diff --git a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/UniqueVFilePathBuilderImpl.java b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/UniqueVFilePathBuilderImpl.java index 706918e8c60c..9f304460b8e1 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/UniqueVFilePathBuilderImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/UniqueVFilePathBuilderImpl.java @@ -19,7 +19,6 @@ import com.intellij.ide.ui.UISettings; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.UniqueVFilePathBuilder; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.UniqueNameBuilder; @@ -33,7 +32,7 @@ import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; -import com.intellij.util.containers.ConcurrentFactoryMap; +import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -41,6 +40,7 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.Collection; import java.util.Collections; +import java.util.concurrent.ConcurrentMap; /** * @author yole @@ -58,47 +58,49 @@ public class UniqueVFilePathBuilderImpl extends UniqueVFilePathBuilder { return getUniqueVirtualFilePath(project, vFile, true); } - private static final Key>>> + private static final Key>>> ourShortNameBuilderCacheKey = Key.create("project's.short.file.name.builder"); - private static final Key>>> + private static final Key>>> ourShortNameOpenedBuilderCacheKey = Key.create("project's.short.file.name.opened.builder"); private static final UniqueNameBuilder ourEmptyBuilder = new UniqueNameBuilder(null, null, -1); private static String getUniqueVirtualFilePath(final Project project, VirtualFile file, final boolean skipNonOpenedFiles) { - Key>>> key = + Key>>> key = skipNonOpenedFiles ? ourShortNameOpenedBuilderCacheKey:ourShortNameBuilderCacheKey; - CachedValue>> data = project.getUserData(key); + CachedValue>> data = project.getUserData(key); if (data == null) { project.putUserData(key, data = CachedValuesManager.getManager(project).createCachedValue( - new CachedValueProvider>>() { + new CachedValueProvider>>() { @Nullable @Override - public Result>> compute() { - return new Result>>( - new ConcurrentFactoryMap>() { - @Nullable - @Override - protected UniqueNameBuilder create(String key) { - final UniqueNameBuilder builder = filesWithTheSameName( - key, - project, - skipNonOpenedFiles, - ProjectScope.getProjectScope(project) - ); - return builder != null ? builder:ourEmptyBuilder; - } - }, + public Result>> compute() { + return new Result>>( + ContainerUtil.>createConcurrentSoftValueMap(), PsiModificationTracker.MODIFICATION_COUNT, - ProjectRootManager.getInstance(project), -// VirtualFileManager.VFS_STRUCTURE_MODIFICATIONS, + //ProjectRootModificationTracker.getInstance(project), + //VirtualFileManager.VFS_STRUCTURE_MODIFICATIONS, FileEditorManagerImpl.OPEN_FILE_SET_MODIFICATION_COUNT ); } }, false)); } - UniqueNameBuilder uniqueNameBuilderForShortName = data.getValue().get(file.getName()); - if (uniqueNameBuilderForShortName == ourEmptyBuilder) uniqueNameBuilderForShortName = null; + final ConcurrentMap> valueMap = data.getValue(); + final String fileName = file.getName(); + UniqueNameBuilder uniqueNameBuilderForShortName = valueMap.get(fileName); + + if (uniqueNameBuilderForShortName == null) { + final UniqueNameBuilder builder = filesWithTheSameName( + fileName, + project, + skipNonOpenedFiles, + ProjectScope.getProjectScope(project) + ); + valueMap.put(fileName, builder != null ? builder:ourEmptyBuilder); + uniqueNameBuilderForShortName = builder; + } else if (uniqueNameBuilderForShortName == ourEmptyBuilder) { + uniqueNameBuilderForShortName = null; + } if (uniqueNameBuilderForShortName != null && uniqueNameBuilderForShortName.contains(file)) { if (file instanceof VirtualFilePathWrapper) {