KT-11410: write multifile class code generation scheme to extra field (xi) in kotlin.Metadata.

This commit is contained in:
Dmitry Petrov
2016-03-24 15:41:14 +03:00
parent d30ab50532
commit 4c4141ea49
7 changed files with 52 additions and 9 deletions
@@ -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");
@@ -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()
@@ -25,7 +25,8 @@ class KotlinClassHeader(
val bytecodeVersion: JvmBytecodeBinaryVersion,
val data: Array<String>?,
val strings: Array<String>?,
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"
}
@@ -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;
}
}