diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByDocument.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByDocument.java index 7aad7fd2998c..4c5ceab88a6e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByDocument.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByDocument.java @@ -28,11 +28,13 @@ public class DocumentReferenceByDocument implements DocumentReference { myDocument = document; } + @Override @NotNull public Document getDocument() { return myDocument; } + @Override @Nullable public VirtualFile getFile() { return null; diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByVirtualFile.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByVirtualFile.java index dc2c2643658f..271bf8f84c12 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByVirtualFile.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByVirtualFile.java @@ -29,12 +29,14 @@ public class DocumentReferenceByVirtualFile implements DocumentReference { myFile = file; } + @Override @Nullable public Document getDocument() { assert myFile.isValid() : "should not be called on references to deleted file: " + myFile; return FileDocumentManager.getInstance().getDocument(myFile); } + @Override @NotNull public VirtualFile getFile() { return myFile; diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java index 620e57792cbc..a53830f241b7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java @@ -41,14 +41,16 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple private static final Key> DELETED_FILES = Key.create(DocumentReferenceManagerImpl.class.getName() + ".DELETED_FILES"); private final Map, DocumentReference> myDocToRef = new WeakValueHashMap, DocumentReference>(); - private final Map myFileToRef = new WeakValueHashMap(); + private final Map, DocumentReference> myFileToRef = new WeakValueHashMap, DocumentReference>(); private final Map myDeletedFilePathToRef = new WeakValueHashMap(); + @Override @NotNull public String getComponentName() { return getClass().getSimpleName(); } + @Override public void initComponent() { VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileAdapter() { @Override @@ -56,7 +58,7 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple VirtualFile f = event.getFile(); DocumentReference ref = myDeletedFilePathToRef.remove(new FilePath(f.getUrl())); if (ref != null) { - myFileToRef.put(f, ref); + myFileToRef.put(new WeakReferenceWithEquals(f), ref); ((DocumentReferenceByVirtualFile)ref).update(f); } } @@ -73,8 +75,10 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple List files = f.getUserData(DELETED_FILES); f.putUserData(DELETED_FILES, null); + assert files != null; for (VirtualFile each : files) { - DocumentReference ref = myFileToRef.remove(each); + Reference r = new WeakReferenceWithEquals(each); + DocumentReference ref = myFileToRef.remove(r); if (ref != null) { myDeletedFilePathToRef.put(new FilePath(each.getUrl()), ref); } @@ -83,7 +87,7 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple }); } - private List collectDeletedFiles(VirtualFile f, List files) { + private static List collectDeletedFiles(VirtualFile f, List files) { if (!(f instanceof NewVirtualFile)) return files; if (!f.isDirectory()) { @@ -97,6 +101,7 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple return files; } + @Override public void disposeComponent() { } @@ -110,19 +115,7 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple } private DocumentReference doCreate(@NotNull final Document document) { - final int hashCode = document.hashCode(); - Reference reference = new WeakReference(document) { - @Override - public int hashCode() { - return hashCode; - } - - @Override - public boolean equals(Object obj) { - Document mydoc = get(); - return mydoc != null && obj instanceof Reference && ((Reference)obj).get() == mydoc; - } - }; + Reference reference = new WeakReferenceWithEquals(document); DocumentReference result = myDocToRef.get(reference); if (result == null) { result = new DocumentReferenceByDocument(document); @@ -137,15 +130,36 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple assertInDispatchThread(); assert file.isValid() : "file is invalid: " + file; - DocumentReference result = myFileToRef.get(file); + WeakReferenceWithEquals ref = new WeakReferenceWithEquals(file); + DocumentReference result = myFileToRef.get(ref); if (result == null) { result = new DocumentReferenceByVirtualFile(file); - myFileToRef.put(file, result); + myFileToRef.put(ref, result); } return result; } - private void assertInDispatchThread() { + private static void assertInDispatchThread() { ApplicationManager.getApplication().assertIsDispatchThread(); } + + private static class WeakReferenceWithEquals extends WeakReference { + final int hashCode; + + public WeakReferenceWithEquals(@NotNull T document) { + super(document); + hashCode = document.hashCode(); + } + + @Override + public int hashCode() { + return hashCode; + } + + @Override + public boolean equals(Object obj) { + T doc = get(); + return doc != null && obj instanceof Reference && ((Reference)obj).get() == doc; + } + } }