Using project and search scope for stub-based declaration providers
+ using indices for getAllPackages and isPackageDeclared()
This commit is contained in:
+12
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+22
-47
@@ -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")));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user