Collect getting psi classes in PsiClassFinder
#KT-3187 In Progress
This commit is contained in:
@@ -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.JavaSemanticServices;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl;
|
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.JavaTypeTransformer;
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver;
|
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
|
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
|
||||||
@@ -50,6 +51,7 @@ public class InjectorForJavaDescriptorResolver {
|
|||||||
private JavaSemanticServices javaSemanticServices;
|
private JavaSemanticServices javaSemanticServices;
|
||||||
private JavaDescriptorResolver javaDescriptorResolver;
|
private JavaDescriptorResolver javaDescriptorResolver;
|
||||||
private PsiClassFinderImpl psiClassFinder;
|
private PsiClassFinderImpl psiClassFinder;
|
||||||
|
private PsiDeclarationProviderFactory psiDeclarationProviderFactory;
|
||||||
private JavaTypeTransformer javaTypeTransformer;
|
private JavaTypeTransformer javaTypeTransformer;
|
||||||
private JavaClassResolver javaClassResolver;
|
private JavaClassResolver javaClassResolver;
|
||||||
private JavaAnnotationResolver javaAnnotationResolver;
|
private JavaAnnotationResolver javaAnnotationResolver;
|
||||||
@@ -76,6 +78,7 @@ public class InjectorForJavaDescriptorResolver {
|
|||||||
this.javaSemanticServices = new JavaSemanticServices();
|
this.javaSemanticServices = new JavaSemanticServices();
|
||||||
this.javaDescriptorResolver = new JavaDescriptorResolver();
|
this.javaDescriptorResolver = new JavaDescriptorResolver();
|
||||||
this.psiClassFinder = new PsiClassFinderImpl();
|
this.psiClassFinder = new PsiClassFinderImpl();
|
||||||
|
this.psiDeclarationProviderFactory = new PsiDeclarationProviderFactory(getPsiClassFinder());
|
||||||
this.javaTypeTransformer = new JavaTypeTransformer();
|
this.javaTypeTransformer = new JavaTypeTransformer();
|
||||||
this.javaClassResolver = new JavaClassResolver();
|
this.javaClassResolver = new JavaClassResolver();
|
||||||
this.javaAnnotationResolver = new JavaAnnotationResolver();
|
this.javaAnnotationResolver = new JavaAnnotationResolver();
|
||||||
@@ -95,6 +98,7 @@ public class InjectorForJavaDescriptorResolver {
|
|||||||
|
|
||||||
this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
||||||
this.javaSemanticServices.setPsiClassFinder(psiClassFinder);
|
this.javaSemanticServices.setPsiClassFinder(psiClassFinder);
|
||||||
|
this.javaSemanticServices.setPsiDeclarationProviderFactory(psiDeclarationProviderFactory);
|
||||||
this.javaSemanticServices.setTrace(bindingTrace);
|
this.javaSemanticServices.setTrace(bindingTrace);
|
||||||
this.javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
this.javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
||||||
|
|
||||||
|
|||||||
@@ -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.resolve.java.PsiClassFinderImpl;
|
||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
||||||
import com.intellij.openapi.project.Project;
|
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.JavaTypeTransformer;
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver;
|
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
|
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
|
||||||
@@ -50,6 +51,7 @@ public class InjectorForJavaSemanticServices {
|
|||||||
private PsiClassFinderImpl psiClassFinder;
|
private PsiClassFinderImpl psiClassFinder;
|
||||||
private ModuleDescriptor moduleDescriptor;
|
private ModuleDescriptor moduleDescriptor;
|
||||||
private final Project project;
|
private final Project project;
|
||||||
|
private PsiDeclarationProviderFactory psiDeclarationProviderFactory;
|
||||||
private JavaTypeTransformer javaTypeTransformer;
|
private JavaTypeTransformer javaTypeTransformer;
|
||||||
private JavaClassResolver javaClassResolver;
|
private JavaClassResolver javaClassResolver;
|
||||||
private JavaAnnotationResolver javaAnnotationResolver;
|
private JavaAnnotationResolver javaAnnotationResolver;
|
||||||
@@ -74,6 +76,7 @@ public class InjectorForJavaSemanticServices {
|
|||||||
this.psiClassFinder = new PsiClassFinderImpl();
|
this.psiClassFinder = new PsiClassFinderImpl();
|
||||||
this.moduleDescriptor = new org.jetbrains.jet.lang.descriptors.ModuleDescriptor(org.jetbrains.jet.lang.resolve.name.Name.special("<dummy>"));
|
this.moduleDescriptor = new org.jetbrains.jet.lang.descriptors.ModuleDescriptor(org.jetbrains.jet.lang.resolve.name.Name.special("<dummy>"));
|
||||||
this.project = project;
|
this.project = project;
|
||||||
|
this.psiDeclarationProviderFactory = new PsiDeclarationProviderFactory(getPsiClassFinder());
|
||||||
this.javaTypeTransformer = new JavaTypeTransformer();
|
this.javaTypeTransformer = new JavaTypeTransformer();
|
||||||
this.javaClassResolver = new JavaClassResolver();
|
this.javaClassResolver = new JavaClassResolver();
|
||||||
this.javaAnnotationResolver = new JavaAnnotationResolver();
|
this.javaAnnotationResolver = new JavaAnnotationResolver();
|
||||||
@@ -90,6 +93,7 @@ public class InjectorForJavaSemanticServices {
|
|||||||
|
|
||||||
this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
||||||
this.javaSemanticServices.setPsiClassFinder(psiClassFinder);
|
this.javaSemanticServices.setPsiClassFinder(psiClassFinder);
|
||||||
|
this.javaSemanticServices.setPsiDeclarationProviderFactory(psiDeclarationProviderFactory);
|
||||||
this.javaSemanticServices.setTrace(bindingTrace);
|
this.javaSemanticServices.setTrace(bindingTrace);
|
||||||
this.javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
this.javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ import org.jetbrains.jet.lang.resolve.OverrideResolver;
|
|||||||
import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
|
import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
|
import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
|
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.JavaTypeTransformer;
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver;
|
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
|
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
|
||||||
@@ -95,6 +96,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
|||||||
private TypeHierarchyResolver typeHierarchyResolver;
|
private TypeHierarchyResolver typeHierarchyResolver;
|
||||||
private ScriptBodyResolver scriptBodyResolver;
|
private ScriptBodyResolver scriptBodyResolver;
|
||||||
private JavaSemanticServices javaSemanticServices;
|
private JavaSemanticServices javaSemanticServices;
|
||||||
|
private PsiDeclarationProviderFactory psiDeclarationProviderFactory;
|
||||||
private JavaTypeTransformer javaTypeTransformer;
|
private JavaTypeTransformer javaTypeTransformer;
|
||||||
private JavaClassResolver javaClassResolver;
|
private JavaClassResolver javaClassResolver;
|
||||||
private JavaAnnotationResolver javaAnnotationResolver;
|
private JavaAnnotationResolver javaAnnotationResolver;
|
||||||
@@ -144,6 +146,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
|||||||
this.typeHierarchyResolver = new TypeHierarchyResolver();
|
this.typeHierarchyResolver = new TypeHierarchyResolver();
|
||||||
this.scriptBodyResolver = new ScriptBodyResolver();
|
this.scriptBodyResolver = new ScriptBodyResolver();
|
||||||
this.javaSemanticServices = new JavaSemanticServices();
|
this.javaSemanticServices = new JavaSemanticServices();
|
||||||
|
this.psiDeclarationProviderFactory = new PsiDeclarationProviderFactory(psiClassFinder);
|
||||||
this.javaTypeTransformer = new JavaTypeTransformer();
|
this.javaTypeTransformer = new JavaTypeTransformer();
|
||||||
this.javaClassResolver = new JavaClassResolver();
|
this.javaClassResolver = new JavaClassResolver();
|
||||||
this.javaAnnotationResolver = new JavaAnnotationResolver();
|
this.javaAnnotationResolver = new JavaAnnotationResolver();
|
||||||
@@ -267,6 +270,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
|||||||
|
|
||||||
javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
||||||
javaSemanticServices.setPsiClassFinder(psiClassFinder);
|
javaSemanticServices.setPsiClassFinder(psiClassFinder);
|
||||||
|
javaSemanticServices.setPsiDeclarationProviderFactory(psiDeclarationProviderFactory);
|
||||||
javaSemanticServices.setTrace(bindingTrace);
|
javaSemanticServices.setTrace(bindingTrace);
|
||||||
javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
||||||
|
|
||||||
|
|||||||
+12
-4
@@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
|||||||
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
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.FqName;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||||
@@ -37,7 +38,8 @@ public class JavaSemanticServices {
|
|||||||
private PsiClassFinder psiClassFinder;
|
private PsiClassFinder psiClassFinder;
|
||||||
@NotNull
|
@NotNull
|
||||||
private BindingTrace trace;
|
private BindingTrace trace;
|
||||||
|
@NotNull
|
||||||
|
private PsiDeclarationProviderFactory psiDeclarationProviderFactory;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setTypeTransformer(@NotNull JavaTypeTransformer typeTransformer) {
|
public void setTypeTransformer(@NotNull JavaTypeTransformer typeTransformer) {
|
||||||
@@ -59,13 +61,16 @@ public class JavaSemanticServices {
|
|||||||
this.trace = trace;
|
this.trace = trace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public JavaTypeTransformer getTypeTransformer() {
|
public JavaTypeTransformer getTypeTransformer() {
|
||||||
return typeTransformer;
|
return typeTransformer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setPsiDeclarationProviderFactory(PsiDeclarationProviderFactory psiDeclarationProviderFactory) {
|
||||||
|
this.psiDeclarationProviderFactory = psiDeclarationProviderFactory;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public JavaDescriptorResolver getDescriptorResolver() {
|
public JavaDescriptorResolver getDescriptorResolver() {
|
||||||
return descriptorResolver;
|
return descriptorResolver;
|
||||||
@@ -81,7 +86,10 @@ public class JavaSemanticServices {
|
|||||||
return psiClassFinder;
|
return psiClassFinder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public PsiDeclarationProviderFactory getPsiDeclarationProviderFactory() {
|
||||||
|
return psiDeclarationProviderFactory;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public ClassDescriptor getKotlinBuiltinClassDescriptor(@NotNull FqName qualifiedName) {
|
public ClassDescriptor getKotlinBuiltinClassDescriptor(@NotNull FqName qualifiedName) {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface PsiClassFinder {
|
public interface PsiClassFinder {
|
||||||
enum RuntimeClassesHandleMode {
|
enum RuntimeClassesHandleMode {
|
||||||
THROW,
|
THROW,
|
||||||
@@ -30,6 +32,13 @@ public interface PsiClassFinder {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
PsiClass findPsiClass(@NotNull FqName fqName, @NotNull RuntimeClassesHandleMode runtimeClassesHandleMode);
|
PsiClass findPsiClass(@NotNull FqName fqName, @NotNull RuntimeClassesHandleMode runtimeClassesHandleMode);
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
PsiPackage findPsiPackage(@NotNull FqName fqName);
|
PsiPackage findPsiPackage(@NotNull FqName fqName);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
List<PsiClass> findPsiClasses(@NotNull PsiPackage psiPackage);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
List<PsiClass> findInnerPsiClasses(@NotNull PsiClass psiClass);
|
||||||
}
|
}
|
||||||
|
|||||||
+31
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.lang.resolve.java;
|
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.project.Project;
|
||||||
import com.intellij.openapi.util.Comparing;
|
import com.intellij.openapi.util.Comparing;
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
@@ -32,6 +34,8 @@ import org.jetbrains.jet.plugin.JetFileType;
|
|||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class PsiClassFinderImpl implements PsiClassFinder {
|
public class PsiClassFinderImpl implements PsiClassFinder {
|
||||||
|
|
||||||
@@ -122,5 +126,32 @@ public class PsiClassFinderImpl implements PsiClassFinder {
|
|||||||
return javaFacade.findPackage(qualifiedName.getFqName());
|
return javaFacade.findPackage(qualifiedName.getFqName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public List<PsiClass> findPsiClasses(@NotNull PsiPackage psiPackage) {
|
||||||
|
return filterDuplicateClasses(psiPackage.getClasses());
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public List<PsiClass> findInnerPsiClasses(@NotNull PsiClass psiClass) {
|
||||||
|
return filterDuplicateClasses(psiClass.getInnerClasses());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<PsiClass> filterDuplicateClasses(PsiClass[] classes) {
|
||||||
|
Set<String> addedQualifiedNames = Sets.newHashSet();
|
||||||
|
List<PsiClass> filteredClasses = Lists.newArrayList();
|
||||||
|
|
||||||
|
for (PsiClass aClass : classes) {
|
||||||
|
String qualifiedName = aClass.getQualifiedName();
|
||||||
|
|
||||||
|
if (qualifiedName != null) {
|
||||||
|
if (addedQualifiedNames.add(qualifiedName)) {
|
||||||
|
filteredClasses.add(aClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return filteredClasses;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-7
@@ -4,30 +4,34 @@ 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.resolve.java.DescriptorResolverUtils;
|
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.JAVA;
|
||||||
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
|
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
|
||||||
|
|
||||||
public class ClassPsiDeclarationProviderImpl extends PsiDeclarationProviderBase implements ClassPsiDeclarationProvider {
|
public class ClassPsiDeclarationProviderImpl extends PsiDeclarationProviderBase implements ClassPsiDeclarationProvider {
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private final PsiClass psiClass;
|
|
||||||
private final boolean staticMembers;
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected final DeclarationOrigin declarationOrigin;
|
protected final DeclarationOrigin declarationOrigin;
|
||||||
|
@NotNull
|
||||||
|
protected final PsiClassFinder psiClassFinder;
|
||||||
|
|
||||||
protected ClassPsiDeclarationProviderImpl(
|
@NotNull
|
||||||
@NotNull PsiClass psiClass, boolean staticMembers
|
private final PsiClass psiClass;
|
||||||
) {
|
|
||||||
|
private final boolean staticMembers;
|
||||||
|
|
||||||
|
protected ClassPsiDeclarationProviderImpl(@NotNull PsiClass psiClass, boolean staticMembers, @NotNull PsiClassFinder psiClassFinder) {
|
||||||
this.staticMembers = staticMembers;
|
this.staticMembers = staticMembers;
|
||||||
this.psiClass = psiClass;
|
this.psiClass = psiClass;
|
||||||
|
this.psiClassFinder = psiClassFinder;
|
||||||
this.declarationOrigin = determineOrigin(psiClass);
|
this.declarationOrigin = determineOrigin(psiClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
protected MembersCache buildMembersCache() {
|
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
|
@Override
|
||||||
|
|||||||
+9
-4
@@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.resolve.java.provider;
|
|||||||
import com.intellij.psi.PsiClass;
|
import com.intellij.psi.PsiClass;
|
||||||
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;
|
||||||
|
|
||||||
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
|
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
|
||||||
|
|
||||||
@@ -29,10 +30,14 @@ public final class KotlinNamespacePsiDeclarationProvider extends ClassPsiDeclara
|
|||||||
|
|
||||||
public KotlinNamespacePsiDeclarationProvider(
|
public KotlinNamespacePsiDeclarationProvider(
|
||||||
@NotNull PsiPackage psiPackage,
|
@NotNull PsiPackage psiPackage,
|
||||||
@NotNull PsiClass psiClass
|
@NotNull PsiClass psiClass,
|
||||||
|
@NotNull PsiDeclarationProviderFactory factory,
|
||||||
|
@NotNull PsiClassFinder psiClassFinder
|
||||||
) {
|
) {
|
||||||
super(psiClass, true);
|
super(psiClass, true, psiClassFinder);
|
||||||
this.packagePsiDeclarationProvider = PsiDeclarationProviderFactory.createDeclarationProviderForNamespaceWithoutMembers(psiPackage);
|
|
||||||
|
// TODO: remove?
|
||||||
|
this.packagePsiDeclarationProvider = factory.createDeclarationProviderForNamespaceWithoutMembers(psiPackage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -45,7 +50,7 @@ public final class KotlinNamespacePsiDeclarationProvider extends ClassPsiDeclara
|
|||||||
@Override
|
@Override
|
||||||
protected MembersCache buildMembersCache() {
|
protected MembersCache buildMembersCache() {
|
||||||
MembersCache cacheWithMembers = super.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;
|
return cacheWithMembers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-5
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
|
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.TypeSource;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
|
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
|
||||||
import org.jetbrains.jet.lang.resolve.java.prop.PropertyNameUtils;
|
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.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public final class MembersCache {
|
public final class MembersCache {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final Map<Name, NamedMembers> namedMembersMap = new HashMap<Name, NamedMembers>();
|
private final Map<Name, NamedMembers> namedMembersMap = new HashMap<Name, NamedMembers>();
|
||||||
|
|
||||||
@@ -59,7 +60,9 @@ public final class MembersCache {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static MembersCache buildMembersByNameCache(
|
public static MembersCache buildMembersByNameCache(
|
||||||
@NotNull MembersCache membersCache, @Nullable PsiClass psiClass,
|
@NotNull MembersCache membersCache,
|
||||||
|
@NotNull PsiClassFinder finder,
|
||||||
|
@Nullable PsiClass psiClass,
|
||||||
@Nullable PsiPackage psiPackage,
|
@Nullable PsiPackage psiPackage,
|
||||||
boolean staticMembers,
|
boolean staticMembers,
|
||||||
boolean isKotlin
|
boolean isKotlin
|
||||||
@@ -67,17 +70,18 @@ public final class MembersCache {
|
|||||||
if (psiClass != null) {
|
if (psiClass != null) {
|
||||||
membersCache.new ClassMemberProcessor(new PsiClassWrapper(psiClass), staticMembers, isKotlin).process();
|
membersCache.new ClassMemberProcessor(new PsiClassWrapper(psiClass), staticMembers, isKotlin).process();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO:
|
//TODO:
|
||||||
PsiClass[] classes = psiPackage != null ? psiPackage.getClasses() : psiClass.getInnerClasses();
|
List<PsiClass> classes = psiPackage != null ? finder.findPsiClasses(psiPackage) : finder.findInnerPsiClasses(psiClass);
|
||||||
membersCache.new ObjectClassProcessor(classes).process();
|
membersCache.new ObjectClassProcessor(classes).process();
|
||||||
return membersCache;
|
return membersCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ObjectClassProcessor {
|
private class ObjectClassProcessor {
|
||||||
@NotNull
|
@NotNull
|
||||||
private final PsiClass[] psiClasses;
|
private final List<PsiClass> psiClasses;
|
||||||
|
|
||||||
private ObjectClassProcessor(@NotNull PsiClass[] classes) {
|
private ObjectClassProcessor(@NotNull List<PsiClass> classes) {
|
||||||
psiClasses = classes;
|
psiClasses = classes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-2
@@ -18,6 +18,7 @@ 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;
|
||||||
|
|
||||||
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA;
|
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA;
|
||||||
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
|
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
|
||||||
@@ -27,10 +28,15 @@ public final class PackagePsiDeclarationProviderImpl extends PsiDeclarationProvi
|
|||||||
@NotNull
|
@NotNull
|
||||||
private final PsiPackage psiPackage;
|
private final PsiPackage psiPackage;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final PsiClassFinder psiClassFinder;
|
||||||
|
|
||||||
/*package private*/ PackagePsiDeclarationProviderImpl(
|
/*package private*/ PackagePsiDeclarationProviderImpl(
|
||||||
@NotNull PsiPackage psiPackage
|
@NotNull PsiPackage psiPackage,
|
||||||
|
@NotNull PsiClassFinder psiClassFinder
|
||||||
) {
|
) {
|
||||||
this.psiPackage = psiPackage;
|
this.psiPackage = psiPackage;
|
||||||
|
this.psiClassFinder = psiClassFinder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -42,7 +48,7 @@ public final class PackagePsiDeclarationProviderImpl extends PsiDeclarationProvi
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
protected MembersCache buildMembersCache() {
|
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
|
@NotNull
|
||||||
|
|||||||
+15
-13
@@ -19,36 +19,38 @@ package org.jetbrains.jet.lang.resolve.java.provider;
|
|||||||
import com.intellij.psi.PsiClass;
|
import com.intellij.psi.PsiClass;
|
||||||
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 final class PsiDeclarationProviderFactory {
|
public final class PsiDeclarationProviderFactory {
|
||||||
private PsiDeclarationProviderFactory() {
|
@NotNull private final PsiClassFinder psiClassFinder;
|
||||||
|
|
||||||
|
public PsiDeclarationProviderFactory(@NotNull PsiClassFinder psiClassFinder) {
|
||||||
|
this.psiClassFinder = psiClassFinder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static ClassPsiDeclarationProvider createSyntheticClassObjectClassData(@NotNull PsiClass psiClass) {
|
public ClassPsiDeclarationProvider createSyntheticClassObjectClassData(@NotNull PsiClass psiClass) {
|
||||||
return createDeclarationProviderForClassStaticMembers(psiClass);
|
return createDeclarationProviderForClassStaticMembers(psiClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static ClassPsiDeclarationProvider createBinaryClassData(@NotNull PsiClass psiClass) {
|
public ClassPsiDeclarationProvider createBinaryClassData(@NotNull PsiClass psiClass) {
|
||||||
return new ClassPsiDeclarationProviderImpl(psiClass, false);
|
return new ClassPsiDeclarationProviderImpl(psiClass, false, psiClassFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static KotlinNamespacePsiDeclarationProvider createDeclarationForKotlinNamespace(
|
public KotlinNamespacePsiDeclarationProvider createDeclarationForKotlinNamespace(
|
||||||
@NotNull PsiPackage psiPackage,
|
@NotNull PsiPackage psiPackage, @NotNull PsiClass psiClass) {
|
||||||
@NotNull PsiClass psiClass
|
return new KotlinNamespacePsiDeclarationProvider(psiPackage, psiClass, this, psiClassFinder);
|
||||||
) {
|
|
||||||
return new KotlinNamespacePsiDeclarationProvider(psiPackage, psiClass);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static PackagePsiDeclarationProvider createDeclarationProviderForNamespaceWithoutMembers(@NotNull PsiPackage psiPackage) {
|
public PackagePsiDeclarationProvider createDeclarationProviderForNamespaceWithoutMembers(@NotNull PsiPackage psiPackage) {
|
||||||
return new PackagePsiDeclarationProviderImpl(psiPackage);
|
return new PackagePsiDeclarationProviderImpl(psiPackage, psiClassFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static ClassPsiDeclarationProvider createDeclarationProviderForClassStaticMembers(@NotNull PsiClass psiClass) {
|
public ClassPsiDeclarationProvider createDeclarationProviderForClassStaticMembers(@NotNull PsiClass psiClass) {
|
||||||
return new ClassPsiDeclarationProviderImpl(psiClass, true);
|
return new ClassPsiDeclarationProviderImpl(psiClass, true, psiClassFinder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -104,7 +104,7 @@ public final class JavaClassObjectResolver {
|
|||||||
String qualifiedName = classObjectPsiClass.getQualifiedName();
|
String qualifiedName = classObjectPsiClass.getQualifiedName();
|
||||||
assert qualifiedName != null;
|
assert qualifiedName != null;
|
||||||
FqName fqName = new FqName(qualifiedName);
|
FqName fqName = new FqName(qualifiedName);
|
||||||
ClassPsiDeclarationProvider classObjectData = PsiDeclarationProviderFactory.createBinaryClassData(classObjectPsiClass);
|
ClassPsiDeclarationProvider classObjectData = semanticServices.getPsiDeclarationProviderFactory().createBinaryClassData(classObjectPsiClass);
|
||||||
ClassDescriptorFromJvmBytecode classObjectDescriptor
|
ClassDescriptorFromJvmBytecode classObjectDescriptor
|
||||||
= new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT);
|
= new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT);
|
||||||
classObjectDescriptor.setSupertypes(supertypesResolver.getSupertypes(classObjectDescriptor,
|
classObjectDescriptor.setSupertypes(supertypesResolver.getSupertypes(classObjectDescriptor,
|
||||||
@@ -144,7 +144,7 @@ public final class JavaClassObjectResolver {
|
|||||||
) {
|
) {
|
||||||
FqNameUnsafe fqName = DescriptorResolverUtils.getFqNameForClassObject(psiClass);
|
FqNameUnsafe fqName = DescriptorResolverUtils.getFqNameForClassObject(psiClass);
|
||||||
ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT);
|
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()));
|
setUpClassObjectDescriptor(classObjectDescriptor, containing, fqName, data, getClassObjectName(containing.getName().getName()));
|
||||||
return classObjectDescriptor;
|
return classObjectDescriptor;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -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.descriptor.ClassDescriptorFromJvmBytecode;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
|
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.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.scope.JavaClassNonStaticMembersScope;
|
||||||
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiClassWrapper;
|
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiClassWrapper;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
@@ -219,7 +218,7 @@ public final class JavaClassResolver {
|
|||||||
) {
|
) {
|
||||||
JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
|
JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
|
||||||
ClassKind kind = getClassKind(psiClass, jetClassAnnotation);
|
ClassKind kind = getClassKind(psiClass, jetClassAnnotation);
|
||||||
ClassPsiDeclarationProvider classData = PsiDeclarationProviderFactory.createBinaryClassData(psiClass);
|
ClassPsiDeclarationProvider classData = semanticServices.getPsiDeclarationProviderFactory().createBinaryClassData(psiClass);
|
||||||
ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(containingDeclaration, kind);
|
ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(containingDeclaration, kind);
|
||||||
|
|
||||||
cache(javaClassToKotlinFqName(fqName), classDescriptor);
|
cache(javaClassToKotlinFqName(fqName), classDescriptor);
|
||||||
|
|||||||
+12
-11
@@ -43,8 +43,6 @@ import java.util.Collections;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory.*;
|
|
||||||
|
|
||||||
public final class JavaNamespaceResolver {
|
public final class JavaNamespaceResolver {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -150,13 +148,15 @@ public final class JavaNamespaceResolver {
|
|||||||
PsiClass psiClass = getPsiClassForJavaPackageScope(fqName);
|
PsiClass psiClass = getPsiClassForJavaPackageScope(fqName);
|
||||||
trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.PROPER);
|
trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.PROPER);
|
||||||
if (psiClass == null) {
|
if (psiClass == null) {
|
||||||
return new JavaPackageScopeWithoutMembers(namespaceDescriptor,
|
return new JavaPackageScopeWithoutMembers(
|
||||||
createDeclarationProviderForNamespaceWithoutMembers(psiPackage),
|
namespaceDescriptor,
|
||||||
fqName, javaSemanticServices);
|
javaSemanticServices.getPsiDeclarationProviderFactory().createDeclarationProviderForNamespaceWithoutMembers(psiPackage),
|
||||||
|
fqName, javaSemanticServices);
|
||||||
}
|
}
|
||||||
return new JavaScopeForKotlinNamespace(namespaceDescriptor,
|
return new JavaScopeForKotlinNamespace(
|
||||||
createDeclarationForKotlinNamespace(psiPackage, psiClass),
|
namespaceDescriptor,
|
||||||
fqName, javaSemanticServices);
|
javaSemanticServices.getPsiDeclarationProviderFactory().createDeclarationForKotlinNamespace(psiPackage, psiClass),
|
||||||
|
fqName, javaSemanticServices);
|
||||||
}
|
}
|
||||||
|
|
||||||
PsiClass psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
|
PsiClass psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
|
||||||
@@ -169,9 +169,10 @@ 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(namespaceDescriptor,
|
return new JavaClassStaticMembersScope(
|
||||||
createDeclarationProviderForClassStaticMembers(psiClass),
|
namespaceDescriptor,
|
||||||
fqName, javaSemanticServices);
|
javaSemanticServices.getPsiDeclarationProviderFactory().createDeclarationProviderForClassStaticMembers(psiClass),
|
||||||
|
fqName, javaSemanticServices);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cache(@NotNull FqName fqName, @Nullable JavaBaseScope packageScope) {
|
private void cache(@NotNull FqName fqName, @Nullable JavaBaseScope packageScope) {
|
||||||
|
|||||||
+1
-1
@@ -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())) {
|
if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user