diff --git a/platform/lang-api/src/com/intellij/util/FileContentUtil.java b/platform/lang-api/src/com/intellij/util/FileContentUtil.java index 4a29dce33a44..dfd1df716e5a 100644 --- a/platform/lang-api/src/com/intellij/util/FileContentUtil.java +++ b/platform/lang-api/src/com/intellij/util/FileContentUtil.java @@ -69,20 +69,23 @@ public class FileContentUtil { virtualFile.refresh(false, false); } - public static void reparseFiles(@NotNull final Project project, @NotNull final Collection files, boolean includeOpenFiles) { - final Set events = new THashSet(); - for (VirtualFile file : files) { - saveOrReload(file, events); - } - if (includeOpenFiles) { - for (VirtualFile open : FileEditorManager.getInstance(project).getOpenFiles()) { - if (!files.contains(open)) { - saveOrReload(open, events); - } - } - } + public static void reparseFiles(@NotNull final Project project, @NotNull final Collection files, final boolean includeOpenFiles) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { + // files must be processed under one write action to prevent firing event for invalid files. + + final Set events = new THashSet(); + for (VirtualFile file : files) { + saveOrReload(file, events); + } + if (includeOpenFiles) { + for (VirtualFile open : FileEditorManager.getInstance(project).getOpenFiles()) { + if (!files.contains(open)) { + saveOrReload(open, events); + } + } + } + ApplicationManager.getApplication().getMessageBus().syncPublisher(VirtualFileManager.VFS_CHANGES) .before(new ArrayList(events)); ApplicationManager.getApplication().getMessageBus().syncPublisher(VirtualFileManager.VFS_CHANGES) @@ -92,7 +95,7 @@ public class FileContentUtil { } private static void saveOrReload(final VirtualFile virtualFile, Collection events) { - if (virtualFile == null || virtualFile.isDirectory()) { + if (virtualFile == null || virtualFile.isDirectory() || !virtualFile.isValid()) { return; } final FileDocumentManager documentManager = FileDocumentManager.getInstance();