Skip to content

Commit 8fbc5ef

Browse files
authored
Filter out $EntriesMappings class for Kotlin's 1.9 feature 'Enum entries' (Kotlin#144)
* 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. * 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. Fixes Kotlin#141
1 parent 3b1c2c1 commit 8fbc5ef

File tree

9 files changed

+60
-8
lines changed

9 files changed

+60
-8
lines changed

build.gradle.kts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,6 @@ val createClasspathManifest = tasks.register("createClasspathManifest") {
6666
val kotlinVersion: String by project
6767
val androidGradlePluginVersion: String = "7.2.2"
6868

69-
configurations.implementation {
70-
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib")
71-
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk7")
72-
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8")
73-
}
74-
7569
dependencies {
7670
implementation(gradleApi())
7771
implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.6.2")
@@ -116,7 +110,8 @@ java {
116110
tasks {
117111
compileTestKotlin {
118112
kotlinOptions {
119-
languageVersion = "1.6"
113+
languageVersion = "1.9"
114+
freeCompilerArgs += "-Xsuppress-version-warnings"
120115
}
121116
}
122117
test {

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version=0.13.2-SNAPSHOT
22
group=org.jetbrains.kotlinx
33

4-
kotlinVersion=1.8.10
4+
kotlinVersion=1.8.20
55
pluginPublishVersion=0.10.1
66

77
kotlin.stdlib.default.dependency=false

src/main/kotlin/api/AsmMetadataLoading.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ fun ClassNode.isEffectivelyPublic(classVisibility: ClassVisibility?) =
3232
&& !isLocal()
3333
&& !isWhenMappings()
3434
&& !isSyntheticAnnotationClass()
35+
&& !isEnumEntriesMappings()
3536
&& (classVisibility?.isPublic(isPublishedApi()) ?: true)
3637

3738

@@ -40,6 +41,7 @@ fun ClassNode.isLocal() = outerMethod != null
4041
fun ClassNode.isInner() = innerClassNode != null
4142
fun ClassNode.isWhenMappings() = isSynthetic(access) && name.endsWith("\$WhenMappings")
4243
fun ClassNode.isSyntheticAnnotationClass() = isSynthetic(access) && name.contains("\$annotationImpl\$")
44+
fun ClassNode.isEnumEntriesMappings() = isSynthetic(access) && name.endsWith("\$EntriesMappings")
4345

4446
val ClassNode.effectiveAccess: Int get() = innerClassNode?.access ?: access
4547
val ClassNode.outerClassName: String? get() = innerClassNode?.outerName
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* Copyright 2016-2023 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
package cases.enums
7+
8+
enum class EnumClass { A, B, C }
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*
2+
* Copyright 2016-2023 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
package cases.enums;
7+
8+
public enum JavaEnum {
9+
JA, JB, JC
10+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package cases.enums
2+
3+
@OptIn(ExperimentalStdlibApi::class)
4+
fun test() {
5+
EnumClass.entries.forEach {
6+
println(it)
7+
}
8+
9+
JavaEnum.entries.forEach {
10+
println(it)
11+
}
12+
}
13+

src/test/kotlin/cases/enums/enums.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
public final class cases/enums/EntriesKt {
2+
public static final fun test ()V
3+
}
4+
5+
public final class cases/enums/EnumClass : java/lang/Enum {
6+
public static final field A Lcases/enums/EnumClass;
7+
public static final field B Lcases/enums/EnumClass;
8+
public static final field C Lcases/enums/EnumClass;
9+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
10+
public static fun valueOf (Ljava/lang/String;)Lcases/enums/EnumClass;
11+
public static fun values ()[Lcases/enums/EnumClass;
12+
}
13+
14+
public final class cases/enums/JavaEnum : java/lang/Enum {
15+
public static final field JA Lcases/enums/JavaEnum;
16+
public static final field JB Lcases/enums/JavaEnum;
17+
public static final field JC Lcases/enums/JavaEnum;
18+
public static fun valueOf (Ljava/lang/String;)Lcases/enums/JavaEnum;
19+
public static fun values ()[Lcases/enums/JavaEnum;
20+
}
21+

src/test/kotlin/cases/whenMappings/whenMappings.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public final class cases/whenMappings/SampleEnum : java/lang/Enum {
77
public static final field A Lcases/whenMappings/SampleEnum;
88
public static final field B Lcases/whenMappings/SampleEnum;
99
public static final field C Lcases/whenMappings/SampleEnum;
10+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
1011
public static fun valueOf (Ljava/lang/String;)Lcases/whenMappings/SampleEnum;
1112
public static fun values ()[Lcases/whenMappings/SampleEnum;
1213
}

src/test/kotlin/tests/CasesPublicAPITest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ class CasesPublicAPITest {
5555

5656
@Test fun whenMappings() { snapshotAPIAndCompare(testName.methodName) }
5757

58+
@Test fun enums() { snapshotAPIAndCompare(testName.methodName) }
59+
5860
private fun snapshotAPIAndCompare(testClassRelativePath: String, nonPublicMarkers: Set<String> = emptySet()) {
5961
val testClassPaths = baseClassPaths.map { it.resolve(testClassRelativePath) }
6062
val testClasses = testClassPaths.flatMap { it.listFiles().orEmpty().asIterable() }

0 commit comments

Comments
 (0)