mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
soft reference for unique name builder (IDEA-CR-4539)
This commit is contained in:
+28
-26
@@ -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<CachedValue<ConcurrentFactoryMap<String, UniqueNameBuilder<VirtualFile>>>>
|
||||
private static final Key<CachedValue<ConcurrentMap<String, UniqueNameBuilder<VirtualFile>>>>
|
||||
ourShortNameBuilderCacheKey = Key.create("project's.short.file.name.builder");
|
||||
private static final Key<CachedValue<ConcurrentFactoryMap<String, UniqueNameBuilder<VirtualFile>>>>
|
||||
private static final Key<CachedValue<ConcurrentMap<String, UniqueNameBuilder<VirtualFile>>>>
|
||||
ourShortNameOpenedBuilderCacheKey = Key.create("project's.short.file.name.opened.builder");
|
||||
private static final UniqueNameBuilder<VirtualFile> ourEmptyBuilder = new UniqueNameBuilder<VirtualFile>(null, null, -1);
|
||||
|
||||
private static String getUniqueVirtualFilePath(final Project project, VirtualFile file, final boolean skipNonOpenedFiles) {
|
||||
Key<CachedValue<ConcurrentFactoryMap<String, UniqueNameBuilder<VirtualFile>>>> key =
|
||||
Key<CachedValue<ConcurrentMap<String, UniqueNameBuilder<VirtualFile>>>> key =
|
||||
skipNonOpenedFiles ? ourShortNameOpenedBuilderCacheKey:ourShortNameBuilderCacheKey;
|
||||
CachedValue<ConcurrentFactoryMap<String, UniqueNameBuilder<VirtualFile>>> data = project.getUserData(key);
|
||||
CachedValue<ConcurrentMap<String, UniqueNameBuilder<VirtualFile>>> data = project.getUserData(key);
|
||||
if (data == null) {
|
||||
project.putUserData(key, data = CachedValuesManager.getManager(project).createCachedValue(
|
||||
new CachedValueProvider<ConcurrentFactoryMap<String, UniqueNameBuilder<VirtualFile>>>() {
|
||||
new CachedValueProvider<ConcurrentMap<String, UniqueNameBuilder<VirtualFile>>>() {
|
||||
@Nullable
|
||||
@Override
|
||||
public Result<ConcurrentFactoryMap<String, UniqueNameBuilder<VirtualFile>>> compute() {
|
||||
return new Result<ConcurrentFactoryMap<String, UniqueNameBuilder<VirtualFile>>>(
|
||||
new ConcurrentFactoryMap<String, UniqueNameBuilder<VirtualFile>>() {
|
||||
@Nullable
|
||||
@Override
|
||||
protected UniqueNameBuilder<VirtualFile> create(String key) {
|
||||
final UniqueNameBuilder<VirtualFile> builder = filesWithTheSameName(
|
||||
key,
|
||||
project,
|
||||
skipNonOpenedFiles,
|
||||
ProjectScope.getProjectScope(project)
|
||||
);
|
||||
return builder != null ? builder:ourEmptyBuilder;
|
||||
}
|
||||
},
|
||||
public Result<ConcurrentMap<String, UniqueNameBuilder<VirtualFile>>> compute() {
|
||||
return new Result<ConcurrentMap<String, UniqueNameBuilder<VirtualFile>>>(
|
||||
ContainerUtil.<String, UniqueNameBuilder<VirtualFile>>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<VirtualFile> uniqueNameBuilderForShortName = data.getValue().get(file.getName());
|
||||
if (uniqueNameBuilderForShortName == ourEmptyBuilder) uniqueNameBuilderForShortName = null;
|
||||
final ConcurrentMap<String, UniqueNameBuilder<VirtualFile>> valueMap = data.getValue();
|
||||
final String fileName = file.getName();
|
||||
UniqueNameBuilder<VirtualFile> uniqueNameBuilderForShortName = valueMap.get(fileName);
|
||||
|
||||
if (uniqueNameBuilderForShortName == null) {
|
||||
final UniqueNameBuilder<VirtualFile> 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) {
|
||||
|
||||
Reference in New Issue
Block a user