From a5a80a9ccc540fcca05e1d84610dd493786bc678 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 25 Sep 2013 19:17:02 +0400 Subject: [PATCH] Change KotlinClassFileHeader loading interface It should be able to load the header based on an abstract KotlinJvmBinaryClass, not only the VirtualFile-based one --- .../jvm/compiler/CliVirtualFileFinder.java | 3 +- .../DeserializedDescriptorResolver.java | 2 +- .../kotlin/header/KotlinClassFileHeader.java | 8 ++--- .../header/ReadDataFromAnnotationVisitor.java | 6 ++-- .../caches/JetFromJavaDescriptorHelper.java | 30 ++++++++----------- .../libraries/DecompiledDataFactory.java | 3 +- .../jet/plugin/libraries/DecompiledUtils.java | 3 +- .../vfilefinder/KotlinClassFileIndex.java | 4 ++- 8 files changed, 29 insertions(+), 30 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliVirtualFileFinder.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliVirtualFileFinder.java index e9471c6415a..9b2ba279596 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliVirtualFileFinder.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliVirtualFileFinder.java @@ -20,6 +20,7 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder; +import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileKotlinClass; import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassFileHeader; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -70,7 +71,7 @@ public class CliVirtualFileFinder implements VirtualFileFinder { return null; } //NOTE: currently we use VirtualFileFinder to find Kotlin binaries only - if (KotlinClassFileHeader.readKotlinHeaderFromClassFile(vFile) != null) { + if (KotlinClassFileHeader.readKotlinHeaderFromClassFile(new VirtualFileKotlinClass(vFile)) != null) { return vFile; } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java index 38d345a6329..b7fe47d3de3 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java @@ -110,7 +110,7 @@ public final class DeserializedDescriptorResolver { @Nullable private String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass) { - KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(kotlinClass.getFile()); + KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(kotlinClass); if (header instanceof SerializedDataHeader) { return ((SerializedDataHeader) header).getAnnotationData(); } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/KotlinClassFileHeader.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/KotlinClassFileHeader.java index 4e7e4374b42..e0149dbd4ed 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/KotlinClassFileHeader.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/KotlinClassFileHeader.java @@ -16,10 +16,10 @@ package org.jetbrains.jet.lang.resolve.kotlin.header; -import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.asm4.ClassReader; +import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass; import org.jetbrains.jet.lang.resolve.name.FqName; import java.io.IOException; @@ -28,12 +28,12 @@ import static org.jetbrains.asm4.ClassReader.*; public abstract class KotlinClassFileHeader { @Nullable - public static KotlinClassFileHeader readKotlinHeaderFromClassFile(@NotNull VirtualFile virtualFile) { + public static KotlinClassFileHeader readKotlinHeaderFromClassFile(@NotNull KotlinJvmBinaryClass kotlinClass) { try { - ClassReader reader = new ClassReader(virtualFile.contentsToByteArray()); + ClassReader reader = new ClassReader(kotlinClass.getFile().contentsToByteArray()); ReadDataFromAnnotationVisitor visitor = new ReadDataFromAnnotationVisitor(); reader.accept(visitor, SKIP_CODE | SKIP_FRAMES | SKIP_DEBUG); - return visitor.createHeader(virtualFile); + return visitor.createHeader(kotlinClass); } catch (IOException e) { throw new RuntimeException(e); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/ReadDataFromAnnotationVisitor.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/ReadDataFromAnnotationVisitor.java index 131587df8cc..cf8e7dfcf37 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/ReadDataFromAnnotationVisitor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/ReadDataFromAnnotationVisitor.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.resolve.kotlin.header; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.asm4.AnnotationVisitor; @@ -26,6 +25,7 @@ import org.jetbrains.asm4.Opcodes; import org.jetbrains.jet.lang.resolve.java.AbiVersionUtil; import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames; import org.jetbrains.jet.lang.resolve.java.JvmClassName; +import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass; import org.jetbrains.jet.lang.resolve.name.FqName; import java.util.ArrayList; @@ -75,13 +75,13 @@ import static org.jetbrains.jet.lang.resolve.java.AbiVersionUtil.isAbiVersionCom } @Nullable - public KotlinClassFileHeader createHeader(@NotNull VirtualFile virtualFile) { + public KotlinClassFileHeader createHeader(@NotNull KotlinJvmBinaryClass kotlinClass) { if (foundType == null) { return null; } if (fqName == null) { - LOG.error("Class doesn't have a name in the bytecode: " + virtualFile); + LOG.error("Class doesn't have a name in the bytecode: " + kotlinClass); return null; } diff --git a/idea/src/org/jetbrains/jet/plugin/caches/JetFromJavaDescriptorHelper.java b/idea/src/org/jetbrains/jet/plugin/caches/JetFromJavaDescriptorHelper.java index 9d1deaf33b6..148ebb8e87f 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/JetFromJavaDescriptorHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/caches/JetFromJavaDescriptorHelper.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.descriptors.serialization.*; import org.jetbrains.jet.lang.descriptors.ClassKind; import org.jetbrains.jet.lang.resolve.java.JavaResolverPsiUtils; +import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileKotlinClass; import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassFileHeader; import org.jetbrains.jet.lang.resolve.kotlin.header.SerializedDataHeader; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -102,23 +103,23 @@ public class JetFromJavaDescriptorHelper { @Nullable private static ClassData getClassData(@NotNull PsiClass psiClass) { - VirtualFile virtualFile = getVirtualFileForPsiClass(psiClass); - if (virtualFile != null) { - KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(virtualFile); - if (header instanceof SerializedDataHeader) { - return JavaProtoBufUtil.readClassDataFrom(((SerializedDataHeader) header).getAnnotationData()); - } - } - return null; + String[] data = getAnnotationDataForKotlinClass(psiClass); + return data == null ? null : JavaProtoBufUtil.readClassDataFrom(data); } @Nullable private static PackageData getPackageData(@NotNull PsiClass psiClass) { + String[] data = getAnnotationDataForKotlinClass(psiClass); + return data == null ? null : JavaProtoBufUtil.readPackageDataFrom(data); + } + + @Nullable + private static String[] getAnnotationDataForKotlinClass(@NotNull PsiClass psiClass) { VirtualFile virtualFile = getVirtualFileForPsiClass(psiClass); if (virtualFile != null) { - KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(virtualFile); + KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(new VirtualFileKotlinClass(virtualFile)); if (header instanceof SerializedDataHeader) { - return JavaProtoBufUtil.readPackageDataFrom(((SerializedDataHeader) header).getAnnotationData()); + return ((SerializedDataHeader) header).getAnnotationData(); } } return null; @@ -129,14 +130,7 @@ public class JetFromJavaDescriptorHelper { @Nullable private static VirtualFile getVirtualFileForPsiClass(@NotNull PsiClass psiClass) { PsiFile psiFile = psiClass.getContainingFile(); - if (psiFile == null) { - return null; - } - VirtualFile virtualFile = psiFile.getVirtualFile(); - if (virtualFile == null) { - return null; - } - return virtualFile; + return psiFile == null ? null : psiFile.getVirtualFile(); } @Nullable diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java index a945e387cce..544476e03d8 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingTraceContext; import org.jetbrains.jet.lang.resolve.MemberComparator; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; +import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileKotlinClass; import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassFileHeader; import org.jetbrains.jet.lang.resolve.kotlin.header.SerializedDataHeader; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -62,7 +63,7 @@ public final class DecompiledDataFactory { new InjectorForJavaDescriptorResolver(project, new BindingTraceContext()); this.javaDescriptorResolver = injector.getJavaDescriptorResolver(); - KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(classFile); + KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(new VirtualFileKotlinClass(classFile)); assert header instanceof SerializedDataHeader : "Decompiled data factory shouldn't be called on an unsupported file: " + classFile; this.classFileHeader = (SerializedDataHeader) header; } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledUtils.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledUtils.java index f1fa46ea5fc..4a12db214b1 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledUtils.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.plugin.libraries; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileKotlinClass; import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassFileHeader; import org.jetbrains.jet.lang.resolve.kotlin.header.SerializedDataHeader; @@ -29,7 +30,7 @@ public final class DecompiledUtils { return false; } //TODO: check index - return KotlinClassFileHeader.readKotlinHeaderFromClassFile(file) instanceof SerializedDataHeader; + return KotlinClassFileHeader.readKotlinHeaderFromClassFile(new VirtualFileKotlinClass(file)) instanceof SerializedDataHeader; } private DecompiledUtils() { diff --git a/idea/src/org/jetbrains/jet/plugin/vfilefinder/KotlinClassFileIndex.java b/idea/src/org/jetbrains/jet/plugin/vfilefinder/KotlinClassFileIndex.java index e8b285701f7..f26634edfe5 100644 --- a/idea/src/org/jetbrains/jet/plugin/vfilefinder/KotlinClassFileIndex.java +++ b/idea/src/org/jetbrains/jet/plugin/vfilefinder/KotlinClassFileIndex.java @@ -22,6 +22,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.indexing.*; import com.intellij.util.io.KeyDescriptor; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileKotlinClass; import org.jetbrains.jet.lang.resolve.kotlin.header.IncompatibleAnnotationHeader; import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassFileHeader; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -74,7 +75,8 @@ public final class KotlinClassFileIndex extends ScalarIndexExtension { @Override public Map map(FileContent inputData) { try { - KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(inputData.getFile()); + KotlinClassFileHeader header = + KotlinClassFileHeader.readKotlinHeaderFromClassFile(new VirtualFileKotlinClass(inputData.getFile())); if (header != null && !(header instanceof IncompatibleAnnotationHeader)) { return Collections.singletonMap(header.getFqName(), null); }