diff --git a/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceServiceBase.java b/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceServiceBase.java index 2e4c3a3c0f1e..ccc38ba56fbc 100644 --- a/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceServiceBase.java +++ b/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceServiceBase.java @@ -94,7 +94,7 @@ public abstract class CompilerReferenceServiceBase myService; private final FileDocumentManager myFileDocManager; private final PsiDocumentManager myPsiDocManager; @@ -200,8 +204,25 @@ public class DirtyScopeHolder extends UserDataHolderBase implements BulkFileList return getDirtyScope().contains(file); } + @Nullable @Override - public void after(@NotNull List events) { + public ChangeApplier prepareChange(@NotNull List events) { + final List modulesToBeMarkedDirty = getModulesToBeMarkedDirtyBefore(events); + + return new ChangeApplier() { + @Override + public void beforeVfsChange() { + modulesToBeMarkedDirty.forEach(DirtyScopeHolder.this::addToDirtyModules); + } + + @Override + public void afterVfsChange() { + after(events); + } + }; + } + + private void after(@NotNull List events) { for (VFileEvent event : events) { if (event instanceof VFileCreateEvent || event instanceof VFileCopyEvent || event instanceof VFileMoveEvent) { VirtualFile file = event.getFile(); @@ -219,12 +240,20 @@ public class DirtyScopeHolder extends UserDataHolderBase implements BulkFileList } } - @Override - public void before(@NotNull List events) { + @Contract(pure=true) + @NotNull + private List getModulesToBeMarkedDirtyBefore(@NotNull List events) { + final List modulesToBeMarkedDirty = new ArrayList<>(); + for (VFileEvent event : events) { + ProgressManager.checkCanceled(); + if (event instanceof VFileDeleteEvent || event instanceof VFileMoveEvent || event instanceof VFileContentChangeEvent) { VirtualFile file = event.getFile(); - fileChanged(file); + if (file != null) { + final Module module = getModuleForSourceContentFile(file); + ContainerUtil.addIfNotNull(modulesToBeMarkedDirty, module); + } } else if (event instanceof VFilePropertyChangeEvent) { VFilePropertyChangeEvent pce = (VFilePropertyChangeEvent)event; @@ -233,16 +262,17 @@ public class DirtyScopeHolder extends UserDataHolderBase implements BulkFileList final String path = pce.getFile().getPath(); for (Module module : ModuleManager.getInstance(myService.getProject()).getModules()) { if (FileUtil.isAncestor(path, module.getModuleFilePath(), true)) { - addToDirtyModules(module); + modulesToBeMarkedDirty.add(module); } } } } } + return modulesToBeMarkedDirty; } - public void installVFSListener() { - myService.getProject().getMessageBus().connect().subscribe(VirtualFileManager.VFS_CHANGES, this); + public void installVFSListener(@NotNull Disposable parentDisposable) { + VirtualFileManager.getInstance().addAsyncFileListener(this, parentDisposable); } private void fileChanged(@NotNull VirtualFile file) { @@ -251,6 +281,7 @@ public class DirtyScopeHolder extends UserDataHolderBase implements BulkFileList addToDirtyModules(module); } } + private void addToDirtyModules(@NotNull Module module) { synchronized (myLock) { if (myCompilationPhase) {