From c93a65d85f02e86674e0be9081a387712e8bcc00 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 12 Jul 2016 20:25:50 +0300 Subject: [PATCH] extract LightDirectoryIndex --- .../ide/scratch/ScratchFileServiceImpl.java | 27 +++++--------- .../indexing}/LightDirectoryIndex.java | 37 ++++++++++++------- 2 files changed, 33 insertions(+), 31 deletions(-) rename platform/lang-impl/src/com/intellij/{ide/scratch => util/indexing}/LightDirectoryIndex.java (75%) diff --git a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileServiceImpl.java b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileServiceImpl.java index b75266ac7d20..68ca22e30bca 100644 --- a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileServiceImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileServiceImpl.java @@ -22,6 +22,7 @@ import com.intellij.lang.LanguageUtil; import com.intellij.lang.PerFileMappings; import com.intellij.lang.PerFileMappingsBase; import com.intellij.openapi.application.AccessToken; +import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.PersistentStateComponent; @@ -44,15 +45,14 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileWithId; import com.intellij.psi.LanguageSubstitutor; import com.intellij.psi.LanguageSubstitutors; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiUtilCore; -import com.intellij.util.PairConsumer; import com.intellij.util.PathUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.indexing.IndexableSetContributor; +import com.intellij.util.indexing.LightDirectoryIndex; import com.intellij.util.messages.MessageBus; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -71,22 +71,14 @@ public class ScratchFileServiceImpl extends ScratchFileService implements Persis private final LightDirectoryIndex myIndex; private final MyLanguages myScratchMapping = new MyLanguages(); - protected ScratchFileServiceImpl(MessageBus messageBus) { - myIndex = new LightDirectoryIndex(messageBus.connect(), NULL_TYPE) { - - @Override - protected void collectRoots(@NotNull PairConsumer consumer) { - LocalFileSystem fileSystem = LocalFileSystem.getInstance(); - for (RootType r : RootType.getAllRootIds()) { - String root = getRootPath(r); - VirtualFile rootFile = fileSystem.findFileByPath(root); - if (rootFile != null) { - consumer.consume(rootFile, r); - } - } + protected ScratchFileServiceImpl(Application application) { + myIndex = new LightDirectoryIndex(application, NULL_TYPE, index -> { + LocalFileSystem fileSystem = LocalFileSystem.getInstance(); + for (RootType r : RootType.getAllRootIds()) { + index.putInfo(fileSystem.findFileByPath(getRootPath(r)), r); } - }; - initFileOpenedListener(messageBus); + }); + initFileOpenedListener(application.getMessageBus()); } @NotNull @@ -100,7 +92,6 @@ public class ScratchFileServiceImpl extends ScratchFileService implements Persis public RootType getRootType(@Nullable VirtualFile file) { if (file == null) return null; VirtualFile directory = file.isDirectory() ? file : file.getParent(); - if (!(directory instanceof VirtualFileWithId)) return null; RootType result = myIndex.getInfoForFile(directory); return result == NULL_TYPE ? null : result; } diff --git a/platform/lang-impl/src/com/intellij/ide/scratch/LightDirectoryIndex.java b/platform/lang-impl/src/com/intellij/util/indexing/LightDirectoryIndex.java similarity index 75% rename from platform/lang-impl/src/com/intellij/ide/scratch/LightDirectoryIndex.java rename to platform/lang-impl/src/com/intellij/util/indexing/LightDirectoryIndex.java index 9b965a02128b..d6a828370c3a 100644 --- a/platform/lang-impl/src/com/intellij/ide/scratch/LightDirectoryIndex.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/LightDirectoryIndex.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -13,8 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.ide.scratch; +package com.intellij.util.indexing; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileTypes.FileTypeEvent; import com.intellij.openapi.fileTypes.FileTypeListener; import com.intellij.openapi.fileTypes.FileTypeManager; @@ -23,7 +25,7 @@ import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.VirtualFileWithId; import com.intellij.openapi.vfs.newvfs.BulkFileListener; import com.intellij.openapi.vfs.newvfs.events.VFileEvent; -import com.intellij.util.PairConsumer; +import com.intellij.util.Consumer; import com.intellij.util.containers.ConcurrentIntObjectMap; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.messages.MessageBusConnection; @@ -33,23 +35,27 @@ import org.jetbrains.annotations.Nullable; import java.util.List; /** - * This is a light version of DirectoryIndexImpl. + * This is a light version of DirectoryIndexImpl * * @author gregsh */ -abstract class LightDirectoryIndex { +public final class LightDirectoryIndex { private final ConcurrentIntObjectMap myInfoCache = ContainerUtil.createConcurrentIntObjectMap(); private final T myDefValue; + private final Consumer> myInitializer; - public LightDirectoryIndex(@NotNull MessageBusConnection connection, @NotNull T defValue) { + public LightDirectoryIndex(@NotNull Disposable parentDisposable, @NotNull T defValue, @NotNull Consumer> initializer) { myDefValue = defValue; - reinitRoots(); + myInitializer = initializer; + resetIndex(); + MessageBusConnection connection = ApplicationManager.getApplication().getMessageBus().connect(parentDisposable); connection.subscribe(FileTypeManager.TOPIC, new FileTypeListener.Adapter() { @Override public void fileTypesChanged(@NotNull FileTypeEvent event) { - reinitRoots(); + resetIndex(); } }); + connection.subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener() { @Override public void before(@NotNull List events) { @@ -60,7 +66,7 @@ abstract class LightDirectoryIndex { for (VFileEvent event : events) { VirtualFile file = event.getFile(); if (file == null || file.isDirectory()) { - reinitRoots(); + resetIndex(); break; } } @@ -68,15 +74,20 @@ abstract class LightDirectoryIndex { }); } - public void reinitRoots() { + public void resetIndex() { myInfoCache.clear(); - collectRoots((file, info) -> cacheInfo(file, info)); + myInitializer.consume(this); } - protected abstract void collectRoots(@NotNull PairConsumer consumer); + public void putInfo(@Nullable VirtualFile file, @NotNull T value) { + if (!(file instanceof VirtualFileWithId)) return; + cacheInfo(file, value); + } @NotNull - public T getInfoForFile(@NotNull VirtualFile file) { + public T getInfoForFile(@Nullable VirtualFile file) { + if (!(file instanceof VirtualFileWithId)) return myDefValue; + VirtualFile dir; if (!file.isDirectory()) { T info = getCachedInfo(file);