Handle cycles underneath top-level aspects.
PiperOrigin-RevId: 303862369
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java
index 9efc6b8..a348adb 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java
@@ -14,29 +14,28 @@
package com.google.devtools.build.lib.skyframe;
-import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
-import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.ActionLookupData;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.pkgcache.PackageProvider;
-import com.google.devtools.build.lib.skyframe.TargetCompletionValue.TargetCompletionKey;
+import com.google.devtools.build.lib.skyframe.CompletionFunction.TopLevelActionLookupKey;
import com.google.devtools.build.lib.skyframe.TestCompletionValue.TestCompletionKey;
import com.google.devtools.build.skyframe.CycleInfo;
import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.devtools.build.skyframe.SkyKey;
+import java.util.function.Predicate;
/**
* Reports cycles between Actions and Artifacts. These indicates cycles within a rule.
*/
public class ActionArtifactCycleReporter extends AbstractLabelCycleReporter {
- @SuppressWarnings("unchecked")
private static final Predicate<SkyKey> IS_ARTIFACT_OR_ACTION_SKY_KEY =
Predicates.or(
SkyFunctions.isSkyFunction(Artifact.ARTIFACT),
SkyFunctions.isSkyFunction(SkyFunctions.ACTION_EXECUTION),
SkyFunctions.isSkyFunction(SkyFunctions.TARGET_COMPLETION),
+ SkyFunctions.isSkyFunction(SkyFunctions.ASPECT_COMPLETION),
SkyFunctions.isSkyFunction(SkyFunctions.TEST_COMPLETION));
ActionArtifactCycleReporter(PackageProvider packageProvider) {
@@ -57,15 +56,19 @@
return prettyPrintArtifact(((Artifact) arg));
} else if (arg instanceof ActionLookupData) {
return "action from: " + arg;
- } else if (arg instanceof TargetCompletionKey
- && skyFunctionName.equals(SkyFunctions.TARGET_COMPLETION)) {
- return "configured target: " + ((TargetCompletionKey) arg).actionLookupKey().getLabel();
+ } else if (arg instanceof TopLevelActionLookupKey) {
+ TopLevelActionLookupKey key = (TopLevelActionLookupKey) arg;
+ if (skyFunctionName.equals(SkyFunctions.TARGET_COMPLETION)) {
+ return "configured target: " + key.actionLookupKey().getLabel();
+ }
+ return "top-level aspect: "
+ + ((AspectCompletionValue.AspectCompletionKey) key).actionLookupKey().prettyPrint();
} else if (arg instanceof TestCompletionKey
&& skyFunctionName.equals(SkyFunctions.TEST_COMPLETION)) {
return "test target: " + ((TestCompletionKey) arg).configuredTargetKey().getLabel();
}
throw new IllegalStateException(
- "Argument is not Action, TargetCompletion or TestCompletion: " + arg);
+ "Argument is not Action, TargetCompletion, AspectCompletion, or TestCompletion: " + arg);
}
@Override
@@ -75,20 +78,19 @@
return ((Artifact) arg).getOwner();
} else if (arg instanceof ActionLookupData) {
return ((ActionLookupData) arg).getLabel();
- } else if (arg instanceof TargetCompletionKey
- && key.functionName().equals(SkyFunctions.TARGET_COMPLETION)) {
- return ((TargetCompletionKey) arg).actionLookupKey().getLabel();
+ } else if (arg instanceof TopLevelActionLookupKey) {
+ return ((TopLevelActionLookupKey) arg).actionLookupKey().getLabel();
} else if (arg instanceof TestCompletionKey
&& key.functionName().equals(SkyFunctions.TEST_COMPLETION)) {
return ((TestCompletionKey) arg).configuredTargetKey().getLabel();
}
throw new IllegalStateException(
- "Argument is not Action, TargetCompletion or TestCompletion: " + arg);
+ "Argument is not Action, TargetCompletion, AspectCompletion, or TestCompletion: " + arg);
}
@Override
protected boolean canReportCycle(SkyKey topLevelKey, CycleInfo cycleInfo) {
- return IS_ARTIFACT_OR_ACTION_SKY_KEY.apply(topLevelKey)
- && Iterables.all(cycleInfo.getCycle(), IS_ARTIFACT_OR_ACTION_SKY_KEY);
+ return IS_ARTIFACT_OR_ACTION_SKY_KEY.test(topLevelKey)
+ && cycleInfo.getCycle().stream().allMatch(IS_ARTIFACT_OR_ACTION_SKY_KEY);
}
}