From d14f382db96f696a0aef9eff522d90e9c3a986ad Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 14 Jan 2013 15:19:57 +0400 Subject: [PATCH] Collect getting psi classes in PsiClassFinder #KT-3187 In Progress --- .../di/InjectorForJavaDescriptorResolver.java | 4 +++ .../di/InjectorForJavaSemanticServices.java | 4 +++ .../di/InjectorForTopDownAnalyzerForJvm.java | 4 +++ .../resolve/java/JavaSemanticServices.java | 16 +++++++--- .../jet/lang/resolve/java/PsiClassFinder.java | 9 ++++++ .../lang/resolve/java/PsiClassFinderImpl.java | 31 +++++++++++++++++++ .../ClassPsiDeclarationProviderImpl.java | 18 ++++++----- ...KotlinNamespacePsiDeclarationProvider.java | 13 +++++--- .../resolve/java/provider/MembersCache.java | 14 ++++++--- .../PackagePsiDeclarationProviderImpl.java | 10 ++++-- .../PsiDeclarationProviderFactory.java | 28 +++++++++-------- .../resolver/JavaClassObjectResolver.java | 4 +-- .../java/resolver/JavaClassResolver.java | 3 +- .../java/resolver/JavaNamespaceResolver.java | 23 +++++++------- .../lang/resolve/java/scope/ScopeUtils.java | 2 +- 15 files changed, 132 insertions(+), 51 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java index 96aed9510c4..24a39e2528d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration; import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl; +import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; @@ -50,6 +51,7 @@ public class InjectorForJavaDescriptorResolver { private JavaSemanticServices javaSemanticServices; private JavaDescriptorResolver javaDescriptorResolver; private PsiClassFinderImpl psiClassFinder; + private PsiDeclarationProviderFactory psiDeclarationProviderFactory; private JavaTypeTransformer javaTypeTransformer; private JavaClassResolver javaClassResolver; private JavaAnnotationResolver javaAnnotationResolver; @@ -76,6 +78,7 @@ public class InjectorForJavaDescriptorResolver { this.javaSemanticServices = new JavaSemanticServices(); this.javaDescriptorResolver = new JavaDescriptorResolver(); this.psiClassFinder = new PsiClassFinderImpl(); + this.psiDeclarationProviderFactory = new PsiDeclarationProviderFactory(getPsiClassFinder()); this.javaTypeTransformer = new JavaTypeTransformer(); this.javaClassResolver = new JavaClassResolver(); this.javaAnnotationResolver = new JavaAnnotationResolver(); @@ -95,6 +98,7 @@ public class InjectorForJavaDescriptorResolver { this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver); this.javaSemanticServices.setPsiClassFinder(psiClassFinder); + this.javaSemanticServices.setPsiDeclarationProviderFactory(psiDeclarationProviderFactory); this.javaSemanticServices.setTrace(bindingTrace); this.javaSemanticServices.setTypeTransformer(javaTypeTransformer); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java index d08ed131100..5197de4d75c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import com.intellij.openapi.project.Project; +import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; @@ -50,6 +51,7 @@ public class InjectorForJavaSemanticServices { private PsiClassFinderImpl psiClassFinder; private ModuleDescriptor moduleDescriptor; private final Project project; + private PsiDeclarationProviderFactory psiDeclarationProviderFactory; private JavaTypeTransformer javaTypeTransformer; private JavaClassResolver javaClassResolver; private JavaAnnotationResolver javaAnnotationResolver; @@ -74,6 +76,7 @@ public class InjectorForJavaSemanticServices { this.psiClassFinder = new PsiClassFinderImpl(); this.moduleDescriptor = new org.jetbrains.jet.lang.descriptors.ModuleDescriptor(org.jetbrains.jet.lang.resolve.name.Name.special("")); this.project = project; + this.psiDeclarationProviderFactory = new PsiDeclarationProviderFactory(getPsiClassFinder()); this.javaTypeTransformer = new JavaTypeTransformer(); this.javaClassResolver = new JavaClassResolver(); this.javaAnnotationResolver = new JavaAnnotationResolver(); @@ -90,6 +93,7 @@ public class InjectorForJavaSemanticServices { this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver); this.javaSemanticServices.setPsiClassFinder(psiClassFinder); + this.javaSemanticServices.setPsiDeclarationProviderFactory(psiDeclarationProviderFactory); this.javaSemanticServices.setTrace(bindingTrace); this.javaSemanticServices.setTypeTransformer(javaTypeTransformer); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 24081aefd13..d9550542ecd 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -47,6 +47,7 @@ import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; import org.jetbrains.jet.lang.resolve.ScriptBodyResolver; import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; +import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; @@ -95,6 +96,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private TypeHierarchyResolver typeHierarchyResolver; private ScriptBodyResolver scriptBodyResolver; private JavaSemanticServices javaSemanticServices; + private PsiDeclarationProviderFactory psiDeclarationProviderFactory; private JavaTypeTransformer javaTypeTransformer; private JavaClassResolver javaClassResolver; private JavaAnnotationResolver javaAnnotationResolver; @@ -144,6 +146,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.typeHierarchyResolver = new TypeHierarchyResolver(); this.scriptBodyResolver = new ScriptBodyResolver(); this.javaSemanticServices = new JavaSemanticServices(); + this.psiDeclarationProviderFactory = new PsiDeclarationProviderFactory(psiClassFinder); this.javaTypeTransformer = new JavaTypeTransformer(); this.javaClassResolver = new JavaClassResolver(); this.javaAnnotationResolver = new JavaAnnotationResolver(); @@ -267,6 +270,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly javaSemanticServices.setDescriptorResolver(javaDescriptorResolver); javaSemanticServices.setPsiClassFinder(psiClassFinder); + javaSemanticServices.setPsiDeclarationProviderFactory(psiDeclarationProviderFactory); javaSemanticServices.setTrace(bindingTrace); javaSemanticServices.setTypeTransformer(javaTypeTransformer); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaSemanticServices.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaSemanticServices.java index bb60751cf2d..3daca2414ad 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaSemanticServices.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaSemanticServices.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -37,7 +38,8 @@ public class JavaSemanticServices { private PsiClassFinder psiClassFinder; @NotNull private BindingTrace trace; - + @NotNull + private PsiDeclarationProviderFactory psiDeclarationProviderFactory; @Inject public void setTypeTransformer(@NotNull JavaTypeTransformer typeTransformer) { @@ -59,13 +61,16 @@ public class JavaSemanticServices { this.trace = trace; } - - @NotNull public JavaTypeTransformer getTypeTransformer() { return typeTransformer; } + @Inject + public void setPsiDeclarationProviderFactory(PsiDeclarationProviderFactory psiDeclarationProviderFactory) { + this.psiDeclarationProviderFactory = psiDeclarationProviderFactory; + } + @NotNull public JavaDescriptorResolver getDescriptorResolver() { return descriptorResolver; @@ -81,7 +86,10 @@ public class JavaSemanticServices { return psiClassFinder; } - + @NotNull + public PsiDeclarationProviderFactory getPsiDeclarationProviderFactory() { + return psiDeclarationProviderFactory; + } @Nullable public ClassDescriptor getKotlinBuiltinClassDescriptor(@NotNull FqName qualifiedName) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinder.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinder.java index eaf9d742c71..0a8f3a61c24 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinder.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinder.java @@ -22,6 +22,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.name.FqName; +import java.util.List; + public interface PsiClassFinder { enum RuntimeClassesHandleMode { THROW, @@ -30,6 +32,13 @@ public interface PsiClassFinder { @Nullable PsiClass findPsiClass(@NotNull FqName fqName, @NotNull RuntimeClassesHandleMode runtimeClassesHandleMode); + @Nullable PsiPackage findPsiPackage(@NotNull FqName fqName); + + @NotNull + List findPsiClasses(@NotNull PsiPackage psiPackage); + + @NotNull + List findInnerPsiClasses(@NotNull PsiClass psiClass); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderImpl.java index c9a0f3e2e32..a64d40cfb28 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderImpl.java @@ -16,6 +16,8 @@ package org.jetbrains.jet.lang.resolve.java; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; @@ -32,6 +34,8 @@ import org.jetbrains.jet.plugin.JetFileType; import javax.annotation.PostConstruct; import javax.inject.Inject; +import java.util.List; +import java.util.Set; public class PsiClassFinderImpl implements PsiClassFinder { @@ -122,5 +126,32 @@ public class PsiClassFinderImpl implements PsiClassFinder { return javaFacade.findPackage(qualifiedName.getFqName()); } + @NotNull + @Override + public List findPsiClasses(@NotNull PsiPackage psiPackage) { + return filterDuplicateClasses(psiPackage.getClasses()); + } + @NotNull + @Override + public List findInnerPsiClasses(@NotNull PsiClass psiClass) { + return filterDuplicateClasses(psiClass.getInnerClasses()); + } + + private static List filterDuplicateClasses(PsiClass[] classes) { + Set addedQualifiedNames = Sets.newHashSet(); + List filteredClasses = Lists.newArrayList(); + + for (PsiClass aClass : classes) { + String qualifiedName = aClass.getQualifiedName(); + + if (qualifiedName != null) { + if (addedQualifiedNames.add(qualifiedName)) { + filteredClasses.add(aClass); + } + } + } + + return filteredClasses; + } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/ClassPsiDeclarationProviderImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/ClassPsiDeclarationProviderImpl.java index 3e18ef50af0..b7f71d88b10 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/ClassPsiDeclarationProviderImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/ClassPsiDeclarationProviderImpl.java @@ -4,30 +4,34 @@ import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; +import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA; import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN; public class ClassPsiDeclarationProviderImpl extends PsiDeclarationProviderBase implements ClassPsiDeclarationProvider { - @NotNull - private final PsiClass psiClass; - private final boolean staticMembers; @NotNull protected final DeclarationOrigin declarationOrigin; + @NotNull + protected final PsiClassFinder psiClassFinder; - protected ClassPsiDeclarationProviderImpl( - @NotNull PsiClass psiClass, boolean staticMembers - ) { + @NotNull + private final PsiClass psiClass; + + private final boolean staticMembers; + + protected ClassPsiDeclarationProviderImpl(@NotNull PsiClass psiClass, boolean staticMembers, @NotNull PsiClassFinder psiClassFinder) { this.staticMembers = staticMembers; this.psiClass = psiClass; + this.psiClassFinder = psiClassFinder; this.declarationOrigin = determineOrigin(psiClass); } @Override @NotNull protected MembersCache buildMembersCache() { - return MembersCache.buildMembersByNameCache(new MembersCache(), psiClass, null, staticMembers, getDeclarationOrigin() == KOTLIN); + return MembersCache.buildMembersByNameCache(new MembersCache(), psiClassFinder, psiClass, null, staticMembers, getDeclarationOrigin() == KOTLIN); } @Override diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/KotlinNamespacePsiDeclarationProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/KotlinNamespacePsiDeclarationProvider.java index e80fbbc73d9..0a21422e68b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/KotlinNamespacePsiDeclarationProvider.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/KotlinNamespacePsiDeclarationProvider.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.resolve.java.provider; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiPackage; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN; @@ -29,10 +30,14 @@ public final class KotlinNamespacePsiDeclarationProvider extends ClassPsiDeclara public KotlinNamespacePsiDeclarationProvider( @NotNull PsiPackage psiPackage, - @NotNull PsiClass psiClass + @NotNull PsiClass psiClass, + @NotNull PsiDeclarationProviderFactory factory, + @NotNull PsiClassFinder psiClassFinder ) { - super(psiClass, true); - this.packagePsiDeclarationProvider = PsiDeclarationProviderFactory.createDeclarationProviderForNamespaceWithoutMembers(psiPackage); + super(psiClass, true, psiClassFinder); + + // TODO: remove? + this.packagePsiDeclarationProvider = factory.createDeclarationProviderForNamespaceWithoutMembers(psiPackage); } @NotNull @@ -45,7 +50,7 @@ public final class KotlinNamespacePsiDeclarationProvider extends ClassPsiDeclara @Override protected MembersCache buildMembersCache() { MembersCache cacheWithMembers = super.buildMembersCache(); - MembersCache.buildMembersByNameCache(cacheWithMembers, null, packagePsiDeclarationProvider.getPsiPackage(), true, getDeclarationOrigin() == KOTLIN); + MembersCache.buildMembersByNameCache(cacheWithMembers, psiClassFinder, null, packagePsiDeclarationProvider.getPsiPackage(), true, getDeclarationOrigin() == KOTLIN); return cacheWithMembers; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java index 57d7c152e5a..c76a41ecbeb 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; +import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import org.jetbrains.jet.lang.resolve.java.TypeSource; import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; import org.jetbrains.jet.lang.resolve.java.prop.PropertyNameUtils; @@ -30,10 +31,10 @@ import org.jetbrains.jet.lang.resolve.name.Name; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; public final class MembersCache { - @NotNull private final Map namedMembersMap = new HashMap(); @@ -59,7 +60,9 @@ public final class MembersCache { @NotNull public static MembersCache buildMembersByNameCache( - @NotNull MembersCache membersCache, @Nullable PsiClass psiClass, + @NotNull MembersCache membersCache, + @NotNull PsiClassFinder finder, + @Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, boolean staticMembers, boolean isKotlin @@ -67,17 +70,18 @@ public final class MembersCache { if (psiClass != null) { membersCache.new ClassMemberProcessor(new PsiClassWrapper(psiClass), staticMembers, isKotlin).process(); } + //TODO: - PsiClass[] classes = psiPackage != null ? psiPackage.getClasses() : psiClass.getInnerClasses(); + List classes = psiPackage != null ? finder.findPsiClasses(psiPackage) : finder.findInnerPsiClasses(psiClass); membersCache.new ObjectClassProcessor(classes).process(); return membersCache; } private class ObjectClassProcessor { @NotNull - private final PsiClass[] psiClasses; + private final List psiClasses; - private ObjectClassProcessor(@NotNull PsiClass[] classes) { + private ObjectClassProcessor(@NotNull List classes) { psiClasses = classes; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PackagePsiDeclarationProviderImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PackagePsiDeclarationProviderImpl.java index d3902f583f7..f23debd548a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PackagePsiDeclarationProviderImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PackagePsiDeclarationProviderImpl.java @@ -18,6 +18,7 @@ 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; import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA; import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN; @@ -27,10 +28,15 @@ public final class PackagePsiDeclarationProviderImpl extends PsiDeclarationProvi @NotNull private final PsiPackage psiPackage; + @NotNull + private final PsiClassFinder psiClassFinder; + /*package private*/ PackagePsiDeclarationProviderImpl( - @NotNull PsiPackage psiPackage + @NotNull PsiPackage psiPackage, + @NotNull PsiClassFinder psiClassFinder ) { this.psiPackage = psiPackage; + this.psiClassFinder = psiClassFinder; } @NotNull @@ -42,7 +48,7 @@ public final class PackagePsiDeclarationProviderImpl extends PsiDeclarationProvi @NotNull @Override protected MembersCache buildMembersCache() { - return MembersCache.buildMembersByNameCache(new MembersCache(), null, getPsiPackage(), true, getDeclarationOrigin() == KOTLIN); + return MembersCache.buildMembersByNameCache(new MembersCache(), psiClassFinder, null, getPsiPackage(), true, getDeclarationOrigin() == KOTLIN); } @NotNull diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProviderFactory.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProviderFactory.java index 08a1170c026..5cd9ccef42a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProviderFactory.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProviderFactory.java @@ -19,36 +19,38 @@ package org.jetbrains.jet.lang.resolve.java.provider; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiPackage; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; public final class PsiDeclarationProviderFactory { - private PsiDeclarationProviderFactory() { + @NotNull private final PsiClassFinder psiClassFinder; + + public PsiDeclarationProviderFactory(@NotNull PsiClassFinder psiClassFinder) { + this.psiClassFinder = psiClassFinder; } @NotNull - public static ClassPsiDeclarationProvider createSyntheticClassObjectClassData(@NotNull PsiClass psiClass) { + public ClassPsiDeclarationProvider createSyntheticClassObjectClassData(@NotNull PsiClass psiClass) { return createDeclarationProviderForClassStaticMembers(psiClass); } @NotNull - public static ClassPsiDeclarationProvider createBinaryClassData(@NotNull PsiClass psiClass) { - return new ClassPsiDeclarationProviderImpl(psiClass, false); + public ClassPsiDeclarationProvider createBinaryClassData(@NotNull PsiClass psiClass) { + return new ClassPsiDeclarationProviderImpl(psiClass, false, psiClassFinder); } @NotNull - public static KotlinNamespacePsiDeclarationProvider createDeclarationForKotlinNamespace( - @NotNull PsiPackage psiPackage, - @NotNull PsiClass psiClass - ) { - return new KotlinNamespacePsiDeclarationProvider(psiPackage, psiClass); + public KotlinNamespacePsiDeclarationProvider createDeclarationForKotlinNamespace( + @NotNull PsiPackage psiPackage, @NotNull PsiClass psiClass) { + return new KotlinNamespacePsiDeclarationProvider(psiPackage, psiClass, this, psiClassFinder); } @NotNull - public static PackagePsiDeclarationProvider createDeclarationProviderForNamespaceWithoutMembers(@NotNull PsiPackage psiPackage) { - return new PackagePsiDeclarationProviderImpl(psiPackage); + public PackagePsiDeclarationProvider createDeclarationProviderForNamespaceWithoutMembers(@NotNull PsiPackage psiPackage) { + return new PackagePsiDeclarationProviderImpl(psiPackage, psiClassFinder); } @NotNull - public static ClassPsiDeclarationProvider createDeclarationProviderForClassStaticMembers(@NotNull PsiClass psiClass) { - return new ClassPsiDeclarationProviderImpl(psiClass, true); + public ClassPsiDeclarationProvider createDeclarationProviderForClassStaticMembers(@NotNull PsiClass psiClass) { + return new ClassPsiDeclarationProviderImpl(psiClass, true, psiClassFinder); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java index bed83a1ba8e..f187f6f237f 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java @@ -104,7 +104,7 @@ public final class JavaClassObjectResolver { String qualifiedName = classObjectPsiClass.getQualifiedName(); assert qualifiedName != null; FqName fqName = new FqName(qualifiedName); - ClassPsiDeclarationProvider classObjectData = PsiDeclarationProviderFactory.createBinaryClassData(classObjectPsiClass); + ClassPsiDeclarationProvider classObjectData = semanticServices.getPsiDeclarationProviderFactory().createBinaryClassData(classObjectPsiClass); ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT); classObjectDescriptor.setSupertypes(supertypesResolver.getSupertypes(classObjectDescriptor, @@ -144,7 +144,7 @@ public final class JavaClassObjectResolver { ) { FqNameUnsafe fqName = DescriptorResolverUtils.getFqNameForClassObject(psiClass); ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT); - ClassPsiDeclarationProvider data = PsiDeclarationProviderFactory.createSyntheticClassObjectClassData(psiClass); + ClassPsiDeclarationProvider data = semanticServices.getPsiDeclarationProviderFactory().createSyntheticClassObjectClassData(psiClass); setUpClassObjectDescriptor(classObjectDescriptor, containing, fqName, data, getClassObjectName(containing.getName().getName())); return classObjectDescriptor; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java index 9ff6b7027e7..efeeaefd2db 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java @@ -33,7 +33,6 @@ import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider; -import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiClassWrapper; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -219,7 +218,7 @@ public final class JavaClassResolver { ) { JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass); ClassKind kind = getClassKind(psiClass, jetClassAnnotation); - ClassPsiDeclarationProvider classData = PsiDeclarationProviderFactory.createBinaryClassData(psiClass); + ClassPsiDeclarationProvider classData = semanticServices.getPsiDeclarationProviderFactory().createBinaryClassData(psiClass); ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(containingDeclaration, kind); cache(javaClassToKotlinFqName(fqName), classDescriptor); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java index c1dae449bd7..8caf8b8327e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java @@ -43,8 +43,6 @@ import java.util.Collections; import java.util.Map; import java.util.Set; -import static org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory.*; - public final class JavaNamespaceResolver { @NotNull @@ -150,13 +148,15 @@ public final class JavaNamespaceResolver { PsiClass psiClass = getPsiClassForJavaPackageScope(fqName); trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.PROPER); if (psiClass == null) { - return new JavaPackageScopeWithoutMembers(namespaceDescriptor, - createDeclarationProviderForNamespaceWithoutMembers(psiPackage), - fqName, javaSemanticServices); + return new JavaPackageScopeWithoutMembers( + namespaceDescriptor, + javaSemanticServices.getPsiDeclarationProviderFactory().createDeclarationProviderForNamespaceWithoutMembers(psiPackage), + fqName, javaSemanticServices); } - return new JavaScopeForKotlinNamespace(namespaceDescriptor, - createDeclarationForKotlinNamespace(psiPackage, psiClass), - fqName, javaSemanticServices); + return new JavaScopeForKotlinNamespace( + namespaceDescriptor, + javaSemanticServices.getPsiDeclarationProviderFactory().createDeclarationForKotlinNamespace(psiPackage, psiClass), + fqName, javaSemanticServices); } PsiClass psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE); @@ -169,9 +169,10 @@ public final class JavaNamespaceResolver { return null; } trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.CLASS_STATICS); - return new JavaClassStaticMembersScope(namespaceDescriptor, - createDeclarationProviderForClassStaticMembers(psiClass), - fqName, javaSemanticServices); + return new JavaClassStaticMembersScope( + namespaceDescriptor, + javaSemanticServices.getPsiDeclarationProviderFactory().createDeclarationProviderForClassStaticMembers(psiClass), + fqName, javaSemanticServices); } private void cache(@NotNull FqName fqName, @Nullable JavaBaseScope packageScope) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/ScopeUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/ScopeUtils.java index d3da0f625f0..34186239fe0 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/ScopeUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/ScopeUtils.java @@ -52,7 +52,7 @@ public final class ScopeUtils { } } - for (PsiClass psiClass : psiPackage.getClasses()) { + for (PsiClass psiClass : javaSemanticServices.getPsiClassFinder().findPsiClasses(psiPackage)) { if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) { continue; }