Change KotlinClassFileHeader loading interface

It should be able to load the header based on an abstract KotlinJvmBinaryClass,
not only the VirtualFile-based one
This commit is contained in:
Alexander Udalov
2013-09-25 19:17:02 +04:00
parent 2eebcd91c0
commit a5a80a9ccc
8 changed files with 29 additions and 30 deletions
@@ -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;
}
}
@@ -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();
}
@@ -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);
@@ -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;
}
@@ -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
@@ -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;
}
@@ -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() {
@@ -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<FqName> {
@Override
public Map<FqName, Void> 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);
}