ErrorReporter is now Java-independent
This commit is contained in:
+7
-7
@@ -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<VirtualFileKotlinClass> 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<String> 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));
|
||||
}
|
||||
}
|
||||
|
||||
+15
-5
@@ -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<VirtualFileKotlinClass, Integer> 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<String, AbiVersionErrorData> ABI_VERSION_ERRORS = Slices.createCollectiveSlice();
|
||||
public static final WritableSlice<ClassDescriptor, List<String>> 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
|
||||
|
||||
@@ -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()
|
||||
|
||||
+1
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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();
|
||||
|
||||
+6
@@ -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);
|
||||
|
||||
+4
-2
@@ -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})")
|
||||
}
|
||||
|
||||
|
||||
+4
@@ -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
|
||||
|
||||
+3
-3
@@ -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<String> unresolvedSuperClasses);
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+4
-4
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,8 @@ class LocalFileKotlinClass private(
|
||||
}
|
||||
}
|
||||
|
||||
override fun getLocation() = file.getAbsolutePath()
|
||||
|
||||
public override fun getFileContents(): ByteArray = fileContents
|
||||
|
||||
override fun hashCode(): Int = file.hashCode()
|
||||
|
||||
Reference in New Issue
Block a user