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.kotlin.descriptors.SourceElement;
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.name.ClassId;
import org.jetbrains.kotlin.name.FqName;
@@ -57,6 +58,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
private String[] strings = null;
private String[] incompatibleData = null;
private KotlinClassHeader.Kind headerKind = null;
private String[] serializedIrFields = null;
@Nullable
public KotlinClassHeader createHeader() {
@@ -77,7 +79,22 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
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() {
@@ -161,6 +178,9 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
else if (METADATA_STRINGS_FIELD_NAME.equals(string)) {
return stringsArrayVisitor();
}
else if (METADATA_SERIALIZED_IR_FIELD_NAME.equals(string)) {
return serializedIrArrayVisitor();
}
else {
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
public void visitEnum(@NotNull Name name, @NotNull ClassId enumClassId, @NotNull Name enumEntryName) {
}
@@ -18,7 +18,8 @@ class KotlinClassHeader(
val strings: Array<String>?,
private val extraString: String?,
val extraInt: Int,
val packageName: String?
val packageName: String?,
val serializedIr: ByteArray?,
) {
// See kotlin.Metadata
enum class Kind(val id: Int) {