Use VirtualFileFinder in JavaNamespaceResolver

This commit is contained in:
Pavel V. Talanov
2013-07-26 19:56:44 +04:00
parent e4988f9dba
commit 7d50a8c6ea
3 changed files with 19 additions and 31 deletions
@@ -130,6 +130,7 @@ public class InjectorForJavaDescriptorResolver {
javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver); javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver);
javaNamespaceResolver.setPsiClassFinder(psiClassFinder); javaNamespaceResolver.setPsiClassFinder(psiClassFinder);
javaNamespaceResolver.setTrace(bindingTrace); javaNamespaceResolver.setTrace(bindingTrace);
javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder);
javaSupertypeResolver.setClassResolver(javaClassResolver); javaSupertypeResolver.setClassResolver(javaClassResolver);
javaSupertypeResolver.setTrace(bindingTrace); javaSupertypeResolver.setTrace(bindingTrace);
@@ -317,6 +317,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver); javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver);
javaNamespaceResolver.setPsiClassFinder(psiClassFinder); javaNamespaceResolver.setPsiClassFinder(psiClassFinder);
javaNamespaceResolver.setTrace(bindingTrace); javaNamespaceResolver.setTrace(bindingTrace);
javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder);
javaSupertypeResolver.setClassResolver(javaClassResolver); javaSupertypeResolver.setClassResolver(javaClassResolver);
javaSupertypeResolver.setTrace(bindingTrace); javaSupertypeResolver.setTrace(bindingTrace);
@@ -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.JavaBaseScope;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; 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.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.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; 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 javax.inject.Inject;
import java.util.*; import java.util.*;
import static org.jetbrains.jet.lang.resolve.java.AbiVersionUtil.INVALID_VERSION;
public final class JavaNamespaceResolver { public final class JavaNamespaceResolver {
@NotNull @NotNull
@@ -66,10 +65,16 @@ public final class JavaNamespaceResolver {
private JavaDescriptorResolver javaDescriptorResolver; private JavaDescriptorResolver javaDescriptorResolver;
private DeserializedDescriptorResolver deserializedDescriptorResolver; private DeserializedDescriptorResolver deserializedDescriptorResolver;
private VirtualFileFinder virtualFileFinder;
public JavaNamespaceResolver() { public JavaNamespaceResolver() {
} }
@Inject
public void setVirtualFileFinder(VirtualFileFinder virtualFileFinder) {
this.virtualFileFinder = virtualFileFinder;
}
@Inject @Inject
public void setPsiClassFinder(PsiClassFinder psiClassFinder) { public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
this.psiClassFinder = psiClassFinder; this.psiClassFinder = psiClassFinder;
@@ -164,29 +169,21 @@ public final class JavaNamespaceResolver {
) { ) {
PsiPackage psiPackage = psiClassFinder.findPsiPackage(fqName); PsiPackage psiPackage = psiClassFinder.findPsiPackage(fqName);
if (psiPackage != null) { 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); trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.PROPER);
if (psiClass != null) { if (virtualFile != null) {
boolean isCompiledKotlinPackageClass = DescriptorResolverUtils.isCompiledKotlinPackageClass(psiClass); ErrorReporter errorReporter = AbiVersionUtil.abiVersionErrorReporter(virtualFile, packageClassFqName, trace);
if (isOldKotlinPackageClass(psiClass) && !isCompiledKotlinPackageClass) { JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(namespaceDescriptor,
// If psiClass has old annotations (@JetPackage) but doesn't have @KotlinPackage, report ABI version error virtualFile, errorReporter);
AbiVersionUtil.reportIncompatibleAbiVersion(psiClass, INVALID_VERSION, trace); if (kotlinPackageScope != null) {
} return kotlinPackageScope;
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;
}
}
} }
} }
// Otherwise (if psiClass is null or doesn't have a supported Kotlin annotation), it's a Java class and the package is empty // 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); return new JavaPackageScope(namespaceDescriptor, psiPackage, fqName, javaDescriptorResolver, psiClassFinder);
} }
@@ -205,11 +202,6 @@ public final class JavaNamespaceResolver {
return new JavaClassStaticMembersScope(namespaceDescriptor, fqName, psiClass, psiClassFinder, javaDescriptorResolver); 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) { private void cache(@NotNull FqName fqName, @Nullable JetScope packageScope) {
if (packageScope == null) { if (packageScope == null) {
unresolvedCache.add(fqName); unresolvedCache.add(fqName);
@@ -236,12 +228,6 @@ public final class JavaNamespaceResolver {
return createNamespaceScope(fqName, namespaceDescriptor); 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) { private static boolean hasStaticMembers(@NotNull PsiClass psiClass) {
for (PsiMember member : ContainerUtil.concat(psiClass.getMethods(), psiClass.getFields())) { for (PsiMember member : ContainerUtil.concat(psiClass.getMethods(), psiClass.getFields())) {
if (member.hasModifierProperty(PsiModifier.STATIC) && !DescriptorResolverUtils.shouldBeInEnumClassObject(member)) { if (member.hasModifierProperty(PsiModifier.STATIC) && !DescriptorResolverUtils.shouldBeInEnumClassObject(member)) {