From d68873dfd90e0bc58f83b37df4419d25d4a96b25 Mon Sep 17 00:00:00 2001 From: Artem Golovko Date: Thu, 6 Mar 2025 19:52:13 +0000 Subject: [PATCH 1/4] Issue #484 - Optimize the KLoggerNameResolver for jvm, since we don't need to search indexOf multiple times --- .../internal/KLoggerNameResolver.kt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/javaMain/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolver.kt b/src/javaMain/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolver.kt index c880446f..96a492ec 100644 --- a/src/javaMain/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolver.kt +++ b/src/javaMain/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolver.kt @@ -7,14 +7,19 @@ internal actual object KLoggerNameResolver { /** get class name for function by the package of the function */ internal actual fun name(func: () -> Unit): String { - val name = func.javaClass.name - val slicedName = - when { - name.contains("Kt$") -> name.substringBefore("Kt$") - name.contains("$") -> name.substringBefore("$") - else -> name + return func::class.java.name.toCleanClassName() + } + + private val classNameEndings = listOf("Kt$", "$") + + private fun String.toCleanClassName(): String { + classNameEndings.forEach { ending -> + val indexOfEnding = this.indexOf(ending) + if (indexOfEnding != -1) { + return this.substring(0, indexOfEnding) } - return slicedName + } + return this } /** get class name for java class (that usually represents kotlin class) */ From 1ad4d3a00faf5c641ed9066168c2a9fb111093c7 Mon Sep 17 00:00:00 2001 From: Artem Golovko Date: Sun, 6 Apr 2025 18:41:50 +0100 Subject: [PATCH 2/4] Issue #484 - update KLoggerNameResolver tests for jvm --- .../internal/KLoggerNameResolver.kt | 30 +++----------- .../internal/KLoggerNameResolverTest.kt | 39 +++++++++---------- 2 files changed, 24 insertions(+), 45 deletions(-) diff --git a/src/javaMain/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolver.kt b/src/javaMain/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolver.kt index 96a492ec..cbf1e024 100644 --- a/src/javaMain/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolver.kt +++ b/src/javaMain/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolver.kt @@ -1,13 +1,17 @@ package io.github.oshai.kotlinlogging.internal -import java.lang.reflect.Modifier +import kotlin.reflect.KClass /** Resolves name of java classes */ internal actual object KLoggerNameResolver { /** get class name for function by the package of the function */ internal actual fun name(func: () -> Unit): String { - return func::class.java.name.toCleanClassName() + return name(func::class) + } + + internal fun name(clazz: KClass<*>): String { + return clazz.java.name.toCleanClassName() } private val classNameEndings = listOf("Kt$", "$") @@ -21,26 +25,4 @@ internal actual object KLoggerNameResolver { } return this } - - /** get class name for java class (that usually represents kotlin class) */ - internal fun name(forClass: Class): String = unwrapCompanionClass(forClass).name - - /** unwrap companion class to enclosing class given a Java Class */ - private fun unwrapCompanionClass(clazz: Class): Class<*> { - return clazz.enclosingClass?.let { enclosingClass -> - try { - enclosingClass.declaredFields - .find { field -> - field.name == clazz.simpleName && - Modifier.isStatic(field.modifiers) && - field.type == clazz - } - ?.run { enclosingClass } - } catch (se: SecurityException) { - // The security manager isn't properly set up, so it won't be possible - // to search for the target declared field. - null - } - } ?: clazz - } } diff --git a/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt b/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt index 5accfc15..20c531ab 100644 --- a/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt +++ b/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt @@ -6,49 +6,46 @@ import org.junit.jupiter.api.TestInstance import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource +import kotlin.reflect.KClass @TestInstance(TestInstance.Lifecycle.PER_CLASS) class KLoggerNameResolverTest { @ParameterizedTest @MethodSource("testNames") - fun testNames(expectedName: String, clazz: Class<*>) { + fun testNames(expectedName: String, clazz: KClass<*>) { assertEquals(expectedName, KLoggerNameResolver.name(clazz)) } private fun testNames(): Stream = Stream.of( - Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass::class.java), - Arguments.of("io.github.oshai.kotlinlogging.internal.ChildClass", ChildClass::class.java), + Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass::class), + Arguments.of("io.github.oshai.kotlinlogging.internal.ChildClass", ChildClass::class), Arguments.of( "io.github.oshai.kotlinlogging.internal.BaseClass", - BaseClass.Companion::class.java, + BaseClass.Companion::class, ), Arguments.of( "io.github.oshai.kotlinlogging.internal.ChildClass", - ChildClass.Companion::class.java, + ChildClass.Companion::class, ), - Arguments.of("io.github.oshai.kotlinlogging.internal.Singleton", Singleton::class.java), - Arguments.of("io.github.oshai.kotlinlogging.internal.MyInterface", MyInterface::class.java), - Arguments.of("java.lang.Object", Any().javaClass), + Arguments.of("io.github.oshai.kotlinlogging.internal.Singleton", Singleton::class), + Arguments.of("io.github.oshai.kotlinlogging.internal.MyInterface", MyInterface::class), + Arguments.of("java.lang.Object", Any()::class), Arguments.of( - "io.github.oshai.kotlinlogging.internal.KLoggerNameResolverTest\$testNames$1", - object {}.javaClass, + "io.github.oshai.kotlinlogging.internal.KLoggerNameResolverTest", + object {}::class, ), Arguments.of( - "io.github.oshai.kotlinlogging.internal.BaseClass\$InnerClass\$Obj", - BaseClass.InnerClass.Obj::class.java, - ), - Arguments.of( - "io.github.oshai.kotlinlogging.internal.BaseClass\$InnerClass\$Obj", - BaseClass.InnerClass.Obj.javaClass, + "io.github.oshai.kotlinlogging.internal.BaseClass", + BaseClass.InnerClass.Obj::class, ), Arguments.of( - "io.github.oshai.kotlinlogging.internal.BaseClass\$InnerClass", - BaseClass.InnerClass.CmpObj::class.java, + "io.github.oshai.kotlinlogging.internal.BaseClass", + BaseClass.InnerClass.CmpObj::class, ), - Arguments.of("io.github.oshai.kotlinlogging.internal.Foo\$Bar", Foo.Bar::class.java), - Arguments.of("io.github.oshai.kotlinlogging.internal.Foo\$Bar2", Foo.Bar3.javaClass), + Arguments.of("io.github.oshai.kotlinlogging.internal.Foo", Foo.Bar::class), + Arguments.of("io.github.oshai.kotlinlogging.internal.Foo", Foo.Bar3::class), Arguments.of( "io.github.oshai.kotlinlogging.internal.PrivateCompanion", PrivateCompanion().companionClass, @@ -88,7 +85,7 @@ class Foo { } class PrivateCompanion { - val companionClass: Class<*> = Companion::class.java + val companionClass: KClass<*> = Companion::class private companion object } From f971961e096f96a3f7359c9a4055f2d69c5a5427 Mon Sep 17 00:00:00 2001 From: Artem Golovko Date: Sun, 6 Apr 2025 19:13:43 +0100 Subject: [PATCH 3/4] Issue #484 - clean up --- .../internal/KLoggerNameResolverTest.kt | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt b/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt index 20c531ab..042086c7 100644 --- a/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt +++ b/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt @@ -1,11 +1,11 @@ package io.github.oshai.kotlinlogging.internal -import java.util.stream.Stream import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.TestInstance import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource +import java.util.stream.Stream import kotlin.reflect.KClass @TestInstance(TestInstance.Lifecycle.PER_CLASS) @@ -21,35 +21,18 @@ class KLoggerNameResolverTest { Stream.of( Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass::class), Arguments.of("io.github.oshai.kotlinlogging.internal.ChildClass", ChildClass::class), - Arguments.of( - "io.github.oshai.kotlinlogging.internal.BaseClass", - BaseClass.Companion::class, - ), - Arguments.of( - "io.github.oshai.kotlinlogging.internal.ChildClass", - ChildClass.Companion::class, - ), + Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.Companion::class), + Arguments.of("io.github.oshai.kotlinlogging.internal.ChildClass", ChildClass.Companion::class), Arguments.of("io.github.oshai.kotlinlogging.internal.Singleton", Singleton::class), Arguments.of("io.github.oshai.kotlinlogging.internal.MyInterface", MyInterface::class), Arguments.of("java.lang.Object", Any()::class), - Arguments.of( - "io.github.oshai.kotlinlogging.internal.KLoggerNameResolverTest", - object {}::class, - ), - Arguments.of( - "io.github.oshai.kotlinlogging.internal.BaseClass", - BaseClass.InnerClass.Obj::class, - ), - Arguments.of( - "io.github.oshai.kotlinlogging.internal.BaseClass", - BaseClass.InnerClass.CmpObj::class, - ), + Arguments.of("io.github.oshai.kotlinlogging.internal.KLoggerNameResolverTest", object {}::class), + Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.InnerClass::class), + Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.InnerClass.Obj::class), + Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.InnerClass.CmpObj::class), Arguments.of("io.github.oshai.kotlinlogging.internal.Foo", Foo.Bar::class), Arguments.of("io.github.oshai.kotlinlogging.internal.Foo", Foo.Bar3::class), - Arguments.of( - "io.github.oshai.kotlinlogging.internal.PrivateCompanion", - PrivateCompanion().companionClass, - ), + Arguments.of("io.github.oshai.kotlinlogging.internal.PrivateCompanion", PrivateCompanion().companionClass), ) } @@ -80,7 +63,8 @@ class Foo { val z = Bar2 companion object { - @JvmField val Bar3 = Foo().z + @JvmField + val Bar3 = Foo().z } } From 302a03e2577e981dd3b9e8e79de0fb92e62561d3 Mon Sep 17 00:00:00 2001 From: Artem Golovko Date: Sun, 6 Apr 2025 20:41:07 +0100 Subject: [PATCH 4/4] Issue #484 - apply formatting --- .../internal/KLoggerNameResolverTest.kt | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt b/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt index 042086c7..90ef40e0 100644 --- a/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt +++ b/src/jvmTest/kotlin/io/github/oshai/kotlinlogging/internal/KLoggerNameResolverTest.kt @@ -1,12 +1,12 @@ package io.github.oshai.kotlinlogging.internal +import java.util.stream.Stream +import kotlin.reflect.KClass import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.TestInstance import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource -import java.util.stream.Stream -import kotlin.reflect.KClass @TestInstance(TestInstance.Lifecycle.PER_CLASS) class KLoggerNameResolverTest { @@ -22,17 +22,32 @@ class KLoggerNameResolverTest { Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass::class), Arguments.of("io.github.oshai.kotlinlogging.internal.ChildClass", ChildClass::class), Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.Companion::class), - Arguments.of("io.github.oshai.kotlinlogging.internal.ChildClass", ChildClass.Companion::class), + Arguments.of( + "io.github.oshai.kotlinlogging.internal.ChildClass", + ChildClass.Companion::class, + ), Arguments.of("io.github.oshai.kotlinlogging.internal.Singleton", Singleton::class), Arguments.of("io.github.oshai.kotlinlogging.internal.MyInterface", MyInterface::class), Arguments.of("java.lang.Object", Any()::class), - Arguments.of("io.github.oshai.kotlinlogging.internal.KLoggerNameResolverTest", object {}::class), + Arguments.of( + "io.github.oshai.kotlinlogging.internal.KLoggerNameResolverTest", + object {}::class, + ), Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.InnerClass::class), - Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.InnerClass.Obj::class), - Arguments.of("io.github.oshai.kotlinlogging.internal.BaseClass", BaseClass.InnerClass.CmpObj::class), + Arguments.of( + "io.github.oshai.kotlinlogging.internal.BaseClass", + BaseClass.InnerClass.Obj::class, + ), + Arguments.of( + "io.github.oshai.kotlinlogging.internal.BaseClass", + BaseClass.InnerClass.CmpObj::class, + ), Arguments.of("io.github.oshai.kotlinlogging.internal.Foo", Foo.Bar::class), Arguments.of("io.github.oshai.kotlinlogging.internal.Foo", Foo.Bar3::class), - Arguments.of("io.github.oshai.kotlinlogging.internal.PrivateCompanion", PrivateCompanion().companionClass), + Arguments.of( + "io.github.oshai.kotlinlogging.internal.PrivateCompanion", + PrivateCompanion().companionClass, + ), ) } @@ -63,8 +78,7 @@ class Foo { val z = Bar2 companion object { - @JvmField - val Bar3 = Foo().z + @JvmField val Bar3 = Foo().z } }