mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
+3
-4
@@ -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;
|
||||
}
|
||||
|
||||
+2
-3
@@ -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;
|
||||
}
|
||||
|
||||
+7
-6
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user