From 31f33739d10e8d16dc08ea427676f764b218ecd9 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 1 Jul 2016 15:52:11 +0300 Subject: [PATCH] increment PSI modification counter on file reparse to make sure elements wouldn't be invalid inexpectedly (e.g. during folding) EA-84255 - PIEAE: LeafPsiElement.a --- .../psi/impl/file/impl/FileManagerImpl.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java b/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java index 5809de171274..0e9d54798cfa 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java @@ -147,9 +147,14 @@ public class FileManagerImpl implements FileManager { public void forceReload(@NotNull VirtualFile vFile) { LanguageSubstitutors.cancelReparsing(vFile); - if (findCachedViewProvider(vFile) == null) { + FileViewProvider viewProvider = findCachedViewProvider(vFile); + if (viewProvider == null) { return; } + ApplicationManager.getApplication().assertWriteAccessAllowed(); + // since the document doesn't change we need to tell everybody something has changed + ((PsiModificationTrackerImpl)myManager.getModificationTracker()).incCounter(); + setViewProvider(vFile, null); VirtualFile dir = vFile.getParent(); @@ -178,13 +183,13 @@ public class FileManagerImpl implements FileManager { if (myInitialized) { myConnection.disconnect(); } - ApplicationManager.getApplication().assertWriteAccessAllowed(); clearViewProviders(); myDisposed = true; } private void clearViewProviders() { + ApplicationManager.getApplication().assertWriteAccessAllowed(); DebugUtil.startPsiModification("clearViewProviders"); try { for (final FileViewProvider provider : myVFileToViewProviderMap.values()) { @@ -200,7 +205,13 @@ public class FileManagerImpl implements FileManager { @Override @TestOnly public void cleanupForNextTest() { - clearViewProviders(); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + clearViewProviders(); + } + }); + myVFileToPsiDirMap.clear(); ((PsiModificationTrackerImpl)myManager.getModificationTracker()).incCounter(); }