From 4c4141ea49944c61b44817e28442c880975d0499 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 24 Mar 2016 15:41:14 +0300 Subject: [PATCH] KT-11410: write multifile class code generation scheme to extra field (xi) in kotlin.Metadata. --- .../kotlin/codegen/MultifileClassCodegen.kt | 3 +++ .../codegen/MultifileClassPartCodegen.kt | 3 +++ .../kotlin/load/java/JvmAnnotationNames.java | 5 +++- .../kotlin/load/kotlin/JvmMetadataVersion.kt | 2 +- .../load/kotlin/header/KotlinClassHeader.kt | 25 ++++++++++++++++++- ...eadKotlinClassHeaderAnnotationVisitor.java | 17 +++++++++---- core/runtime.jvm/src/kotlin/Metadata.kt | 6 ++++- 7 files changed, 52 insertions(+), 9 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index 2685ddccd3a..e7f4da57817 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader.MultifileClassKind.* import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus @@ -330,6 +331,8 @@ class MultifileClassCodegen( arv.visit(null, internalName) } arv.visitEnd() + val multifileClassKind = if (shouldGeneratePartHierarchy) INHERITING else DELEGATING + av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_KIND_FIELD_NAME, multifileClassKind.id) } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt index 9e01d397be8..60bc4b3bb63 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader.MultifileClassKind.* import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtProperty @@ -164,6 +165,8 @@ class MultifileClassPartCodegen( writeKotlinMetadata(v, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART) { av -> AsmUtil.writeAnnotationData(av, serializer, packageProto) av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME, facadeClassType.internalName) + val multifileClassKind = if (shouldGeneratePartHierarchy) INHERITING else DELEGATING + av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_KIND_FIELD_NAME, multifileClassKind.id) } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java index ea6d1a4e008..c07b6483b3c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java @@ -29,7 +29,10 @@ public final class JvmAnnotationNames { public static final String KIND_FIELD_NAME = "k"; public static final String METADATA_DATA_FIELD_NAME = "d1"; public static final String METADATA_STRINGS_FIELD_NAME = "d2"; - public static final String METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME = "xs"; + public static final String METADATA_EXTRA_STRING_FIELD_NAME = "xs"; + public static final String METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME = METADATA_EXTRA_STRING_FIELD_NAME; + public static final String METADATA_EXTRA_INT_FIELD_NAME = "xi"; + public static final String METADATA_MULTIFILE_CLASS_KIND_FIELD_NAME = METADATA_EXTRA_INT_FIELD_NAME; public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/JvmMetadataVersion.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/JvmMetadataVersion.kt index ca7904271ef..dd46a42adda 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/JvmMetadataVersion.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/JvmMetadataVersion.kt @@ -32,7 +32,7 @@ class JvmMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) { var skipCheck: Boolean = false @JvmField - val INSTANCE = JvmMetadataVersion(1, 1, 0) + val INSTANCE = JvmMetadataVersion(1, 1, 1) @JvmField val INVALID_VERSION = JvmMetadataVersion() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt index a5e68feddde..e2366fb5bca 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt @@ -25,7 +25,8 @@ class KotlinClassHeader( val bytecodeVersion: JvmBytecodeBinaryVersion, val data: Array?, val strings: Array?, - val multifileClassName: String? + val extraString: String?, + val extraInt: Int ) { // See kotlin.Metadata enum class Kind(val id: Int) { @@ -44,5 +45,27 @@ class KotlinClassHeader( } } + // See kotlin.Metadata + enum class MultifileClassKind(val id: Int) { + DELEGATING(0), + INHERITING(1); + + companion object { + private val entryById = values().associateBy(MultifileClassKind::id) + + @JvmStatic + fun getById(id: Int) = entryById[id] + } + } + + val multifileClassName: String? + get() = if (kind == Kind.MULTIFILE_CLASS_PART) extraString else null + + val multifileClassKind: MultifileClassKind? + get() = if (kind == Kind.MULTIFILE_CLASS || kind == Kind.MULTIFILE_CLASS_PART) + MultifileClassKind.getById(extraInt) + else + null + override fun toString() = "$kind version=$metadataVersion" } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java index 24953f4e050..018693b5ada 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java @@ -50,7 +50,8 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor private JvmMetadataVersion metadataVersion = null; private JvmBytecodeBinaryVersion bytecodeVersion = null; - private String multifileClassName = null; + private String extraString = null; + private int extraInt = 0; private String[] data = null; private String[] strings = null; private KotlinClassHeader.Kind headerKind = null; @@ -76,7 +77,8 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor bytecodeVersion != null ? bytecodeVersion : JvmBytecodeBinaryVersion.INVALID_VERSION, data, strings, - multifileClassName + extraString, + extraInt ); } @@ -135,9 +137,14 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor bytecodeVersion = new JvmBytecodeBinaryVersion((int[]) value); } } - else if (METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME.equals(string)) { + else if (METADATA_EXTRA_STRING_FIELD_NAME.equals(string)) { if (value instanceof String) { - multifileClassName = (String) value; + extraString = (String) value; + } + } + else if (METADATA_EXTRA_INT_FIELD_NAME.equals(string)) { + if (value instanceof Integer) { + extraInt = (Integer) value; } } } @@ -209,7 +216,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor } } else if ("multifileClassName".equals(string)) { - multifileClassName = value instanceof String ? (String) value : null; + extraString = value instanceof String ? (String) value : null; } } diff --git a/core/runtime.jvm/src/kotlin/Metadata.kt b/core/runtime.jvm/src/kotlin/Metadata.kt index 2700bc89785..d4868d718c9 100644 --- a/core/runtime.jvm/src/kotlin/Metadata.kt +++ b/core/runtime.jvm/src/kotlin/Metadata.kt @@ -55,5 +55,9 @@ internal annotation class Metadata( /** * An extra string. For a multi-file part class, internal name of the facade class. */ - val xs: String = "" + val xs: String = "", + /** + * An extra int. For multi-file class, represents code generation scheme. + */ + val xi: Int = 0 )