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 8cfab0592fe..4a09f5c3cbc 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 @@ -112,13 +112,14 @@ public final class DeserializedDescriptorResolver { @Nullable private String[] readData(@NotNull VirtualFile virtualFile) { KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(virtualFile); - if (header instanceof SerializedDataHeader && header.isCompatibleKotlinCompiledFile()) { + if (header instanceof SerializedDataHeader) { return ((SerializedDataHeader) header).getAnnotationData(); } if (header != null) { errorReporter.reportIncompatibleAbiVersion(header.getFqName(), virtualFile, header.getVersion()); } + return null; } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/OldAnnotationHeader.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/IncompatibleAnnotationHeader.java similarity index 76% rename from core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/OldAnnotationHeader.java rename to core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/IncompatibleAnnotationHeader.java index f593958d056..f870f4d49c0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/OldAnnotationHeader.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/IncompatibleAnnotationHeader.java @@ -17,11 +17,10 @@ package org.jetbrains.jet.lang.resolve.kotlin.header; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.resolve.java.AbiVersionUtil; import org.jetbrains.jet.lang.resolve.name.FqName; -public class OldAnnotationHeader extends KotlinClassFileHeader { - protected OldAnnotationHeader(@NotNull FqName fqName) { - super(AbiVersionUtil.INVALID_VERSION, fqName); +public class IncompatibleAnnotationHeader extends KotlinClassFileHeader { + protected IncompatibleAnnotationHeader(int version, @NotNull FqName fqName) { + super(version, fqName); } } 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 7263e841580..4e7e4374b42 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 @@ -25,7 +25,6 @@ import org.jetbrains.jet.lang.resolve.name.FqName; import java.io.IOException; import static org.jetbrains.asm4.ClassReader.*; -import static org.jetbrains.jet.lang.resolve.java.AbiVersionUtil.isAbiVersionCompatible; public abstract class KotlinClassFileHeader { @Nullable @@ -60,11 +59,4 @@ public abstract class KotlinClassFileHeader { public FqName getFqName() { return fqName; } - - /** - * @return true if this is a header for compiled Kotlin file with correct abi version which can be processed by compiler or the IDE - */ - public boolean isCompatibleKotlinCompiledFile() { - return isAbiVersionCompatible(version); - } } 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 85899793b5b..b3705dcd0b3 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 @@ -84,19 +84,29 @@ import static org.jetbrains.jet.lang.resolve.java.AbiVersionUtil.isAbiVersionCom return null; } + if (!AbiVersionUtil.isAbiVersionCompatible(version)) { + return new IncompatibleAnnotationHeader(version, fqName); + } + switch (foundType) { case CLASS: - return SerializedDataHeader.create(version, annotationData, SerializedDataHeader.Kind.CLASS, fqName); + return serializedDataHeader(SerializedDataHeader.Kind.CLASS, fqName); case PACKAGE: - return SerializedDataHeader.create(version, annotationData, SerializedDataHeader.Kind.PACKAGE, fqName); - case OLD_CLASS: - case OLD_PACKAGE: - return new OldAnnotationHeader(fqName); + return serializedDataHeader(SerializedDataHeader.Kind.PACKAGE, fqName); default: - throw new UnsupportedOperationException("Unknown HeaderType: " + foundType); + throw new UnsupportedOperationException("Unknown compatible HeaderType: " + foundType); } } + @Nullable + private SerializedDataHeader serializedDataHeader(@NotNull SerializedDataHeader.Kind kind, @NotNull FqName fqName) { + if (annotationData == null) { + LOG.error("Kotlin annotation " + foundType + " is incorrect for class: " + fqName); + return null; + } + return new SerializedDataHeader(version, annotationData, kind, fqName); + } + @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { fqName = JvmClassName.byInternalName(name).getFqName(); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/SerializedDataHeader.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/SerializedDataHeader.java index e94728717da..da6a62f2d59 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/SerializedDataHeader.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/header/SerializedDataHeader.java @@ -16,16 +16,10 @@ package org.jetbrains.jet.lang.resolve.kotlin.header; -import com.intellij.openapi.diagnostic.Logger; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.name.FqName; -import static org.jetbrains.jet.lang.resolve.java.AbiVersionUtil.isAbiVersionCompatible; - public class SerializedDataHeader extends KotlinClassFileHeader { - private static final Logger LOG = Logger.getInstance(SerializedDataHeader.class); - public enum Kind { CLASS, PACKAGE @@ -34,22 +28,13 @@ public class SerializedDataHeader extends KotlinClassFileHeader { private final String[] data; private final Kind kind; - private SerializedDataHeader(int version, @Nullable String[] annotationData, @NotNull Kind kind, @NotNull FqName fqName) { + protected SerializedDataHeader(int version, @NotNull String[] annotationData, @NotNull Kind kind, @NotNull FqName fqName) { super(version, fqName); this.data = annotationData; this.kind = kind; } - @Nullable - public static SerializedDataHeader create(int version, @Nullable String[] annotationData, @NotNull Kind kind, @NotNull FqName fqName) { - if (isAbiVersionCompatible(version) && annotationData == null) { - LOG.error("Kotlin annotation " + kind + " is incorrect for class: " + fqName); - return null; - } - return new SerializedDataHeader(version, annotationData, kind, fqName); - } - - @Nullable + @NotNull public String[] getAnnotationData() { return data; } diff --git a/idea/src/org/jetbrains/jet/plugin/caches/JetFromJavaDescriptorHelper.java b/idea/src/org/jetbrains/jet/plugin/caches/JetFromJavaDescriptorHelper.java index ec4290af8d1..9d1deaf33b6 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/JetFromJavaDescriptorHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/caches/JetFromJavaDescriptorHelper.java @@ -106,10 +106,7 @@ public class JetFromJavaDescriptorHelper { if (virtualFile != null) { KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(virtualFile); if (header instanceof SerializedDataHeader) { - String[] data = ((SerializedDataHeader) header).getAnnotationData(); - if (data != null) { - return JavaProtoBufUtil.readClassDataFrom(data); - } + return JavaProtoBufUtil.readClassDataFrom(((SerializedDataHeader) header).getAnnotationData()); } } return null; @@ -121,10 +118,7 @@ public class JetFromJavaDescriptorHelper { if (virtualFile != null) { KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(virtualFile); if (header instanceof SerializedDataHeader) { - String[] data = ((SerializedDataHeader) header).getAnnotationData(); - if (data != null) { - return JavaProtoBufUtil.readPackageDataFrom(data); - } + return JavaProtoBufUtil.readPackageDataFrom(((SerializedDataHeader) header).getAnnotationData()); } } return null; diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledUtils.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledUtils.java index a88c765d495..f1fa46ea5fc 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledUtils.java @@ -29,8 +29,7 @@ public final class DecompiledUtils { return false; } //TODO: check index - KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(file); - return header instanceof SerializedDataHeader && header.isCompatibleKotlinCompiledFile(); + return KotlinClassFileHeader.readKotlinHeaderFromClassFile(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 33842726ad1..22d32af3c80 100644 --- a/idea/src/org/jetbrains/jet/plugin/vfilefinder/KotlinClassFileIndex.java +++ b/idea/src/org/jetbrains/jet/plugin/vfilefinder/KotlinClassFileIndex.java @@ -59,7 +59,7 @@ public final class KotlinClassFileIndex extends ScalarIndexExtension { public Map map(FileContent inputData) { try { KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(inputData.getFile()); - if (header instanceof SerializedDataHeader && header.isCompatibleKotlinCompiledFile()) { + if (header instanceof SerializedDataHeader) { return Collections.singletonMap(header.getFqName(), null); } }