get rid of LightVirtualFile by generalizing its processing as files in non local filesystem that can not survive their removal / undo of removal

This commit is contained in:
Maxim.Mossienko
2014-11-07 14:16:27 +01:00
parent 65ba5b7cb1
commit 741f03209c
3 changed files with 12 additions and 13 deletions
@@ -19,14 +19,13 @@ import com.intellij.openapi.command.undo.DocumentReference;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.LightVirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
class DocumentReferenceByLightVirtualFile implements DocumentReference {
private LightVirtualFile myFile;
class DocumentReferenceByNonlocalVirtualFile implements DocumentReference {
private final VirtualFile myFile;
DocumentReferenceByLightVirtualFile(@NotNull LightVirtualFile file) {
DocumentReferenceByNonlocalVirtualFile(@NotNull VirtualFile file) {
myFile = file;
}
@@ -28,7 +28,6 @@ import com.intellij.openapi.vfs.VirtualFileEvent;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
import com.intellij.reference.SoftReference;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.util.containers.WeakKeyWeakValueHashMap;
import com.intellij.util.containers.WeakValueHashMap;
import com.intellij.util.io.fs.FilePath;
@@ -134,10 +133,10 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple
public DocumentReference create(@NotNull VirtualFile file) {
assertInDispatchThread();
if (file instanceof LightVirtualFile) {
if (!file.isInLocalFileSystem()) { // we treat local files differently from non local because we can undo their deletion
DocumentReference reference = file.getUserData(FILE_TO_STRONG_REF_KEY);
if (reference == null) {
file.putUserData(FILE_TO_STRONG_REF_KEY, reference = new DocumentReferenceByLightVirtualFile((LightVirtualFile)file));
file.putUserData(FILE_TO_STRONG_REF_KEY, reference = new DocumentReferenceByNonlocalVirtualFile(file));
}
return reference;
}
@@ -21,7 +21,6 @@ import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.util.containers.HashMap;
import com.intellij.util.containers.WeakList;
import gnu.trove.THashSet;
@@ -35,9 +34,11 @@ class UndoRedoStacksHolder {
private final boolean myUndo;
private final LinkedList<UndoableGroup> myGlobalStack = new LinkedList<UndoableGroup>();
// strongly reference local files for which we can undo file removal
// document without files and nonlocal files are stored without strong reference
private final Map<DocumentReference, LinkedList<UndoableGroup>> myDocumentStacks = new HashMap<DocumentReference, LinkedList<UndoableGroup>>();
private final WeakList<Document> myDocumentsWithStacks = new WeakList<Document>();
private final WeakList<LightVirtualFile> myLightVirtualFilesWithStacks = new WeakList<LightVirtualFile>();
private final WeakList<VirtualFile> myNonlocalVirtualFilesWithStacks = new WeakList<VirtualFile>();
public UndoRedoStacksHolder(boolean isUndo) {
myUndo = isUndo;
@@ -53,8 +54,8 @@ class UndoRedoStacksHolder {
LinkedList<UndoableGroup> result;
VirtualFile file = r.getFile();
if (file instanceof LightVirtualFile) {
result = addWeaklyTrackedEmptyStack((LightVirtualFile)file, myLightVirtualFilesWithStacks);
if (!file.isInLocalFileSystem()) {
result = addWeaklyTrackedEmptyStack(file, myNonlocalVirtualFilesWithStacks);
}
else {
result = myDocumentStacks.get(r);
@@ -178,7 +179,7 @@ class UndoRedoStacksHolder {
cleanWeaklyTrackedEmptyStacks(myDocumentsWithStacks);
cleanWeaklyTrackedEmptyStacks(myLightVirtualFilesWithStacks);
cleanWeaklyTrackedEmptyStacks(myNonlocalVirtualFilesWithStacks);
}
private <T extends UserDataHolder> void cleanWeaklyTrackedEmptyStacks(WeakList<T> stackHolders) {
@@ -240,7 +241,7 @@ class UndoRedoStacksHolder {
for (Document each : myDocumentsWithStacks) {
result.add(documentReferenceManager.create(each));
}
for (LightVirtualFile each : myLightVirtualFilesWithStacks) {
for (VirtualFile each : myNonlocalVirtualFilesWithStacks) {
result.add(documentReferenceManager.create(each));
}
}