From 130470a9feafd4b60c98264f96faba26a77006ef Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Wed, 14 Jun 2023 10:22:11 +0200 Subject: [PATCH 1/4] Filter out $EntriesMappings class for Kotlin's 1.9 feature 'Enum entries' Kotlin compiler generates synthetic class holding EnumEntries starting from 1.9. This change filters out such classes from the API dump. --- src/main/kotlin/api/AsmMetadataLoading.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/api/AsmMetadataLoading.kt b/src/main/kotlin/api/AsmMetadataLoading.kt index b1f9c5ee..d2268c18 100644 --- a/src/main/kotlin/api/AsmMetadataLoading.kt +++ b/src/main/kotlin/api/AsmMetadataLoading.kt @@ -32,6 +32,7 @@ fun ClassNode.isEffectivelyPublic(classVisibility: ClassVisibility?) = && !isLocal() && !isWhenMappings() && !isSyntheticAnnotationClass() + && !isEnumEntriesMappings() && (classVisibility?.isPublic(isPublishedApi()) ?: true) @@ -40,6 +41,7 @@ fun ClassNode.isLocal() = outerMethod != null fun ClassNode.isInner() = innerClassNode != null fun ClassNode.isWhenMappings() = isSynthetic(access) && name.endsWith("\$WhenMappings") fun ClassNode.isSyntheticAnnotationClass() = isSynthetic(access) && name.contains("\$annotationImpl\$") +fun ClassNode.isEnumEntriesMappings() = isSynthetic(access) && name.endsWith("\$EntriesMappings") val ClassNode.effectiveAccess: Int get() = innerClassNode?.access ?: access val ClassNode.outerClassName: String? get() = innerClassNode?.outerName From 4973d8c679f93fce8b5faf650d35eeb472aba1be Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 4 Jul 2023 13:56:29 +0200 Subject: [PATCH 2/4] Upgrade a Kotlin version and remove stdlib exclusion Changed config to make testing of Enum.entries possible. Enum.entries require stdlib >= 1.8.20. Exclusion of stdlib artifacts is only required when Gradle's Kotlin version is higher than the project's one. --- build.gradle.kts | 6 ------ gradle.properties | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9cda0802..102f6a0c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -66,12 +66,6 @@ val createClasspathManifest = tasks.register("createClasspathManifest") { val kotlinVersion: String by project val androidGradlePluginVersion: String = "7.2.2" -configurations.implementation { - exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib") - exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk7") - exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8") -} - dependencies { implementation(gradleApi()) implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.6.2") diff --git a/gradle.properties b/gradle.properties index 924e174d..a96bd054 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ version=0.13.2-SNAPSHOT group=org.jetbrains.kotlinx -kotlinVersion=1.8.10 +kotlinVersion=1.8.20 pluginPublishVersion=0.10.1 kotlin.stdlib.default.dependency=false From 4fbfd42a0d46128026258b228be5dc024efb579c Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 4 Jul 2023 13:57:06 +0200 Subject: [PATCH 3/4] Added test for EnumEntries filtration --- build.gradle.kts | 3 ++- src/test/kotlin/cases/enums/EnumClass.kt | 8 ++++++++ src/test/kotlin/cases/enums/entries.kt | 8 ++++++++ src/test/kotlin/cases/enums/enums.txt | 13 +++++++++++++ src/test/kotlin/cases/whenMappings/whenMappings.txt | 1 + src/test/kotlin/tests/CasesPublicAPITest.kt | 2 ++ 6 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/test/kotlin/cases/enums/EnumClass.kt create mode 100644 src/test/kotlin/cases/enums/entries.kt create mode 100644 src/test/kotlin/cases/enums/enums.txt diff --git a/build.gradle.kts b/build.gradle.kts index 102f6a0c..338e085f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -110,7 +110,8 @@ java { tasks { compileTestKotlin { kotlinOptions { - languageVersion = "1.6" + languageVersion = "1.9" + freeCompilerArgs += "-Xsuppress-version-warnings" } } test { diff --git a/src/test/kotlin/cases/enums/EnumClass.kt b/src/test/kotlin/cases/enums/EnumClass.kt new file mode 100644 index 00000000..f1bb959f --- /dev/null +++ b/src/test/kotlin/cases/enums/EnumClass.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2016-2023 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +package cases.enums + +enum class EnumClass { A, B, C } diff --git a/src/test/kotlin/cases/enums/entries.kt b/src/test/kotlin/cases/enums/entries.kt new file mode 100644 index 00000000..28aae8b7 --- /dev/null +++ b/src/test/kotlin/cases/enums/entries.kt @@ -0,0 +1,8 @@ +package cases.enums + +@OptIn(ExperimentalStdlibApi::class) +fun test() { + EnumClass.entries.forEach { + println(it) + } +} diff --git a/src/test/kotlin/cases/enums/enums.txt b/src/test/kotlin/cases/enums/enums.txt new file mode 100644 index 00000000..835744fa --- /dev/null +++ b/src/test/kotlin/cases/enums/enums.txt @@ -0,0 +1,13 @@ +public final class cases/enums/EntriesKt { + public static final fun test ()V +} + +public final class cases/enums/EnumClass : java/lang/Enum { + public static final field A Lcases/enums/EnumClass; + public static final field B Lcases/enums/EnumClass; + public static final field C Lcases/enums/EnumClass; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcases/enums/EnumClass; + public static fun values ()[Lcases/enums/EnumClass; +} + diff --git a/src/test/kotlin/cases/whenMappings/whenMappings.txt b/src/test/kotlin/cases/whenMappings/whenMappings.txt index 1975cf13..ca17a5ef 100644 --- a/src/test/kotlin/cases/whenMappings/whenMappings.txt +++ b/src/test/kotlin/cases/whenMappings/whenMappings.txt @@ -7,6 +7,7 @@ public final class cases/whenMappings/SampleEnum : java/lang/Enum { public static final field A Lcases/whenMappings/SampleEnum; public static final field B Lcases/whenMappings/SampleEnum; public static final field C Lcases/whenMappings/SampleEnum; + public static fun getEntries ()Lkotlin/enums/EnumEntries; public static fun valueOf (Ljava/lang/String;)Lcases/whenMappings/SampleEnum; public static fun values ()[Lcases/whenMappings/SampleEnum; } diff --git a/src/test/kotlin/tests/CasesPublicAPITest.kt b/src/test/kotlin/tests/CasesPublicAPITest.kt index 33f0f02f..ae66e059 100644 --- a/src/test/kotlin/tests/CasesPublicAPITest.kt +++ b/src/test/kotlin/tests/CasesPublicAPITest.kt @@ -55,6 +55,8 @@ class CasesPublicAPITest { @Test fun whenMappings() { snapshotAPIAndCompare(testName.methodName) } + @Test fun enums() { snapshotAPIAndCompare(testName.methodName) } + private fun snapshotAPIAndCompare(testClassRelativePath: String, nonPublicMarkers: Set = emptySet()) { val testClassPaths = baseClassPaths.map { it.resolve(testClassRelativePath) } val testClasses = testClassPaths.flatMap { it.listFiles().orEmpty().asIterable() } From b2757d4a9388015ab50dfae5978f0ba89a0b3294 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 15 Aug 2023 10:13:59 +0200 Subject: [PATCH 4/4] Fixed test to use a enum class requiring EntriesMapping class --- src/test/kotlin/cases/enums/JavaEnum.java | 10 ++++++++++ src/test/kotlin/cases/enums/entries.kt | 5 +++++ src/test/kotlin/cases/enums/enums.txt | 8 ++++++++ 3 files changed, 23 insertions(+) create mode 100644 src/test/kotlin/cases/enums/JavaEnum.java diff --git a/src/test/kotlin/cases/enums/JavaEnum.java b/src/test/kotlin/cases/enums/JavaEnum.java new file mode 100644 index 00000000..9fae2fd1 --- /dev/null +++ b/src/test/kotlin/cases/enums/JavaEnum.java @@ -0,0 +1,10 @@ +/* + * Copyright 2016-2023 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +package cases.enums; + +public enum JavaEnum { + JA, JB, JC +} diff --git a/src/test/kotlin/cases/enums/entries.kt b/src/test/kotlin/cases/enums/entries.kt index 28aae8b7..8faa1918 100644 --- a/src/test/kotlin/cases/enums/entries.kt +++ b/src/test/kotlin/cases/enums/entries.kt @@ -5,4 +5,9 @@ fun test() { EnumClass.entries.forEach { println(it) } + + JavaEnum.entries.forEach { + println(it) + } } + diff --git a/src/test/kotlin/cases/enums/enums.txt b/src/test/kotlin/cases/enums/enums.txt index 835744fa..d086c780 100644 --- a/src/test/kotlin/cases/enums/enums.txt +++ b/src/test/kotlin/cases/enums/enums.txt @@ -11,3 +11,11 @@ public final class cases/enums/EnumClass : java/lang/Enum { public static fun values ()[Lcases/enums/EnumClass; } +public final class cases/enums/JavaEnum : java/lang/Enum { + public static final field JA Lcases/enums/JavaEnum; + public static final field JB Lcases/enums/JavaEnum; + public static final field JC Lcases/enums/JavaEnum; + public static fun valueOf (Ljava/lang/String;)Lcases/enums/JavaEnum; + public static fun values ()[Lcases/enums/JavaEnum; +} +