diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildOutputConsumerImpl.java b/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildOutputConsumerImpl.java index 8cd78c831712..21a6f6b9f6c3 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildOutputConsumerImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildOutputConsumerImpl.java @@ -46,7 +46,7 @@ public class BuildOutputConsumerImpl implements BuildOutputConsumer { public BuildOutputConsumerImpl(BuildTarget target, CompileContext context) { myTarget = target; myContext = context; - myFileGeneratedEvent = new FileGeneratedEvent(); + myFileGeneratedEvent = new FileGeneratedEvent(target); myOutputs = myTarget.getOutputRoots(context); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildListener.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildListener.java index d81cd61d651e..4e3af6af3fce 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildListener.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildListener.java @@ -15,10 +15,9 @@ */ package org.jetbrains.jps.incremental; -import com.intellij.openapi.util.Pair; -import org.jetbrains.jps.builders.BuildTarget; +import org.jetbrains.jps.incremental.messages.FileDeletedEvent; +import org.jetbrains.jps.incremental.messages.FileGeneratedEvent; -import java.util.Collection; import java.util.EventListener; /** @@ -27,15 +26,11 @@ import java.util.EventListener; */ public interface BuildListener extends EventListener{ - void targetsBuildStarted(Collection> targets); - - void targetsBuildFinished(Collection> targets); - /** * Note: when parallel build is on, might be called from several simultaneously running threads - * @param paths collection of pairs [output root->relative path to generated file] + * @param event */ - void filesGenerated(Collection> paths); + void filesGenerated(FileGeneratedEvent event); - void filesDeleted(Collection paths); + void filesDeleted(FileDeletedEvent event); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ChainedTargetsBuildListener.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ChainedTargetsBuildListener.java index bb6875c305b5..ad94dc4f02ed 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ChainedTargetsBuildListener.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ChainedTargetsBuildListener.java @@ -19,15 +19,13 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.jps.builders.BuildRootDescriptor; import org.jetbrains.jps.builders.BuildRootIndex; -import org.jetbrains.jps.builders.BuildTarget; +import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.incremental.fs.BuildFSState; +import org.jetbrains.jps.incremental.messages.FileDeletedEvent; +import org.jetbrains.jps.incremental.messages.FileGeneratedEvent; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; /** * Notifies targets about changes in their sources made by other builders @@ -36,35 +34,24 @@ import java.util.Set; */ class ChainedTargetsBuildListener implements BuildListener { private final CompileContextImpl myContext; - private final Set> myCurrentTargets = Collections.synchronizedSet(new HashSet>()); public ChainedTargetsBuildListener(CompileContextImpl context) { myContext = context; } @Override - public void targetsBuildStarted(Collection> targets) { - myCurrentTargets.addAll(targets); - } - - @Override - public void targetsBuildFinished(Collection> targets) { - myCurrentTargets.removeAll(targets); - } - - @Override - public void filesGenerated(Collection> paths) { - final BuildFSState fsState = myContext.getProjectDescriptor().fsState; - final BuildRootIndex rootsIndex = myContext.getProjectDescriptor().getBuildRootIndex(); - for (Pair pair : paths) { + public void filesGenerated(FileGeneratedEvent event) { + final ProjectDescriptor pd = myContext.getProjectDescriptor(); + final BuildFSState fsState = pd.fsState; + for (Pair pair : event.getPaths()) { final String relativePath = pair.getSecond(); final File file = relativePath.equals(".") ? new File(pair.getFirst()) : new File(pair.getFirst(), relativePath); - for (BuildRootDescriptor descriptor : rootsIndex.findAllParentDescriptors(file, myContext)) { - if (!myCurrentTargets.contains(descriptor.getTarget())) { - // do not mark files belonging to the target being currently compiled + for (BuildRootDescriptor desc : pd.getBuildRootIndex().findAllParentDescriptors(file, myContext)) { + if (!event.getSourceTarget().equals(desc.getTarget())) { + // do not mark files belonging to the target that originated the event // It is assumed that those files will be explicitly marked dirty by particular builder, if needed. try { - fsState.markDirty(myContext, file, descriptor, myContext.getProjectDescriptor().timestamps.getStorage(), false); + fsState.markDirty(myContext, file, desc, pd.timestamps.getStorage(), false); } catch (IOException ignored) { } @@ -74,14 +61,13 @@ class ChainedTargetsBuildListener implements BuildListener { } @Override - public void filesDeleted(Collection paths) { - BuildFSState state = myContext.getProjectDescriptor().fsState; - BuildRootIndex rootsIndex = myContext.getProjectDescriptor().getBuildRootIndex(); - for (String path : paths) { - File file = new File(FileUtil.toSystemDependentName(path)); - Collection descriptors = rootsIndex.findAllParentDescriptors(file, myContext); - for (BuildRootDescriptor descriptor : descriptors) { - state.registerDeleted(myContext, descriptor.getTarget(), file); + public void filesDeleted(FileDeletedEvent event) { + final BuildFSState state = myContext.getProjectDescriptor().fsState; + final BuildRootIndex rootsIndex = myContext.getProjectDescriptor().getBuildRootIndex(); + for (String path : event.getFilePaths()) { + final File file = new File(FileUtil.toSystemDependentName(path)); + for (BuildRootDescriptor desc : rootsIndex.findAllParentDescriptors(file, myContext)) { + state.registerDeleted(myContext, desc.getTarget(), file); } } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContextImpl.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContextImpl.java index 971529b5c173..325494bb4c7a 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContextImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContextImpl.java @@ -15,7 +15,6 @@ */ package org.jetbrains.jps.incremental; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.util.EventDispatcher; import gnu.trove.TObjectLongHashMap; @@ -27,7 +26,10 @@ import org.jetbrains.jps.builders.java.JavaBuilderUtil; import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.builders.logging.BuildLoggingManager; import org.jetbrains.jps.cmdline.ProjectDescriptor; -import org.jetbrains.jps.incremental.messages.*; +import org.jetbrains.jps.incremental.messages.BuildMessage; +import org.jetbrains.jps.incremental.messages.FileDeletedEvent; +import org.jetbrains.jps.incremental.messages.FileGeneratedEvent; +import org.jetbrains.jps.incremental.messages.ProgressMessage; import java.util.*; @@ -158,23 +160,10 @@ public class CompileContextImpl extends UserDataHolderBase implements CompileCon } myDelegateMessageHandler.processMessage(msg); if (msg instanceof FileGeneratedEvent) { - final Collection> paths = ((FileGeneratedEvent)msg).getPaths(); - if (!paths.isEmpty()) { - myListeners.getMulticaster().filesGenerated(paths); - } + myListeners.getMulticaster().filesGenerated((FileGeneratedEvent)msg); } else if (msg instanceof FileDeletedEvent) { - Collection paths = ((FileDeletedEvent)msg).getFilePaths(); - myListeners.getMulticaster().filesDeleted(paths); - } - else if (msg instanceof BuildingTargetProgressMessage) { - final BuildingTargetProgressMessage _msg = (BuildingTargetProgressMessage)msg; - if (_msg.getEventType() == BuildingTargetProgressMessage.Event.STARTED) { - myListeners.getMulticaster().targetsBuildStarted(_msg.getTargets()); - } - else if (_msg.getEventType() == BuildingTargetProgressMessage.Event.FINISHED) { - myListeners.getMulticaster().targetsBuildFinished(_msg.getTargets()); - } + myListeners.getMulticaster().filesDeleted((FileDeletedEvent)msg); } } 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 941e1a4f1184..75da092c5a7e 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -352,9 +352,9 @@ public class IncProjectBuilder { //Deletes class loader classpath index files for changed output roots context.addBuildListener(new BuildListener() { @Override - public void filesGenerated(Collection> paths) { + public void filesGenerated(FileGeneratedEvent event) { final Set outputs = new THashSet(FileUtil.FILE_HASHING_STRATEGY); - for (Pair pair : paths) { + for (Pair pair : event.getPaths()) { outputs.add(new File(pair.getFirst())); } for (File root : outputs) { @@ -364,15 +364,7 @@ public class IncProjectBuilder { } @Override - public void filesDeleted(Collection paths) { - } - - @Override - public void targetsBuildStarted(Collection> targets) { - } - - @Override - public void targetsBuildFinished(Collection> targets) { + public void filesDeleted(FileDeletedEvent event) { } }); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/FileDeletedEvent.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/FileDeletedEvent.java index fbae82e05ea5..13b7f326dca9 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/FileDeletedEvent.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/FileDeletedEvent.java @@ -16,6 +16,7 @@ package org.jetbrains.jps.incremental.messages; import java.util.Collection; +import java.util.Collections; /** * @author nik @@ -25,7 +26,7 @@ public class FileDeletedEvent extends BuildMessage { public FileDeletedEvent(Collection filePaths) { super("", Kind.INFO); - myFilePaths = filePaths; + myFilePaths = Collections.unmodifiableCollection(filePaths); } public Collection getFilePaths() { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/FileGeneratedEvent.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/FileGeneratedEvent.java index 51821d8b8102..f071b8f6967c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/FileGeneratedEvent.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/FileGeneratedEvent.java @@ -18,9 +18,12 @@ package org.jetbrains.jps.incremental.messages; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.builders.BuildTarget; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; /** * @author Eugene Zhuravlev @@ -30,9 +33,16 @@ public class FileGeneratedEvent extends BuildMessage { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.messages.FileGeneratedEvent"); private final Collection> myPaths = new ArrayList>(); + private final BuildTarget mySourceTarget; - public FileGeneratedEvent() { + public FileGeneratedEvent(@NotNull BuildTarget sourceTarget) { super("", Kind.INFO); + mySourceTarget = sourceTarget; + } + + @NotNull + public BuildTarget getSourceTarget() { + return mySourceTarget; } public void add(String root, String relativePath) { @@ -44,7 +54,8 @@ public class FileGeneratedEvent extends BuildMessage { } } + @NotNull public Collection> getPaths() { - return myPaths; + return Collections.unmodifiableCollection(myPaths); } }