From d36bca4475cf22389fd55c8f95b6eef2df87b938 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 13 Jun 2016 10:41:06 +0200 Subject: [PATCH] VFS isIgnored micro-optimizations --- .../fileTypes/impl/IgnoredPatternSet.java | 5 +- .../fileTypes/impl/IgnoredFileCache.java | 46 +++++-------------- .../openapi/roots/impl/RootIndex.java | 14 ++---- 3 files changed, 20 insertions(+), 45 deletions(-) diff --git a/jps/model-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredPatternSet.java b/jps/model-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredPatternSet.java index 35d300e0436e..f61ecbbf3a42 100644 --- a/jps/model-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredPatternSet.java +++ b/jps/model-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredPatternSet.java @@ -16,6 +16,7 @@ package com.intellij.openapi.fileTypes.impl; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.fileTypes.FileNameMatcherFactory; @@ -53,14 +54,14 @@ public class IgnoredPatternSet { } } - public boolean isIgnored(@NotNull String fileName) { + public boolean isIgnored(@NotNull CharSequence fileName) { if (myIgnorePatterns.findAssociatedFileType(fileName) == Boolean.TRUE) { return true; } //Quite a hack, but still we need to have some name, which //won't be caught by VFS for sure. - return fileName.endsWith(FileUtil.ASYNC_DELETE_EXTENSION); + return StringUtil.endsWith(fileName, FileUtil.ASYNC_DELETE_EXTENSION); } void clearPatterns() { diff --git a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredFileCache.java b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredFileCache.java index 20c7e7770988..d22f0251e9c1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredFileCache.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredFileCache.java @@ -23,8 +23,6 @@ import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.openapi.vfs.newvfs.events.VFileEvent; import com.intellij.openapi.vfs.newvfs.events.VFilePropertyChangeEvent; import com.intellij.util.containers.ConcurrentBitSet; -import com.intellij.util.containers.ConcurrentIntObjectMap; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NotNull; @@ -33,11 +31,10 @@ import java.util.List; /** * @author peter */ -class IgnoredFileCache { - private final ConcurrentBitSet myCheckedIds = new ConcurrentBitSet(); - private final ConcurrentIntObjectMap myIgnoredIds = ContainerUtil.createConcurrentIntObjectMap(); +final class IgnoredFileCache { + private final ConcurrentBitSet myNonIgnoredIds = new ConcurrentBitSet(); private final IgnoredPatternSet myIgnoredPatterns; - private volatile int myVfsEventNesting; + private int myVfsEventNesting; IgnoredFileCache(@NotNull IgnoredPatternSet ignoredPatterns) { myIgnoredPatterns = ignoredPatterns; @@ -62,8 +59,7 @@ class IgnoredFileCache { if (file instanceof NewVirtualFile && event instanceof VFilePropertyChangeEvent) { int id = ((NewVirtualFile)file).getId(); if (id >= 0) { - myCheckedIds.clear(id); - myIgnoredIds.remove(id); + myNonIgnoredIds.clear(id); } } } @@ -72,37 +68,19 @@ class IgnoredFileCache { } void clearCache() { - myCheckedIds.clear(); - myIgnoredIds.clear(); + myNonIgnoredIds.clear(); } - boolean isFileIgnored(@NotNull VirtualFile file) { - if (myVfsEventNesting != 0 || !(file instanceof NewVirtualFile)) { - return isFileIgnoredNoCache(file); + boolean isFileIgnored(VirtualFile file) { + int id = myVfsEventNesting == 0 && file instanceof NewVirtualFile ? ((NewVirtualFile)file).getId() : -1; + if (id > 0 && myNonIgnoredIds.get(id)) { + return false; } - int id = ((NewVirtualFile)file).getId(); - if (id < 0) { - return isFileIgnoredNoCache(file); + boolean result = myIgnoredPatterns.isIgnored(file.getNameSequence()); + if (!result && id > 0) { + myNonIgnoredIds.set(id); } - - ConcurrentBitSet checkedIds = myCheckedIds; - if (checkedIds.get(id)) { - return myIgnoredIds.containsKey(id); - } - - boolean result = isFileIgnoredNoCache(file); - if (result) { - myIgnoredIds.put(id, Boolean.TRUE); - } - else { - myIgnoredIds.remove(id); - } - checkedIds.set(id); return result; } - - private boolean isFileIgnoredNoCache(@NotNull VirtualFile file) { - return myIgnoredPatterns.isIgnored(file.getName()); - } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java index 4f8b4fe36ef1..8b0441dee432 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java @@ -24,7 +24,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtilCore; @@ -50,6 +49,7 @@ public class RootIndex { }; private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.impl.RootIndex"); + private static final FileTypeRegistry ourFileTypes = FileTypeRegistry.getInstance(); private final Map myPackagePrefixByRoot = ContainerUtil.newHashMap(); @@ -375,7 +375,7 @@ public class RootIndex { if (info != null) { return info; } - if (isIgnored(file)) { + if (ourFileTypes.isFileIgnored(file)) { return NonProjectDirectoryInfo.IGNORED; } dir = file.getParent(); @@ -397,7 +397,7 @@ public class RootIndex { return info; } - if (isIgnored(root)) { + if (ourFileTypes.isFileIgnored(root)) { return cacheInfos(dir, root, NonProjectDirectoryInfo.IGNORED); } } @@ -433,7 +433,7 @@ public class RootIndex { @Nullable public String getPackageName(@NotNull final VirtualFile dir) { if (dir.isDirectory()) { - if (isIgnored(dir)) { + if (ourFileTypes.isFileIgnored(dir)) { return null; } @@ -477,7 +477,7 @@ public class RootIndex { boolean hasContentRoots = false; while (dir != null) { hasContentRoots |= info.contentRootOf.get(dir) != null; - if (!hasContentRoots && isIgnored(dir)) { + if (!hasContentRoots && ourFileTypes.isFileIgnored(dir)) { return null; } if (allRoots.contains(dir)) { @@ -488,10 +488,6 @@ public class RootIndex { return hierarchy; } - private static boolean isIgnored(@NotNull VirtualFile dir) { - return FileTypeRegistry.getInstance().isFileIgnored(dir); - } - private static class RootInfo { // getDirectoriesByPackageName used to be in this order, some clients might rely on that @NotNull final LinkedHashSet classAndSourceRoots = ContainerUtil.newLinkedHashSet();