diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.java index 3022868a1d7..5878b78e2e1 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.java @@ -33,7 +33,6 @@ import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.kotlin.load.java.JavaBindingContext; import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.components.TraceBasedErrorReporter; -import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass; import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.resolve.AnalyzingUtils; import org.jetbrains.kotlin.resolve.BindingContext; @@ -148,14 +147,15 @@ public final class AnalyzerWithCompilerReport { assert analysisResult != null; BindingContext bindingContext = analysisResult.getBindingContext(); - Collection errorClasses = bindingContext.getKeys(TraceBasedErrorReporter.ABI_VERSION_ERRORS); - for (VirtualFileKotlinClass kotlinClass : errorClasses) { - Integer abiVersion = bindingContext.get(TraceBasedErrorReporter.ABI_VERSION_ERRORS, kotlinClass); - String path = toSystemDependentName(kotlinClass.getFile().getPath()); + Collection errorClasses = bindingContext.getKeys(TraceBasedErrorReporter.ABI_VERSION_ERRORS); + for (String kotlinClass : errorClasses) { + TraceBasedErrorReporter.AbiVersionErrorData data = bindingContext.get(TraceBasedErrorReporter.ABI_VERSION_ERRORS, kotlinClass); + assert data != null; + String path = toSystemDependentName(kotlinClass); messageCollectorWrapper.report(CompilerMessageSeverity.ERROR, - "Class '" + JvmClassName.byClassId(kotlinClass.getClassId()) + + "Class '" + JvmClassName.byClassId(data.classId) + "' was compiled with an incompatible version of Kotlin. " + - "Its ABI version is " + abiVersion + ", expected ABI version is " + JvmAbi.VERSION, + "Its ABI version is " + data.actualVersion + ", expected ABI version is " + JvmAbi.VERSION, CompilerMessageLocation.create(path, 0, 0)); } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/TraceBasedErrorReporter.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/TraceBasedErrorReporter.java index cb30ba60196..2c7f2b1a452 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/TraceBasedErrorReporter.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/TraceBasedErrorReporter.java @@ -21,10 +21,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; import org.jetbrains.kotlin.descriptors.ClassDescriptor; -import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass; -import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass; +import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.OverrideResolver; +import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter; import org.jetbrains.kotlin.util.slicedMap.Slices; import org.jetbrains.kotlin.util.slicedMap.WritableSlice; @@ -34,7 +34,17 @@ import java.util.List; public class TraceBasedErrorReporter implements ErrorReporter { private static final Logger LOG = Logger.getInstance(TraceBasedErrorReporter.class); - public static final WritableSlice ABI_VERSION_ERRORS = Slices.createCollectiveSlice(); + public static class AbiVersionErrorData { + public final int actualVersion; + public final ClassId classId; + + public AbiVersionErrorData(int actualVersion, @NotNull ClassId classId) { + this.actualVersion = actualVersion; + this.classId = classId; + } + } + + public static final WritableSlice ABI_VERSION_ERRORS = Slices.createCollectiveSlice(); public static final WritableSlice> INCOMPLETE_HIERARCHY = Slices.createCollectiveSlice(); private BindingTrace trace; @@ -45,8 +55,8 @@ public class TraceBasedErrorReporter implements ErrorReporter { } @Override - public void reportIncompatibleAbiVersion(@NotNull KotlinJvmBinaryClass kotlinClass, int actualVersion) { - trace.record(ABI_VERSION_ERRORS, (VirtualFileKotlinClass) kotlinClass, actualVersion); + public void reportIncompatibleAbiVersion(@NotNull ClassId classId, @NotNull String filePath, int actualVersion) { + trace.record(ABI_VERSION_ERRORS, filePath, new AbiVersionErrorData(actualVersion, classId)); } @Override 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 5ab495d6c01..3c964a723a8 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 @@ -33,6 +33,8 @@ public class VirtualFileKotlinClass private( innerClasses: FileBasedKotlinClass.InnerClassesInfo ) : FileBasedKotlinClass(className, classHeader, innerClasses) { + override fun getLocation() = file.getPath() + override fun getFileContents(): ByteArray { try { return file.contentsToByteArray() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/DescriptorResolverUtils.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/DescriptorResolverUtils.java index fb1517f9e4c..6ccdb43e4b8 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/DescriptorResolverUtils.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/DescriptorResolverUtils.java @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.load.java.structure.*; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.OverridingUtil; +import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter; import java.util.Collection; import java.util.HashSet; diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt index 154e8d384aa..8e918dfd2ea 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.load.java.lazy import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.load.java.lazy.types.LazyJavaTypeResolver import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.components.* import org.jetbrains.kotlin.load.kotlin.DeserializedDescriptorResolver @@ -27,6 +26,7 @@ import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder import org.jetbrains.kotlin.load.java.structure.JavaPropertyInitializerEvaluator import org.jetbrains.kotlin.load.java.sources.JavaSourceElementFactory import org.jetbrains.kotlin.load.java.structure.JavaTypeParameterListOwner +import org.jetbrains.kotlin.serialization.deserialization.* open class GlobalJavaResolverContext( val storageManager: StorageManager, diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/resolvers.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/resolvers.kt index 09f81b5e43f..c83f139ef62 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/resolvers.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/resolvers.kt @@ -87,7 +87,7 @@ private fun LazyJavaResolverContext.resolveBinaryClass(kotlinClass: KotlinJvmBin val header = kotlinClass.getClassHeader() if (!header.isCompatibleAbiVersion) { - errorReporter.reportIncompatibleAbiVersion(kotlinClass, header.version) + errorReporter.reportIncompatibleAbiVersion(kotlinClass.getClassId(), kotlinClass.getLocation(), header.version) } else if (header.kind == KotlinClassHeader.Kind.CLASS) { val descriptor = deserializedDescriptorResolver.resolveClass(kotlinClass) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt index d4ad3a0a1de..5ae2893e957 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.* import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.load.java.components.ErrorReporter +import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter import org.jetbrains.kotlin.name.FqName import java.util.HashMap import org.jetbrains.kotlin.name.Name diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt index 64cd20a0faa..f1511cabf87 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.load.kotlin import org.jetbrains.kotlin.load.java.components.DescriptorResolverUtils -import org.jetbrains.kotlin.load.java.components.ErrorReporter +import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass.AnnotationArrayArgumentVisitor import org.jetbrains.kotlin.types.ErrorUtils import org.jetbrains.kotlin.storage.StorageManager diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.java index 820d6d60c09..f8ac9d28cb5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.java @@ -21,7 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; -import org.jetbrains.kotlin.load.java.components.ErrorReporter; +import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter; import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.scopes.JetScope; @@ -84,7 +84,7 @@ public final class DeserializedDescriptorResolver { public String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull KotlinClassHeader.Kind expectedKind) { KotlinClassHeader header = kotlinClass.getClassHeader(); if (!header.getIsCompatibleAbiVersion()) { - errorReporter.reportIncompatibleAbiVersion(kotlinClass, header.getVersion()); + errorReporter.reportIncompatibleAbiVersion(kotlinClass.getClassId(), kotlinClass.getLocation(), header.getVersion()); } else if (header.getKind() == expectedKind) { return header.getAnnotationData(); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.java index f54fe2c79d7..9dc298c3776 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.java @@ -26,6 +26,12 @@ public interface KotlinJvmBinaryClass { @NotNull ClassId getClassId(); + /** + * @return path to the class file (to be reported to the user upon error) + */ + @NotNull + String getLocation(); + void loadClassAnnotations(@NotNull AnnotationVisitor visitor); void visitMembers(@NotNull MemberVisitor visitor); diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/components/RuntimeErrorReporter.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/components/RuntimeErrorReporter.kt index 438f3d57559..17fcfb01585 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/components/RuntimeErrorReporter.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/components/RuntimeErrorReporter.kt @@ -20,6 +20,8 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter public object RuntimeErrorReporter : ErrorReporter { // TODO: specialized exceptions @@ -27,8 +29,8 @@ public object RuntimeErrorReporter : ErrorReporter { throw IllegalStateException("Incomplete hierarchy for class ${descriptor.getName()}, unresolved classes $unresolvedSuperClasses") } - override fun reportIncompatibleAbiVersion(kotlinClass: KotlinJvmBinaryClass, actualVersion: Int) { - throw IllegalStateException("Incompatible ABI version of ${kotlinClass.getClassId()}: $actualVersion " + + override fun reportIncompatibleAbiVersion(classId: ClassId, filePath: String, actualVersion: Int) { + throw IllegalStateException("Incompatible ABI version of ${classId}: $actualVersion " + "(expected version is ${JvmAbi.VERSION})") } 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 263c98ea0ca..54bf35bf45e 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 @@ -43,7 +43,9 @@ public class ReflectKotlinClass private( private val klass: Class<*>, private val classHeader: KotlinClassHeader ) : KotlinJvmBinaryClass { + default object Factory { + public fun create(klass: Class<*>): ReflectKotlinClass? { val headerReader = ReadKotlinClassHeaderAnnotationVisitor() ReflectClassStructure.loadClassAnnotations(klass, headerReader) @@ -51,6 +53,8 @@ public class ReflectKotlinClass private( } } + override fun getLocation() = klass.getName().replace('.', '/') + ".class" + override fun getClassId() = klass.classId override fun getClassHeader() = classHeader diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/ErrorReporter.java b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/ErrorReporter.java similarity index 84% rename from core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/ErrorReporter.java rename to core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/ErrorReporter.java index 4ade4c19606..36ca6c39332 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/ErrorReporter.java +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/ErrorReporter.java @@ -14,18 +14,18 @@ * limitations under the License. */ -package org.jetbrains.kotlin.load.java.components; +package org.jetbrains.kotlin.serialization.deserialization; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; import org.jetbrains.kotlin.descriptors.ClassDescriptor; -import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass; +import org.jetbrains.kotlin.name.ClassId; import java.util.List; public interface ErrorReporter { - void reportIncompatibleAbiVersion(@NotNull KotlinJvmBinaryClass kotlinClass, int actualVersion); + void reportIncompatibleAbiVersion(@NotNull ClassId classId, @NotNull String filePath, int actualVersion); void reportIncompleteHierarchy(@NotNull ClassDescriptor descriptor, @NotNull List unresolvedSuperClasses); diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt index f485ee67d03..3331c4bc1d5 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder -import org.jetbrains.kotlin.load.java.components.ErrorReporter +import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter import org.jetbrains.kotlin.load.kotlin.AbstractBinaryClassAnnotationAndConstantLoader import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.storage.LockBasedStorageManager diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/LoggingErrorReporter.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/LoggingErrorReporter.kt index 38b2fd268ca..5da35377096 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/LoggingErrorReporter.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/LoggingErrorReporter.kt @@ -16,11 +16,11 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder -import org.jetbrains.kotlin.load.java.components.ErrorReporter +import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass import com.intellij.openapi.diagnostic.Logger import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.name.* class LoggingErrorReporter(private val log: Logger) : ErrorReporter { override fun reportLoadingError(message: String, exception: Exception?) { @@ -35,7 +35,7 @@ class LoggingErrorReporter(private val log: Logger) : ErrorReporter { log.error("Could not infer visibility for $descriptor") } - override fun reportIncompatibleAbiVersion(kotlinClass: KotlinJvmBinaryClass, actualVersion: Int) { - log.error("Incompatible ABI version for class ${kotlinClass.getClassId()}, actual version: $actualVersion") + override fun reportIncompatibleAbiVersion(classId: ClassId, filePath: String, actualVersion: Int) { + log.error("Incompatible ABI version for class $classId, actual version: $actualVersion") } } diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LocalFileKotlinClass.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LocalFileKotlinClass.kt index a57a9c1902b..e57a8a934d1 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LocalFileKotlinClass.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LocalFileKotlinClass.kt @@ -39,6 +39,8 @@ class LocalFileKotlinClass private( } } + override fun getLocation() = file.getAbsolutePath() + public override fun getFileContents(): ByteArray = fileContents override fun hashCode(): Int = file.hashCode()