From fc8058848f070ce007fb757d142079e439e1ccac Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 16 May 2016 14:20:05 +0300 Subject: [PATCH] Added classVersion to KotlinJvmBinaryClass --- .../kotlin/incremental/LocalFileKotlinClass.kt | 9 +++++---- .../kotlin/load/kotlin/FileBasedKotlinClass.java | 15 ++++++++++++--- .../kotlin/load/kotlin/VirtualFileKotlinClass.kt | 9 +++++---- .../jetbrains/kotlin/codegen/InlineTestUtil.kt | 4 ++-- .../load/kotlin/reflect/ReflectKotlinClass.kt | 1 + 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/build-common/src/org/jetbrains/kotlin/incremental/LocalFileKotlinClass.kt b/build-common/src/org/jetbrains/kotlin/incremental/LocalFileKotlinClass.kt index 1c7ecab6ca1..859392686af 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/LocalFileKotlinClass.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/LocalFileKotlinClass.kt @@ -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) } } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java index 68557c199e0..71eb9182d64 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java @@ -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 create( @NotNull byte[] fileContents, - @NotNull Function3 factory + @NotNull Function4 factory ) { final ReadKotlinClassHeaderAnnotationVisitor readHeaderVisitor = new ReadKotlinClassHeaderAnnotationVisitor(); final Ref classNameRef = Ref.create(); + final Ref 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() { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClass.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClass.kt index 31db64c4ed5..f8f2d56625c 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClass.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClass.kt @@ -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) } } } diff --git a/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt b/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt index d70a569016f..4deef636409 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt @@ -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() diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/ReflectKotlinClass.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/ReflectKotlinClass.kt index df71b7e6d3d..16a017364ae 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/ReflectKotlinClass.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/ReflectKotlinClass.kt @@ -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