mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
reworked (CR follow-up) IDEA-165741 JPS: ChainedTargetsBuildListener should not mark dirty files for the target being currently compiled
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
+18
-32
@@ -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() {
|
||||
|
||||
+13
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user