JVM_IR: read serialized IR from annotation

This commit is contained in:
Georgy Bronnikov
2021-03-05 17:31:31 +03:00
committed by TeamCityServer
parent baaecaa052
commit 7dbdb311e1
2 changed files with 33 additions and 2 deletions
@@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.SourceElement; import org.jetbrains.kotlin.descriptors.SourceElement;
import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.load.java.JvmAnnotationNames;
import org.jetbrains.kotlin.metadata.jvm.deserialization.BitEncoding;
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion; import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion;
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
@@ -57,6 +58,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
private String[] strings = null; private String[] strings = null;
private String[] incompatibleData = null; private String[] incompatibleData = null;
private KotlinClassHeader.Kind headerKind = null; private KotlinClassHeader.Kind headerKind = null;
private String[] serializedIrFields = null;
@Nullable @Nullable
public KotlinClassHeader createHeader() { public KotlinClassHeader createHeader() {
@@ -77,7 +79,22 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
return null; return null;
} }
return new KotlinClassHeader(headerKind, metadataVersion, data, incompatibleData, strings, extraString, extraInt, packageName); byte[] serializedIr = null;
if (serializedIrFields != null) {
serializedIr = BitEncoding.decodeBytes(serializedIrFields);
}
return new KotlinClassHeader(
headerKind,
metadataVersion,
data,
incompatibleData,
strings,
extraString,
extraInt,
packageName,
serializedIr
);
} }
private boolean shouldHaveData() { private boolean shouldHaveData() {
@@ -161,6 +178,9 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
else if (METADATA_STRINGS_FIELD_NAME.equals(string)) { else if (METADATA_STRINGS_FIELD_NAME.equals(string)) {
return stringsArrayVisitor(); return stringsArrayVisitor();
} }
else if (METADATA_SERIALIZED_IR_FIELD_NAME.equals(string)) {
return serializedIrArrayVisitor();
}
else { else {
return null; return null;
} }
@@ -186,6 +206,16 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
}; };
} }
@NotNull
private AnnotationArrayArgumentVisitor serializedIrArrayVisitor() {
return new CollectStringArrayAnnotationVisitor() {
@Override
protected void visitEnd(@NotNull String[] result) {
serializedIrFields = result;
}
};
}
@Override @Override
public void visitEnum(@NotNull Name name, @NotNull ClassId enumClassId, @NotNull Name enumEntryName) { public void visitEnum(@NotNull Name name, @NotNull ClassId enumClassId, @NotNull Name enumEntryName) {
} }
@@ -18,7 +18,8 @@ class KotlinClassHeader(
val strings: Array<String>?, val strings: Array<String>?,
private val extraString: String?, private val extraString: String?,
val extraInt: Int, val extraInt: Int,
val packageName: String? val packageName: String?,
val serializedIr: ByteArray?,
) { ) {
// See kotlin.Metadata // See kotlin.Metadata
enum class Kind(val id: Int) { enum class Kind(val id: Int) {