soft reference for unique name builder (IDEA-CR-4539)

This commit is contained in:
Maxim.Mossienko
2015-09-04 18:08:05 +02:00
parent 2130596fbe
commit fa27598b93
@@ -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) {