Skip to content

Commit 871ee98

Browse files
authored
Issue #484 - Optimize the KLoggerNameResolver for jvm (#485)
* Issue #484 - Optimize the KLoggerNameResolver for jvm, since we don't need to search indexOf multiple times update KLoggerNameResolver tests for jvm
1 parent 771b1fb commit 871ee98

File tree

2 files changed

+33
-51
lines changed

2 files changed

+33
-51
lines changed
Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,28 @@
11
package io.github.oshai.kotlinlogging.internal
22

3-
import java.lang.reflect.Modifier
3+
import kotlin.reflect.KClass
44

55
/** Resolves name of java classes */
66
internal actual object KLoggerNameResolver {
77

88
/** get class name for function by the package of the function */
99
internal actual fun name(func: () -> Unit): String {
10-
val name = func.javaClass.name
11-
val slicedName =
12-
when {
13-
name.contains("Kt$") -> name.substringBefore("Kt$")
14-
name.contains("$") -> name.substringBefore("$")
15-
else -> name
16-
}
17-
return slicedName
10+
return name(func::class)
11+
}
12+
13+
internal fun name(clazz: KClass<*>): String {
14+
return clazz.java.name.toCleanClassName()
1815
}
1916

20-
/** get class name for java class (that usually represents kotlin class) */
21-
internal fun <T : Any> name(forClass: Class<T>): String = unwrapCompanionClass(forClass).name
17+
private val classNameEndings = listOf("Kt$", "$")
2218

23-
/** unwrap companion class to enclosing class given a Java Class */
24-
private fun <T : Any> unwrapCompanionClass(clazz: Class<T>): Class<*> {
25-
return clazz.enclosingClass?.let { enclosingClass ->
26-
try {
27-
enclosingClass.declaredFields
28-
.find { field ->
29-
field.name == clazz.simpleName &&
30-
Modifier.isStatic(field.modifiers) &&
31-
field.type == clazz
32-
}
33-
?.run { enclosingClass }
34-
} catch (se: SecurityException) {
35-
// The security manager isn't properly set up, so it won't be possible
36-
// to search for the target declared field.
37-
null
19+
private fun String.toCleanClassName(): String {
20+
classNameEndings.forEach { ending ->
21+
val indexOfEnding = this.indexOf(ending)
22+
if (indexOfEnding != -1) {
23+
return this.substring(0, indexOfEnding)
3824
}
39-
} ?: clazz
25+
}
26+
return this
4027
}
4128
}

src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.oshai.kotlinlogging.internal
22

33
import java.util.stream.Stream
4+
import kotlin.reflect.KClass
45
import org.junit.jupiter.api.Assertions.assertEquals
56
import org.junit.jupiter.api.TestInstance
67
import org.junit.jupiter.params.ParameterizedTest
@@ -12,43 +13,37 @@ class KLoggerNameResolverTest {
1213

1314
@ParameterizedTest
1415
@MethodSource("testNames")
15-
fun testNames(expectedName: String, clazz: Class<*>) {
16+
fun testNames(expectedName: String, clazz: KClass<*>) {
1617
assertEquals(expectedName, KLoggerNameResolver.name(clazz))
1718
}
1819

1920
private fun testNames(): Stream<Arguments> =
2021
Stream.of(
21-
Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass::class.java),
22-
Arguments.of("io.github.oshai.kotlinlogging.internal.ChildClass", ChildClass::class.java),
23-
Arguments.of(
24-
"io.github.oshai.kotlinlogging.internal.BaseClass",
25-
BaseClass.Companion::class.java,
26-
),
22+
Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass::class),
23+
Arguments.of("io.github.oshai.kotlinlogging.internal.ChildClass", ChildClass::class),
24+
Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.Companion::class),
2725
Arguments.of(
2826
"io.github.oshai.kotlinlogging.internal.ChildClass",
29-
ChildClass.Companion::class.java,
27+
ChildClass.Companion::class,
3028
),
31-
Arguments.of("io.github.oshai.kotlinlogging.internal.Singleton", Singleton::class.java),
32-
Arguments.of("io.github.oshai.kotlinlogging.internal.MyInterface", MyInterface::class.java),
33-
Arguments.of("java.lang.Object", Any().javaClass),
29+
Arguments.of("io.github.oshai.kotlinlogging.internal.Singleton", Singleton::class),
30+
Arguments.of("io.github.oshai.kotlinlogging.internal.MyInterface", MyInterface::class),
31+
Arguments.of("java.lang.Object", Any()::class),
3432
Arguments.of(
35-
"io.github.oshai.kotlinlogging.internal.KLoggerNameResolverTest\$testNames$1",
36-
object {}.javaClass,
33+
"io.github.oshai.kotlinlogging.internal.KLoggerNameResolverTest",
34+
object {}::class,
3735
),
36+
Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.InnerClass::class),
3837
Arguments.of(
39-
"io.github.oshai.kotlinlogging.internal.BaseClass\$InnerClass\$Obj",
40-
BaseClass.InnerClass.Obj::class.java,
41-
),
42-
Arguments.of(
43-
"io.github.oshai.kotlinlogging.internal.BaseClass\$InnerClass\$Obj",
44-
BaseClass.InnerClass.Obj.javaClass,
38+
"io.github.oshai.kotlinlogging.internal.BaseClass",
39+
BaseClass.InnerClass.Obj::class,
4540
),
4641
Arguments.of(
47-
"io.github.oshai.kotlinlogging.internal.BaseClass\$InnerClass",
48-
BaseClass.InnerClass.CmpObj::class.java,
42+
"io.github.oshai.kotlinlogging.internal.BaseClass",
43+
BaseClass.InnerClass.CmpObj::class,
4944
),
50-
Arguments.of("io.github.oshai.kotlinlogging.internal.Foo\$Bar", Foo.Bar::class.java),
51-
Arguments.of("io.github.oshai.kotlinlogging.internal.Foo\$Bar2", Foo.Bar3.javaClass),
45+
Arguments.of("io.github.oshai.kotlinlogging.internal.Foo", Foo.Bar::class),
46+
Arguments.of("io.github.oshai.kotlinlogging.internal.Foo", Foo.Bar3::class),
5247
Arguments.of(
5348
"io.github.oshai.kotlinlogging.internal.PrivateCompanion",
5449
PrivateCompanion().companionClass,
@@ -88,7 +83,7 @@ class Foo {
8883
}
8984

9085
class PrivateCompanion {
91-
val companionClass: Class<*> = Companion::class.java
86+
val companionClass: KClass<*> = Companion::class
9287

9388
private companion object
9489
}

0 commit comments

Comments
 (0)