use one NonClasspathDirectoriesScope instead of union of per-root scopes

This commit is contained in:
peter
2014-07-08 08:38:22 +02:00
parent 8ddead1ca8
commit eb59c9fa5a
6 changed files with 25 additions and 34 deletions
@@ -5,7 +5,7 @@ import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.NonClasspathDirectoryScope;
import com.intellij.psi.search.NonClasspathDirectoriesScope;
import com.intellij.psi.search.SearchScope;
import org.jetbrains.annotations.NotNull;
@@ -25,7 +25,7 @@ public class NonClasspathResolveScopeEnlarger extends ResolveScopeEnlarger {
final List<VirtualFile> roots = ((NonClasspathClassFinder)finder).getClassRoots();
for (VirtualFile root : roots) {
if (VfsUtil.isAncestor(root, file, true)) {
return NonClasspathDirectoryScope.compose(roots);
return NonClasspathDirectoriesScope.compose(roots);
}
}
}
@@ -23,7 +23,7 @@ import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.impl.file.PsiPackageImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.NonClasspathDirectoryScope;
import com.intellij.psi.search.NonClasspathDirectoriesScope;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
@@ -252,7 +252,7 @@ public abstract class NonClasspathClassFinder extends PsiElementFinder {
GlobalSearchScope scope = base;
for (PsiElementFinder finder : Extensions.getExtensions(EP_NAME, project)) {
if (finder instanceof NonClasspathClassFinder) {
scope = scope.uniteWith(NonClasspathDirectoryScope.compose(((NonClasspathClassFinder)finder).getClassRoots()));
scope = scope.uniteWith(NonClasspathDirectoriesScope.compose(((NonClasspathClassFinder)finder).getClassRoots()));
}
}
return scope;
@@ -19,18 +19,21 @@ package com.intellij.psi.search;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
* @author peter
*/
public class NonClasspathDirectoryScope extends GlobalSearchScope {
private final VirtualFile myRoot;
public class NonClasspathDirectoriesScope extends GlobalSearchScope {
private final Set<VirtualFile> myRoots;
public NonClasspathDirectoryScope(@NotNull VirtualFile root) {
myRoot = root;
public NonClasspathDirectoriesScope(@NotNull Collection<VirtualFile> roots) {
myRoots = ContainerUtil.newHashSet(roots);
}
@Override
@@ -44,16 +47,12 @@ public class NonClasspathDirectoryScope extends GlobalSearchScope {
return EMPTY_SCOPE;
}
GlobalSearchScope scope = new NonClasspathDirectoryScope(roots.get(0));
for (int i = 1; i < roots.size(); i++) {
scope = scope.uniteWith(new NonClasspathDirectoryScope(roots.get(i)));
}
return scope;
return new NonClasspathDirectoriesScope(roots);
}
@Override
public boolean contains(@NotNull VirtualFile file) {
return VfsUtilCore.isAncestor(myRoot, file, false);
return VfsUtilCore.isUnder(file, myRoots);
}
@Override
@@ -74,11 +73,11 @@ public class NonClasspathDirectoryScope extends GlobalSearchScope {
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof NonClasspathDirectoryScope)) return false;
if (!(o instanceof NonClasspathDirectoriesScope)) return false;
NonClasspathDirectoryScope that = (NonClasspathDirectoryScope)o;
NonClasspathDirectoriesScope that = (NonClasspathDirectoriesScope)o;
if (!myRoot.equals(that.myRoot)) return false;
if (!myRoots.equals(that.myRoots)) return false;
return true;
}
@@ -86,7 +85,7 @@ public class NonClasspathDirectoryScope extends GlobalSearchScope {
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + myRoot.hashCode();
result = 31 * result + myRoots.hashCode();
return result;
}
}
@@ -21,7 +21,7 @@ import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElementFinder;
import com.intellij.psi.ResolveScopeEnlarger;
import com.intellij.psi.search.NonClasspathDirectoryScope;
import com.intellij.psi.search.NonClasspathDirectoriesScope;
import com.intellij.psi.search.SearchScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.GroovyFileType;
@@ -42,7 +42,7 @@ public class GradleBuildClasspathResolveScopeEnlarger extends ResolveScopeEnlarg
final List<VirtualFile> roots = gradleClassFinder.getClassRoots();
for (VirtualFile root : roots) {
if (VfsUtilCore.isAncestor(root, file, true)) {
return NonClasspathDirectoryScope.compose(roots);
return NonClasspathDirectoriesScope.compose(roots);
}
}
}
@@ -41,7 +41,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.NonClasspathDirectoryScope;
import com.intellij.psi.search.NonClasspathDirectoriesScope;
import icons.GradleIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -52,7 +52,6 @@ import org.jetbrains.plugins.gradle.service.resolve.GradleResolverUtil;
import org.jetbrains.plugins.gradle.util.GradleConstants;
import org.jetbrains.plugins.groovy.config.GroovyConfigUtils;
import org.jetbrains.plugins.groovy.extensions.GroovyRunnableScriptType;
import org.jetbrains.plugins.groovy.extensions.GroovyScriptType;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrApplicationStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
@@ -332,10 +331,7 @@ public class GradleScriptType extends GroovyRunnableScriptType {
files = GradleBuildClasspathManager.getInstance(file.getProject()).getModuleClasspathEntries(modulePath);
for (final VirtualFile root : files) {
result = result.uniteWith(new NonClasspathDirectoryScope(root));
}
result = new ExternalModuleBuildGlobalSearchScope(module.getProject(), result, modulePath);
result = new ExternalModuleBuildGlobalSearchScope(module.getProject(), result.uniteWith(new NonClasspathDirectoriesScope(files)), modulePath);
}
return result;
}
@@ -20,12 +20,12 @@ import com.intellij.compiler.options.CompileStepBeforeRunNoErrorCheck;
import com.intellij.execution.Location;
import com.intellij.execution.RunManagerEx;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.NonClasspathDirectoryScope;
import com.intellij.psi.search.NonClasspathDirectoriesScope;
import icons.JetgroovyIcons;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -104,7 +104,7 @@ public class GantScriptType extends GroovyRunnableScriptType {
}
public static List<VirtualFile> additionalScopeFiles(@NotNull GroovyFile file) {
final Module module = ModuleUtil.findModuleForPsiElement(file);
final Module module = ModuleUtilCore.findModuleForPsiElement(file);
if (module != null) {
final String sdkHome = GantUtils.getSdkHomeFromClasspath(module);
if (sdkHome != null) {
@@ -123,10 +123,6 @@ public class GantScriptType extends GroovyRunnableScriptType {
@Override
public GlobalSearchScope patchResolveScope(@NotNull GroovyFile file, @NotNull GlobalSearchScope baseScope) {
GlobalSearchScope result = baseScope;
for (final VirtualFile root : additionalScopeFiles(file)) {
result = result.uniteWith(new NonClasspathDirectoryScope(root));
}
return result;
return baseScope.uniteWith(new NonClasspathDirectoriesScope(additionalScopeFiles(file)));
}
}