Added classVersion to KotlinJvmBinaryClass

This commit is contained in:
Mikhael Bogdanov
2016-05-16 14:20:05 +03:00
parent 0ae2175a00
commit fc8058848f
5 changed files with 25 additions and 13 deletions
@@ -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() {
@@ -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)
}
}
}