prefer document's stamp over file's one in view provider (IDEA-128919)

This commit is contained in:
peter
2014-11-21 22:53:45 +01:00
parent 2bf5ca0386
commit 3deea11b1b
2 changed files with 22 additions and 1 deletions
@@ -19,6 +19,7 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -317,4 +318,24 @@ public class MiscPsiTest extends LightCodeInsightFixtureTestCase {
assertTrue(file.getText(), file.getText().contains("foo() {\n"));
}
public void testPsiModificationNotAffectingDocument() {
final PsiJavaFile file = (PsiJavaFile)myFixture.addFileToProject("a.java", "class A{public static void foo() { }}");
PsiClass aClass = file.getClasses()[0];
//noinspection ResultOfMethodCallIgnored
aClass.getNode();
PlatformTestUtil.tryGcSoftlyReachableObjects();
PsiKeyword kw = assertInstanceOf(aClass.getMethods()[0].getModifierList().getFirstChild(), PsiKeyword.class);
kw.delete();
Document document = PsiDocumentManager.getInstance(getProject()).getDocument(file);
assertNotNull(document);
assertTrue(document.getModificationStamp() != file.getVirtualFile().getModificationStamp());
assertEquals(document.getModificationStamp(), file.getViewProvider().getModificationStamp());
FileDocumentManager.getInstance().saveDocument(document);
assertEquals(file.getText(), LoadTextUtil.loadText(file.getVirtualFile()).toString());
}
}
@@ -548,7 +548,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
@Override
public long getModificationStamp() {
Document document = com.intellij.reference.SoftReference.dereference(myDocument);
Document document = getCachedDocument();
if (document != null) return getLastCommittedStamp(document);
return myVirtualFile.getModificationStamp();
}