Added classVersion to KotlinJvmBinaryClass
This commit is contained in:
@@ -26,16 +26,17 @@ class LocalFileKotlinClass private constructor(
|
||||
private val file: File,
|
||||
private val fileContents: ByteArray,
|
||||
className: ClassId,
|
||||
classVersion: Int,
|
||||
classHeader: KotlinClassHeader,
|
||||
innerClasses: FileBasedKotlinClass.InnerClassesInfo
|
||||
) : FileBasedKotlinClass(className, classHeader, innerClasses) {
|
||||
innerClasses: InnerClassesInfo
|
||||
) : FileBasedKotlinClass(className, classVersion, classHeader, innerClasses) {
|
||||
|
||||
companion object {
|
||||
fun create(file: File): LocalFileKotlinClass? {
|
||||
val fileContents = file.readBytes()
|
||||
return FileBasedKotlinClass.create(fileContents) {
|
||||
className, classHeader, innerClasses ->
|
||||
LocalFileKotlinClass(file, fileContents, className, classHeader, innerClasses)
|
||||
className, classVersion, classHeader, innerClasses ->
|
||||
LocalFileKotlinClass(file, fileContents, className, classVersion, classHeader, innerClasses)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
-3
@@ -17,7 +17,7 @@
|
||||
package org.jetbrains.kotlin.load.kotlin;
|
||||
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import kotlin.jvm.functions.Function3;
|
||||
import kotlin.jvm.functions.Function4;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.descriptors.SourceElement;
|
||||
@@ -38,15 +38,18 @@ import static org.jetbrains.org.objectweb.asm.Opcodes.ASM5;
|
||||
|
||||
public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
|
||||
private final ClassId classId;
|
||||
private final int classVersion;
|
||||
private final KotlinClassHeader classHeader;
|
||||
private final InnerClassesInfo innerClasses;
|
||||
|
||||
protected FileBasedKotlinClass(
|
||||
@NotNull ClassId classId,
|
||||
int classVersion,
|
||||
@NotNull KotlinClassHeader classHeader,
|
||||
@NotNull InnerClassesInfo innerClasses
|
||||
) {
|
||||
this.classId = classId;
|
||||
this.classVersion = classVersion;
|
||||
this.classHeader = classHeader;
|
||||
this.innerClasses = innerClasses;
|
||||
}
|
||||
@@ -84,15 +87,17 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
|
||||
@Nullable
|
||||
public static <T extends FileBasedKotlinClass> T create(
|
||||
@NotNull byte[] fileContents,
|
||||
@NotNull Function3<ClassId, KotlinClassHeader, InnerClassesInfo, T> factory
|
||||
@NotNull Function4<ClassId, Integer, KotlinClassHeader, InnerClassesInfo, T> factory
|
||||
) {
|
||||
final ReadKotlinClassHeaderAnnotationVisitor readHeaderVisitor = new ReadKotlinClassHeaderAnnotationVisitor();
|
||||
final Ref<String> classNameRef = Ref.create();
|
||||
final Ref<Integer> classVersion = Ref.create();
|
||||
final InnerClassesInfo innerClasses = new InnerClassesInfo();
|
||||
new ClassReader(fileContents).accept(new ClassVisitor(ASM5) {
|
||||
@Override
|
||||
public void visit(int version, int access, @NotNull String name, String signature, String superName, String[] interfaces) {
|
||||
classNameRef.set(name);
|
||||
classVersion.set(version);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -118,7 +123,7 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
|
||||
if (header == null) return null;
|
||||
|
||||
ClassId id = resolveNameByInternalName(className, innerClasses);
|
||||
return factory.invoke(id, header, innerClasses);
|
||||
return factory.invoke(id, classVersion.get(), header, innerClasses);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -127,6 +132,10 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
|
||||
return classId;
|
||||
}
|
||||
|
||||
public int getClassVersion() {
|
||||
return classVersion;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public KotlinClassHeader getClassHeader() {
|
||||
|
||||
+5
-4
@@ -29,9 +29,10 @@ import java.io.IOException
|
||||
class VirtualFileKotlinClass private constructor(
|
||||
val file: VirtualFile,
|
||||
className: ClassId,
|
||||
classVersion: Int,
|
||||
classHeader: KotlinClassHeader,
|
||||
innerClasses: FileBasedKotlinClass.InnerClassesInfo
|
||||
) : FileBasedKotlinClass(className, classHeader, innerClasses) {
|
||||
innerClasses: InnerClassesInfo
|
||||
) : FileBasedKotlinClass(className, classVersion, classHeader, innerClasses) {
|
||||
|
||||
override val location: String
|
||||
get() = file.path
|
||||
@@ -63,8 +64,8 @@ class VirtualFileKotlinClass private constructor(
|
||||
val byteContent = fileContent ?: file.contentsToByteArray(false)
|
||||
if (!byteContent.isEmpty()) {
|
||||
return@time FileBasedKotlinClass.create(byteContent) {
|
||||
name, header, innerClasses ->
|
||||
VirtualFileKotlinClass(file, name, header, innerClasses)
|
||||
name, classVersion, header, innerClasses ->
|
||||
VirtualFileKotlinClass(file, name, classVersion, header, innerClasses)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,8 +178,8 @@ object InlineTestUtil {
|
||||
|
||||
private fun loadBinaryClass(file: OutputFile): KotlinJvmBinaryClass {
|
||||
val klass = FileBasedKotlinClass.create(file.asByteArray()) {
|
||||
className, classHeader, innerClasses ->
|
||||
object : FileBasedKotlinClass(className, classHeader, innerClasses) {
|
||||
className, classVersion, classHeader, innerClasses ->
|
||||
object : FileBasedKotlinClass(className, classVersion, classHeader, innerClasses) {
|
||||
override val location: String
|
||||
get() = throw UnsupportedOperationException()
|
||||
override fun getFileContents(): ByteArray = throw UnsupportedOperationException()
|
||||
|
||||
+1
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.load.kotlin.reflect
|
||||
|
||||
import com.sun.xml.internal.ws.org.objectweb.asm.Opcodes
|
||||
import org.jetbrains.kotlin.load.java.structure.reflect.classId
|
||||
import org.jetbrains.kotlin.load.java.structure.reflect.desc
|
||||
import org.jetbrains.kotlin.load.java.structure.reflect.isEnumClassOrSpecializedEnumEntryClass
|
||||
|
||||
Reference in New Issue
Block a user