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 f50f8c8af0a..7bb18401e82 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -130,6 +130,7 @@ public class InjectorForJavaDescriptorResolver { javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver); javaNamespaceResolver.setPsiClassFinder(psiClassFinder); javaNamespaceResolver.setTrace(bindingTrace); + javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder); javaSupertypeResolver.setClassResolver(javaClassResolver); javaSupertypeResolver.setTrace(bindingTrace); 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 55baffa074d..dab9fc4cb87 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -317,6 +317,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver); javaNamespaceResolver.setPsiClassFinder(psiClassFinder); javaNamespaceResolver.setTrace(bindingTrace); + javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder); javaSupertypeResolver.setClassResolver(javaClassResolver); javaSupertypeResolver.setTrace(bindingTrace); 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 2c78433490e..4cabe6e4fd1 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 @@ -41,6 +41,7 @@ import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils; import org.jetbrains.jet.lang.resolve.java.scope.JavaBaseScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope; +import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -48,8 +49,6 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; import javax.inject.Inject; import java.util.*; -import static org.jetbrains.jet.lang.resolve.java.AbiVersionUtil.INVALID_VERSION; - public final class JavaNamespaceResolver { @NotNull @@ -66,10 +65,16 @@ public final class JavaNamespaceResolver { private JavaDescriptorResolver javaDescriptorResolver; private DeserializedDescriptorResolver deserializedDescriptorResolver; + private VirtualFileFinder virtualFileFinder; public JavaNamespaceResolver() { } + @Inject + public void setVirtualFileFinder(VirtualFileFinder virtualFileFinder) { + this.virtualFileFinder = virtualFileFinder; + } + @Inject public void setPsiClassFinder(PsiClassFinder psiClassFinder) { this.psiClassFinder = psiClassFinder; @@ -164,29 +169,21 @@ public final class JavaNamespaceResolver { ) { PsiPackage psiPackage = psiClassFinder.findPsiPackage(fqName); if (psiPackage != null) { - PsiClass psiClass = getPsiClassForJavaPackageScope(fqName); + FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(fqName); + VirtualFile virtualFile = virtualFileFinder.find(packageClassFqName); + trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.PROPER); - if (psiClass != null) { - boolean isCompiledKotlinPackageClass = DescriptorResolverUtils.isCompiledKotlinPackageClass(psiClass); - if (isOldKotlinPackageClass(psiClass) && !isCompiledKotlinPackageClass) { - // If psiClass has old annotations (@JetPackage) but doesn't have @KotlinPackage, report ABI version error - AbiVersionUtil.reportIncompatibleAbiVersion(psiClass, INVALID_VERSION, trace); - } - if (isCompiledKotlinPackageClass) { - // If psiClass has @KotlinPackage (regardless of whether it has @JetPackage or not), deserialize it to Kotlin descriptor. - // Note that @KotlinPackage may still have an old ABI version, in which case null is returned by createKotlinPackageScope - VirtualFile file = psiClass.getContainingFile().getVirtualFile(); - if (file != null) { - JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(namespaceDescriptor, - file, DescriptorResolverUtils.createPsiBasedErrorReporter(psiClass, trace)); - if (kotlinPackageScope != null) { - return kotlinPackageScope; - } - } + if (virtualFile != null) { + ErrorReporter errorReporter = AbiVersionUtil.abiVersionErrorReporter(virtualFile, packageClassFqName, trace); + JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(namespaceDescriptor, + virtualFile, errorReporter); + if (kotlinPackageScope != null) { + return kotlinPackageScope; } } + // Otherwise (if psiClass is null or doesn't have a supported Kotlin annotation), it's a Java class and the package is empty return new JavaPackageScope(namespaceDescriptor, psiPackage, fqName, javaDescriptorResolver, psiClassFinder); } @@ -205,11 +202,6 @@ public final class JavaNamespaceResolver { return new JavaClassStaticMembersScope(namespaceDescriptor, fqName, psiClass, psiClassFinder, javaDescriptorResolver); } - private static boolean isOldKotlinPackageClass(@NotNull PsiClass psiClass) { - //noinspection deprecation - return DescriptorResolverUtils.hasAnnotation(psiClass, JvmAnnotationNames.OLD_JET_PACKAGE_CLASS_ANNOTATION.getFqName()); - } - private void cache(@NotNull FqName fqName, @Nullable JetScope packageScope) { if (packageScope == null) { unresolvedCache.add(fqName); @@ -236,12 +228,6 @@ public final class JavaNamespaceResolver { return createNamespaceScope(fqName, namespaceDescriptor); } - @Nullable - private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) { - return psiClassFinder - .findPsiClass(PackageClassUtils.getPackageClassFqName(packageFQN), PsiClassFinder.RuntimeClassesHandleMode.IGNORE); - } - private static boolean hasStaticMembers(@NotNull PsiClass psiClass) { for (PsiMember member : ContainerUtil.concat(psiClass.getMethods(), psiClass.getFields())) { if (member.hasModifierProperty(PsiModifier.STATIC) && !DescriptorResolverUtils.shouldBeInEnumClassObject(member)) {