[vfs] checking file type before looking for .jar root (IDEA-177078)

This commit is contained in:
Roman Shevchenko
2017-08-21 19:53:37 +02:00
parent 9383b46409
commit 793d239f08
4 changed files with 23 additions and 20 deletions
@@ -59,11 +59,6 @@ public class StandardFileSystems {
return ourJar.getValue();
}
@Nullable
public static VirtualFile getJarRootForLocalFile(@NotNull VirtualFile virtualFile) {
return jar().findFileByPath(virtualFile.getPath() + URLUtil.JAR_SEPARATOR);
}
//<editor-fold desc="Deprecated stuff.">
/** @deprecated use ArchiveFileSystem#getLocalByEntry(VirtualFile) (to remove in IDEA 2018) */
public static VirtualFile getVirtualFileForJar(@Nullable VirtualFile entryVFile) {
@@ -75,5 +70,10 @@ public class StandardFileSystems {
String localPath = path.substring(0, separatorIndex);
return local().findFileByPath(localPath);
}
/** @deprecated use ArchiveFileSystem#getRootByLocal(VirtualFile) (to remove in IDEA 2018) */
public static VirtualFile getJarRootForLocalFile(@NotNull VirtualFile local) {
return jar().findFileByPath(local.getPath() + URLUtil.JAR_SEPARATOR);
}
//</editor-fold>
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
* Copyright 2000-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,7 +16,6 @@
package com.intellij.util;
import com.intellij.ide.highlighter.ArchiveFileType;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.io.FileUtil;
@@ -25,6 +24,7 @@ import com.intellij.openapi.vfs.StandardFileSystems;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.HashSet;
import com.intellij.util.containers.JBIterable;
import com.intellij.util.io.URLUtil;
import org.jetbrains.annotations.NotNull;
import java.io.File;
@@ -41,14 +41,12 @@ public class PathsList {
private static final Function<VirtualFile, String> LOCAL_PATH = file -> PathUtil.getLocalPath(file);
private static final Function<String, VirtualFile> PATH_TO_DIR = (NullableFunction<String, VirtualFile>)s -> {
final FileType fileType = FileTypeRegistry.getInstance().getFileTypeByFileName(s);
final VirtualFile localFile = PATH_TO_LOCAL_VFILE.fun(s);
if (localFile == null) return null;
if (ArchiveFileType.INSTANCE.equals(fileType) && !localFile.isDirectory()) {
return StandardFileSystems.getJarRootForLocalFile(localFile);
VirtualFile file = PATH_TO_LOCAL_VFILE.fun(s);
if (file == null) return null;
if (!file.isDirectory() && FileTypeRegistry.getInstance().getFileTypeByFileName(file.getName()) == ArchiveFileType.INSTANCE) {
return StandardFileSystems.jar().findFileByPath(file.getPath() + URLUtil.JAR_SEPARATOR);
}
return localFile;
return file;
};
public boolean isEmpty() {
@@ -44,7 +44,7 @@ public abstract class ArchiveFileSystem extends NewVirtualFileSystem {
*/
@Nullable
public VirtualFile getRootByLocal(@NotNull VirtualFile file) {
return findFileByPath(getRootPathByLocal(file));
return isCorrectFileType(file) ? findFileByPath(getRootPathByLocal(file)) : null;
}
@NotNull
@@ -15,10 +15,12 @@
*/
package com.intellij.openapi.roots.impl.libraries;
import com.intellij.ide.highlighter.ArchiveFileType;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ComponentSerializationUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtilCore;
@@ -39,6 +41,7 @@ import com.intellij.util.ArrayUtilRt;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
import com.intellij.util.io.URLUtil;
import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters;
import com.intellij.util.xmlb.XmlSerializer;
import gnu.trove.THashSet;
@@ -215,14 +218,16 @@ public class LibraryImpl extends TraceableDisposable implements LibraryEx.Modifi
return VfsUtilCore.toVirtualFileArray(expanded);
}
public static void collectJarFiles(final VirtualFile dir, final List<VirtualFile> container, final boolean recursively) {
public static void collectJarFiles(VirtualFile dir, List<VirtualFile> container, boolean recursively) {
VfsUtilCore.visitChildrenRecursively(dir, new VirtualFileVisitor(SKIP_ROOT, recursively ? null : ONE_LEVEL_DEEP) {
@Override
public boolean visitFile(@NotNull VirtualFile file) {
final VirtualFile jarRoot = file.isDirectory() ? null : StandardFileSystems.getJarRootForLocalFile(file);
if (jarRoot != null) {
container.add(jarRoot);
return false;
if (!file.isDirectory() && FileTypeRegistry.getInstance().getFileTypeByFileName(file.getName()) == ArchiveFileType.INSTANCE) {
VirtualFile jarRoot = StandardFileSystems.jar().findFileByPath(file.getPath() + URLUtil.JAR_SEPARATOR);
if (jarRoot != null) {
container.add(jarRoot);
return false;
}
}
return true;
}