diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java index daa5c444429..3eeb90983e5 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java @@ -8,7 +8,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; 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.resolve.scopes.receivers.ReceiverDescriptor; 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.List; import java.util.Map; -import java.util.Set; /** * @author abreslav @@ -73,9 +71,8 @@ public class JavaClassMembersScope extends JavaClassOrPackageScope { public Collection getAllDescriptors() { if (allDescriptors == null) { 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)); @@ -84,17 +81,6 @@ public class JavaClassMembersScope extends JavaClassOrPackageScope { 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) { // TODO : suboptimal, walk the list only once for (PsiClass innerClass : psiClass.getPsiClass().getAllInnerClasses()) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index c8766ffb590..0f99a9c4302 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -95,6 +95,7 @@ public class JavaDescriptorResolver { private Map namedMembersMap; } + /** Class with instance members */ private static class ResolverClassData extends ResolverScopeData { private MutableClassDescriptorLite classDescriptor; @@ -104,6 +105,7 @@ public class JavaDescriptorResolver { } } + /** Either package or class with static members */ private static class ResolverNamespaceData extends ResolverScopeData { private JavaNamespaceDescriptor namespaceDescriptor; @@ -1015,7 +1017,7 @@ public class JavaDescriptorResolver { 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) { return; } @@ -1027,7 +1029,10 @@ public class JavaDescriptorResolver { Set functionDescriptors = new HashSet(namedMembers.methods.size()); 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; } @@ -1073,12 +1078,12 @@ public class JavaDescriptorResolver { } else { typeSubstitutor = TypeSubstitutor.EMPTY; } - resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, staticMembers, namedMembers, methodName); + resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, namedMembers); return namedMembers.functionDescriptors; } - public TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) { + private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) { TypeSubstitutor typeSubstitutor; if (classDescriptor != null) { typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType()); @@ -1230,18 +1235,23 @@ public class JavaDescriptorResolver { return substitutedFunctionDescriptor; } - public List resolveMethods(PsiClass psiClass, DeclarationDescriptor containingDeclaration, boolean staticMembers, TypeSubstitutor substitutorForGenericSupertypes) { - List functions = new ArrayList(); - for (HierarchicalMethodSignature signature : psiClass.getVisibleSignatures()) { - PsiMethod method = signature.getMethod(); - if (method.hasModifierProperty(PsiModifier.STATIC) != staticMembers) { - continue; - } - FunctionDescriptor functionDescriptor = semanticServices.getDescriptorResolver().resolveMethodToFunctionDescriptor(containingDeclaration, psiClass, substitutorForGenericSupertypes, new PsiMethodWrapper(method)); - if (functionDescriptor != null) { - functions.add(functionDescriptor); - } + public List resolveMethods(PsiClass psiClass, DeclarationDescriptor containingDeclaration) { + ResolverScopeData scopeData = getResolverScopeData(containingDeclaration, new PsiClassWrapper(psiClass)); + + TypeSubstitutor substitutorForGenericSupertypes; + if (scopeData instanceof ResolverClassData) { + substitutorForGenericSupertypes = createSubstitutorForGenericSupertypes(((ResolverClassData) scopeData).classDescriptor); + } else { + substitutorForGenericSupertypes = TypeSubstitutor.EMPTY; } + + List functions = new ArrayList(); + + for (NamedMembers namedMembers : scopeData.namedMembersMap.values()) { + resolveNamedGroupFunctions(containingDeclaration, psiClass, substitutorForGenericSupertypes, namedMembers); + functions.addAll(namedMembers.functionDescriptors); + } + return functions; }