diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java index 499f4519304..7aee1bb6ac9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java @@ -69,6 +69,12 @@ public abstract class JavaClassOrPackageScope extends JetScopeImpl { return semanticServices.getDescriptorResolver().resolveMethods(resolverScopeData, NamePredicate.exact(name)); } + @NotNull + @Override + public Collection getAllDescriptorNames() { + return semanticServices.getDescriptorResolver().resolveMemberNames(resolverScopeData); + } + @NotNull @Override public Collection getAllDescriptors(@NotNull DescriptorPredicate predicate) { 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 5bbdc73ba26..af318d4b0e5 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 @@ -1518,6 +1518,13 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes return functions; } + @NotNull + public Collection resolveMemberNames(@NotNull ResolverScopeData scopeData) { + getResolverScopeData(scopeData); + // TODO: inner classes are not added + return scopeData.namedMembersMap.keySet(); + } + private Collection getSupertypes(ResolverScopeData scope) { if (scope instanceof ResolverBinaryClassData) { return ((ResolverBinaryClassData) scope).classDescriptor.getSupertypes(); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java index a6a7fc17fb7..475731923fc 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java @@ -20,9 +20,12 @@ import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiParameter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.java.prop.PropertyNameUtils; import org.jetbrains.jet.lang.resolve.java.prop.PropertyParseResult; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.types.JetType; import java.util.Collections; import java.util.HashMap; @@ -36,23 +39,28 @@ class JavaDescriptorResolverHelper { } private static class Builder { + @NotNull + private final JavaDescriptorResolver.ResolverScopeData scopeData; + @NotNull private final PsiClassWrapper psiClass; private final boolean staticMembers; private final boolean kotlin; private Map namedMembersMap = new HashMap(); - private Builder(PsiClassWrapper psiClass, boolean staticMembers, boolean kotlin) { - this.psiClass = psiClass; - this.staticMembers = staticMembers; - this.kotlin = kotlin; + private Builder(@NotNull JavaDescriptorResolver.ResolverScopeData scopeData) { + this.scopeData = scopeData; + this.psiClass = new PsiClassWrapper(scopeData.psiClass); + this.staticMembers = scopeData.staticMembers; + this.kotlin = scopeData.kotlin; } public void run() { + createGroupsForMembersFromSupertypes(); processFields(); processMethods(); } - + private NamedMembers getNamedMembers(Name name) { NamedMembers r = namedMembersMap.get(name); if (r == null) { @@ -62,6 +70,23 @@ class JavaDescriptorResolverHelper { } return r; } + + private void createGroupsForMembersFromSupertypes() { + if (scopeData.classOrNamespaceDescriptor instanceof ClassDescriptor) { + ClassDescriptor clazz = (ClassDescriptor) scopeData.classOrNamespaceDescriptor; + for (JetType supertype : clazz.getTypeConstructor().getSupertypes()) { + for (Name name : supertype.getMemberScope().getAllDescriptorNames()) { + getNamedMembers(name); + } + } + } + else if (scopeData.classOrNamespaceDescriptor instanceof NamespaceDescriptor) { + + } + else { + throw new IllegalStateException("unknown descriptor: " + scopeData.classOrNamespaceDescriptor); + } + } private boolean includeMember(PsiMemberWrapper member) { if (member.isStatic() != staticMembers) { @@ -99,16 +124,6 @@ class JavaDescriptorResolverHelper { private void processMethods() { - for (PsiMethod method : psiClass.getPsiClass().getAllMethods()) { - getNamedMembers(Name.identifier(method.getName())); - - PropertyParseResult propertyParseResult = PropertyNameUtils.parseMethodToProperty(method.getName()); - if (propertyParseResult != null) { - getNamedMembers(Name.identifier(propertyParseResult.getPropertyName())); - } - } - - for (PsiMethod method0 : psiClass.getPsiClass().getMethods()) { PsiMethodWrapper method = new PsiMethodWrapper(method0); @@ -216,7 +231,7 @@ class JavaDescriptorResolverHelper { @NotNull static Map getNamedMembers(@NotNull JavaDescriptorResolver.ResolverScopeData resolverScopeData) { if (resolverScopeData.psiClass != null) { - Builder builder = new Builder(new PsiClassWrapper(resolverScopeData.psiClass), resolverScopeData.staticMembers, resolverScopeData.kotlin); + Builder builder = new Builder(resolverScopeData); builder.run(); return builder.namedMembersMap; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java index 1607af7575f..37dfc1670af 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java @@ -88,6 +88,9 @@ public interface JetScope { Collection getAllDescriptors(); + @NotNull + Collection getAllDescriptorNames(); + /** * @return EFFECTIVE implicit receiver at this point (may be corresponding to an outer scope) */ diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeBase.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeBase.java index 42130096fc9..07d6daaa0ba 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeBase.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeBase.java @@ -16,9 +16,13 @@ package org.jetbrains.jet.lang.resolve.scopes; +import com.google.common.collect.Sets; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.resolve.name.Name; import java.util.Collection; +import java.util.Set; /** * @author Stepan Koltsov @@ -30,4 +34,14 @@ public abstract class JetScopeBase implements JetScope { return getAllDescriptors(DescriptorPredicate.all()); } + @NotNull + @Override + public Collection getAllDescriptorNames() { + // dummy implementation + Set r = Sets.newHashSet(); + for (DeclarationDescriptor descriptor : getAllDescriptors()) { + r.add(descriptor.getName()); + } + return r; + } }