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.jet.lang.descriptors.*;
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.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -210,12 +210,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
}
@NotNull
public Set<VariableDescriptor> resolveFieldGroupByName(
@NotNull Name name,
@NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor
) {
return propertiesResolver.resolveFieldGroupByName(name, provider, ownerDescriptor);
public Set<VariableDescriptor> resolveFieldGroup(@NotNull NamedMembers members, @NotNull ClassOrNamespaceDescriptor ownerDescriptor) {
return propertiesResolver.resolveFieldGroup(members, ownerDescriptor);
}
@Nullable
@@ -245,21 +241,16 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
@NotNull
public Set<FunctionDescriptor> resolveFunctionGroupForClass(
@NotNull Name methodName,
@NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor,
@NotNull NamedMembers members,
@NotNull ClassOrNamespaceDescriptor owner,
@NotNull PsiClass psiClass
) {
return functionResolver.resolveFunctionGroupForClass(methodName, provider, ownerDescriptor, psiClass);
return functionResolver.resolveFunctionGroupForClass(members, owner, psiClass);
}
@NotNull
public Set<FunctionDescriptor> resolveFunctionGroupForPackage(
@NotNull Name methodName,
@NotNull PsiDeclarationProvider provider,
@NotNull NamespaceDescriptor ownerDescriptor
) {
return functionResolver.resolveFunctionGroupForPackage(methodName, provider, ownerDescriptor);
public Set<FunctionDescriptor> resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) {
return functionResolver.resolveFunctionGroupForPackage(members, owner);
}
@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.SignaturesPropagationData;
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.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -244,10 +243,12 @@ public final class JavaFunctionResolver {
}
@NotNull
private Set<FunctionDescriptor> resolveNamedGroupFunctions(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass,
NamedMembers namedMembers, Name methodName
public Set<FunctionDescriptor> resolveFunctionGroupForClass(
@NotNull NamedMembers namedMembers,
@NotNull ClassOrNamespaceDescriptor owner,
@NotNull PsiClass psiClass
) {
Name methodName = namedMembers.getName();
Set<SimpleFunctionDescriptor> functionsFromSupertypes = null;
if (owner instanceof ClassDescriptor) {
@@ -368,31 +369,10 @@ public final class JavaFunctionResolver {
}
@NotNull
public Set<FunctionDescriptor> resolveFunctionGroupForClass(
@NotNull Name methodName,
@NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor,
@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);
}
public Set<FunctionDescriptor> resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) {
SimpleFunctionDescriptor samConstructor = resolveSamConstructor(owner, members);
if (samConstructor != null) {
return Collections.<FunctionDescriptor>singleton(samConstructor);
}
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.kotlinSignature.AlternativeFieldSignatureData;
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.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -68,35 +67,18 @@ public final class JavaPropertyResolver {
}
@NotNull
public Set<VariableDescriptor> resolveFieldGroupByName(
@NotNull Name fieldName,
@NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor
) {
NamedMembers namedMembers = provider.getMembersCache().get(fieldName);
if (namedMembers == null) {
return Collections.emptySet();
}
public Set<VariableDescriptor> resolveFieldGroup(@NotNull NamedMembers members, @NotNull ClassOrNamespaceDescriptor ownerDescriptor) {
Name propertyName = members.getName();
return resolveNamedGroupProperties(ownerDescriptor, namedMembers, fieldName,
"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();
List<PsiFieldWrapper> fields = members.getFields();
Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
assert fields.size() <= 1;
if (fields.size() == 1) {
PsiFieldWrapper field = fields.iterator().next();
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.resolve.java.JavaDescriptorResolver;
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.scopes.JetScopeImpl;
@@ -38,7 +37,7 @@ public abstract class JavaBaseScope extends JetScopeImpl {
@NotNull
protected final JavaDescriptorResolver javaDescriptorResolver;
@NotNull
protected final PsiDeclarationProvider declarationProvider;
protected final MembersProvider membersProvider;
@NotNull
private final Map<Name, Set<FunctionDescriptor>> functionDescriptors = Maps.newHashMap();
@NotNull
@@ -56,10 +55,10 @@ public abstract class JavaBaseScope extends JetScopeImpl {
protected JavaBaseScope(
@NotNull ClassOrNamespaceDescriptor descriptor,
@NotNull JavaDescriptorResolver javaDescriptorResolver,
@NotNull PsiDeclarationProvider declarationProvider
@NotNull MembersProvider membersProvider
) {
this.javaDescriptorResolver = javaDescriptorResolver;
this.declarationProvider = declarationProvider;
this.membersProvider = membersProvider;
this.descriptor = descriptor;
}
@@ -86,7 +85,11 @@ public abstract class JavaBaseScope extends JetScopeImpl {
@NotNull
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
@@ -146,7 +149,7 @@ public abstract class JavaBaseScope extends JetScopeImpl {
@NotNull
private Collection<DeclarationDescriptor> computeFieldAndFunctionDescriptors() {
Collection<DeclarationDescriptor> result = Lists.newArrayList();
for (NamedMembers members : declarationProvider.getMembersCache().allMembers()) {
for (NamedMembers members : membersProvider.allMembers()) {
Name name = members.getName();
ProgressIndicatorProvider.checkCanceled();
result.addAll(getFunctions(name));
@@ -20,18 +20,13 @@ import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
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.Name;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.*;
public abstract class JavaClassMembersScope extends JavaBaseScope {
@NotNull
protected final ClassPsiDeclarationProvider declarationProvider;
@NotNull
protected final PsiClass psiClass;
@@ -40,11 +35,10 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
protected JavaClassMembersScope(
@NotNull ClassOrNamespaceDescriptor descriptor,
@NotNull PsiClass psiClass,
@NotNull ClassPsiDeclarationProvider declarationProvider,
@NotNull MembersProvider membersProvider,
@NotNull JavaDescriptorResolver javaDescriptorResolver
) {
super(descriptor, javaDescriptorResolver, declarationProvider);
this.declarationProvider = declarationProvider;
super(descriptor, javaDescriptorResolver, membersProvider);
this.psiClass = psiClass;
}
@@ -64,7 +58,11 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
@NotNull
@Override
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
@@ -23,7 +23,6 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import java.util.Collection;
import java.util.Collections;
@@ -45,10 +44,7 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
@NotNull PsiClassFinder psiClassFinder,
@NotNull JavaDescriptorResolver javaDescriptorResolver
) {
super(descriptor,
psiClass,
new ClassPsiDeclarationProvider(psiClass, staticMembersOfPsiClass, psiClassFinder),
javaDescriptorResolver);
super(descriptor, psiClass, MembersProvider.forClass(psiClassFinder, psiClass, staticMembersOfPsiClass), javaDescriptorResolver);
this.descriptor = descriptor;
this.psiClass = psiClass;
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.JavaDescriptorResolver;
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.Name;
@@ -45,7 +44,7 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
@NotNull PsiClassFinder psiClassFinder,
@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.psiClass = psiClass;
}
@@ -24,7 +24,7 @@ import com.intellij.psi.PsiPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
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.Name;
@@ -47,7 +47,7 @@ public final class JavaPackageScope extends JavaBaseScope {
@NotNull JavaDescriptorResolver javaDescriptorResolver,
@NotNull PsiClassFinder psiClassFinder
) {
super(descriptor, javaDescriptorResolver, new PackagePsiDeclarationProvider(psiPackage, psiClassFinder));
super(descriptor, javaDescriptorResolver, MembersProvider.forPackage(psiClassFinder, psiPackage));
this.psiPackage = psiPackage;
this.packageFQN = packageFQN;
this.psiClassFinder = psiClassFinder;
@@ -134,7 +134,11 @@ public final class JavaPackageScope extends JavaBaseScope {
@Override
@NotNull
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
@@ -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;
}
}