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
@@ -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)
} }
} }
} }
@@ -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() {
@@ -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()
@@ -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