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;
|
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.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.ClassMemberDeclarationProvider;
|
import org.jetbrains.jet.lang.resolve.lazy.ClassMemberDeclarationProvider;
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.DeclarationProviderFactory;
|
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;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
|
||||||
public class StubDeclarationProviderFactory implements DeclarationProviderFactory {
|
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
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public ClassMemberDeclarationProvider getClassMemberDeclarationProvider(@NotNull JetClassLikeInfo classLikeInfo) {
|
public ClassMemberDeclarationProvider getClassMemberDeclarationProvider(@NotNull JetClassLikeInfo classLikeInfo) {
|
||||||
@@ -33,7 +44,6 @@ public class StubDeclarationProviderFactory implements DeclarationProviderFactor
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName) {
|
public PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName) {
|
||||||
// TODO:
|
return new StubPackageMemberDeclarationProvider(packageFqName, project, searchScope);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-47
@@ -17,88 +17,63 @@
|
|||||||
package org.jetbrains.jet.plugin.stubindex.resolve;
|
package org.jetbrains.jet.plugin.stubindex.resolve;
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project;
|
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.psi.search.GlobalSearchScope;
|
||||||
|
import com.intellij.util.Function;
|
||||||
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.asJava.LightClassGenerationSupport;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.lang.psi.JetNamedFunction;
|
import org.jetbrains.jet.lang.psi.JetNamedFunction;
|
||||||
import org.jetbrains.jet.lang.psi.JetProperty;
|
import org.jetbrains.jet.lang.psi.JetProperty;
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.PackageMemberDeclarationProvider;
|
import org.jetbrains.jet.lang.resolve.lazy.PackageMemberDeclarationProvider;
|
||||||
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.plugin.stubindex.JetAllPackagesIndex;
|
||||||
import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex;
|
import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex;
|
||||||
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex;
|
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
|
||||||
|
|
||||||
public class StubPackageMemberDeclarationProvider extends AbstractStubDeclarationProvider implements PackageMemberDeclarationProvider {
|
public class StubPackageMemberDeclarationProvider extends AbstractStubDeclarationProvider implements PackageMemberDeclarationProvider {
|
||||||
@NotNull private final FqName fqName;
|
private final FqName fqName;
|
||||||
@NotNull private final Project project;
|
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.fqName = fqName;
|
||||||
this.project = project;
|
this.project = project;
|
||||||
|
this.searchScope = searchScope;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isPackageDeclared(@NotNull Name name) {
|
public boolean isPackageDeclared(@NotNull Name name) {
|
||||||
FqName childFqName = fqName.child(name);
|
return LightClassGenerationSupport.getInstance(project).packageExists(fqName, searchScope);
|
||||||
|
|
||||||
for (JetFile jetFile : getJetFiles()) {
|
|
||||||
if (childFqName.toString().equals(jetFile.getPackageName())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<JetNamedFunction> getFunctionDeclarations(@NotNull Name name) {
|
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
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<JetProperty> getPropertyDeclarations(@NotNull Name name) {
|
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
|
@Override
|
||||||
public Collection<FqName> getAllDeclaredPackages() {
|
public Collection<FqName> getAllDeclaredPackages() {
|
||||||
Collection<FqName> subPackages = new HashSet<FqName>();
|
// get all packages in this project
|
||||||
|
Collection<String> allPackagesInProject = JetAllPackagesIndex.getInstance().getAllKeys(project);
|
||||||
for (JetFile file : getJetFiles()) {
|
return ContainerUtil.mapNotNull(allPackagesInProject, new Function<String, FqName>() {
|
||||||
String packageName = file.getPackageName();
|
@Override
|
||||||
if (packageName != null) {
|
public FqName fun(String packageFqName) {
|
||||||
FqName packageFqName = new FqName(packageName);
|
// filter by the search scope
|
||||||
if (!packageFqName.isRoot() && packageFqName.parent().equalsTo(fqName)) {
|
Collection<JetFile> files = JetAllPackagesIndex.getInstance().get(packageFqName, project, searchScope);
|
||||||
subPackages.add(packageFqName);
|
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.base.Function;
|
||||||
import com.google.common.collect.Collections2;
|
import com.google.common.collect.Collections2;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope;
|
||||||
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
|
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
|
||||||
import org.jetbrains.jet.lang.psi.JetNamedFunction;
|
import org.jetbrains.jet.lang.psi.JetNamedFunction;
|
||||||
import org.jetbrains.jet.lang.psi.JetProperty;
|
import org.jetbrains.jet.lang.psi.JetProperty;
|
||||||
@@ -36,7 +37,7 @@ public class JetStubResolveTest extends LightCodeInsightFixtureTestCase {
|
|||||||
"package test.testing\n" +
|
"package test.testing\n" +
|
||||||
"fun some() {}");
|
"fun some() {}");
|
||||||
StubPackageMemberDeclarationProvider provider =
|
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")));
|
List<JetNamedFunction> some = Lists.newArrayList(provider.getFunctionDeclarations(Name.identifier("some")));
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@ public class JetStubResolveTest extends LightCodeInsightFixtureTestCase {
|
|||||||
"fun other(v : String) {}");
|
"fun other(v : String) {}");
|
||||||
|
|
||||||
StubPackageMemberDeclarationProvider provider =
|
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")));
|
List<JetNamedFunction> other = Lists.newArrayList(provider.getFunctionDeclarations(Name.identifier("other")));
|
||||||
Collection<String> functionTexts = Collections2.transform(other, new Function<JetNamedFunction, String>() {
|
Collection<String> functionTexts = Collections2.transform(other, new Function<JetNamedFunction, String>() {
|
||||||
@@ -72,7 +73,7 @@ public class JetStubResolveTest extends LightCodeInsightFixtureTestCase {
|
|||||||
"val test = 12\n");
|
"val test = 12\n");
|
||||||
|
|
||||||
StubPackageMemberDeclarationProvider provider =
|
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")));
|
List<JetProperty> testProperties = Lists.newArrayList(provider.getPropertyDeclarations(Name.identifier("test")));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user