From 8ec6d38717a908b0958e0b79c8bb209bc98311e2 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Tue, 12 Jul 2016 17:39:35 +0300 Subject: [PATCH] external system aware make build notifications rework --- .../actions/CompileProjectAction.java | 7 ++-- .../openapi/build/BuildSystemManagerImpl.java | 23 ++++++++++++- .../build/DefaultBuildSystemDriver.java | 2 +- .../BuildArtifactsBeforeRunTaskProvider.java | 5 ++- .../build/BuildChunkStatusNotification.java | 32 +++++++++++++++++++ .../build/BuildStatusNotification.java | 17 +++++++--- .../build/BuildStatusNotificationAdapter.java | 30 +++++++++++++++++ .../openapi/build/BuildSystemDriver.java | 2 +- .../build/GradleBuildSystemDriver.java | 2 +- 9 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 java/compiler/openapi/src/com/intellij/openapi/build/BuildChunkStatusNotification.java create mode 100644 java/compiler/openapi/src/com/intellij/openapi/build/BuildStatusNotificationAdapter.java diff --git a/java/compiler/impl/src/com/intellij/compiler/actions/CompileProjectAction.java b/java/compiler/impl/src/com/intellij/compiler/actions/CompileProjectAction.java index b4a68e509f65..897b9d124478 100644 --- a/java/compiler/impl/src/com/intellij/compiler/actions/CompileProjectAction.java +++ b/java/compiler/impl/src/com/intellij/compiler/actions/CompileProjectAction.java @@ -19,17 +19,16 @@ import com.intellij.history.LocalHistory; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.Presentation; -import com.intellij.openapi.build.BuildContext; -import com.intellij.openapi.build.BuildStatusNotification; +import com.intellij.openapi.build.BuildStatusNotificationAdapter; import com.intellij.openapi.build.BuildSystemManager; import com.intellij.openapi.compiler.CompilerBundle; import com.intellij.openapi.project.Project; public class CompileProjectAction extends CompileActionBase { protected void doAction(DataContext dataContext, final Project project) { - BuildSystemManager.getInstance(project).rebuildProject(new BuildStatusNotification() { + BuildSystemManager.getInstance(project).rebuildProject(new BuildStatusNotificationAdapter() { @Override - public void finished(boolean aborted, int errors, int warnings, BuildContext buildContext) { + public void finished(boolean aborted, int errors, int warnings) { if (aborted || project.isDisposed()) { return; } diff --git a/java/compiler/impl/src/com/intellij/openapi/build/BuildSystemManagerImpl.java b/java/compiler/impl/src/com/intellij/openapi/build/BuildSystemManagerImpl.java index 606c069215cf..e583582e4510 100644 --- a/java/compiler/impl/src/com/intellij/openapi/build/BuildSystemManagerImpl.java +++ b/java/compiler/impl/src/com/intellij/openapi/build/BuildSystemManagerImpl.java @@ -26,6 +26,8 @@ import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import static com.intellij.util.containers.ContainerUtil.list; @@ -116,10 +118,29 @@ public class BuildSystemManagerImpl extends BuildSystemManager { return myDefaultBuildSystemDriver; })); + AtomicInteger inProgressCounter = new AtomicInteger(toBuild.size()); + AtomicInteger errorsCounter = new AtomicInteger(); + AtomicInteger warningsCounter = new AtomicInteger(); + AtomicBoolean abortedFlag = new AtomicBoolean(false); for (Map.Entry> entry : toBuild.entrySet()) { BuildSystemDriver driver = entry.getKey(); BuildScope buildScope = toBuild.size() == 1 ? scope : new BuildScopeImpl(entry.getValue(), scope.getSessionId()); - driver.build(new BuildContextImpl(myProject, buildScope, isIncrementalBuild), callback); + BuildChunkStatusNotification chunkStatusNotification = callback == null ? null : new BuildChunkStatusNotification() { + @Override + public void finished(boolean aborted, int errors, int warnings, BuildContext buildContext) { + int inProgress = inProgressCounter.decrementAndGet(); + int allErrors = errorsCounter.addAndGet(errors); + int allWarnings = warningsCounter.addAndGet(warnings); + if(aborted){ + abortedFlag.set(true); + } + callback.chunkFinished(aborted, errors, warnings, inProgress, buildContext); + if (inProgress == 0) { + callback.finished(abortedFlag.get(), allErrors, allWarnings); + } + } + }; + driver.build(new BuildContextImpl(myProject, buildScope, isIncrementalBuild), chunkStatusNotification); } } diff --git a/java/compiler/impl/src/com/intellij/openapi/build/DefaultBuildSystemDriver.java b/java/compiler/impl/src/com/intellij/openapi/build/DefaultBuildSystemDriver.java index 0668209eb61c..be5d049ac284 100644 --- a/java/compiler/impl/src/com/intellij/openapi/build/DefaultBuildSystemDriver.java +++ b/java/compiler/impl/src/com/intellij/openapi/build/DefaultBuildSystemDriver.java @@ -49,7 +49,7 @@ import java.util.stream.Stream; */ public class DefaultBuildSystemDriver extends BuildSystemDriver { @Override - public void build(@NotNull BuildContext buildContext, @Nullable BuildStatusNotification callback) { + public void build(@NotNull BuildContext buildContext, @Nullable BuildChunkStatusNotification callback) { CompileStatusNotification compileNotification = callback == null ? null : (aborted, errors, warnings, compileContext) -> callback.finished(aborted, errors, warnings, buildContext); if (buildContext.getScope() instanceof ProjectBuildScope) { diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java index 4113a2fbb8a7..02ee5f663f76 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java @@ -176,12 +176,11 @@ public class BuildArtifactsBeforeRunTaskProvider extends BeforeRunTaskProvider EP_NAME = ExtensionPointName.create("com.intellij.buildSystemDriver"); - public abstract void build(@NotNull BuildContext buildContext, @Nullable BuildStatusNotification callback); + public abstract void build(@NotNull BuildContext buildContext, @Nullable BuildChunkStatusNotification callback); public abstract boolean canBuild(@NotNull BuildTarget buildTarget); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/build/GradleBuildSystemDriver.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/build/GradleBuildSystemDriver.java index a3a4a8d48d8e..72fb1cba4c1e 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/build/GradleBuildSystemDriver.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/build/GradleBuildSystemDriver.java @@ -69,7 +69,7 @@ import java.util.stream.Collectors; */ public class GradleBuildSystemDriver extends BuildSystemDriver { @Override - public void build(@NotNull BuildContext buildContext, @Nullable BuildStatusNotification buildCallback) { + public void build(@NotNull BuildContext buildContext, @Nullable BuildChunkStatusNotification buildCallback) { String executionName = null; if (buildContext.getScope() instanceof ProjectBuildScope) { executionName = buildContext.isIncrementalBuild() ? "Make" : "Rebuild";