From 4cf5bc536cfe031e1d28e6df643b72f1c880c6c0 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 28 Jan 2013 21:54:10 +0400 Subject: [PATCH] Using project and search scope for stub-based declaration providers + using indices for getAllPackages and isPackageDeclared() --- .../StubDeclarationProviderFactory.java | 14 +++- .../StubPackageMemberDeclarationProvider.java | 69 ++++++------------- .../stubs/resolve/JetStubResolveTest.java | 7 +- 3 files changed, 38 insertions(+), 52 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubDeclarationProviderFactory.java b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubDeclarationProviderFactory.java index 0048f4b798e..d779c12a5e1 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubDeclarationProviderFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubDeclarationProviderFactory.java @@ -16,6 +16,8 @@ package org.jetbrains.jet.plugin.stubindex.resolve; +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.resolve.lazy.ClassMemberDeclarationProvider; import org.jetbrains.jet.lang.resolve.lazy.DeclarationProviderFactory; @@ -24,6 +26,15 @@ import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.jet.lang.resolve.name.FqName; public class StubDeclarationProviderFactory implements DeclarationProviderFactory { + + private final Project project; + private final GlobalSearchScope searchScope; + + public StubDeclarationProviderFactory(@NotNull Project project, @NotNull GlobalSearchScope scope) { + this.project = project; + searchScope = scope; + } + @NotNull @Override public ClassMemberDeclarationProvider getClassMemberDeclarationProvider(@NotNull JetClassLikeInfo classLikeInfo) { @@ -33,7 +44,6 @@ public class StubDeclarationProviderFactory implements DeclarationProviderFactor @Override public PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName) { - // TODO: - return null; + return new StubPackageMemberDeclarationProvider(packageFqName, project, searchScope); } } diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubPackageMemberDeclarationProvider.java b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubPackageMemberDeclarationProvider.java index 7d346d22a4b..5d258ab6d59 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubPackageMemberDeclarationProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubPackageMemberDeclarationProvider.java @@ -17,88 +17,63 @@ package org.jetbrains.jet.plugin.stubindex.resolve; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.search.FilenameIndex; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.asJava.LightClassGenerationSupport; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetProperty; import org.jetbrains.jet.lang.resolve.lazy.PackageMemberDeclarationProvider; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.plugin.stubindex.JetAllPackagesIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex; import java.util.Collection; -import java.util.HashSet; public class StubPackageMemberDeclarationProvider extends AbstractStubDeclarationProvider implements PackageMemberDeclarationProvider { - @NotNull private final FqName fqName; - @NotNull private final Project project; + private final FqName fqName; + private final Project project; + private final GlobalSearchScope searchScope; - public StubPackageMemberDeclarationProvider(@NotNull FqName fqName, @NotNull Project project) { + public StubPackageMemberDeclarationProvider(@NotNull FqName fqName, @NotNull Project project, @NotNull GlobalSearchScope searchScope) { this.fqName = fqName; this.project = project; + this.searchScope = searchScope; } @Override public boolean isPackageDeclared(@NotNull Name name) { - FqName childFqName = fqName.child(name); - - for (JetFile jetFile : getJetFiles()) { - if (childFqName.toString().equals(jetFile.getPackageName())) { - return true; - } - } - - return false; + return LightClassGenerationSupport.getInstance(project).packageExists(fqName, searchScope); } @NotNull @Override public Collection getFunctionDeclarations(@NotNull Name name) { - return JetTopLevelFunctionsFqnNameIndex.getInstance().get(fqName.child(name).toString(), project, GlobalSearchScope.allScope(project)); + return JetTopLevelFunctionsFqnNameIndex.getInstance().get(fqName.child(name).toString(), project, searchScope); } @NotNull @Override public Collection getPropertyDeclarations(@NotNull Name name) { - return JetTopLevelPropertiesFqnNameIndex.getInstance().get(fqName.child(name).toString(), project, GlobalSearchScope.allScope(project)); + return JetTopLevelPropertiesFqnNameIndex.getInstance().get(fqName.child(name).toString(), project, searchScope); } @Override public Collection getAllDeclaredPackages() { - Collection subPackages = new HashSet(); - - for (JetFile file : getJetFiles()) { - String packageName = file.getPackageName(); - if (packageName != null) { - FqName packageFqName = new FqName(packageName); - if (!packageFqName.isRoot() && packageFqName.parent().equalsTo(fqName)) { - subPackages.add(packageFqName); - } + // get all packages in this project + Collection allPackagesInProject = JetAllPackagesIndex.getInstance().getAllKeys(project); + return ContainerUtil.mapNotNull(allPackagesInProject, new Function() { + @Override + public FqName fun(String packageFqName) { + // filter by the search scope + Collection files = JetAllPackagesIndex.getInstance().get(packageFqName, project, searchScope); + if (files.isEmpty()) return null; + return new FqName(packageFqName); } - } - - return subPackages; - } - - private Collection getJetFiles() { - Collection kotlinFiles = FilenameIndex.getAllFilesByExt(project, "kt"); - kotlinFiles.addAll(FilenameIndex.getAllFilesByExt(project, "jet")); - - Collection jetFiles = new HashSet(kotlinFiles.size()); - - for (VirtualFile file : kotlinFiles) { - PsiFile kotlinFile = PsiManager.getInstance(project).findFile(file); - if (kotlinFile instanceof JetFile) { - jetFiles.add((JetFile) kotlinFile); - } - } - - return jetFiles; + }); } } diff --git a/idea/tests/org/jetbrains/jet/plugin/stubs/resolve/JetStubResolveTest.java b/idea/tests/org/jetbrains/jet/plugin/stubs/resolve/JetStubResolveTest.java index 92a1c8713f1..ed894315fe6 100644 --- a/idea/tests/org/jetbrains/jet/plugin/stubs/resolve/JetStubResolveTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/stubs/resolve/JetStubResolveTest.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.plugin.stubs.resolve; import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetProperty; @@ -36,7 +37,7 @@ public class JetStubResolveTest extends LightCodeInsightFixtureTestCase { "package test.testing\n" + "fun some() {}"); StubPackageMemberDeclarationProvider provider = - new StubPackageMemberDeclarationProvider(new FqName("test.testing"), getProject()); + new StubPackageMemberDeclarationProvider(new FqName("test.testing"), getProject(), GlobalSearchScope.projectScope(getProject())); List some = Lists.newArrayList(provider.getFunctionDeclarations(Name.identifier("some"))); @@ -51,7 +52,7 @@ public class JetStubResolveTest extends LightCodeInsightFixtureTestCase { "fun other(v : String) {}"); StubPackageMemberDeclarationProvider provider = - new StubPackageMemberDeclarationProvider(new FqName("test.testing"), getProject()); + new StubPackageMemberDeclarationProvider(new FqName("test.testing"), getProject(), GlobalSearchScope.projectScope(getProject())); List other = Lists.newArrayList(provider.getFunctionDeclarations(Name.identifier("other"))); Collection functionTexts = Collections2.transform(other, new Function() { @@ -72,7 +73,7 @@ public class JetStubResolveTest extends LightCodeInsightFixtureTestCase { "val test = 12\n"); StubPackageMemberDeclarationProvider provider = - new StubPackageMemberDeclarationProvider(new FqName("test.testing"), getProject()); + new StubPackageMemberDeclarationProvider(new FqName("test.testing"), getProject(), GlobalSearchScope.projectScope(getProject())); List testProperties = Lists.newArrayList(provider.getPropertyDeclarations(Name.identifier("test")));