From 793d239f088877edd8e2889c91d741fdb8ea5811 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 21 Aug 2017 19:41:53 +0200 Subject: [PATCH] [vfs] checking file type before looking for .jar root (IDEA-177078) --- .../openapi/vfs/StandardFileSystems.java | 10 +++++----- .../src/com/intellij/util/PathsList.java | 16 +++++++--------- .../openapi/vfs/newvfs/ArchiveFileSystem.java | 2 +- .../roots/impl/libraries/LibraryImpl.java | 15 ++++++++++----- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/platform/core-api/src/com/intellij/openapi/vfs/StandardFileSystems.java b/platform/core-api/src/com/intellij/openapi/vfs/StandardFileSystems.java index a930c439a9b4..64f7c8a8e367 100644 --- a/platform/core-api/src/com/intellij/openapi/vfs/StandardFileSystems.java +++ b/platform/core-api/src/com/intellij/openapi/vfs/StandardFileSystems.java @@ -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); - } - // /** @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); + } // } \ No newline at end of file diff --git a/platform/core-api/src/com/intellij/util/PathsList.java b/platform/core-api/src/com/intellij/util/PathsList.java index b49244bbacad..d5ca742f7e74 100644 --- a/platform/core-api/src/com/intellij/util/PathsList.java +++ b/platform/core-api/src/com/intellij/util/PathsList.java @@ -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 LOCAL_PATH = file -> PathUtil.getLocalPath(file); private static final Function PATH_TO_DIR = (NullableFunction)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() { diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/newvfs/ArchiveFileSystem.java b/platform/platform-api/src/com/intellij/openapi/vfs/newvfs/ArchiveFileSystem.java index 491c70fd7a40..b9c76dc8a2b2 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/newvfs/ArchiveFileSystem.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/newvfs/ArchiveFileSystem.java @@ -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 diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java index 550bbc31cccc..fbe27f230ded 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java @@ -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 container, final boolean recursively) { + public static void collectJarFiles(VirtualFile dir, List 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; }