KT-11410: write multifile class code generation scheme to extra field (xi) in kotlin.Metadata.
This commit is contained in:
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
|
|||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
|
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.load.kotlin.incremental.IncrementalPackageFragmentProvider
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
|
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
|
||||||
@@ -330,6 +331,8 @@ class MultifileClassCodegen(
|
|||||||
arv.visit(null, internalName)
|
arv.visit(null, internalName)
|
||||||
}
|
}
|
||||||
arv.visitEnd()
|
arv.visitEnd()
|
||||||
|
val multifileClassKind = if (shouldGeneratePartHierarchy) INHERITING else DELEGATING
|
||||||
|
av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_KIND_FIELD_NAME, multifileClassKind.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
|
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.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||||
import org.jetbrains.kotlin.psi.KtProperty
|
import org.jetbrains.kotlin.psi.KtProperty
|
||||||
@@ -164,6 +165,8 @@ class MultifileClassPartCodegen(
|
|||||||
writeKotlinMetadata(v, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART) { av ->
|
writeKotlinMetadata(v, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART) { av ->
|
||||||
AsmUtil.writeAnnotationData(av, serializer, packageProto)
|
AsmUtil.writeAnnotationData(av, serializer, packageProto)
|
||||||
av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME, facadeClassType.internalName)
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -29,7 +29,10 @@ public final class JvmAnnotationNames {
|
|||||||
public static final String KIND_FIELD_NAME = "k";
|
public static final String KIND_FIELD_NAME = "k";
|
||||||
public static final String METADATA_DATA_FIELD_NAME = "d1";
|
public static final String METADATA_DATA_FIELD_NAME = "d1";
|
||||||
public static final String METADATA_STRINGS_FIELD_NAME = "d2";
|
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");
|
public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value");
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -32,7 +32,7 @@ class JvmMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
|
|||||||
var skipCheck: Boolean = false
|
var skipCheck: Boolean = false
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val INSTANCE = JvmMetadataVersion(1, 1, 0)
|
val INSTANCE = JvmMetadataVersion(1, 1, 1)
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val INVALID_VERSION = JvmMetadataVersion()
|
val INVALID_VERSION = JvmMetadataVersion()
|
||||||
|
|||||||
+24
-1
@@ -25,7 +25,8 @@ class KotlinClassHeader(
|
|||||||
val bytecodeVersion: JvmBytecodeBinaryVersion,
|
val bytecodeVersion: JvmBytecodeBinaryVersion,
|
||||||
val data: Array<String>?,
|
val data: Array<String>?,
|
||||||
val strings: Array<String>?,
|
val strings: Array<String>?,
|
||||||
val multifileClassName: String?
|
val extraString: String?,
|
||||||
|
val extraInt: Int
|
||||||
) {
|
) {
|
||||||
// See kotlin.Metadata
|
// See kotlin.Metadata
|
||||||
enum class Kind(val id: Int) {
|
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"
|
override fun toString() = "$kind version=$metadataVersion"
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-5
@@ -50,7 +50,8 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
|
|||||||
|
|
||||||
private JvmMetadataVersion metadataVersion = null;
|
private JvmMetadataVersion metadataVersion = null;
|
||||||
private JvmBytecodeBinaryVersion bytecodeVersion = null;
|
private JvmBytecodeBinaryVersion bytecodeVersion = null;
|
||||||
private String multifileClassName = null;
|
private String extraString = null;
|
||||||
|
private int extraInt = 0;
|
||||||
private String[] data = null;
|
private String[] data = null;
|
||||||
private String[] strings = null;
|
private String[] strings = null;
|
||||||
private KotlinClassHeader.Kind headerKind = null;
|
private KotlinClassHeader.Kind headerKind = null;
|
||||||
@@ -76,7 +77,8 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
|
|||||||
bytecodeVersion != null ? bytecodeVersion : JvmBytecodeBinaryVersion.INVALID_VERSION,
|
bytecodeVersion != null ? bytecodeVersion : JvmBytecodeBinaryVersion.INVALID_VERSION,
|
||||||
data,
|
data,
|
||||||
strings,
|
strings,
|
||||||
multifileClassName
|
extraString,
|
||||||
|
extraInt
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,9 +137,14 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
|
|||||||
bytecodeVersion = new JvmBytecodeBinaryVersion((int[]) value);
|
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) {
|
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)) {
|
else if ("multifileClassName".equals(string)) {
|
||||||
multifileClassName = value instanceof String ? (String) value : null;
|
extraString = value instanceof String ? (String) value : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,5 +55,9 @@ internal annotation class Metadata(
|
|||||||
/**
|
/**
|
||||||
* An extra string. For a multi-file part class, internal name of the facade class.
|
* 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
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user