summaryrefslogtreecommitdiff
path: root/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java')
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java46
1 files changed, 42 insertions, 4 deletions
diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
index c40135db7c5f..669cf92d37da 100644
--- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
+++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
@@ -34,7 +34,9 @@ import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.application.PathManager;
+import com.intellij.openapi.compiler.CompilationStatusListener;
import com.intellij.openapi.compiler.CompileContext;
+import com.intellij.openapi.compiler.CompilerTopics;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.EditorFactory;
@@ -64,16 +66,14 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
+import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
import com.intellij.openapi.vfs.newvfs.impl.FileNameCache;
import com.intellij.openapi.wm.IdeFrame;
-import com.intellij.util.Alarm;
-import com.intellij.util.Function;
-import com.intellij.util.PathUtil;
-import com.intellij.util.SmartList;
+import com.intellij.util.*;
import com.intellij.util.concurrency.Semaphore;
import com.intellij.util.concurrency.SequentialTaskExecutor;
import com.intellij.util.containers.IntArrayList;
@@ -1117,6 +1117,44 @@ public class BuildManager implements ApplicationComponent{
scheduleAutoMake();
}
});
+ conn.subscribe(CompilerTopics.COMPILATION_STATUS, new CompilationStatusListener() {
+ private final Set<String> myRootsToRefresh = new THashSet<String>(FileUtil.PATH_HASHING_STRATEGY);
+ @Override
+ public void compilationFinished(boolean aborted, int errors, int warnings, CompileContext compileContext) {
+ final String[] roots;
+ synchronized (myRootsToRefresh) {
+ roots = ArrayUtil.toStringArray(myRootsToRefresh);
+ myRootsToRefresh.clear();
+ }
+ ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
+ @Override
+ public void run() {
+ if (project.isDisposed()) {
+ return;
+ }
+ final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
+ final LocalFileSystem lfs = LocalFileSystem.getInstance();
+ final Set<VirtualFile> filesToRefresh = new HashSet<VirtualFile>();
+ for (String root : roots) {
+ final VirtualFile rootFile = lfs.refreshAndFindFileByPath(root);
+ if (rootFile != null && fileIndex.isInSourceContent(rootFile)) {
+ filesToRefresh.add(rootFile);
+ }
+ }
+ if (!filesToRefresh.isEmpty()) {
+ lfs.refreshFiles(filesToRefresh, true, true, null);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void fileGenerated(String outputRoot, String relativePath) {
+ synchronized (myRootsToRefresh) {
+ myRootsToRefresh.add(outputRoot);
+ }
+ }
+ });
final String projectPath = getProjectPath(project);
Disposer.register(project, new Disposable() {
@Override