more JavaDescriptorResolver refactoring

This commit is contained in:
Stepan Koltsov
2012-01-26 15:32:10 +04:00
parent fc8bc52ea2
commit 4bd4454363
2 changed files with 26 additions and 30 deletions
@@ -8,7 +8,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.TypeSubstitutor; import org.jetbrains.jet.lang.types.TypeSubstitutor;
@@ -16,7 +15,6 @@ import org.jetbrains.jet.lang.types.TypeSubstitutor;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* @author abreslav * @author abreslav
@@ -73,9 +71,8 @@ public class JavaClassMembersScope extends JavaClassOrPackageScope {
public Collection<DeclarationDescriptor> getAllDescriptors() { public Collection<DeclarationDescriptor> getAllDescriptors() {
if (allDescriptors == null) { if (allDescriptors == null) {
allDescriptors = Sets.newHashSet(); allDescriptors = Sets.newHashSet();
TypeSubstitutor substitutorForGenericSupertypes = getTypeSubstitutorForSupertypes();
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(psiClass.getPsiClass(), descriptor, staticMembers, substitutorForGenericSupertypes)); allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(psiClass.getPsiClass(), descriptor));
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(descriptor, psiClass.getPsiClass(), staticMembers)); allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(descriptor, psiClass.getPsiClass(), staticMembers));
@@ -84,17 +81,6 @@ public class JavaClassMembersScope extends JavaClassOrPackageScope {
return allDescriptors; return allDescriptors;
} }
private TypeSubstitutor getTypeSubstitutorForSupertypes() {
TypeSubstitutor substitutorForGenericSupertypes;
if (descriptor instanceof ClassDescriptor) {
substitutorForGenericSupertypes = semanticServices.getDescriptorResolver().createSubstitutorForGenericSupertypes((ClassDescriptor) descriptor);
}
else {
substitutorForGenericSupertypes = TypeSubstitutor.EMPTY;
}
return substitutorForGenericSupertypes;
}
private ClassifierDescriptor doGetClassifierDescriptor(String name) { private ClassifierDescriptor doGetClassifierDescriptor(String name) {
// TODO : suboptimal, walk the list only once // TODO : suboptimal, walk the list only once
for (PsiClass innerClass : psiClass.getPsiClass().getAllInnerClasses()) { for (PsiClass innerClass : psiClass.getPsiClass().getAllInnerClasses()) {
@@ -95,6 +95,7 @@ public class JavaDescriptorResolver {
private Map<String, NamedMembers> namedMembersMap; private Map<String, NamedMembers> namedMembersMap;
} }
/** Class with instance members */
private static class ResolverClassData extends ResolverScopeData { private static class ResolverClassData extends ResolverScopeData {
private MutableClassDescriptorLite classDescriptor; private MutableClassDescriptorLite classDescriptor;
@@ -104,6 +105,7 @@ public class JavaDescriptorResolver {
} }
} }
/** Either package or class with static members */
private static class ResolverNamespaceData extends ResolverScopeData { private static class ResolverNamespaceData extends ResolverScopeData {
private JavaNamespaceDescriptor namespaceDescriptor; private JavaNamespaceDescriptor namespaceDescriptor;
@@ -1015,7 +1017,7 @@ public class JavaDescriptorResolver {
namedMembers.propertyDescriptors = r; namedMembers.propertyDescriptors = r;
} }
private void resolveNamedGroupFunctions(DeclarationDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, boolean staticMembers, NamedMembers namedMembers, String functionName) { private void resolveNamedGroupFunctions(DeclarationDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers) {
if (namedMembers.functionDescriptors != null) { if (namedMembers.functionDescriptors != null) {
return; return;
} }
@@ -1027,7 +1029,10 @@ public class JavaDescriptorResolver {
Set<FunctionDescriptor> functionDescriptors = new HashSet<FunctionDescriptor>(namedMembers.methods.size()); Set<FunctionDescriptor> functionDescriptors = new HashSet<FunctionDescriptor>(namedMembers.methods.size());
for (PsiMethodWrapper method : namedMembers.methods) { for (PsiMethodWrapper method : namedMembers.methods) {
functionDescriptors.add(resolveMethodToFunctionDescriptor(owner, psiClass, typeSubstitutorForGenericSuperclasses, method)); FunctionDescriptor function = resolveMethodToFunctionDescriptor(owner, psiClass, typeSubstitutorForGenericSuperclasses, method);
if (function != null) {
functionDescriptors.add(function);
}
} }
namedMembers.functionDescriptors = functionDescriptors; namedMembers.functionDescriptors = functionDescriptors;
} }
@@ -1073,12 +1078,12 @@ public class JavaDescriptorResolver {
} else { } else {
typeSubstitutor = TypeSubstitutor.EMPTY; typeSubstitutor = TypeSubstitutor.EMPTY;
} }
resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, staticMembers, namedMembers, methodName); resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, namedMembers);
return namedMembers.functionDescriptors; return namedMembers.functionDescriptors;
} }
public TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) { private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
TypeSubstitutor typeSubstitutor; TypeSubstitutor typeSubstitutor;
if (classDescriptor != null) { if (classDescriptor != null) {
typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType()); typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
@@ -1230,18 +1235,23 @@ public class JavaDescriptorResolver {
return substitutedFunctionDescriptor; return substitutedFunctionDescriptor;
} }
public List<FunctionDescriptor> resolveMethods(PsiClass psiClass, DeclarationDescriptor containingDeclaration, boolean staticMembers, TypeSubstitutor substitutorForGenericSupertypes) { public List<FunctionDescriptor> resolveMethods(PsiClass psiClass, DeclarationDescriptor containingDeclaration) {
List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>(); ResolverScopeData scopeData = getResolverScopeData(containingDeclaration, new PsiClassWrapper(psiClass));
for (HierarchicalMethodSignature signature : psiClass.getVisibleSignatures()) {
PsiMethod method = signature.getMethod(); TypeSubstitutor substitutorForGenericSupertypes;
if (method.hasModifierProperty(PsiModifier.STATIC) != staticMembers) { if (scopeData instanceof ResolverClassData) {
continue; substitutorForGenericSupertypes = createSubstitutorForGenericSupertypes(((ResolverClassData) scopeData).classDescriptor);
} } else {
FunctionDescriptor functionDescriptor = semanticServices.getDescriptorResolver().resolveMethodToFunctionDescriptor(containingDeclaration, psiClass, substitutorForGenericSupertypes, new PsiMethodWrapper(method)); substitutorForGenericSupertypes = TypeSubstitutor.EMPTY;
if (functionDescriptor != null) {
functions.add(functionDescriptor);
}
} }
List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
for (NamedMembers namedMembers : scopeData.namedMembersMap.values()) {
resolveNamedGroupFunctions(containingDeclaration, psiClass, substitutorForGenericSupertypes, namedMembers);
functions.addAll(namedMembers.functionDescriptors);
}
return functions; return functions;
} }