Refactor JavaNamespaceResolver and ResolverNamespaceData

Remove reference to JavaBaseScope from ResolverNamespaceData
This commit is contained in:
Pavel V. Talanov
2012-11-02 20:30:09 +04:00
parent 86e93e3c22
commit aa5793d6d0
3 changed files with 39 additions and 56 deletions
@@ -21,18 +21,12 @@ import com.intellij.psi.PsiPackage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
/** /**
* Either package or class with static members * Either package or class with static members
*/ */
public class ResolverNamespaceData extends ResolverScopeData { public class ResolverNamespaceData extends ResolverScopeData {
public static final ResolverNamespaceData NEGATIVE = new ResolverNamespaceData(true);
private final NamespaceDescriptor namespaceDescriptor;
private JavaPackageScope memberScope;
public ResolverNamespaceData( public ResolverNamespaceData(
@Nullable PsiClass psiClass, @Nullable PsiClass psiClass,
@@ -41,23 +35,5 @@ public class ResolverNamespaceData extends ResolverScopeData {
@NotNull NamespaceDescriptor namespaceDescriptor @NotNull NamespaceDescriptor namespaceDescriptor
) { ) {
super(psiClass, psiPackage, fqName, true, namespaceDescriptor); super(psiClass, psiPackage, fqName, true, namespaceDescriptor);
this.namespaceDescriptor = namespaceDescriptor;
}
public ResolverNamespaceData(boolean negative) {
super(negative);
this.namespaceDescriptor = null;
}
public JavaPackageScope getMemberScope() {
return memberScope;
}
public NamespaceDescriptor getNamespaceDescriptor() {
return namespaceDescriptor;
}
public void setMemberScope(JavaPackageScope memberScope) {
this.memberScope = memberScope;
} }
} }
@@ -93,22 +93,22 @@ public final class JavaNamespaceResolver {
return null; return null;
} }
JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor( JavaNamespaceDescriptor javaNamespaceDescriptor = new JavaNamespaceDescriptor(
parentNs, parentNs,
Collections.<AnnotationDescriptor>emptyList(), // TODO Collections.<AnnotationDescriptor>emptyList(), // TODO
qualifiedName qualifiedName
); );
ResolverNamespaceData scopeData = createNamespaceResolverScopeData(qualifiedName, ns); JavaPackageScope newScope = createNamespaceScope(qualifiedName, javaNamespaceDescriptor);
if (scopeData == null) { if (newScope == null) {
return null; return null;
} }
trace.record(BindingContext.NAMESPACE, scopeData.getPsiPackageOrPsiClass(), ns); trace.record(BindingContext.NAMESPACE, newScope.getResolverScopeData().getPsiPackageOrPsiClass(), javaNamespaceDescriptor);
ns.setMemberScope(scopeData.getMemberScope()); javaNamespaceDescriptor.setMemberScope(newScope);
return scopeData.getNamespaceDescriptor(); return javaNamespaceDescriptor;
} }
@Nullable @Nullable
@@ -127,9 +127,28 @@ public final class JavaNamespaceResolver {
} }
@Nullable @Nullable
private ResolverNamespaceData createNamespaceResolverScopeData( private JavaPackageScope createNamespaceScope(
@NotNull FqName fqName, @NotNull FqName fqName,
@NotNull NamespaceDescriptor ns @NotNull NamespaceDescriptor namespaceDescriptor
) {
ResolverNamespaceData namespaceData = createNamespaceData(fqName, namespaceDescriptor);
JavaPackageScope javaPackageScope;
if (namespaceData == null) {
javaPackageScope = null;
}
else {
javaPackageScope = new JavaPackageScope(fqName, javaSemanticServices, namespaceData);
}
cache(fqName, javaPackageScope);
return javaPackageScope;
}
@Nullable
private ResolverNamespaceData createNamespaceData(
@NotNull FqName fqName,
@NotNull NamespaceDescriptor namespaceDescriptor
) { ) {
PsiPackage psiPackage; PsiPackage psiPackage;
PsiClass psiClass; PsiClass psiClass;
@@ -139,28 +158,19 @@ public final class JavaNamespaceResolver {
psiClass = getPsiClassForJavaPackageScope(fqName); psiClass = getPsiClassForJavaPackageScope(fqName);
psiPackage = psiClassFinder.findPsiPackage(fqName); psiPackage = psiClassFinder.findPsiPackage(fqName);
if (psiClass != null || psiPackage != null) { if (psiClass != null || psiPackage != null) {
trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.PROPER); trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.PROPER);
break lookingForPsi; break lookingForPsi;
} }
psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE); psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
if (psiClass != null && !psiClass.isEnum()) { if (psiClass != null && !psiClass.isEnum()) {
trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.CLASS_STATICS); trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.CLASS_STATICS);
break lookingForPsi; break lookingForPsi;
} }
cache(fqName, null);
return null; return null;
} }
ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, psiPackage, fqName, ns); return new ResolverNamespaceData(psiClass, psiPackage, fqName, namespaceDescriptor);
JavaPackageScope memberScope = new JavaPackageScope(fqName, javaSemanticServices, namespaceData);
namespaceData.setMemberScope(memberScope);
cache(fqName, memberScope);
return namespaceData;
} }
private void cache(@NotNull FqName fqName, @Nullable JavaPackageScope packageScope) { private void cache(@NotNull FqName fqName, @Nullable JavaPackageScope packageScope) {
@@ -186,16 +196,7 @@ public final class JavaNamespaceResolver {
if (alreadyResolvedScope != null) { if (alreadyResolvedScope != null) {
return alreadyResolvedScope; return alreadyResolvedScope;
} }
ResolverNamespaceData data; return createNamespaceScope(fqName, namespaceDescriptor);
data = createNamespaceResolverScopeData(fqName, namespaceDescriptor);
if (data == null) {
return null;
}
JavaPackageScope scope = data.getMemberScope();
if (scope == null) {
throw new IllegalStateException("fqn: " + fqName);
}
return scope;
} }
@Nullable @Nullable
@@ -44,18 +44,19 @@ public abstract class JavaBaseScope extends JetScopeImpl {
@NotNull @NotNull
protected final JavaSemanticServices semanticServices; protected final JavaSemanticServices semanticServices;
@NotNull @NotNull
protected final ResolverScopeData resolverScopeData; protected final ResolverScopeData resolverScopeData;
@NotNull @NotNull
private final Map<Name, Set<FunctionDescriptor>> functionDescriptors = Maps.newHashMap(); private final Map<Name, Set<FunctionDescriptor>> functionDescriptors = Maps.newHashMap();
@NotNull @NotNull
private final Map<Name, Set<VariableDescriptor>> propertyDescriptors = Maps.newHashMap(); private final Map<Name, Set<VariableDescriptor>> propertyDescriptors = Maps.newHashMap();
@Nullable @Nullable
private Collection<DeclarationDescriptor> allDescriptors = null; private Collection<DeclarationDescriptor> allDescriptors = null;
protected JavaBaseScope( protected JavaBaseScope(
@NotNull JavaSemanticServices semanticServices, @NotNull JavaSemanticServices semanticServices,
@NotNull ResolverScopeData resolverScopeData @NotNull ResolverScopeData resolverScopeData
@@ -164,4 +165,9 @@ public abstract class JavaBaseScope extends JetScopeImpl {
resolverScopeData.isStaticMembers())); resolverScopeData.isStaticMembers()));
} }
} }
@NotNull
public ResolverScopeData getResolverScopeData() {
return resolverScopeData;
}
} }