diff --git a/java/java-tests/testSrc/com/intellij/psi/PsiModificationTrackerTest.java b/java/java-tests/testSrc/com/intellij/psi/PsiModificationTrackerTest.java index 22d93439b2a4..af66253cb185 100644 --- a/java/java-tests/testSrc/com/intellij/psi/PsiModificationTrackerTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/PsiModificationTrackerTest.java @@ -32,7 +32,6 @@ import com.intellij.psi.util.PsiModificationTracker; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase; import com.intellij.util.Processor; -import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -340,4 +339,23 @@ public class PsiModificationTrackerTest extends JavaCodeInsightFixtureTestCase { assertNull(JavaPsiFacade.getInstance(getProject()).findClass("foo.Foo", GlobalSearchScope.allScope(getProject()))); assertFalse(count1 == tracker.getJavaStructureModificationCount()); } + + public void testVirtualFileRename_WithPsi() throws IOException { + PsiModificationTracker tracker = PsiManager.getInstance(getProject()).getModificationTracker(); + final PsiManagerEx psiManager = (PsiManagerEx)PsiManager.getInstance(getProject()); + GlobalSearchScope scope = GlobalSearchScope.allScope(getProject()); + + final VirtualFile file = myFixture.addFileToProject("foo/Foo.java", "package foo; class Foo {}").getVirtualFile(); + assertNotNull(JavaPsiFacade.getInstance(getProject()).findClass("foo.Foo", scope)); + long count1 = tracker.getModificationCount(); + long hc = psiManager.findFile(file).hashCode(); + long stamp1 = psiManager.findFile(file).getModificationStamp(); + + file.rename(this, "Bar.java"); + + assertNotNull(JavaPsiFacade.getInstance(getProject()).findClass("foo.Foo", scope)); + assertTrue(count1 != tracker.getModificationCount()); + assertTrue(stamp1 != psiManager.findFile(file).getModificationStamp()); + assertEquals(hc, psiManager.findFile(file).hashCode()); + } } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java index f4902a1000f1..b9751224b1db 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java @@ -40,6 +40,7 @@ import com.intellij.psi.*; import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.PsiTreeChangeEventImpl; import com.intellij.psi.impl.smartPointers.SmartPointerManagerImpl; +import com.intellij.psi.impl.source.PsiFileImpl; import com.intellij.util.FileContentUtilCore; import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NotNull; @@ -399,6 +400,9 @@ public class PsiVFSListener extends VirtualFileAdapter { myManager.childReplaced(treeEvent); } else { + if (oldPsiFile instanceof PsiFileImpl) { + ((PsiFileImpl)oldPsiFile).clearCaches(); + } treeEvent.setElement(oldPsiFile); treeEvent.setPropertyName(PsiTreeChangeEvent.PROP_FILE_NAME); treeEvent.setOldValue(event.getOldValue());