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:
@@ -20,6 +20,7 @@ import com.intellij.openapi.vfs.VirtualFile;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
|
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.kotlin.header.KotlinClassFileHeader;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
|
||||||
@@ -70,7 +71,7 @@ public class CliVirtualFileFinder implements VirtualFileFinder {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
//NOTE: currently we use VirtualFileFinder to find Kotlin binaries only
|
//NOTE: currently we use VirtualFileFinder to find Kotlin binaries only
|
||||||
if (KotlinClassFileHeader.readKotlinHeaderFromClassFile(vFile) != null) {
|
if (KotlinClassFileHeader.readKotlinHeaderFromClassFile(new VirtualFileKotlinClass(vFile)) != null) {
|
||||||
return vFile;
|
return vFile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -110,7 +110,7 @@ public final class DeserializedDescriptorResolver {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass) {
|
private String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass) {
|
||||||
KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(kotlinClass.getFile());
|
KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(kotlinClass);
|
||||||
if (header instanceof SerializedDataHeader) {
|
if (header instanceof SerializedDataHeader) {
|
||||||
return ((SerializedDataHeader) header).getAnnotationData();
|
return ((SerializedDataHeader) header).getAnnotationData();
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -16,10 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.lang.resolve.kotlin.header;
|
package org.jetbrains.jet.lang.resolve.kotlin.header;
|
||||||
|
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.asm4.ClassReader;
|
import org.jetbrains.asm4.ClassReader;
|
||||||
|
import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -28,12 +28,12 @@ import static org.jetbrains.asm4.ClassReader.*;
|
|||||||
|
|
||||||
public abstract class KotlinClassFileHeader {
|
public abstract class KotlinClassFileHeader {
|
||||||
@Nullable
|
@Nullable
|
||||||
public static KotlinClassFileHeader readKotlinHeaderFromClassFile(@NotNull VirtualFile virtualFile) {
|
public static KotlinClassFileHeader readKotlinHeaderFromClassFile(@NotNull KotlinJvmBinaryClass kotlinClass) {
|
||||||
try {
|
try {
|
||||||
ClassReader reader = new ClassReader(virtualFile.contentsToByteArray());
|
ClassReader reader = new ClassReader(kotlinClass.getFile().contentsToByteArray());
|
||||||
ReadDataFromAnnotationVisitor visitor = new ReadDataFromAnnotationVisitor();
|
ReadDataFromAnnotationVisitor visitor = new ReadDataFromAnnotationVisitor();
|
||||||
reader.accept(visitor, SKIP_CODE | SKIP_FRAMES | SKIP_DEBUG);
|
reader.accept(visitor, SKIP_CODE | SKIP_FRAMES | SKIP_DEBUG);
|
||||||
return visitor.createHeader(virtualFile);
|
return visitor.createHeader(kotlinClass);
|
||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
|
|||||||
+3
-3
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.jet.lang.resolve.kotlin.header;
|
package org.jetbrains.jet.lang.resolve.kotlin.header;
|
||||||
|
|
||||||
import com.intellij.openapi.diagnostic.Logger;
|
import com.intellij.openapi.diagnostic.Logger;
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.asm4.AnnotationVisitor;
|
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.AbiVersionUtil;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
|
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
|
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 org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -75,13 +75,13 @@ import static org.jetbrains.jet.lang.resolve.java.AbiVersionUtil.isAbiVersionCom
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public KotlinClassFileHeader createHeader(@NotNull VirtualFile virtualFile) {
|
public KotlinClassFileHeader createHeader(@NotNull KotlinJvmBinaryClass kotlinClass) {
|
||||||
if (foundType == null) {
|
if (foundType == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fqName == 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;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.jetbrains.jet.descriptors.serialization.*;
|
import org.jetbrains.jet.descriptors.serialization.*;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassKind;
|
import org.jetbrains.jet.lang.descriptors.ClassKind;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaResolverPsiUtils;
|
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.KotlinClassFileHeader;
|
||||||
import org.jetbrains.jet.lang.resolve.kotlin.header.SerializedDataHeader;
|
import org.jetbrains.jet.lang.resolve.kotlin.header.SerializedDataHeader;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
@@ -102,23 +103,23 @@ public class JetFromJavaDescriptorHelper {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static ClassData getClassData(@NotNull PsiClass psiClass) {
|
private static ClassData getClassData(@NotNull PsiClass psiClass) {
|
||||||
VirtualFile virtualFile = getVirtualFileForPsiClass(psiClass);
|
String[] data = getAnnotationDataForKotlinClass(psiClass);
|
||||||
if (virtualFile != null) {
|
return data == null ? null : JavaProtoBufUtil.readClassDataFrom(data);
|
||||||
KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(virtualFile);
|
|
||||||
if (header instanceof SerializedDataHeader) {
|
|
||||||
return JavaProtoBufUtil.readClassDataFrom(((SerializedDataHeader) header).getAnnotationData());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static PackageData getPackageData(@NotNull PsiClass psiClass) {
|
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);
|
VirtualFile virtualFile = getVirtualFileForPsiClass(psiClass);
|
||||||
if (virtualFile != null) {
|
if (virtualFile != null) {
|
||||||
KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(virtualFile);
|
KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(new VirtualFileKotlinClass(virtualFile));
|
||||||
if (header instanceof SerializedDataHeader) {
|
if (header instanceof SerializedDataHeader) {
|
||||||
return JavaProtoBufUtil.readPackageDataFrom(((SerializedDataHeader) header).getAnnotationData());
|
return ((SerializedDataHeader) header).getAnnotationData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -129,14 +130,7 @@ public class JetFromJavaDescriptorHelper {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private static VirtualFile getVirtualFileForPsiClass(@NotNull PsiClass psiClass) {
|
private static VirtualFile getVirtualFileForPsiClass(@NotNull PsiClass psiClass) {
|
||||||
PsiFile psiFile = psiClass.getContainingFile();
|
PsiFile psiFile = psiClass.getContainingFile();
|
||||||
if (psiFile == null) {
|
return psiFile == null ? null : psiFile.getVirtualFile();
|
||||||
return null;
|
|
||||||
}
|
|
||||||
VirtualFile virtualFile = psiFile.getVirtualFile();
|
|
||||||
if (virtualFile == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return virtualFile;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@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.BindingTraceContext;
|
||||||
import org.jetbrains.jet.lang.resolve.MemberComparator;
|
import org.jetbrains.jet.lang.resolve.MemberComparator;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
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.KotlinClassFileHeader;
|
||||||
import org.jetbrains.jet.lang.resolve.kotlin.header.SerializedDataHeader;
|
import org.jetbrains.jet.lang.resolve.kotlin.header.SerializedDataHeader;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
@@ -62,7 +63,7 @@ public final class DecompiledDataFactory {
|
|||||||
new InjectorForJavaDescriptorResolver(project, new BindingTraceContext());
|
new InjectorForJavaDescriptorResolver(project, new BindingTraceContext());
|
||||||
this.javaDescriptorResolver = injector.getJavaDescriptorResolver();
|
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;
|
assert header instanceof SerializedDataHeader : "Decompiled data factory shouldn't be called on an unsupported file: " + classFile;
|
||||||
this.classFileHeader = (SerializedDataHeader) header;
|
this.classFileHeader = (SerializedDataHeader) header;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.jetbrains.jet.plugin.libraries;
|
|||||||
import com.intellij.openapi.fileTypes.StdFileTypes;
|
import com.intellij.openapi.fileTypes.StdFileTypes;
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.KotlinClassFileHeader;
|
||||||
import org.jetbrains.jet.lang.resolve.kotlin.header.SerializedDataHeader;
|
import org.jetbrains.jet.lang.resolve.kotlin.header.SerializedDataHeader;
|
||||||
|
|
||||||
@@ -29,7 +30,7 @@ public final class DecompiledUtils {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//TODO: check index
|
//TODO: check index
|
||||||
return KotlinClassFileHeader.readKotlinHeaderFromClassFile(file) instanceof SerializedDataHeader;
|
return KotlinClassFileHeader.readKotlinHeaderFromClassFile(new VirtualFileKotlinClass(file)) instanceof SerializedDataHeader;
|
||||||
}
|
}
|
||||||
|
|
||||||
private DecompiledUtils() {
|
private DecompiledUtils() {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.intellij.openapi.vfs.VirtualFile;
|
|||||||
import com.intellij.util.indexing.*;
|
import com.intellij.util.indexing.*;
|
||||||
import com.intellij.util.io.KeyDescriptor;
|
import com.intellij.util.io.KeyDescriptor;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.IncompatibleAnnotationHeader;
|
||||||
import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassFileHeader;
|
import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassFileHeader;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
@@ -74,7 +75,8 @@ public final class KotlinClassFileIndex extends ScalarIndexExtension<FqName> {
|
|||||||
@Override
|
@Override
|
||||||
public Map<FqName, Void> map(FileContent inputData) {
|
public Map<FqName, Void> map(FileContent inputData) {
|
||||||
try {
|
try {
|
||||||
KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(inputData.getFile());
|
KotlinClassFileHeader header =
|
||||||
|
KotlinClassFileHeader.readKotlinHeaderFromClassFile(new VirtualFileKotlinClass(inputData.getFile()));
|
||||||
if (header != null && !(header instanceof IncompatibleAnnotationHeader)) {
|
if (header != null && !(header instanceof IncompatibleAnnotationHeader)) {
|
||||||
return Collections.singletonMap(header.getFqName(), null);
|
return Collections.singletonMap(header.getFqName(), null);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user