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.setPsiClassFinder(psiClassFinder);
javaNamespaceResolver.setTrace(bindingTrace);
javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder);
javaSupertypeResolver.setClassResolver(javaClassResolver);
javaSupertypeResolver.setTrace(bindingTrace);
@@ -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);
@@ -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)) {