Delete PsiDeclarationProvider

And its two subclasses. Replace it by package-local MembersProvider, which is
used only in java scopes, and two factory methods (for package & for class)
This commit is contained in:
Alexander Udalov
2013-07-24 22:07:29 +04:00
committed by Pavel V. Talanov
parent e2d6234c9c
commit 86013aacde
12 changed files with 128 additions and 215 deletions
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.java.resolver.*; import org.jetbrains.jet.lang.resolve.java.resolver.*;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -210,12 +210,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
@NotNull @NotNull
public Set<VariableDescriptor> resolveFieldGroupByName( public Set<VariableDescriptor> resolveFieldGroup(@NotNull NamedMembers members, @NotNull ClassOrNamespaceDescriptor ownerDescriptor) {
@NotNull Name name, return propertiesResolver.resolveFieldGroup(members, ownerDescriptor);
@NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor
) {
return propertiesResolver.resolveFieldGroupByName(name, provider, ownerDescriptor);
} }
@Nullable @Nullable
@@ -245,21 +241,16 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
@NotNull @NotNull
public Set<FunctionDescriptor> resolveFunctionGroupForClass( public Set<FunctionDescriptor> resolveFunctionGroupForClass(
@NotNull Name methodName, @NotNull NamedMembers members,
@NotNull PsiDeclarationProvider provider, @NotNull ClassOrNamespaceDescriptor owner,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor,
@NotNull PsiClass psiClass @NotNull PsiClass psiClass
) { ) {
return functionResolver.resolveFunctionGroupForClass(methodName, provider, ownerDescriptor, psiClass); return functionResolver.resolveFunctionGroupForClass(members, owner, psiClass);
} }
@NotNull @NotNull
public Set<FunctionDescriptor> resolveFunctionGroupForPackage( public Set<FunctionDescriptor> resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) {
@NotNull Name methodName, return functionResolver.resolveFunctionGroupForPackage(members, owner);
@NotNull PsiDeclarationProvider provider,
@NotNull NamespaceDescriptor ownerDescriptor
) {
return functionResolver.resolveFunctionGroupForPackage(methodName, provider, ownerDescriptor);
} }
@NotNull @NotNull
@@ -1,40 +0,0 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve.java.provider;
import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
public final class ClassPsiDeclarationProvider extends PsiDeclarationProvider {
@NotNull
private final PsiClass psiClass;
private final boolean staticMembers;
public ClassPsiDeclarationProvider(@NotNull PsiClass psiClass, boolean staticMembers, @NotNull PsiClassFinder psiClassFinder) {
super(psiClassFinder);
this.staticMembers = staticMembers;
this.psiClass = psiClass;
}
@Override
@NotNull
protected MembersCache buildMembersCache() {
return MembersCache.buildMembersByNameCache(psiClassFinder, psiClass, null, staticMembers);
}
}
@@ -1,37 +0,0 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve.java.provider;
import com.intellij.psi.PsiPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
public final class PackagePsiDeclarationProvider extends PsiDeclarationProvider {
@NotNull
private final PsiPackage psiPackage;
public PackagePsiDeclarationProvider(@NotNull PsiPackage psiPackage, @NotNull PsiClassFinder psiClassFinder) {
super(psiClassFinder);
this.psiPackage = psiPackage;
}
@NotNull
@Override
protected MembersCache buildMembersCache() {
return MembersCache.buildMembersByNameCache(psiClassFinder, null, psiPackage, true);
}
}
@@ -1,42 +0,0 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve.java.provider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
public abstract class PsiDeclarationProvider {
@NotNull
protected final PsiClassFinder psiClassFinder;
private MembersCache membersCache;
protected PsiDeclarationProvider(@NotNull PsiClassFinder psiClassFinder) {
this.psiClassFinder = psiClassFinder;
}
@NotNull
public MembersCache getMembersCache() {
if (membersCache == null) {
membersCache = buildMembersCache();
}
return membersCache;
}
@NotNull
protected abstract MembersCache buildMembersCache();
}
@@ -35,7 +35,6 @@ import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmByte
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData;
import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers; import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -244,10 +243,12 @@ public final class JavaFunctionResolver {
} }
@NotNull @NotNull
private Set<FunctionDescriptor> resolveNamedGroupFunctions( public Set<FunctionDescriptor> resolveFunctionGroupForClass(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass, @NotNull NamedMembers namedMembers,
NamedMembers namedMembers, Name methodName @NotNull ClassOrNamespaceDescriptor owner,
@NotNull PsiClass psiClass
) { ) {
Name methodName = namedMembers.getName();
Set<SimpleFunctionDescriptor> functionsFromSupertypes = null; Set<SimpleFunctionDescriptor> functionsFromSupertypes = null;
if (owner instanceof ClassDescriptor) { if (owner instanceof ClassDescriptor) {
@@ -368,31 +369,10 @@ public final class JavaFunctionResolver {
} }
@NotNull @NotNull
public Set<FunctionDescriptor> resolveFunctionGroupForClass( public Set<FunctionDescriptor> resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) {
@NotNull Name methodName, SimpleFunctionDescriptor samConstructor = resolveSamConstructor(owner, members);
@NotNull PsiDeclarationProvider provider, if (samConstructor != null) {
@NotNull ClassOrNamespaceDescriptor ownerDescriptor, return Collections.<FunctionDescriptor>singleton(samConstructor);
@NotNull PsiClass psiClass
) {
NamedMembers namedMembers = provider.getMembersCache().get(methodName);
if (namedMembers == null) {
return Collections.emptySet();
}
return resolveNamedGroupFunctions(ownerDescriptor, psiClass, namedMembers, methodName);
}
@NotNull
public Set<FunctionDescriptor> resolveFunctionGroupForPackage(
@NotNull Name functionName,
@NotNull PsiDeclarationProvider provider,
@NotNull NamespaceDescriptor ownerDescriptor
) {
NamedMembers namedMembers = provider.getMembersCache().get(functionName);
if (namedMembers != null) {
SimpleFunctionDescriptor samConstructor = resolveSamConstructor(ownerDescriptor, namedMembers);
if (samConstructor != null) {
return Collections.<FunctionDescriptor>singleton(samConstructor);
}
} }
return Collections.emptySet(); return Collections.emptySet();
} }
@@ -31,7 +31,6 @@ import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData;
import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers; import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiFieldWrapper; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiFieldWrapper;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -68,35 +67,18 @@ public final class JavaPropertyResolver {
} }
@NotNull @NotNull
public Set<VariableDescriptor> resolveFieldGroupByName( public Set<VariableDescriptor> resolveFieldGroup(@NotNull NamedMembers members, @NotNull ClassOrNamespaceDescriptor ownerDescriptor) {
@NotNull Name fieldName, Name propertyName = members.getName();
@NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor
) {
NamedMembers namedMembers = provider.getMembersCache().get(fieldName);
if (namedMembers == null) {
return Collections.emptySet();
}
return resolveNamedGroupProperties(ownerDescriptor, namedMembers, fieldName, List<PsiFieldWrapper> fields = members.getFields();
"class or namespace " + DescriptorUtils.getFQName(ownerDescriptor));
}
@NotNull
private Set<VariableDescriptor> resolveNamedGroupProperties(
@NotNull ClassOrNamespaceDescriptor ownerDescriptor,
@NotNull NamedMembers namedMembers,
@NotNull Name propertyName,
@NotNull String context
) {
List<PsiFieldWrapper> fields = namedMembers.getFields();
Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1); Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
assert fields.size() <= 1; assert fields.size() <= 1;
if (fields.size() == 1) { if (fields.size() == 1) {
PsiFieldWrapper field = fields.iterator().next(); PsiFieldWrapper field = fields.iterator().next();
if (DescriptorResolverUtils.isCorrectOwnerForEnumMember(ownerDescriptor, field.getPsiField())) { if (DescriptorResolverUtils.isCorrectOwnerForEnumMember(ownerDescriptor, field.getPsiField())) {
propertiesFromCurrent.add(resolveProperty(ownerDescriptor, propertyName, context, field)); propertiesFromCurrent.add(resolveProperty(ownerDescriptor, propertyName,
"class or namespace " + DescriptorUtils.getFQName(ownerDescriptor), field));
} }
} }
@@ -28,7 +28,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers; import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl; import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl;
@@ -38,7 +37,7 @@ public abstract class JavaBaseScope extends JetScopeImpl {
@NotNull @NotNull
protected final JavaDescriptorResolver javaDescriptorResolver; protected final JavaDescriptorResolver javaDescriptorResolver;
@NotNull @NotNull
protected final PsiDeclarationProvider declarationProvider; protected final MembersProvider membersProvider;
@NotNull @NotNull
private final Map<Name, Set<FunctionDescriptor>> functionDescriptors = Maps.newHashMap(); private final Map<Name, Set<FunctionDescriptor>> functionDescriptors = Maps.newHashMap();
@NotNull @NotNull
@@ -56,10 +55,10 @@ public abstract class JavaBaseScope extends JetScopeImpl {
protected JavaBaseScope( protected JavaBaseScope(
@NotNull ClassOrNamespaceDescriptor descriptor, @NotNull ClassOrNamespaceDescriptor descriptor,
@NotNull JavaDescriptorResolver javaDescriptorResolver, @NotNull JavaDescriptorResolver javaDescriptorResolver,
@NotNull PsiDeclarationProvider declarationProvider @NotNull MembersProvider membersProvider
) { ) {
this.javaDescriptorResolver = javaDescriptorResolver; this.javaDescriptorResolver = javaDescriptorResolver;
this.declarationProvider = declarationProvider; this.membersProvider = membersProvider;
this.descriptor = descriptor; this.descriptor = descriptor;
} }
@@ -86,7 +85,11 @@ public abstract class JavaBaseScope extends JetScopeImpl {
@NotNull @NotNull
private Set<VariableDescriptor> computePropertyDescriptors(@NotNull Name name) { private Set<VariableDescriptor> computePropertyDescriptors(@NotNull Name name) {
return javaDescriptorResolver.resolveFieldGroupByName(name, declarationProvider, descriptor); NamedMembers members = membersProvider.get(name);
if (members == null) {
return Collections.emptySet();
}
return javaDescriptorResolver.resolveFieldGroup(members, descriptor);
} }
@NotNull @NotNull
@@ -146,7 +149,7 @@ public abstract class JavaBaseScope extends JetScopeImpl {
@NotNull @NotNull
private Collection<DeclarationDescriptor> computeFieldAndFunctionDescriptors() { private Collection<DeclarationDescriptor> computeFieldAndFunctionDescriptors() {
Collection<DeclarationDescriptor> result = Lists.newArrayList(); Collection<DeclarationDescriptor> result = Lists.newArrayList();
for (NamedMembers members : declarationProvider.getMembersCache().allMembers()) { for (NamedMembers members : membersProvider.allMembers()) {
Name name = members.getName(); Name name = members.getName();
ProgressIndicatorProvider.checkCanceled(); ProgressIndicatorProvider.checkCanceled();
result.addAll(getFunctions(name)); result.addAll(getFunctions(name));
@@ -20,18 +20,13 @@ import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.LabelName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collection; import java.util.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public abstract class JavaClassMembersScope extends JavaBaseScope { public abstract class JavaClassMembersScope extends JavaBaseScope {
@NotNull
protected final ClassPsiDeclarationProvider declarationProvider;
@NotNull @NotNull
protected final PsiClass psiClass; protected final PsiClass psiClass;
@@ -40,11 +35,10 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
protected JavaClassMembersScope( protected JavaClassMembersScope(
@NotNull ClassOrNamespaceDescriptor descriptor, @NotNull ClassOrNamespaceDescriptor descriptor,
@NotNull PsiClass psiClass, @NotNull PsiClass psiClass,
@NotNull ClassPsiDeclarationProvider declarationProvider, @NotNull MembersProvider membersProvider,
@NotNull JavaDescriptorResolver javaDescriptorResolver @NotNull JavaDescriptorResolver javaDescriptorResolver
) { ) {
super(descriptor, javaDescriptorResolver, declarationProvider); super(descriptor, javaDescriptorResolver, membersProvider);
this.declarationProvider = declarationProvider;
this.psiClass = psiClass; this.psiClass = psiClass;
} }
@@ -64,7 +58,11 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
@NotNull @NotNull
@Override @Override
protected Set<FunctionDescriptor> computeFunctionDescriptor(@NotNull Name name) { protected Set<FunctionDescriptor> computeFunctionDescriptor(@NotNull Name name) {
return javaDescriptorResolver.resolveFunctionGroupForClass(name, declarationProvider, descriptor, psiClass); NamedMembers members = membersProvider.get(name);
if (members == null) {
return Collections.emptySet();
}
return javaDescriptorResolver.resolveFunctionGroupForClass(members, descriptor, psiClass);
} }
@NotNull @NotNull
@@ -23,7 +23,6 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -45,10 +44,7 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
@NotNull PsiClassFinder psiClassFinder, @NotNull PsiClassFinder psiClassFinder,
@NotNull JavaDescriptorResolver javaDescriptorResolver @NotNull JavaDescriptorResolver javaDescriptorResolver
) { ) {
super(descriptor, super(descriptor, psiClass, MembersProvider.forClass(psiClassFinder, psiClass, staticMembersOfPsiClass), javaDescriptorResolver);
psiClass,
new ClassPsiDeclarationProvider(psiClass, staticMembersOfPsiClass, psiClassFinder),
javaDescriptorResolver);
this.descriptor = descriptor; this.descriptor = descriptor;
this.psiClass = psiClass; this.psiClass = psiClass;
this.staticMembersOfPsiClass = staticMembersOfPsiClass; this.staticMembersOfPsiClass = staticMembersOfPsiClass;
@@ -25,7 +25,6 @@ import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -45,7 +44,7 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
@NotNull PsiClassFinder psiClassFinder, @NotNull PsiClassFinder psiClassFinder,
@NotNull JavaDescriptorResolver javaDescriptorResolver @NotNull JavaDescriptorResolver javaDescriptorResolver
) { ) {
super(descriptor, psiClass, new ClassPsiDeclarationProvider(psiClass, true, psiClassFinder), javaDescriptorResolver); super(descriptor, psiClass, MembersProvider.forClass(psiClassFinder, psiClass, true), javaDescriptorResolver);
this.packageFQN = packageFQN; this.packageFQN = packageFQN;
this.psiClass = psiClass; this.psiClass = psiClass;
} }
@@ -24,7 +24,7 @@ import com.intellij.psi.PsiPackage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -47,7 +47,7 @@ public final class JavaPackageScope extends JavaBaseScope {
@NotNull JavaDescriptorResolver javaDescriptorResolver, @NotNull JavaDescriptorResolver javaDescriptorResolver,
@NotNull PsiClassFinder psiClassFinder @NotNull PsiClassFinder psiClassFinder
) { ) {
super(descriptor, javaDescriptorResolver, new PackagePsiDeclarationProvider(psiPackage, psiClassFinder)); super(descriptor, javaDescriptorResolver, MembersProvider.forPackage(psiClassFinder, psiPackage));
this.psiPackage = psiPackage; this.psiPackage = psiPackage;
this.packageFQN = packageFQN; this.packageFQN = packageFQN;
this.psiClassFinder = psiClassFinder; this.psiClassFinder = psiClassFinder;
@@ -134,7 +134,11 @@ public final class JavaPackageScope extends JavaBaseScope {
@Override @Override
@NotNull @NotNull
protected Set<FunctionDescriptor> computeFunctionDescriptor(@NotNull Name name) { protected Set<FunctionDescriptor> computeFunctionDescriptor(@NotNull Name name) {
return javaDescriptorResolver.resolveFunctionGroupForPackage(name, declarationProvider, (NamespaceDescriptor) descriptor); NamedMembers members = membersProvider.get(name);
if (members == null) {
return Collections.emptySet();
}
return javaDescriptorResolver.resolveFunctionGroupForPackage(members, (NamespaceDescriptor) descriptor);
} }
@NotNull @NotNull
@@ -0,0 +1,79 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve.java.scope;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
import org.jetbrains.jet.lang.resolve.java.provider.MembersCache;
import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collection;
/* package */ class MembersProvider {
@NotNull
private final PsiClassFinder psiClassFinder;
@Nullable
private final PsiClass psiClass;
@Nullable
private final PsiPackage psiPackage;
private final boolean staticMembers;
private MembersProvider(
@NotNull PsiClassFinder psiClassFinder,
@Nullable PsiClass psiClass,
@Nullable PsiPackage psiPackage,
boolean staticMembers
) {
this.psiClassFinder = psiClassFinder;
this.psiClass = psiClass;
this.psiPackage = psiPackage;
this.staticMembers = staticMembers;
}
@NotNull
public static MembersProvider forPackage(@NotNull PsiClassFinder psiClassFinder, @NotNull PsiPackage psiPackage) {
return new MembersProvider(psiClassFinder, null, psiPackage, true);
}
@NotNull
public static MembersProvider forClass(@NotNull PsiClassFinder psiClassFinder, @NotNull PsiClass psiClass, boolean staticMembers) {
return new MembersProvider(psiClassFinder, psiClass, null, staticMembers);
}
@Nullable
public NamedMembers get(@NotNull Name name) {
return getMembersCache().get(name);
}
@NotNull
public Collection<NamedMembers> allMembers() {
return getMembersCache().allMembers();
}
private MembersCache membersCache;
@NotNull
private MembersCache getMembersCache() {
if (membersCache == null) {
membersCache = MembersCache.buildMembersByNameCache(psiClassFinder, psiClass, psiPackage, staticMembers);
}
return membersCache;
}
}