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