diff options
Diffstat (limited to 'java/compiler/impl/src/com/intellij/compiler/server')
-rw-r--r-- | java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java | 46 | ||||
-rw-r--r-- | java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java | 59 |
2 files changed, 73 insertions, 32 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 diff --git a/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java b/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java index 6a8c9740df80..bfde64d4396e 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java @@ -20,6 +20,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.util.ProgressIndicatorBase; import com.intellij.openapi.progress.util.ProgressIndicatorUtils; import com.intellij.openapi.progress.util.ReadTask; import com.intellij.openapi.project.DumbService; @@ -40,7 +41,6 @@ import org.jetbrains.jps.api.CmdlineRemoteProto; import org.jetbrains.org.objectweb.asm.Opcodes; import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; /** * @author Eugene Zhuravlev @@ -66,19 +66,23 @@ public abstract class DefaultMessageHandler implements BuilderMessageHandler { //noinspection EnumSwitchStatementWhichMissesCases switch (msg.getType()) { case BUILD_EVENT: - handleBuildEvent(sessionId, msg.getBuildEvent()); + final CmdlineRemoteProto.Message.BuilderMessage.BuildEvent event = msg.getBuildEvent(); + if (event.getEventType() == CmdlineRemoteProto.Message.BuilderMessage.BuildEvent.Type.CUSTOM_BUILDER_MESSAGE && event.hasCustomBuilderMessage()) { + final CmdlineRemoteProto.Message.BuilderMessage.BuildEvent.CustomBuilderMessage message = event.getCustomBuilderMessage(); + if (!myProject.isDisposed()) { + myProject.getMessageBus().syncPublisher(CustomBuilderMessageHandler.TOPIC).messageReceived( + message.getBuilderId(), message.getMessageType(), message.getMessageText() + ); + } + } + handleBuildEvent(sessionId, event); break; case COMPILE_MESSAGE: handleCompileMessage(sessionId, msg.getCompileMessage()); break; case CONSTANT_SEARCH_TASK: final CmdlineRemoteProto.Message.BuilderMessage.ConstantSearchTask task = msg.getConstantSearchTask(); - myTaskExecutor.submit(new Runnable() { - @Override - public void run() { - handleConstantSearchTask(channel, sessionId, task); - } - }); + handleConstantSearchTask(channel, sessionId, task); break; } } @@ -88,30 +92,29 @@ public abstract class DefaultMessageHandler implements BuilderMessageHandler { protected abstract void handleBuildEvent(UUID sessionId, CmdlineRemoteProto.Message.BuilderMessage.BuildEvent event); private void handleConstantSearchTask(final Channel channel, final UUID sessionId, final CmdlineRemoteProto.Message.BuilderMessage.ConstantSearchTask task) { - while (true) { - final AtomicBoolean canceled = new AtomicBoolean(false); - DumbService.getInstance(myProject).waitForSmartMode(); - ProgressIndicatorUtils.runWithWriteActionPriority(new ReadTask() { - @Override - public void computeInReadAction(@NotNull ProgressIndicator indicator) { - if (DumbService.isDumb(myProject)) { - canceled.set(true); - return; - } - - doHandleConstantSearchTask(channel, sessionId, task); + ProgressIndicatorUtils.scheduleWithWriteActionPriority(new ProgressIndicatorBase(), myTaskExecutor, new ReadTask() { + @Override + public void computeInReadAction(@NotNull ProgressIndicator indicator) { + if (DumbService.isDumb(myProject)) { + onCanceled(indicator); } - - @Override - public void onCanceled(@NotNull ProgressIndicator indicator) { - canceled.set(true); + else { + doHandleConstantSearchTask(channel, sessionId, task); } - }); - if (!canceled.get()) { - break; } - } + + @Override + public void onCanceled(@NotNull ProgressIndicator indicator) { + DumbService.getInstance(myProject).runWhenSmart(new Runnable() { + @Override + public void run() { + handleConstantSearchTask(channel, sessionId, task); + } + }); + } + }); } + private void doHandleConstantSearchTask(Channel channel, UUID sessionId, CmdlineRemoteProto.Message.BuilderMessage.ConstantSearchTask task) { final String ownerClassName = task.getOwnerClassName(); final String fieldName = task.getFieldName(); |