Simplify PsiDeclarationProvider

- simplify hierarchy, now there's only two kinds of providers: for packages and
  for classes
- remove getters from providers and thus almost get rid of dependencies on them
  from the outside resolver (the only usages left are those that call
  getMembersCache)
This commit is contained in:
Alexander Udalov
2013-07-24 21:20:38 +04:00
committed by Pavel V. Talanov
parent d708dc6ed4
commit e2d6234c9c
19 changed files with 159 additions and 251 deletions
@@ -16,12 +16,11 @@
package org.jetbrains.jet.lang.resolve.java; package org.jetbrains.jet.lang.resolve.java;
import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull; 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.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider;
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;
@@ -191,10 +190,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
@NotNull @NotNull
public Collection<ConstructorDescriptor> resolveConstructors( public Collection<ConstructorDescriptor> resolveConstructors(@NotNull PsiClass psiClass, @NotNull ClassDescriptor classDescriptor) {
@NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptor classDescriptor return constructorResolver.resolveConstructors(psiClass, classDescriptor);
) {
return constructorResolver.resolveConstructors(classData, classDescriptor);
} }
@Nullable @Nullable
@@ -215,10 +212,10 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
@NotNull @NotNull
public Set<VariableDescriptor> resolveFieldGroupByName( public Set<VariableDescriptor> resolveFieldGroupByName(
@NotNull Name name, @NotNull Name name,
@NotNull PsiDeclarationProvider data, @NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor @NotNull ClassOrNamespaceDescriptor ownerDescriptor
) { ) {
return propertiesResolver.resolveFieldGroupByName(name, data, ownerDescriptor); return propertiesResolver.resolveFieldGroupByName(name, provider, ownerDescriptor);
} }
@Nullable @Nullable
@@ -247,25 +244,26 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
@NotNull @NotNull
public Set<FunctionDescriptor> resolveFunctionGroup( public Set<FunctionDescriptor> resolveFunctionGroupForClass(
@NotNull Name methodName, @NotNull Name methodName,
@NotNull ClassPsiDeclarationProvider scopeData, @NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor @NotNull ClassOrNamespaceDescriptor ownerDescriptor,
@NotNull PsiClass psiClass
) { ) {
return functionResolver.resolveFunctionGroup(methodName, scopeData, ownerDescriptor); return functionResolver.resolveFunctionGroupForClass(methodName, provider, ownerDescriptor, psiClass);
} }
@NotNull @NotNull
public Set<FunctionDescriptor> resolveFunctionGroup( public Set<FunctionDescriptor> resolveFunctionGroupForPackage(
@NotNull Name methodName, @NotNull Name methodName,
@NotNull PackagePsiDeclarationProvider scopeData, @NotNull PsiDeclarationProvider provider,
@NotNull NamespaceDescriptor ownerDescriptor @NotNull NamespaceDescriptor ownerDescriptor
) { ) {
return functionResolver.resolveFunctionGroup(methodName, scopeData, ownerDescriptor); return functionResolver.resolveFunctionGroupForPackage(methodName, provider, ownerDescriptor);
} }
@NotNull @NotNull
public List<ClassDescriptor> resolveInnerClasses(@NotNull ClassPsiDeclarationProvider declarationProvider) { public List<ClassDescriptor> resolveInnerClasses(@NotNull PsiClass psiClass) {
return innerClassResolver.resolveInnerClasses(declarationProvider); return innerClassResolver.resolveInnerClasses(psiClass);
} }
} }
@@ -18,12 +18,23 @@ package org.jetbrains.jet.lang.resolve.java.provider;
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
public interface ClassPsiDeclarationProvider extends PsiDeclarationProvider { public final class ClassPsiDeclarationProvider extends PsiDeclarationProvider {
@NotNull @NotNull
PsiClass getPsiClass(); private final PsiClass psiClass;
//TODO: remove this method private final boolean staticMembers;
boolean isStaticMembers();
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,54 +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 class ClassPsiDeclarationProviderImpl extends PsiDeclarationProviderBase implements ClassPsiDeclarationProvider {
@NotNull
protected final PsiClassFinder psiClassFinder;
@NotNull
private final PsiClass psiClass;
private final boolean staticMembers;
public ClassPsiDeclarationProviderImpl(@NotNull PsiClass psiClass, boolean staticMembers, @NotNull PsiClassFinder psiClassFinder) {
this.staticMembers = staticMembers;
this.psiClass = psiClass;
this.psiClassFinder = psiClassFinder;
}
@Override
@NotNull
protected MembersCache buildMembersCache() {
return MembersCache.buildMembersByNameCache(new MembersCache(), psiClassFinder, psiClass, null, staticMembers);
}
@Override
@NotNull
public PsiClass getPsiClass() {
return psiClass;
}
@Override
public boolean isStaticMembers() {
return staticMembers;
}
}
@@ -99,12 +99,13 @@ public final class MembersCache {
@NotNull @NotNull
public static MembersCache buildMembersByNameCache( public static MembersCache buildMembersByNameCache(
@NotNull MembersCache membersCache,
@NotNull PsiClassFinder finder, @NotNull PsiClassFinder finder,
@Nullable PsiClass psiClass, @Nullable PsiClass psiClass,
@Nullable PsiPackage psiPackage, @Nullable PsiPackage psiPackage,
boolean staticMembers boolean staticMembers
) { ) {
MembersCache membersCache = new MembersCache();
if (psiClass != null) { if (psiClass != null) {
membersCache.new ClassMemberProcessor(psiClass, staticMembers).process(); membersCache.new ClassMemberProcessor(psiClass, staticMembers).process();
} }
@@ -112,6 +113,7 @@ public final class MembersCache {
//TODO: //TODO:
List<PsiClass> classes = psiPackage != null ? finder.findPsiClasses(psiPackage) : finder.findInnerPsiClasses(psiClass); List<PsiClass> classes = psiPackage != null ? finder.findPsiClasses(psiPackage) : finder.findInnerPsiClasses(psiClass);
membersCache.new ExtraPackageMembersProcessor(classes).process(); membersCache.new ExtraPackageMembersProcessor(classes).process();
return membersCache; return membersCache;
} }
@@ -18,9 +18,20 @@ package org.jetbrains.jet.lang.resolve.java.provider;
import com.intellij.psi.PsiPackage; import com.intellij.psi.PsiPackage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
public interface PackagePsiDeclarationProvider extends PsiDeclarationProvider { 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 @NotNull
PsiPackage getPsiPackage(); @Override
protected MembersCache buildMembersCache() {
return MembersCache.buildMembersByNameCache(psiClassFinder, null, psiPackage, true);
}
} }
@@ -1,46 +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 PackagePsiDeclarationProviderImpl extends PsiDeclarationProviderBase implements PackagePsiDeclarationProvider {
@NotNull
private final PsiPackage psiPackage;
@NotNull
private final PsiClassFinder psiClassFinder;
public PackagePsiDeclarationProviderImpl(@NotNull PsiPackage psiPackage, @NotNull PsiClassFinder psiClassFinder) {
this.psiPackage = psiPackage;
this.psiClassFinder = psiClassFinder;
}
@NotNull
@Override
public PsiPackage getPsiPackage() {
return psiPackage;
}
@NotNull
@Override
protected MembersCache buildMembersCache() {
return MembersCache.buildMembersByNameCache(new MembersCache(), psiClassFinder, null, getPsiPackage(), true);
}
}
@@ -17,9 +17,26 @@
package org.jetbrains.jet.lang.resolve.java.provider; package org.jetbrains.jet.lang.resolve.java.provider;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
public interface PsiDeclarationProvider { public abstract class PsiDeclarationProvider {
@NotNull
protected final PsiClassFinder psiClassFinder;
private MembersCache membersCache;
protected PsiDeclarationProvider(@NotNull PsiClassFinder psiClassFinder) {
this.psiClassFinder = psiClassFinder;
}
@NotNull @NotNull
MembersCache getMembersCache(); public MembersCache getMembersCache() {
if (membersCache == null) {
membersCache = buildMembersCache();
}
return membersCache;
}
@NotNull
protected abstract MembersCache buildMembersCache();
} }
@@ -1,35 +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;
public abstract class PsiDeclarationProviderBase implements PsiDeclarationProvider {
private MembersCache membersCache = null;
@Override
@NotNull
public MembersCache getMembersCache() {
if (membersCache == null) {
membersCache = buildMembersCache();
}
return membersCache;
}
@NotNull
protected abstract MembersCache buildMembersCache();
}
@@ -34,8 +34,6 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProviderImpl;
import org.jetbrains.jet.lang.resolve.java.provider.MembersCache; import org.jetbrains.jet.lang.resolve.java.provider.MembersCache;
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils; import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope;
@@ -275,12 +273,11 @@ public final class JavaClassResolver {
@NotNull PostponedTasks taskList, @NotNull PostponedTasks taskList,
@NotNull ClassOrNamespaceDescriptor containingDeclaration @NotNull ClassOrNamespaceDescriptor containingDeclaration
) { ) {
ClassKind kind = getClassKind(psiClass); ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(containingDeclaration, getClassKind(psiClass),
ClassPsiDeclarationProvider classData = new ClassPsiDeclarationProviderImpl(psiClass, false, psiClassFinder); isInnerClass(psiClass));
ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(
containingDeclaration, kind, isInnerClass(psiClass));
cache(javaClassToKotlinFqName(fqName), classDescriptor); cache(javaClassToKotlinFqName(fqName), classDescriptor);
classDescriptor.setName(Name.identifier(psiClass.getName())); classDescriptor.setName(Name.identifier(psiClass.getName()));
List<JavaSignatureResolver.TypeParameterDescriptorInitialization> typeParameterDescriptorInitializations List<JavaSignatureResolver.TypeParameterDescriptorInitialization> typeParameterDescriptorInitializations
@@ -292,7 +289,9 @@ public final class JavaClassResolver {
classDescriptor.setVisibility(DescriptorResolverUtils.resolveVisibility(psiClass)); classDescriptor.setVisibility(DescriptorResolverUtils.resolveVisibility(psiClass));
classDescriptor.setModality(resolveModality(psiClass, classDescriptor)); classDescriptor.setModality(resolveModality(psiClass, classDescriptor));
classDescriptor.createTypeConstructor(); classDescriptor.createTypeConstructor();
JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classDescriptor, classData, javaDescriptorResolver);
JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classDescriptor, psiClass, false, psiClassFinder,
javaDescriptorResolver);
classDescriptor.setScopeForMemberLookup(scope); classDescriptor.setScopeForMemberLookup(scope);
classDescriptor.setScopeForConstructorResolve(scope); classDescriptor.setScopeForConstructorResolve(scope);
@@ -505,27 +504,21 @@ public final class JavaClassResolver {
private ClassDescriptorFromJvmBytecode createSyntheticClassObject(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) { private ClassDescriptorFromJvmBytecode createSyntheticClassObject(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
ClassDescriptorFromJvmBytecode classObjectDescriptor = ClassDescriptorFromJvmBytecode classObjectDescriptor =
new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT, false); new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT, false);
ClassPsiDeclarationProvider provider = new ClassPsiDeclarationProviderImpl(psiClass, true, psiClassFinder);
setUpClassObjectDescriptor(classObjectDescriptor, containing, provider, getClassObjectName(containing.getName().asString()));
return classObjectDescriptor;
}
private void setUpClassObjectDescriptor( classObjectDescriptor.setName(getClassObjectName(containing.getName()));
@NotNull ClassDescriptorFromJvmBytecode classObjectDescriptor,
@NotNull ClassDescriptor containing,
@NotNull ClassPsiDeclarationProvider data,
@NotNull Name classObjectName
) {
classObjectDescriptor.setName(classObjectName);
classObjectDescriptor.setModality(Modality.FINAL); classObjectDescriptor.setModality(Modality.FINAL);
classObjectDescriptor.setVisibility(containing.getVisibility()); classObjectDescriptor.setVisibility(containing.getVisibility());
classObjectDescriptor.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList()); classObjectDescriptor.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList());
classObjectDescriptor.createTypeConstructor(); classObjectDescriptor.createTypeConstructor();
JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classObjectDescriptor, data, javaDescriptorResolver);
JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classObjectDescriptor, psiClass, true, psiClassFinder,
javaDescriptorResolver);
WritableScopeImpl writableScope = WritableScopeImpl writableScope =
new WritableScopeImpl(scope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, "Member lookup scope"); new WritableScopeImpl(scope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, "Member lookup scope");
writableScope.changeLockLevel(WritableScope.LockLevel.BOTH); writableScope.changeLockLevel(WritableScope.LockLevel.BOTH);
classObjectDescriptor.setScopeForMemberLookup(writableScope); classObjectDescriptor.setScopeForMemberLookup(writableScope);
classObjectDescriptor.setScopeForConstructorResolve(scope); classObjectDescriptor.setScopeForConstructorResolve(scope);
return classObjectDescriptor;
} }
} }
@@ -30,7 +30,6 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.*;
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.provider.ClassPsiDeclarationProvider;
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.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -68,13 +67,9 @@ public final class JavaConstructorResolver {
} }
@NotNull @NotNull
public Collection<ConstructorDescriptor> resolveConstructors( public Collection<ConstructorDescriptor> resolveConstructors(@NotNull PsiClass psiClass, @NotNull ClassDescriptor containingClass) {
@NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptor containingClass
) {
Collection<ConstructorDescriptor> constructors = Lists.newArrayList(); Collection<ConstructorDescriptor> constructors = Lists.newArrayList();
PsiClass psiClass = classData.getPsiClass();
List<TypeParameterDescriptor> typeParameters = containingClass.getTypeConstructor().getParameters(); List<TypeParameterDescriptor> typeParameters = containingClass.getTypeConstructor().getParameters();
TypeVariableResolver typeVariableResolver = TypeVariableResolver typeVariableResolver =
@@ -34,9 +34,8 @@ import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
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.ClassPsiDeclarationProvider;
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.PackagePsiDeclarationProvider; 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;
@@ -369,27 +368,26 @@ public final class JavaFunctionResolver {
} }
@NotNull @NotNull
public Set<FunctionDescriptor> resolveFunctionGroup( public Set<FunctionDescriptor> resolveFunctionGroupForClass(
@NotNull Name methodName, @NotNull Name methodName,
@NotNull ClassPsiDeclarationProvider scopeData, @NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor @NotNull ClassOrNamespaceDescriptor ownerDescriptor,
@NotNull PsiClass psiClass
) { ) {
NamedMembers namedMembers = provider.getMembersCache().get(methodName);
NamedMembers namedMembers = scopeData.getMembersCache().get(methodName);
if (namedMembers == null) { if (namedMembers == null) {
return Collections.emptySet(); return Collections.emptySet();
} }
PsiClass psiClass = scopeData.getPsiClass();
return resolveNamedGroupFunctions(ownerDescriptor, psiClass, namedMembers, methodName); return resolveNamedGroupFunctions(ownerDescriptor, psiClass, namedMembers, methodName);
} }
@NotNull @NotNull
public Set<FunctionDescriptor> resolveFunctionGroup( public Set<FunctionDescriptor> resolveFunctionGroupForPackage(
@NotNull Name functionName, @NotNull Name functionName,
@NotNull PackagePsiDeclarationProvider scopeData, @NotNull PsiDeclarationProvider provider,
@NotNull NamespaceDescriptor ownerDescriptor @NotNull NamespaceDescriptor ownerDescriptor
) { ) {
NamedMembers namedMembers = scopeData.getMembersCache().get(functionName); NamedMembers namedMembers = provider.getMembersCache().get(functionName);
if (namedMembers != null) { if (namedMembers != null) {
SimpleFunctionDescriptor samConstructor = resolveSamConstructor(ownerDescriptor, namedMembers); SimpleFunctionDescriptor samConstructor = resolveSamConstructor(ownerDescriptor, namedMembers);
if (samConstructor != null) { if (samConstructor != null) {
@@ -20,12 +20,10 @@ import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
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 javax.inject.Inject; import javax.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
public final class JavaInnerClassResolver { public final class JavaInnerClassResolver {
@@ -41,16 +39,7 @@ public final class JavaInnerClassResolver {
} }
@NotNull @NotNull
public List<ClassDescriptor> resolveInnerClasses(@NotNull ClassPsiDeclarationProvider declarationProvider) { public List<ClassDescriptor> resolveInnerClasses(@NotNull PsiClass psiClass) {
if (declarationProvider.isStaticMembers()) {
return Collections.emptyList();
}
return resolveInnerClasses(declarationProvider.getPsiClass());
}
@NotNull
private List<ClassDescriptor> resolveInnerClasses(@NotNull PsiClass psiClass) {
PsiClass[] innerPsiClasses = psiClass.getInnerClasses(); PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
List<ClassDescriptor> result = new ArrayList<ClassDescriptor>(innerPsiClasses.length); List<ClassDescriptor> result = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
for (PsiClass innerPsiClass : innerPsiClasses) { for (PsiClass innerPsiClass : innerPsiClasses) {
@@ -36,10 +36,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaNamespaceDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaNamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProviderImpl;
import org.jetbrains.jet.lang.resolve.java.provider.MembersCache; import org.jetbrains.jet.lang.resolve.java.provider.MembersCache;
import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProviderImpl;
import org.jetbrains.jet.lang.resolve.java.scope.JavaBaseScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaBaseScope;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope;
import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope;
@@ -190,8 +187,7 @@ public final class JavaNamespaceResolver {
} }
// Otherwise (if psiClass is null or doesn't have a supported Kotlin annotation), it's a Java class and the package is empty // Otherwise (if psiClass is null or doesn't have a supported Kotlin annotation), it's a Java class and the package is empty
PackagePsiDeclarationProvider provider = new PackagePsiDeclarationProviderImpl(psiPackage, psiClassFinder); return new JavaPackageScope(namespaceDescriptor, psiPackage, fqName, javaDescriptorResolver, psiClassFinder);
return new JavaPackageScope(namespaceDescriptor, provider, fqName, javaDescriptorResolver, psiClassFinder);
} }
PsiClass psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE); PsiClass psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
@@ -205,10 +201,7 @@ public final class JavaNamespaceResolver {
return null; return null;
} }
trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.CLASS_STATICS); trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.CLASS_STATICS);
return new JavaClassStaticMembersScope( return new JavaClassStaticMembersScope(namespaceDescriptor, fqName, psiClass, psiClassFinder, javaDescriptorResolver);
namespaceDescriptor,
new ClassPsiDeclarationProviderImpl(psiClass, true, psiClassFinder),
fqName, javaDescriptorResolver);
} }
private static boolean isOldKotlinPackageClass(@NotNull PsiClass psiClass) { private static boolean isOldKotlinPackageClass(@NotNull PsiClass psiClass) {
@@ -70,10 +70,10 @@ public final class JavaPropertyResolver {
@NotNull @NotNull
public Set<VariableDescriptor> resolveFieldGroupByName( public Set<VariableDescriptor> resolveFieldGroupByName(
@NotNull Name fieldName, @NotNull Name fieldName,
@NotNull PsiDeclarationProvider scopeData, @NotNull PsiDeclarationProvider provider,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor @NotNull ClassOrNamespaceDescriptor ownerDescriptor
) { ) {
NamedMembers namedMembers = scopeData.getMembersCache().get(fieldName); NamedMembers namedMembers = provider.getMembersCache().get(fieldName);
if (namedMembers == null) { if (namedMembers == null) {
return Collections.emptySet(); return Collections.emptySet();
} }
@@ -27,9 +27,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.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.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider; 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;
@@ -160,15 +158,7 @@ public abstract class JavaBaseScope extends JetScopeImpl {
//TODO: remove this method //TODO: remove this method
@NotNull @NotNull
public PsiElement getPsiElement() { public abstract PsiElement getPsiElement();
if (declarationProvider instanceof ClassPsiDeclarationProvider) {
return ((ClassPsiDeclarationProvider) declarationProvider).getPsiClass();
}
if (declarationProvider instanceof PackagePsiDeclarationProvider) {
return ((PackagePsiDeclarationProvider) declarationProvider).getPsiPackage();
}
throw new IllegalStateException();
}
@NotNull @NotNull
protected Collection<ClassDescriptor> getInnerClasses() { protected Collection<ClassDescriptor> getInnerClasses() {
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.resolve.java.scope; package org.jetbrains.jet.lang.resolve.java.scope;
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;
@@ -31,16 +32,26 @@ import java.util.Set;
public abstract class JavaClassMembersScope extends JavaBaseScope { public abstract class JavaClassMembersScope extends JavaBaseScope {
@NotNull @NotNull
protected final ClassPsiDeclarationProvider declarationProvider; protected final ClassPsiDeclarationProvider declarationProvider;
@NotNull
protected final PsiClass psiClass;
private Map<Name, ClassDescriptor> innerClassesMap = null; private Map<Name, ClassDescriptor> innerClassesMap = null;
protected JavaClassMembersScope( protected JavaClassMembersScope(
@NotNull ClassOrNamespaceDescriptor descriptor, @NotNull ClassOrNamespaceDescriptor descriptor,
@NotNull PsiClass psiClass,
@NotNull ClassPsiDeclarationProvider declarationProvider, @NotNull ClassPsiDeclarationProvider declarationProvider,
@NotNull JavaDescriptorResolver javaDescriptorResolver @NotNull JavaDescriptorResolver javaDescriptorResolver
) { ) {
super(descriptor, javaDescriptorResolver, declarationProvider); super(descriptor, javaDescriptorResolver, declarationProvider);
this.declarationProvider = declarationProvider; this.declarationProvider = declarationProvider;
this.psiClass = psiClass;
}
@NotNull
@Override
public PsiClass getPsiElement() {
return psiClass;
} }
@NotNull @NotNull
@@ -53,7 +64,7 @@ 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.resolveFunctionGroup(name, declarationProvider, descriptor); return javaDescriptorResolver.resolveFunctionGroupForClass(name, declarationProvider, descriptor, psiClass);
} }
@NotNull @NotNull
@@ -68,12 +79,6 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
return innerClassesMap; return innerClassesMap;
} }
@NotNull
@Override
protected Collection<ClassDescriptor> computeInnerClasses() {
return javaDescriptorResolver.resolveInnerClasses(declarationProvider);
}
@Override @Override
public ClassDescriptor getObjectDescriptor(@NotNull Name name) { public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
ClassDescriptor innerClass = getInnerClassesMap().get(name); ClassDescriptor innerClass = getInnerClassesMap().get(name);
@@ -16,14 +16,17 @@
package org.jetbrains.jet.lang.resolve.java.scope; package org.jetbrains.jet.lang.resolve.java.scope;
import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; 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.provider.ClassPsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope { public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope {
@@ -31,14 +34,24 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
private ConstructorDescriptor primaryConstructor = null; private ConstructorDescriptor primaryConstructor = null;
@NotNull @NotNull
private final ClassDescriptor descriptor; private final ClassDescriptor descriptor;
@NotNull
private final PsiClass psiClass;
private final boolean staticMembersOfPsiClass;
public JavaClassNonStaticMembersScope( public JavaClassNonStaticMembersScope(
@NotNull ClassDescriptor descriptor, @NotNull ClassDescriptor descriptor,
@NotNull ClassPsiDeclarationProvider psiDeclarationProvider, @NotNull PsiClass psiClass,
boolean staticMembersOfPsiClass,
@NotNull PsiClassFinder psiClassFinder,
@NotNull JavaDescriptorResolver javaDescriptorResolver @NotNull JavaDescriptorResolver javaDescriptorResolver
) { ) {
super(descriptor, psiDeclarationProvider, javaDescriptorResolver); super(descriptor,
psiClass,
new ClassPsiDeclarationProvider(psiClass, staticMembersOfPsiClass, psiClassFinder),
javaDescriptorResolver);
this.descriptor = descriptor; this.descriptor = descriptor;
this.psiClass = psiClass;
this.staticMembersOfPsiClass = staticMembersOfPsiClass;
} }
@@ -56,7 +69,7 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
private void initConstructorsIfNeeded() { private void initConstructorsIfNeeded() {
if (constructors == null) { if (constructors == null) {
constructors = javaDescriptorResolver.resolveConstructors(declarationProvider, descriptor); constructors = javaDescriptorResolver.resolveConstructors(psiClass, descriptor);
for (ConstructorDescriptor constructor : constructors) { for (ConstructorDescriptor constructor : constructors) {
if (constructor.isPrimary()) { if (constructor.isPrimary()) {
@@ -69,4 +82,13 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
} }
} }
} }
@NotNull
@Override
protected Collection<ClassDescriptor> computeInnerClasses() {
if (staticMembersOfPsiClass) {
return Collections.emptyList();
}
return javaDescriptorResolver.resolveInnerClasses(psiClass);
}
} }
@@ -19,28 +19,35 @@ package org.jetbrains.jet.lang.resolve.java.scope;
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClass;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; 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.provider.ClassPsiDeclarationProvider; 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;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
public final class JavaClassStaticMembersScope extends JavaClassMembersScope { public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
@NotNull @NotNull
private final FqName packageFQN; private final FqName packageFQN;
@NotNull
private final PsiClass psiClass;
public JavaClassStaticMembersScope( public JavaClassStaticMembersScope(
@NotNull NamespaceDescriptor descriptor, @NotNull NamespaceDescriptor descriptor,
@NotNull ClassPsiDeclarationProvider declarationProvider,
@NotNull FqName packageFQN, @NotNull FqName packageFQN,
@NotNull PsiClass psiClass,
@NotNull PsiClassFinder psiClassFinder,
@NotNull JavaDescriptorResolver javaDescriptorResolver @NotNull JavaDescriptorResolver javaDescriptorResolver
) { ) {
super(descriptor, declarationProvider, javaDescriptorResolver); super(descriptor, psiClass, new ClassPsiDeclarationProvider(psiClass, true, psiClassFinder), javaDescriptorResolver);
this.packageFQN = packageFQN; this.packageFQN = packageFQN;
this.psiClass = psiClass;
} }
@Override @Override
@@ -52,9 +59,15 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
@Override @Override
protected Collection<DeclarationDescriptor> computeAllDescriptors() { protected Collection<DeclarationDescriptor> computeAllDescriptors() {
Collection<DeclarationDescriptor> result = super.computeAllDescriptors(); Collection<DeclarationDescriptor> result = super.computeAllDescriptors();
for (PsiClass nested : declarationProvider.getPsiClass().getInnerClasses()) { for (PsiClass nested : psiClass.getInnerClasses()) {
ContainerUtil.addIfNotNull(result, getNamespace(Name.identifier(nested.getName()))); ContainerUtil.addIfNotNull(result, getNamespace(Name.identifier(nested.getName())));
} }
return result; return result;
} }
@NotNull
@Override
protected Collection<ClassDescriptor> computeInnerClasses() {
return Collections.emptyList();
}
} }
@@ -33,6 +33,8 @@ import java.util.Collections;
import java.util.Set; import java.util.Set;
public final class JavaPackageScope extends JavaBaseScope { public final class JavaPackageScope extends JavaBaseScope {
@NotNull
private final PsiPackage psiPackage;
@NotNull @NotNull
private final FqName packageFQN; private final FqName packageFQN;
@NotNull @NotNull
@@ -40,16 +42,23 @@ public final class JavaPackageScope extends JavaBaseScope {
public JavaPackageScope( public JavaPackageScope(
@NotNull NamespaceDescriptor descriptor, @NotNull NamespaceDescriptor descriptor,
@NotNull PackagePsiDeclarationProvider declarationProvider, @NotNull PsiPackage psiPackage,
@NotNull FqName packageFQN, @NotNull FqName packageFQN,
@NotNull JavaDescriptorResolver javaDescriptorResolver, @NotNull JavaDescriptorResolver javaDescriptorResolver,
@NotNull PsiClassFinder psiClassFinder @NotNull PsiClassFinder psiClassFinder
) { ) {
super(descriptor, javaDescriptorResolver, declarationProvider); super(descriptor, javaDescriptorResolver, new PackagePsiDeclarationProvider(psiPackage, psiClassFinder));
this.psiPackage = psiPackage;
this.packageFQN = packageFQN; this.packageFQN = packageFQN;
this.psiClassFinder = psiClassFinder; this.psiClassFinder = psiClassFinder;
} }
@Override
@NotNull
public PsiPackage getPsiElement() {
return psiPackage;
}
@Override @Override
public ClassifierDescriptor getClassifier(@NotNull Name name) { public ClassifierDescriptor getClassifier(@NotNull Name name) {
ClassDescriptor classDescriptor = ClassDescriptor classDescriptor =
@@ -87,8 +96,6 @@ public final class JavaPackageScope extends JavaBaseScope {
private Collection<DeclarationDescriptor> computeAllPackageDeclarations() { private Collection<DeclarationDescriptor> computeAllPackageDeclarations() {
Collection<DeclarationDescriptor> result = Sets.newHashSet(); Collection<DeclarationDescriptor> result = Sets.newHashSet();
PsiPackage psiPackage = ((PackagePsiDeclarationProvider) declarationProvider).getPsiPackage();
for (PsiPackage psiSubPackage : psiPackage.getSubPackages()) { for (PsiPackage psiSubPackage : psiPackage.getSubPackages()) {
FqName fqName = new FqName(psiSubPackage.getQualifiedName()); FqName fqName = new FqName(psiSubPackage.getQualifiedName());
NamespaceDescriptor childNs = javaDescriptorResolver.resolveNamespace(fqName, DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN); NamespaceDescriptor childNs = javaDescriptorResolver.resolveNamespace(fqName, DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
@@ -127,8 +134,7 @@ 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.resolveFunctionGroup(name, (PackagePsiDeclarationProvider) declarationProvider, return javaDescriptorResolver.resolveFunctionGroupForPackage(name, declarationProvider, (NamespaceDescriptor) descriptor);
(NamespaceDescriptor) descriptor);
} }
@NotNull @NotNull