Using project and search scope for stub-based declaration providers

+ using indices for getAllPackages and isPackageDeclared()
This commit is contained in:
Andrey Breslav
2013-01-28 21:54:10 +04:00
parent ae48edfb5f
commit 4cf5bc536c
3 changed files with 38 additions and 52 deletions
@@ -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);
}
}
@@ -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<JetNamedFunction> 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<JetProperty> 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<FqName> getAllDeclaredPackages() {
Collection<FqName> subPackages = new HashSet<FqName>();
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<String> allPackagesInProject = JetAllPackagesIndex.getInstance().getAllKeys(project);
return ContainerUtil.mapNotNull(allPackagesInProject, new Function<String, FqName>() {
@Override
public FqName fun(String packageFqName) {
// filter by the search scope
Collection<JetFile> files = JetAllPackagesIndex.getInstance().get(packageFqName, project, searchScope);
if (files.isEmpty()) return null;
return new FqName(packageFqName);
}
}
return subPackages;
}
private Collection<JetFile> getJetFiles() {
Collection<VirtualFile> kotlinFiles = FilenameIndex.getAllFilesByExt(project, "kt");
kotlinFiles.addAll(FilenameIndex.getAllFilesByExt(project, "jet"));
Collection<JetFile> jetFiles = new HashSet<JetFile>(kotlinFiles.size());
for (VirtualFile file : kotlinFiles) {
PsiFile kotlinFile = PsiManager.getInstance(project).findFile(file);
if (kotlinFile instanceof JetFile) {
jetFiles.add((JetFile) kotlinFile);
}
}
return jetFiles;
});
}
}
@@ -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<JetNamedFunction> 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<JetNamedFunction> other = Lists.newArrayList(provider.getFunctionDeclarations(Name.identifier("other")));
Collection<String> functionTexts = Collections2.transform(other, new Function<JetNamedFunction, String>() {
@@ -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<JetProperty> testProperties = Lists.newArrayList(provider.getPropertyDeclarations(Name.identifier("test")));