From 86013aacdec49cf689e1eaba45aa2d725d80a3c7 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 24 Jul 2013 22:07:29 +0400 Subject: [PATCH] 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) --- .../resolve/java/JavaDescriptorResolver.java | 25 ++---- .../provider/ClassPsiDeclarationProvider.java | 40 ---------- .../PackagePsiDeclarationProvider.java | 37 --------- .../java/provider/PsiDeclarationProvider.java | 42 ---------- .../java/resolver/JavaFunctionResolver.java | 38 +++------ .../java/resolver/JavaPropertyResolver.java | 28 ++----- .../resolve/java/scope/JavaBaseScope.java | 15 ++-- .../java/scope/JavaClassMembersScope.java | 20 +++-- .../scope/JavaClassNonStaticMembersScope.java | 6 +- .../scope/JavaClassStaticMembersScope.java | 3 +- .../resolve/java/scope/JavaPackageScope.java | 10 ++- .../resolve/java/scope/MembersProvider.java | 79 +++++++++++++++++++ 12 files changed, 128 insertions(+), 215 deletions(-) delete mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/ClassPsiDeclarationProvider.java delete mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PackagePsiDeclarationProvider.java delete mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProvider.java create mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/MembersProvider.java 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 9fae3b1113d..dd43b194a1c 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 @@ -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 resolveFieldGroupByName( - @NotNull Name name, - @NotNull PsiDeclarationProvider provider, - @NotNull ClassOrNamespaceDescriptor ownerDescriptor - ) { - return propertiesResolver.resolveFieldGroupByName(name, provider, ownerDescriptor); + public Set 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 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 resolveFunctionGroupForPackage( - @NotNull Name methodName, - @NotNull PsiDeclarationProvider provider, - @NotNull NamespaceDescriptor ownerDescriptor - ) { - return functionResolver.resolveFunctionGroupForPackage(methodName, provider, ownerDescriptor); + public Set resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) { + return functionResolver.resolveFunctionGroupForPackage(members, owner); } @NotNull diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/ClassPsiDeclarationProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/ClassPsiDeclarationProvider.java deleted file mode 100644 index a158112f032..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/ClassPsiDeclarationProvider.java +++ /dev/null @@ -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); - } -} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PackagePsiDeclarationProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PackagePsiDeclarationProvider.java deleted file mode 100644 index dfbc3946984..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PackagePsiDeclarationProvider.java +++ /dev/null @@ -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); - } -} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProvider.java deleted file mode 100644 index 3e4a89f672f..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProvider.java +++ /dev/null @@ -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(); -} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java index 6d82c350ddf..42d3fc34270 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java @@ -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 resolveNamedGroupFunctions( - @NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass, - NamedMembers namedMembers, Name methodName + public Set resolveFunctionGroupForClass( + @NotNull NamedMembers namedMembers, + @NotNull ClassOrNamespaceDescriptor owner, + @NotNull PsiClass psiClass ) { + Name methodName = namedMembers.getName(); Set functionsFromSupertypes = null; if (owner instanceof ClassDescriptor) { @@ -368,31 +369,10 @@ public final class JavaFunctionResolver { } @NotNull - public Set 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 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.singleton(samConstructor); - } + public Set resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) { + SimpleFunctionDescriptor samConstructor = resolveSamConstructor(owner, members); + if (samConstructor != null) { + return Collections.singleton(samConstructor); } return Collections.emptySet(); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java index 17782c662e9..387ac644f33 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java @@ -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 resolveFieldGroupByName( - @NotNull Name fieldName, - @NotNull PsiDeclarationProvider provider, - @NotNull ClassOrNamespaceDescriptor ownerDescriptor - ) { - NamedMembers namedMembers = provider.getMembersCache().get(fieldName); - if (namedMembers == null) { - return Collections.emptySet(); - } + public Set 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 resolveNamedGroupProperties( - @NotNull ClassOrNamespaceDescriptor ownerDescriptor, - @NotNull NamedMembers namedMembers, - @NotNull Name propertyName, - @NotNull String context - ) { - List fields = namedMembers.getFields(); + List fields = members.getFields(); Set propertiesFromCurrent = new HashSet(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)); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaBaseScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaBaseScope.java index 5a84e9d2ecc..e89182f78cb 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaBaseScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaBaseScope.java @@ -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> 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 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 computeFieldAndFunctionDescriptors() { Collection result = Lists.newArrayList(); - for (NamedMembers members : declarationProvider.getMembersCache().allMembers()) { + for (NamedMembers members : membersProvider.allMembers()) { Name name = members.getName(); ProgressIndicatorProvider.checkCanceled(); result.addAll(getFunctions(name)); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java index 752de1a520a..24e371f720e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java @@ -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 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 diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java index dcfe371d44c..3b9ffabed59 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java @@ -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; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java index 4643ea19bd5..f2222ae9966 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java @@ -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; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java index b9974104190..959de9e4033 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java @@ -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 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 diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/MembersProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/MembersProvider.java new file mode 100644 index 00000000000..20caf65513a --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/MembersProvider.java @@ -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 allMembers() { + return getMembersCache().allMembers(); + } + + private MembersCache membersCache; + @NotNull + private MembersCache getMembersCache() { + if (membersCache == null) { + membersCache = MembersCache.buildMembersByNameCache(psiClassFinder, psiClass, psiPackage, staticMembers); + } + return membersCache; + } +}