From af2c03ad708d3bacceeba12690a203c1d213ed02 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 8 Aug 2013 18:01:33 +0400 Subject: [PATCH] Get rid of trace in JavaClassResolver and JavaNamespaceResolver Create TraceBasedErrorReporter which reports ABI errors to the trace --- .../di/InjectorForJavaDescriptorResolver.java | 56 ++++++++++--------- .../di/InjectorForTopDownAnalyzerForJvm.java | 56 ++++++++++--------- .../jet/lang/resolve/java/AbiVersionUtil.java | 14 ----- .../DeserializedDescriptorResolver.java | 55 ++++++++---------- .../resolve/java/resolver/ErrorReporter.java | 6 +- .../java/resolver/JavaClassResolver.java | 16 ++---- .../java/resolver/JavaNamespaceResolver.java | 11 +--- .../resolver/TraceBasedErrorReporter.java | 39 +++++++++++++ .../injectors/GenerateInjectors.java | 3 + 9 files changed, 136 insertions(+), 120 deletions(-) create mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/TraceBasedErrorReporter.java diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java index 9ecd8a348e6..30c16c94502 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -22,19 +22,20 @@ import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache; import org.jetbrains.jet.lang.resolve.java.resolver.FakeOverrideVisibilityResolverImpl; +import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedErrorReporter; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder; import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationArgumentResolver; +import org.jetbrains.jet.lang.resolve.java.resolver.DeserializedDescriptorResolver; +import org.jetbrains.jet.lang.resolve.java.resolver.AnnotationDescriptorDeserializer; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaNamespaceResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeParameterResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.resolver.JavaValueParameterResolver; -import org.jetbrains.jet.lang.resolve.java.resolver.DeserializedDescriptorResolver; -import org.jetbrains.jet.lang.resolve.java.resolver.AnnotationDescriptorDeserializer; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaNamespaceResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaSupertypeResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaConstructorResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaPropertyResolver; @@ -50,19 +51,20 @@ public class InjectorForJavaDescriptorResolver { private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final TraceBasedJavaResolverCache traceBasedJavaResolverCache; private final FakeOverrideVisibilityResolverImpl fakeOverrideVisibilityResolver; + private final TraceBasedErrorReporter traceBasedErrorReporter; private final JavaDescriptorResolver javaDescriptorResolver; private final PsiClassFinderImpl psiClassFinder; private final VirtualFileFinder virtualFileFinder; private final JavaClassResolver javaClassResolver; private final JavaAnnotationResolver javaAnnotationResolver; private final JavaAnnotationArgumentResolver javaAnnotationArgumentResolver; + private final DeserializedDescriptorResolver deserializedDescriptorResolver; + private final AnnotationDescriptorDeserializer annotationDescriptorDeserializer; + private final JavaNamespaceResolver javaNamespaceResolver; private final JavaFunctionResolver javaFunctionResolver; private final JavaTypeParameterResolver javaTypeParameterResolver; private final JavaTypeTransformer javaTypeTransformer; private final JavaValueParameterResolver javaValueParameterResolver; - private final DeserializedDescriptorResolver deserializedDescriptorResolver; - private final AnnotationDescriptorDeserializer annotationDescriptorDeserializer; - private final JavaNamespaceResolver javaNamespaceResolver; private final JavaSupertypeResolver javaSupertypeResolver; private final JavaConstructorResolver javaConstructorResolver; private final JavaPropertyResolver javaPropertyResolver; @@ -77,19 +79,20 @@ public class InjectorForJavaDescriptorResolver { this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver(); this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache(); this.fakeOverrideVisibilityResolver = new FakeOverrideVisibilityResolverImpl(); + this.traceBasedErrorReporter = new TraceBasedErrorReporter(); this.javaDescriptorResolver = new JavaDescriptorResolver(); this.psiClassFinder = new PsiClassFinderImpl(); this.virtualFileFinder = com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class); this.javaClassResolver = new JavaClassResolver(); this.javaAnnotationResolver = new JavaAnnotationResolver(); this.javaAnnotationArgumentResolver = new JavaAnnotationArgumentResolver(); + this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); + this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(); + this.javaNamespaceResolver = new JavaNamespaceResolver(); this.javaFunctionResolver = new JavaFunctionResolver(); this.javaTypeParameterResolver = new JavaTypeParameterResolver(); this.javaTypeTransformer = new JavaTypeTransformer(); this.javaValueParameterResolver = new JavaValueParameterResolver(); - this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); - this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(); - this.javaNamespaceResolver = new JavaNamespaceResolver(); this.javaSupertypeResolver = new JavaSupertypeResolver(); this.javaConstructorResolver = new JavaConstructorResolver(); this.javaPropertyResolver = new JavaPropertyResolver(); @@ -102,6 +105,8 @@ public class InjectorForJavaDescriptorResolver { fakeOverrideVisibilityResolver.setTrace(bindingTrace); + traceBasedErrorReporter.setTrace(bindingTrace); + this.javaDescriptorResolver.setClassResolver(javaClassResolver); this.javaDescriptorResolver.setConstructorResolver(javaConstructorResolver); this.javaDescriptorResolver.setFunctionResolver(javaFunctionResolver); @@ -112,13 +117,12 @@ public class InjectorForJavaDescriptorResolver { javaClassResolver.setAnnotationResolver(javaAnnotationResolver); javaClassResolver.setCache(traceBasedJavaResolverCache); + javaClassResolver.setDeserializedDescriptorResolver(deserializedDescriptorResolver); javaClassResolver.setFunctionResolver(javaFunctionResolver); javaClassResolver.setJavaClassFinder(javaClassFinder); javaClassResolver.setJavaDescriptorResolver(javaDescriptorResolver); - javaClassResolver.setKotlinDescriptorResolver(deserializedDescriptorResolver); javaClassResolver.setNamespaceResolver(javaNamespaceResolver); javaClassResolver.setSupertypesResolver(javaSupertypeResolver); - javaClassResolver.setTrace(bindingTrace); javaClassResolver.setTypeParameterResolver(javaTypeParameterResolver); javaClassResolver.setVirtualFileFinder(virtualFileFinder); @@ -128,6 +132,21 @@ public class InjectorForJavaDescriptorResolver { javaAnnotationArgumentResolver.setAnnotationResolver(javaAnnotationResolver); javaAnnotationArgumentResolver.setClassResolver(javaClassResolver); + deserializedDescriptorResolver.setAnnotationDeserializer(annotationDescriptorDeserializer); + deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); + deserializedDescriptorResolver.setJavaClassResolver(javaClassResolver); + deserializedDescriptorResolver.setJavaNamespaceResolver(javaNamespaceResolver); + + annotationDescriptorDeserializer.setJavaClassResolver(javaClassResolver); + annotationDescriptorDeserializer.setPsiClassFinder(psiClassFinder); + annotationDescriptorDeserializer.setVirtualFileFinder(virtualFileFinder); + + javaNamespaceResolver.setCache(traceBasedJavaResolverCache); + javaNamespaceResolver.setDeserializedDescriptorResolver(deserializedDescriptorResolver); + javaNamespaceResolver.setJavaClassFinder(javaClassFinder); + javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver); + javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder); + javaFunctionResolver.setAnnotationResolver(javaAnnotationResolver); javaFunctionResolver.setCache(traceBasedJavaResolverCache); javaFunctionResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); @@ -142,21 +161,6 @@ public class InjectorForJavaDescriptorResolver { javaValueParameterResolver.setTypeTransformer(javaTypeTransformer); - deserializedDescriptorResolver.setAnnotationDeserializer(annotationDescriptorDeserializer); - deserializedDescriptorResolver.setJavaClassResolver(javaClassResolver); - deserializedDescriptorResolver.setJavaNamespaceResolver(javaNamespaceResolver); - - annotationDescriptorDeserializer.setJavaClassResolver(javaClassResolver); - annotationDescriptorDeserializer.setPsiClassFinder(psiClassFinder); - annotationDescriptorDeserializer.setVirtualFileFinder(virtualFileFinder); - - javaNamespaceResolver.setCache(traceBasedJavaResolverCache); - javaNamespaceResolver.setDeserializedDescriptorResolver(deserializedDescriptorResolver); - javaNamespaceResolver.setJavaClassFinder(javaClassFinder); - javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver); - javaNamespaceResolver.setTrace(bindingTrace); - javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder); - javaSupertypeResolver.setClassResolver(javaClassResolver); javaSupertypeResolver.setTrace(bindingTrace); javaSupertypeResolver.setTypeTransformer(javaTypeTransformer); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index efa1c41bf5a..c496edc3510 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -34,6 +34,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache; import org.jetbrains.jet.lang.resolve.java.resolver.FakeOverrideVisibilityResolverImpl; +import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedErrorReporter; import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl; import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder; import org.jetbrains.jet.lang.resolve.DeclarationResolver; @@ -55,13 +56,13 @@ import org.jetbrains.jet.lang.resolve.ScriptBodyResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationArgumentResolver; +import org.jetbrains.jet.lang.resolve.java.resolver.DeserializedDescriptorResolver; +import org.jetbrains.jet.lang.resolve.java.resolver.AnnotationDescriptorDeserializer; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaNamespaceResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeParameterResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.resolver.JavaValueParameterResolver; -import org.jetbrains.jet.lang.resolve.java.resolver.DeserializedDescriptorResolver; -import org.jetbrains.jet.lang.resolve.java.resolver.AnnotationDescriptorDeserializer; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaNamespaceResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaSupertypeResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaConstructorResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaPropertyResolver; @@ -89,6 +90,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final TraceBasedJavaResolverCache traceBasedJavaResolverCache; private final FakeOverrideVisibilityResolverImpl fakeOverrideVisibilityResolver; + private final TraceBasedErrorReporter traceBasedErrorReporter; private final NamespaceFactoryImpl namespaceFactory; private final VirtualFileFinder virtualFileFinder; private final DeclarationResolver declarationResolver; @@ -110,13 +112,13 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final JavaClassResolver javaClassResolver; private final JavaAnnotationResolver javaAnnotationResolver; private final JavaAnnotationArgumentResolver javaAnnotationArgumentResolver; + private final DeserializedDescriptorResolver deserializedDescriptorResolver; + private final AnnotationDescriptorDeserializer annotationDescriptorDeserializer; + private final JavaNamespaceResolver javaNamespaceResolver; private final JavaFunctionResolver javaFunctionResolver; private final JavaTypeParameterResolver javaTypeParameterResolver; private final JavaTypeTransformer javaTypeTransformer; private final JavaValueParameterResolver javaValueParameterResolver; - private final DeserializedDescriptorResolver deserializedDescriptorResolver; - private final AnnotationDescriptorDeserializer annotationDescriptorDeserializer; - private final JavaNamespaceResolver javaNamespaceResolver; private final JavaSupertypeResolver javaSupertypeResolver; private final JavaConstructorResolver javaConstructorResolver; private final JavaPropertyResolver javaPropertyResolver; @@ -145,6 +147,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver(); this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache(); this.fakeOverrideVisibilityResolver = new FakeOverrideVisibilityResolverImpl(); + this.traceBasedErrorReporter = new TraceBasedErrorReporter(); this.namespaceFactory = new NamespaceFactoryImpl(); this.virtualFileFinder = com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class); this.declarationResolver = new DeclarationResolver(); @@ -166,13 +169,13 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.javaClassResolver = new JavaClassResolver(); this.javaAnnotationResolver = new JavaAnnotationResolver(); this.javaAnnotationArgumentResolver = new JavaAnnotationArgumentResolver(); + this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); + this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(); + this.javaNamespaceResolver = new JavaNamespaceResolver(); this.javaFunctionResolver = new JavaFunctionResolver(); this.javaTypeParameterResolver = new JavaTypeParameterResolver(); this.javaTypeTransformer = new JavaTypeTransformer(); this.javaValueParameterResolver = new JavaValueParameterResolver(); - this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); - this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(); - this.javaNamespaceResolver = new JavaNamespaceResolver(); this.javaSupertypeResolver = new JavaSupertypeResolver(); this.javaConstructorResolver = new JavaConstructorResolver(); this.javaPropertyResolver = new JavaPropertyResolver(); @@ -228,6 +231,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly fakeOverrideVisibilityResolver.setTrace(bindingTrace); + traceBasedErrorReporter.setTrace(bindingTrace); + this.namespaceFactory.setModuleDescriptor(moduleDescriptor); this.namespaceFactory.setTrace(bindingTrace); @@ -299,13 +304,12 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly javaClassResolver.setAnnotationResolver(javaAnnotationResolver); javaClassResolver.setCache(traceBasedJavaResolverCache); + javaClassResolver.setDeserializedDescriptorResolver(deserializedDescriptorResolver); javaClassResolver.setFunctionResolver(javaFunctionResolver); javaClassResolver.setJavaClassFinder(javaClassFinder); javaClassResolver.setJavaDescriptorResolver(javaDescriptorResolver); - javaClassResolver.setKotlinDescriptorResolver(deserializedDescriptorResolver); javaClassResolver.setNamespaceResolver(javaNamespaceResolver); javaClassResolver.setSupertypesResolver(javaSupertypeResolver); - javaClassResolver.setTrace(bindingTrace); javaClassResolver.setTypeParameterResolver(javaTypeParameterResolver); javaClassResolver.setVirtualFileFinder(virtualFileFinder); @@ -315,6 +319,21 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly javaAnnotationArgumentResolver.setAnnotationResolver(javaAnnotationResolver); javaAnnotationArgumentResolver.setClassResolver(javaClassResolver); + deserializedDescriptorResolver.setAnnotationDeserializer(annotationDescriptorDeserializer); + deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); + deserializedDescriptorResolver.setJavaClassResolver(javaClassResolver); + deserializedDescriptorResolver.setJavaNamespaceResolver(javaNamespaceResolver); + + annotationDescriptorDeserializer.setJavaClassResolver(javaClassResolver); + annotationDescriptorDeserializer.setPsiClassFinder(psiClassFinder); + annotationDescriptorDeserializer.setVirtualFileFinder(virtualFileFinder); + + javaNamespaceResolver.setCache(traceBasedJavaResolverCache); + javaNamespaceResolver.setDeserializedDescriptorResolver(deserializedDescriptorResolver); + javaNamespaceResolver.setJavaClassFinder(javaClassFinder); + javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver); + javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder); + javaFunctionResolver.setAnnotationResolver(javaAnnotationResolver); javaFunctionResolver.setCache(traceBasedJavaResolverCache); javaFunctionResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); @@ -329,21 +348,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly javaValueParameterResolver.setTypeTransformer(javaTypeTransformer); - deserializedDescriptorResolver.setAnnotationDeserializer(annotationDescriptorDeserializer); - deserializedDescriptorResolver.setJavaClassResolver(javaClassResolver); - deserializedDescriptorResolver.setJavaNamespaceResolver(javaNamespaceResolver); - - annotationDescriptorDeserializer.setJavaClassResolver(javaClassResolver); - annotationDescriptorDeserializer.setPsiClassFinder(psiClassFinder); - annotationDescriptorDeserializer.setVirtualFileFinder(virtualFileFinder); - - javaNamespaceResolver.setCache(traceBasedJavaResolverCache); - javaNamespaceResolver.setDeserializedDescriptorResolver(deserializedDescriptorResolver); - javaNamespaceResolver.setJavaClassFinder(javaClassFinder); - javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver); - javaNamespaceResolver.setTrace(bindingTrace); - javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder); - javaSupertypeResolver.setClassResolver(javaClassResolver); javaSupertypeResolver.setTrace(bindingTrace); javaSupertypeResolver.setTypeTransformer(javaTypeTransformer); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AbiVersionUtil.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AbiVersionUtil.java index 343053c5707..6e5dc734797 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AbiVersionUtil.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AbiVersionUtil.java @@ -34,20 +34,6 @@ public final class AbiVersionUtil { return abiVersion == JvmAbi.VERSION; } - @NotNull - public static ErrorReporter abiVersionErrorReporter( - @NotNull final VirtualFile file, - @NotNull final FqName classFqName, - @NotNull final BindingTrace trace - ) { - return new ErrorReporter() { - @Override - public void reportIncompatibleAbiVersion(int actualVersion) { - trace.record(ABI_VERSION_ERRORS, new AbiVersionErrorLocation(classFqName, file), actualVersion); - } - }; - } - public static final class AbiVersionErrorLocation { @NotNull private final FqName classFqName; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedDescriptorResolver.java index 94fd9bbcbb7..cdb8efb9da0 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedDescriptorResolver.java @@ -39,7 +39,6 @@ import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.INCLUDE_K import static org.jetbrains.jet.lang.resolve.java.resolver.DeserializedResolverUtils.kotlinFqNameToJavaFqName; public final class DeserializedDescriptorResolver { - private AnnotationDescriptorDeserializer annotationDeserializer; private final LockBasedStorageManager storageManager = new LockBasedStorageManager(); @@ -48,6 +47,8 @@ public final class DeserializedDescriptorResolver { private JavaClassResolver javaClassResolver; + private ErrorReporter errorReporter; + @NotNull private final DescriptorFinder javaDescriptorFinder = new DescriptorFinder() { @Nullable @@ -84,26 +85,30 @@ public final class DeserializedDescriptorResolver { this.javaClassResolver = javaClassResolver; } - @Nullable - public ClassDescriptor resolveClass(@NotNull ClassId id, @NotNull VirtualFile file, @NotNull ErrorReporter reporter) { - ClassData classData = readClassDataFromClassFile(file, reporter); - if (classData == null) { - return null; - } - return createDeserializedClass(classData, id); + @Inject + public void setErrorReporter(ErrorReporter errorReporter) { + this.errorReporter = errorReporter; } @Nullable - public JetScope createKotlinPackageScope( - @NotNull NamespaceDescriptor descriptor, - @NotNull VirtualFile file, - @NotNull ErrorReporter reporter - ) { - PackageData packageData = readPackageDataFromClassFile(file, reporter); - if (packageData == null) { - return null; + public ClassDescriptor resolveClass(@NotNull ClassId id, @NotNull VirtualFile file) { + String[] data = readData(file); + if (data != null) { + ClassData classData = JavaProtoBufUtil.readClassDataFrom(data); + return createDeserializedClass(classData, id); } - return new DeserializedPackageMemberScope(storageManager, descriptor, annotationDeserializer, javaDescriptorFinder, packageData); + return null; + } + + @Nullable + public JetScope createKotlinPackageScope(@NotNull NamespaceDescriptor descriptor, @NotNull VirtualFile file) { + String[] data = readData(file); + if (data != null) { + PackageData packageData = JavaProtoBufUtil.readPackageDataFrom(data); + return new DeserializedPackageMemberScope(storageManager, descriptor, annotationDeserializer, javaDescriptorFinder, + packageData); + } + return null; } @Nullable @@ -119,23 +124,11 @@ public final class DeserializedDescriptorResolver { } @Nullable - private static ClassData readClassDataFromClassFile(@NotNull VirtualFile file, @NotNull ErrorReporter reporter) { - String[] data = readData(file, reporter); - return data == null ? null : JavaProtoBufUtil.readClassDataFrom(data); - } - - @Nullable - private static PackageData readPackageDataFromClassFile(@NotNull VirtualFile file, @NotNull ErrorReporter reporter) { - String[] data = readData(file, reporter); - return data == null ? null : JavaProtoBufUtil.readPackageDataFrom(data); - } - - @Nullable - private static String[] readData(@NotNull VirtualFile virtualFile, @NotNull ErrorReporter reporter) { + private String[] readData(@NotNull VirtualFile virtualFile) { KotlinClassFileHeader header = KotlinClassFileHeader.readKotlinHeaderFromClassFile(virtualFile); int version = header.getVersion(); if (!isAbiVersionCompatible(version) && header.getType() != KotlinClassFileHeader.HeaderType.NONE) { - reporter.reportIncompatibleAbiVersion(version); + errorReporter.reportIncompatibleAbiVersion(header.getFqName(), virtualFile, version); return null; } return header.getAnnotationData(); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/ErrorReporter.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/ErrorReporter.java index 80294decf85..a477ce0546d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/ErrorReporter.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/ErrorReporter.java @@ -16,6 +16,10 @@ package org.jetbrains.jet.lang.resolve.java.resolver; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.name.FqName; + public interface ErrorReporter { - void reportIncompatibleAbiVersion(int actualVersion); + void reportIncompatibleAbiVersion(@NotNull FqName fqName, @NotNull VirtualFile file, int actualVersion); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java index f1eb80e97ea..b7cf5a55272 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java @@ -28,7 +28,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.descriptors.serialization.ClassId; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.*; @@ -83,7 +82,6 @@ public final class JavaClassResolver { @NotNull private final Set unresolvedCache = Sets.newHashSet(); - private BindingTrace trace; private JavaResolverCache cache; private JavaTypeParameterResolver typeParameterResolver; private JavaDescriptorResolver javaDescriptorResolver; @@ -92,7 +90,7 @@ public final class JavaClassResolver { private JavaNamespaceResolver namespaceResolver; private JavaSupertypeResolver supertypesResolver; private JavaFunctionResolver functionResolver; - private DeserializedDescriptorResolver kotlinDescriptorResolver; + private DeserializedDescriptorResolver deserializedDescriptorResolver; private VirtualFileFinder virtualFileFinder; public JavaClassResolver() { @@ -103,19 +101,14 @@ public final class JavaClassResolver { this.virtualFileFinder = virtualFileFinder; } - @Inject - public void setTrace(BindingTrace trace) { - this.trace = trace; - } - @Inject public void setCache(JavaResolverCache cache) { this.cache = cache; } @Inject - public void setKotlinDescriptorResolver(DeserializedDescriptorResolver kotlinDescriptorResolver) { - this.kotlinDescriptorResolver = kotlinDescriptorResolver; + public void setDeserializedDescriptorResolver(DeserializedDescriptorResolver deserializedDescriptorResolver) { + this.deserializedDescriptorResolver = deserializedDescriptorResolver; } @Inject @@ -229,8 +222,7 @@ public final class JavaClassResolver { : "We can resolve the class, so it can't be 'unresolved' during parent resolution"; ClassId id = ClassId.fromFqNameAndContainingDeclaration(qualifiedName, containingDeclaration); - ErrorReporter errorReporter = AbiVersionUtil.abiVersionErrorReporter(file, qualifiedName, trace); - ClassDescriptor deserializedDescriptor = kotlinDescriptorResolver.resolveClass(id, file, errorReporter); + ClassDescriptor deserializedDescriptor = deserializedDescriptorResolver.resolveClass(id, file); if (deserializedDescriptor != null) { cache(javaClassToKotlinFqName(qualifiedName), deserializedDescriptor); return deserializedDescriptor; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java index ee3d5ef0417..413472fa37e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java @@ -26,7 +26,6 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorParent; -import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaNamespaceDescriptor; @@ -60,7 +59,6 @@ public final class JavaNamespaceResolver { private final Set unresolvedCache = Sets.newHashSet(); private JavaClassFinder javaClassFinder; - private BindingTrace trace; private JavaResolverCache cache; private JavaDescriptorResolver javaDescriptorResolver; @@ -77,11 +75,6 @@ public final class JavaNamespaceResolver { this.javaClassFinder = javaClassFinder; } - @Inject - public void setTrace(BindingTrace trace) { - this.trace = trace; - } - @Inject public void setCache(JavaResolverCache cache) { this.cache = cache; @@ -165,9 +158,7 @@ public final class JavaNamespaceResolver { cache.recordProperNamespace(namespaceDescriptor); if (virtualFile != null) { - ErrorReporter errorReporter = AbiVersionUtil.abiVersionErrorReporter(virtualFile, packageClassFqName, trace); - JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(namespaceDescriptor, - virtualFile, errorReporter); + JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(namespaceDescriptor, virtualFile); if (kotlinPackageScope != null) { return kotlinPackageScope; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/TraceBasedErrorReporter.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/TraceBasedErrorReporter.java new file mode 100644 index 00000000000..5490dea335d --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/TraceBasedErrorReporter.java @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.java.resolver; + +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.lang.resolve.java.AbiVersionUtil; +import org.jetbrains.jet.lang.resolve.name.FqName; + +import javax.inject.Inject; + +public class TraceBasedErrorReporter implements ErrorReporter { + private BindingTrace trace; + + @Inject + public void setTrace(BindingTrace trace) { + this.trace = trace; + } + + @Override + public void reportIncompatibleAbiVersion(@NotNull FqName fqName, @NotNull VirtualFile file, int actualVersion) { + trace.record(AbiVersionUtil.ABI_VERSION_ERRORS, new AbiVersionUtil.AbiVersionErrorLocation(fqName, file), actualVersion); + } +} diff --git a/generators/org/jetbrains/jet/generators/injectors/GenerateInjectors.java b/generators/org/jetbrains/jet/generators/injectors/GenerateInjectors.java index d72eda711a0..ab1ad6a5c7f 100644 --- a/generators/org/jetbrains/jet/generators/injectors/GenerateInjectors.java +++ b/generators/org/jetbrains/jet/generators/injectors/GenerateInjectors.java @@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.resolver.FakeOverrideVisibilityResolverImpl; +import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedErrorReporter; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache; import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder; @@ -111,6 +112,7 @@ public class GenerateInjectors { generator.addField(TraceBasedExternalSignatureResolver.class); generator.addField(TraceBasedJavaResolverCache.class); generator.addField(FakeOverrideVisibilityResolverImpl.class); + generator.addField(TraceBasedErrorReporter.class); generator.addPublicField(NamespaceFactoryImpl.class); generator.addField(false, VirtualFileFinder.class, "virtualFileFinder", new GivenExpression( @@ -131,6 +133,7 @@ public class GenerateInjectors { generator.addField(TraceBasedExternalSignatureResolver.class); generator.addField(TraceBasedJavaResolverCache.class); generator.addField(FakeOverrideVisibilityResolverImpl.class); + generator.addField(TraceBasedErrorReporter.class); generator.addPublicField(JavaDescriptorResolver.class); generator.addPublicField(PsiClassFinderImpl.class); generator.addField(false, VirtualFileFinder.class, "virtualFileFinder",