This commit is contained in:
Alexey Kudravtsev
2018-11-29 19:58:19 +03:00
parent f5e5ee7806
commit 9d672aa006
3 changed files with 26 additions and 20 deletions
@@ -24,7 +24,7 @@ import com.intellij.openapi.compiler.ExportableUserDataHolderBase;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashSet;
@@ -35,18 +35,18 @@ import java.util.*;
public class CompositeScope extends ExportableUserDataHolderBase implements CompileScope{
private final List<CompileScope> myScopes = new ArrayList<>();
public CompositeScope(CompileScope scope1, CompileScope scope2) {
public CompositeScope(@NotNull CompileScope scope1, @NotNull CompileScope scope2) {
addScope(scope1);
addScope(scope2);
}
public CompositeScope(CompileScope[] scopes) {
public CompositeScope(@NotNull CompileScope[] scopes) {
for (CompileScope scope : scopes) {
addScope(scope);
}
}
private void addScope(CompileScope scope) {
private void addScope(@NotNull CompileScope scope) {
if (scope instanceof CompositeScope) {
final CompositeScope compositeScope = (CompositeScope)scope;
for (CompileScope childScope : compositeScope.myScopes) {
@@ -68,7 +68,7 @@ public class CompositeScope extends ExportableUserDataHolderBase implements Comp
ContainerUtil.addAll(allFiles, files);
}
}
return VfsUtil.toVirtualFileArray(allFiles);
return VfsUtilCore.toVirtualFileArray(allFiles);
}
@Override
@@ -112,6 +112,7 @@ public class CompositeScope extends ExportableUserDataHolderBase implements Comp
return super.getUserData(key);
}
@NotNull
public Collection<CompileScope> getScopes() {
return Collections.unmodifiableList(myScopes);
}
@@ -25,6 +25,7 @@ import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileVisitor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@@ -37,7 +38,7 @@ public class FileSetCompileScope extends ExportableUserDataHolderBase implements
private Set<String> myUrls; // urls caching
private final Module[] myAffectedModules;
public FileSetCompileScope(final Collection<VirtualFile> files, Module[] modules) {
public FileSetCompileScope(@NotNull Collection<VirtualFile> files, @NotNull Module[] modules) {
myAffectedModules = modules;
ApplicationManager.getApplication().runReadAction(
() -> {
@@ -55,6 +56,7 @@ public class FileSetCompileScope extends ExportableUserDataHolderBase implements
return myAffectedModules;
}
@NotNull
public Collection<VirtualFile> getRootFiles() {
return Collections.unmodifiableCollection(myRootFiles);
}
@@ -95,6 +97,7 @@ public class FileSetCompileScope extends ExportableUserDataHolderBase implements
return false;
}
@NotNull
private Set<String> getUrls() {
if (myUrls == null) {
myUrls = new HashSet<>();
@@ -106,7 +109,7 @@ public class FileSetCompileScope extends ExportableUserDataHolderBase implements
return myUrls;
}
private void addFile(VirtualFile file) {
private void addFile(@NotNull VirtualFile file) {
if (file.isDirectory()) {
myDirectoryUrls.add(file.getUrl() + "/");
}
@@ -114,7 +117,7 @@ public class FileSetCompileScope extends ExportableUserDataHolderBase implements
myUrls = null;
}
private static void addRecursively(final Collection<? super VirtualFile> container, VirtualFile fromDirectory, final FileType fileType) {
private static void addRecursively(@NotNull Collection<? super VirtualFile> container, @NotNull VirtualFile fromDirectory, @Nullable FileType fileType) {
VfsUtilCore.visitChildrenRecursively(fromDirectory, new VirtualFileVisitor(VirtualFileVisitor.SKIP_ROOT) {
@Override
public boolean visitFile(@NotNull VirtualFile child) {
@@ -357,7 +357,7 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
*/
@NotNull
@Contract(pure = true)
public static GlobalSearchScope filesScope(@NotNull Project project, @NotNull Collection<VirtualFile> files) {
public static GlobalSearchScope filesScope(@NotNull Project project, @NotNull Collection<? extends VirtualFile> files) {
return filesScope(project, files, null);
}
@@ -369,20 +369,20 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
*/
@NotNull
@Contract(pure = true)
public static GlobalSearchScope filesWithoutLibrariesScope(@NotNull Project project, @NotNull Collection<VirtualFile> files) {
public static GlobalSearchScope filesWithoutLibrariesScope(@NotNull Project project, @NotNull Collection<? extends VirtualFile> files) {
if (files.isEmpty()) return EMPTY_SCOPE;
return new FilesScope(project, files, false, false);
}
@NotNull
@Contract(pure = true)
public static GlobalSearchScope filesWithLibrariesScope(@NotNull Project project, @NotNull Collection<VirtualFile> files) {
public static GlobalSearchScope filesWithLibrariesScope(@NotNull Project project, @NotNull Collection<? extends VirtualFile> files) {
return filesWithLibrariesScope(project, files, false);
}
@NotNull
@Contract(pure = true)
public static GlobalSearchScope filesWithLibrariesScope(@NotNull Project project, @NotNull Collection<VirtualFile> files,
public static GlobalSearchScope filesWithLibrariesScope(@NotNull Project project, @NotNull Collection<? extends VirtualFile> files,
boolean searchOutsideRootModel) {
if (files.isEmpty()) return EMPTY_SCOPE;
return new FilesScope(project, files, true, searchOutsideRootModel);
@@ -393,7 +393,7 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
*/
@NotNull
@Contract(pure = true)
public static GlobalSearchScope filesScope(@NotNull Project project, @NotNull Collection<VirtualFile> files, @Nullable final String displayName) {
public static GlobalSearchScope filesScope(@NotNull Project project, @NotNull Collection<? extends VirtualFile> files, @Nullable final String displayName) {
if (files.isEmpty()) return EMPTY_SCOPE;
return files.size() == 1? fileScope(project, files.iterator().next(), displayName) : new FilesScope(project, files) {
@NotNull
@@ -425,8 +425,7 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
private boolean containsScope(@NotNull GlobalSearchScope scope) {
if (myScope1.equals(scope) || myScope2.equals(scope) || equals(scope)) return true;
if (myScope1 instanceof IntersectionScope && ((IntersectionScope)myScope1).containsScope(scope)) return true;
if (myScope2 instanceof IntersectionScope && ((IntersectionScope)myScope2).containsScope(scope)) return true;
return false;
return myScope2 instanceof IntersectionScope && ((IntersectionScope)myScope2).containsScope(scope);
}
@NotNull
@@ -494,6 +493,7 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
@Override
public int calcHashCode() {
//noinspection deprecation
return 31 * myScope1.hashCode() + myScope2.hashCode();
}
@@ -791,16 +791,16 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
}
public static class FilesScope extends GlobalSearchScope implements Iterable<VirtualFile> {
private final Collection<VirtualFile> myFiles;
private final Collection<? extends VirtualFile> myFiles;
private final boolean mySearchOutsideRootModel;
private volatile Boolean myHasFilesOutOfProjectRoots;
private FilesScope(@Nullable Project project, @NotNull Collection<VirtualFile> files) {
private FilesScope(@Nullable Project project, @NotNull Collection<? extends VirtualFile> files) {
this(project, files, null, false);
}
// Optimization
private FilesScope(@Nullable Project project, @NotNull Collection<VirtualFile> files, @Nullable Boolean hasFilesOutOfProjectRoots,
private FilesScope(@Nullable Project project, @NotNull Collection<? extends VirtualFile> files, @Nullable Boolean hasFilesOutOfProjectRoots,
boolean searchOutsideRootModel) {
super(project);
myFiles = files;
@@ -846,14 +846,16 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
@Override
public String toString() {
List<VirtualFile> files = myFiles.size() <= 20 ? new ArrayList<>(myFiles) : new ArrayList<>(myFiles).subList(0, 20);
List<VirtualFile> files = ContainerUtil.getFirstItems(new ArrayList<>(myFiles), 20);
return "Files: ("+ files +"); search in libraries: " + (myHasFilesOutOfProjectRoots != null ? myHasFilesOutOfProjectRoots : "unknown");
}
@NotNull
@Override
public Iterator<VirtualFile> iterator() {
return myFiles.iterator();
//noinspection unchecked
return (Iterator<VirtualFile>) // optimization hack: avoid copying in `new ArrayList(myFiles).iterator()`
myFiles.iterator();
}
@Override