reworked (CR follow-up) IDEA-165741 JPS: ChainedTargetsBuildListener should not mark dirty files for the target being currently compiled

This commit is contained in:
Eugene Zhuravlev
2016-12-21 19:35:07 +01:00
parent f7ed4af970
commit a0199696d5
7 changed files with 48 additions and 74 deletions
@@ -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);
}
@@ -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<? extends BuildTarget<?>> targets);
void targetsBuildFinished(Collection<? extends BuildTarget<?>> 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<Pair<String, String>> paths);
void filesGenerated(FileGeneratedEvent event);
void filesDeleted(Collection<String> paths);
void filesDeleted(FileDeletedEvent event);
}
@@ -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<BuildTarget<?>> myCurrentTargets = Collections.synchronizedSet(new HashSet<BuildTarget<?>>());
public ChainedTargetsBuildListener(CompileContextImpl context) {
myContext = context;
}
@Override
public void targetsBuildStarted(Collection<? extends BuildTarget<?>> targets) {
myCurrentTargets.addAll(targets);
}
@Override
public void targetsBuildFinished(Collection<? extends BuildTarget<?>> targets) {
myCurrentTargets.removeAll(targets);
}
@Override
public void filesGenerated(Collection<Pair<String, String>> paths) {
final BuildFSState fsState = myContext.getProjectDescriptor().fsState;
final BuildRootIndex rootsIndex = myContext.getProjectDescriptor().getBuildRootIndex();
for (Pair<String, String> pair : paths) {
public void filesGenerated(FileGeneratedEvent event) {
final ProjectDescriptor pd = myContext.getProjectDescriptor();
final BuildFSState fsState = pd.fsState;
for (Pair<String, String> 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<String> paths) {
BuildFSState state = myContext.getProjectDescriptor().fsState;
BuildRootIndex rootsIndex = myContext.getProjectDescriptor().getBuildRootIndex();
for (String path : paths) {
File file = new File(FileUtil.toSystemDependentName(path));
Collection<BuildRootDescriptor> 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);
}
}
}
@@ -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<Pair<String, String>> paths = ((FileGeneratedEvent)msg).getPaths();
if (!paths.isEmpty()) {
myListeners.getMulticaster().filesGenerated(paths);
}
myListeners.getMulticaster().filesGenerated((FileGeneratedEvent)msg);
}
else if (msg instanceof FileDeletedEvent) {
Collection<String> 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);
}
}
@@ -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<Pair<String, String>> paths) {
public void filesGenerated(FileGeneratedEvent event) {
final Set<File> outputs = new THashSet<File>(FileUtil.FILE_HASHING_STRATEGY);
for (Pair<String, String> pair : paths) {
for (Pair<String, String> 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<String> paths) {
}
@Override
public void targetsBuildStarted(Collection<? extends BuildTarget<?>> targets) {
}
@Override
public void targetsBuildFinished(Collection<? extends BuildTarget<?>> targets) {
public void filesDeleted(FileDeletedEvent event) {
}
});
@@ -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<String> filePaths) {
super("", Kind.INFO);
myFilePaths = filePaths;
myFilePaths = Collections.unmodifiableCollection(filePaths);
}
public Collection<String> getFilePaths() {
@@ -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<Pair<String, String>> myPaths = new ArrayList<Pair<String, String>>();
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<Pair<String, String>> getPaths() {
return myPaths;
return Collections.unmodifiableCollection(myPaths);
}
}