diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index a8468ef15d55..b1ffe29b9788 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -139,13 +139,16 @@ final class BuildSession implements Runnable, CanceledStatus { CustomBuilderMessage builderMessage = (CustomBuilderMessage)buildMessage; response = CmdlineProtoUtil.createCustomBuilderMessage(builderMessage.getBuilderId(), builderMessage.getMessageType(), builderMessage.getMessageText()); } - else { + else if (!(buildMessage instanceof BuildingTargetProgressMessage)) { float done = -1.0f; if (buildMessage instanceof ProgressMessage) { done = ((ProgressMessage)buildMessage).getDone(); } response = CmdlineProtoUtil.createCompileProgressMessageResponse(buildMessage.getMessageText(), done); } + else { + response = null; + } if (response != null) { Channels.write(myChannel, CmdlineProtoUtil.toMessage(mySessionId, response)); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 2e6a288e900d..bac5deac1608 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -809,6 +809,7 @@ public class IncProjectBuilder { private void buildTargetsChunk(CompileContext context, final BuildTargetChunk chunk) throws ProjectBuildException { boolean doneSomething; try { + sendBuildingTargetMessages(chunk.getTargets(), BuildingTargetProgressMessage.Event.STARTED); Utils.ERRORS_DETECTED_KEY.set(context, Boolean.FALSE); for (BuildTarget target : chunk.getTargets()) { @@ -864,9 +865,14 @@ public class IncProjectBuilder { finally { Utils.REMOVED_SOURCES_KEY.set(context, null); } + sendBuildingTargetMessages(chunk.getTargets(), BuildingTargetProgressMessage.Event.FINISHED); } } + private void sendBuildingTargetMessages(@NotNull Set> targets, @NotNull BuildingTargetProgressMessage.Event event) { + myMessageDispatcher.processMessage(new BuildingTargetProgressMessage(targets, event)); + } + private static void createClasspathIndex(final BuildTargetChunk chunk) { final Set outputDirs = new THashSet(FileUtil.FILE_HASHING_STRATEGY); for (BuildTarget target : chunk.getTargets()) { @@ -992,6 +998,7 @@ public class IncProjectBuilder { // return true if changed something, false otherwise private boolean runModuleLevelBuilders(final CompileContext context, final ModuleChunk chunk) throws ProjectBuildException, IOException { + sendBuildingTargetMessages(chunk.getTargets(), BuildingTargetProgressMessage.Event.STARTED); for (BuilderCategory category : BuilderCategory.values()) { for (ModuleLevelBuilder builder : myBuilderRegistry.getBuilders(category)) { builder.chunkBuildStarted(context, chunk); @@ -1105,6 +1112,7 @@ public class IncProjectBuilder { builder.chunkBuildFinished(context, chunk); } } + sendBuildingTargetMessages(chunk.getTargets(), BuildingTargetProgressMessage.Event.FINISHED); } return doneSomething; diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/BuildingTargetProgressMessage.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/BuildingTargetProgressMessage.java new file mode 100644 index 000000000000..50399f74baab --- /dev/null +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/BuildingTargetProgressMessage.java @@ -0,0 +1,47 @@ +package org.jetbrains.jps.incremental.messages; + +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.NotNullFunction; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.builders.BuildTarget; + +import java.util.Collection; + +/** + * @author nik + */ +public class BuildingTargetProgressMessage extends BuildMessage { + private final Collection> myTargets; + @NotNull private final Event myEventType; + + public enum Event { + STARTED, FINISHED + } + + public BuildingTargetProgressMessage(@NotNull Collection> targets, @NotNull Event event) { + super(composeMessageText(targets, event), Kind.PROGRESS); + myTargets = targets; + myEventType = event; + } + + private static String composeMessageText(Collection> targets, Event event) { + String targetsString = StringUtil.join(targets, new NotNullFunction, String>() { + @NotNull + @Override + public String fun(BuildTarget dom) { + return dom.getPresentableName(); + } + }, ", "); + return (event == Event.STARTED ? "Started" : "Finished") + " building " + targetsString; + } + + @NotNull + public Collection> getTargets() { + return myTargets; + } + + @NotNull + public Event getEventType() { + return myEventType; + } +} diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index 4c92428e47d4..a1bc3a9b87e1 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -1183,9 +1183,9 @@ public class StringUtil extends StringUtilRt { } @NotNull - public static String join(@NotNull Collection items, @NotNull Function f, @NotNull @NonNls String separator) { + public static String join(@NotNull Collection items, @NotNull Function f, @NotNull @NonNls String separator) { if (items.isEmpty()) return ""; - return join((Iterable)items, f, separator); + return join((Iterable)items, f, separator); } public static String join(@NotNull Iterable items, @NotNull @NonNls String separator) { @@ -1200,7 +1200,7 @@ public class StringUtil extends StringUtilRt { } @NotNull - public static String join(@NotNull Iterable items, @NotNull Function f, @NotNull @NonNls String separator) { + public static String join(@NotNull Iterable items, @NotNull Function f, @NotNull @NonNls String separator) { final StringBuilder result = new StringBuilder(); for (T item : items) { String string = f.fun(item);