From 9e2733915bb898d4030f682459f9a4df9d3251fc Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 3 May 2019 13:44:52 +0200 Subject: [PATCH] Add module name JVM extensions to class/package in kotlinx-metadata-jvm #KT-31308 Fixed --- .../jetbrains/kotlin/load/java/JvmAbi.java | 3 ++- .../jvm/deserialization/JvmProtoBufUtil.kt | 2 ++ libraries/kotlinx-metadata/jvm/ChangeLog.md | 4 ++++ .../jvm/impl/JvmMetadataExtensions.kt | 16 ++++++++++++++ .../src/kotlinx/metadata/jvm/jvmExtensions.kt | 7 +++++++ .../org/jetbrains/kotlin/kotlinp/printers.kt | 21 ++++++++++++++++--- .../tools/kotlinp/testData/Annotations.txt | 8 +++++++ .../tools/kotlinp/testData/LocalClass.txt | 6 ++++++ .../testData/LocalDelegatedProperties.txt | 4 ++++ .../tools/kotlinp/testData/NestedClasses.txt | 14 +++++++++++++ .../tools/kotlinp/testData/PlatformType.txt | 2 ++ .../tools/kotlinp/testData/Properties.txt | 2 ++ .../tools/kotlinp/testData/SimpleClass.txt | 2 ++ .../tools/kotlinp/testData/TypeParameters.txt | 6 ++++++ .../kotlinp/testData/VersionRequirement.txt | 4 ++++ 15 files changed, 97 insertions(+), 4 deletions(-) diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java index 936f446e6af..255adaa29f5 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.load.java; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.CompanionObjectMapping; import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; @@ -43,7 +44,7 @@ public final class JvmAbi { public static final String INSTANCE_FIELD = "INSTANCE"; public static final String HIDDEN_INSTANCE_FIELD = "$$" + INSTANCE_FIELD; - public static final String DEFAULT_MODULE_NAME = "main"; + public static final String DEFAULT_MODULE_NAME = JvmProtoBufUtil.DEFAULT_MODULE_NAME; public static final ClassId REFLECTION_FACTORY_IMPL = ClassId.topLevel(new FqName("kotlin.reflect.jvm.internal.ReflectionFactoryImpl")); public static final String LOCAL_VARIABLE_NAME_PREFIX_INLINE_ARGUMENT = "$i$a$"; diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt index b919e49aab7..1c3228d7856 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt @@ -20,6 +20,8 @@ object JvmProtoBufUtil { const val PLATFORM_TYPE_ID = "kotlin.jvm.PlatformType" + const val DEFAULT_MODULE_NAME = "main" + @JvmStatic fun readClassDataFrom(data: Array, strings: Array): Pair = readClassDataFrom(BitEncoding.decodeBytes(data), strings) diff --git a/libraries/kotlinx-metadata/jvm/ChangeLog.md b/libraries/kotlinx-metadata/jvm/ChangeLog.md index 8bb54627947..c9f3c43cd84 100644 --- a/libraries/kotlinx-metadata/jvm/ChangeLog.md +++ b/libraries/kotlinx-metadata/jvm/ChangeLog.md @@ -1,5 +1,9 @@ # kotlinx-metadata-jvm +## 0.0.6 + +- [`KT-31308`](https://youtrack.jetbrains.com/issue/KT-31308) Add module name extensions to kotlinx-metadata-jvm + ## 0.0.5 - [`KT-25371`](https://youtrack.jetbrains.com/issue/KT-25371) Support unsigned integers in kotlinx-metadata-jvm diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt index 2f05193bb57..c63e4e198ac 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt @@ -29,6 +29,8 @@ internal class JvmMetadataExtensions : MetadataExtensions { )?.let { property.accept(it, c) } } + ext.visitModuleName(proto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME) + ext.visitEnd() } @@ -41,6 +43,8 @@ internal class JvmMetadataExtensions : MetadataExtensions { )?.let { property.accept(it, c) } } + ext.visitModuleName(proto.getExtensionOrNull(JvmProtoBuf.packageModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME) + ext.visitEnd() } @@ -111,6 +115,12 @@ internal class JvmMetadataExtensions : MetadataExtensions { ): KmPropertyVisitor = writeProperty(c, flags, name, getterFlags, setterFlags) { proto.addExtension(JvmProtoBuf.classLocalVariable, it.build()) } + + override fun visitModuleName(name: String) { + if (name != JvmProtoBufUtil.DEFAULT_MODULE_NAME) { + proto.setExtension(JvmProtoBuf.classModuleName, c[name]) + } + } } } @@ -124,6 +134,12 @@ internal class JvmMetadataExtensions : MetadataExtensions { ): KmPropertyVisitor = writeProperty(c, flags, name, getterFlags, setterFlags) { proto.addExtension(JvmProtoBuf.packageLocalVariable, it.build()) } + + override fun visitModuleName(name: String) { + if (name != JvmProtoBufUtil.DEFAULT_MODULE_NAME) { + proto.setExtension(JvmProtoBuf.packageModuleName, c[name]) + } + } } } diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt index 66858499c4c..2d2fca50985 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt @@ -32,6 +32,13 @@ abstract class JvmDeclarationContainerExtensionVisitor @JvmOverloads constructor */ open fun visitLocalDelegatedProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? = delegate?.visitLocalDelegatedProperty(flags, name, getterFlags, setterFlags) + + /** + * Visits the name of the module where this container is declared. + */ + open fun visitModuleName(name: String) { + delegate?.visitModuleName(name) + } } /** diff --git a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt index 26393fa2d92..96369bac48b 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt @@ -514,7 +514,11 @@ private fun StringBuilder.appendFlags(flags: Flags, map: Map) { } } -private fun StringBuilder.appendLocalDelegatedProperties(localDelegatedProperties: List) { +private fun StringBuilder.appendDeclarationContainerExtensions( + settings: KotlinpSettings, + localDelegatedProperties: List, + moduleName: String? +) { for ((i, sb) in localDelegatedProperties.withIndex()) { appendln() appendln(" // local delegated property #$i") @@ -527,6 +531,11 @@ private fun StringBuilder.appendLocalDelegatedProperties(localDelegatedPropertie ) } } + + if (settings.isVerbose && moduleName != null) { + appendln() + appendln(" // module name: $moduleName") + } } interface AbstractPrinter { @@ -615,6 +624,7 @@ class ClassPrinter(private val settings: KotlinpSettings) : KmClassVisitor(), Ab if (type != JvmClassExtensionVisitor.TYPE) return null return object : JvmClassExtensionVisitor() { private val localDelegatedProperties = mutableListOf() + private var moduleName: String? = null override fun visitAnonymousObjectOriginName(internalName: String) { anonymousObjectOriginName = internalName @@ -626,8 +636,12 @@ class ClassPrinter(private val settings: KotlinpSettings) : KmClassVisitor(), Ab settings, StringBuilder().also { localDelegatedProperties.add(it) }, flags, name, getterFlags, setterFlags ) + override fun visitModuleName(name: String) { + moduleName = name + } + override fun visitEnd() { - sb.appendLocalDelegatedProperties(localDelegatedProperties) + sb.appendDeclarationContainerExtensions(settings, localDelegatedProperties, moduleName) } } } @@ -660,6 +674,7 @@ abstract class PackagePrinter(private val settings: KotlinpSettings) : KmPackage if (type != JvmPackageExtensionVisitor.TYPE) return null return object : JvmPackageExtensionVisitor() { private val localDelegatedProperties = mutableListOf() + private var moduleName: String? = null override fun visitLocalDelegatedProperty( flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags @@ -668,7 +683,7 @@ abstract class PackagePrinter(private val settings: KotlinpSettings) : KmPackage ) override fun visitEnd() { - sb.appendLocalDelegatedProperties(localDelegatedProperties) + sb.appendDeclarationContainerExtensions(settings, localDelegatedProperties, moduleName) } } } diff --git a/libraries/tools/kotlinp/testData/Annotations.txt b/libraries/tools/kotlinp/testData/Annotations.txt index 9f33a5a6e4d..656e992a253 100644 --- a/libraries/tools/kotlinp/testData/Annotations.txt +++ b/libraries/tools/kotlinp/testData/Annotations.txt @@ -125,6 +125,8 @@ public final annotation class A : kotlin/Annotation { // getter: za()[Z public final val za: kotlin/BooleanArray public final get + + // module name: test-module } // B.class // ------------------------------------------ @@ -136,6 +138,8 @@ public final annotation class B : kotlin/Annotation { // getter: value()Ljava/lang/String; public final val value: kotlin/String public final get + + // module name: test-module } // C.class // ------------------------------------------ @@ -149,6 +153,8 @@ public final class C : kotlin/Any { // signature: returnTypeAnnotation()V public final fun returnTypeAnnotation(): @A(z = true, c = 'x', b = 1.toByte(), s = 42.toShort(), i = 42424242, f = -2.72f, j = 239239239239239L, d = 3.14, ui = 1u, ub = 255.toUByte(), us = 3.toUShort(), ul = 4uL, ui_max = 4294967295u, ub_max = 255.toUByte(), us_max = 65535.toUShort(), ul_max = 18446744073709551615uL, za = [true], ca = ['\''], ba = [1.toByte()], sa = [42.toShort()], ia = [42424242], fa = [-2.72f], ja = [239239239239239L], da = [3.14], str = "aba\ncaba'\"\t\u0001\u0002ꙮ", enum = kotlin/annotation/AnnotationTarget.CLASS, klass = C::class, anno = B(value = "aba\ncaba'\"\t\u0001\u0002ꙮ")) kotlin/Unit + + // module name: test-module } // JvmNamed.class // ------------------------------------------ @@ -160,6 +166,8 @@ public final annotation class JvmNamed : kotlin/Annotation { // getter: uglyJvmName()Ljava/lang/String; public final val value: kotlin/String public final get + + // module name: test-module } // META-INF/test-module.kotlin_module // ------------------------------------------ diff --git a/libraries/tools/kotlinp/testData/LocalClass.txt b/libraries/tools/kotlinp/testData/LocalClass.txt index c589c7f49e3..94f42c2459b 100644 --- a/libraries/tools/kotlinp/testData/LocalClass.txt +++ b/libraries/tools/kotlinp/testData/LocalClass.txt @@ -4,6 +4,8 @@ public final class A : kotlin/Any { // signature: ()V public /* primary */ constructor() + + // module name: test-module } // A$L.class // ------------------------------------------ @@ -16,6 +18,8 @@ local final class .A$L : kotlin/Any { public final fun x(l: .A$L<.A$L.I>): kotlin/Unit // nested class: I + + // module name: test-module } // A$L$I.class // ------------------------------------------ @@ -23,6 +27,8 @@ local final inner class .A$L.I : kotlin/Any { // signature: (LA$L;)V public /* primary */ constructor() + + // module name: test-module } // META-INF/test-module.kotlin_module // ------------------------------------------ diff --git a/libraries/tools/kotlinp/testData/LocalDelegatedProperties.txt b/libraries/tools/kotlinp/testData/LocalDelegatedProperties.txt index 7f9e2849505..533c6c30d6e 100644 --- a/libraries/tools/kotlinp/testData/LocalDelegatedProperties.txt +++ b/libraries/tools/kotlinp/testData/LocalDelegatedProperties.txt @@ -19,6 +19,8 @@ public final class Class : kotlin/Any { // local delegated property #2 // local final /* delegated */ val local6: kotlin/Int // local final get + + // module name: test-module } // Class$f$1.class // ------------------------------------------ @@ -41,6 +43,8 @@ public final class Delegate : kotlin/Any { // getter: getValue()Ljava/lang/Object; public final val value: T#0? public final get + + // module name: test-module } // LocalDelegatedPropertiesKt.class // ------------------------------------------ diff --git a/libraries/tools/kotlinp/testData/NestedClasses.txt b/libraries/tools/kotlinp/testData/NestedClasses.txt index 553f7738c8a..b5b0baf4ff9 100644 --- a/libraries/tools/kotlinp/testData/NestedClasses.txt +++ b/libraries/tools/kotlinp/testData/NestedClasses.txt @@ -7,16 +7,22 @@ public abstract interface A : kotlin/Any { // nested class: B // nested class: D + + // module name: test-module } // A$B.class // ------------------------------------------ public abstract interface A.B : kotlin/Any { // nested class: C + + // module name: test-module } // A$B$C.class // ------------------------------------------ public abstract interface A.B.C : kotlin/Any { + + // module name: test-module } // A$D.class // ------------------------------------------ @@ -28,6 +34,8 @@ public final companion object A.D : kotlin/Any { // nested class: E // nested class: F + + // module name: test-module } // A$D$E.class // ------------------------------------------ @@ -39,6 +47,8 @@ public final enum class A.D.E : kotlin/Enum { E1, E2, + + // module name: test-module } // A$D$F.class // ------------------------------------------ @@ -50,6 +60,8 @@ public sealed class A.D.F : kotlin/Any { // nested class: G // sealed subclass: A.D.F.G + + // module name: test-module } // A$D$F$G.class // ------------------------------------------ @@ -57,6 +69,8 @@ public final class A.D.F.G : A.D.F { // signature: ()V public /* primary */ constructor() + + // module name: test-module } // META-INF/test-module.kotlin_module // ------------------------------------------ diff --git a/libraries/tools/kotlinp/testData/PlatformType.txt b/libraries/tools/kotlinp/testData/PlatformType.txt index aad34e318ea..c4d640d7c3d 100644 --- a/libraries/tools/kotlinp/testData/PlatformType.txt +++ b/libraries/tools/kotlinp/testData/PlatformType.txt @@ -10,6 +10,8 @@ public final class PlatformType : kotlin/Any { // signature: nullability()Ljava/io/File; public final fun nullability(): java/io/File! + + // module name: test-module } // META-INF/test-module.kotlin_module // ------------------------------------------ diff --git a/libraries/tools/kotlinp/testData/Properties.txt b/libraries/tools/kotlinp/testData/Properties.txt index 36b9b2e5d55..425d6d07cb9 100644 --- a/libraries/tools/kotlinp/testData/Properties.txt +++ b/libraries/tools/kotlinp/testData/Properties.txt @@ -34,6 +34,8 @@ public final class C : kotlin/Any { // getter: getDelegated(Ljava/lang/Number;)Ljava/util/List; public final /* delegated */ val T#0.delegated: kotlin/collections/List public final /* non-default */ get + + // module name: test-module } // META-INF/test-module.kotlin_module // ------------------------------------------ diff --git a/libraries/tools/kotlinp/testData/SimpleClass.txt b/libraries/tools/kotlinp/testData/SimpleClass.txt index 6a1a5ffac29..f9565457cde 100644 --- a/libraries/tools/kotlinp/testData/SimpleClass.txt +++ b/libraries/tools/kotlinp/testData/SimpleClass.txt @@ -26,6 +26,8 @@ public final class SimpleClass : kotlin/Any { public final var x: kotlin/Long public final /* non-default */ external get public final /* non-default */ set(: kotlin/Long) + + // module name: test-module } // META-INF/test-module.kotlin_module // ------------------------------------------ diff --git a/libraries/tools/kotlinp/testData/TypeParameters.txt b/libraries/tools/kotlinp/testData/TypeParameters.txt index 375d56d626d..3548a3bf747 100644 --- a/libraries/tools/kotlinp/testData/TypeParameters.txt +++ b/libraries/tools/kotlinp/testData/TypeParameters.txt @@ -9,6 +9,8 @@ public final class A : kotlin/Any { public final fun a(t: T#1): kotlin/Unit // nested class: B + + // module name: test-module } // A$B.class // ------------------------------------------ @@ -24,6 +26,8 @@ public final inner class A.B : kotlin/Any { public final fun bb(t: T#0): kotlin/Unit // nested class: C + + // module name: test-module } // A$B$C.class // ------------------------------------------ @@ -40,6 +44,8 @@ public final inner class A.B.C : kotlin/Any { // signature: z(LA$B$C;)V public final fun z(c: A.B.C): kotlin/Unit + + // module name: test-module } // META-INF/test-module.kotlin_module // ------------------------------------------ diff --git a/libraries/tools/kotlinp/testData/VersionRequirement.txt b/libraries/tools/kotlinp/testData/VersionRequirement.txt index 02385b3973d..5980b409e19 100644 --- a/libraries/tools/kotlinp/testData/VersionRequirement.txt +++ b/libraries/tools/kotlinp/testData/VersionRequirement.txt @@ -5,6 +5,8 @@ public final class test/Klass : kotlin/Any { // signature: ()V public /* primary */ constructor() + + // module name: test-module } // test/Konstructor.class // ------------------------------------------ @@ -13,6 +15,8 @@ public final class test/Konstructor : kotlin/Any { // requires language version 42.0.0 (level=WARNING, errorCode=42, message="Konstructor must not be used!") // signature: ()V public /* primary */ constructor() + + // module name: test-module } // test/VersionRequirementKt.class // ------------------------------------------