aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java33
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java8
2 files changed, 38 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java
index e4ef9ef5c4..07903d9a64 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java
@@ -17,10 +17,12 @@ import com.google.common.base.Preconditions;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
+import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.ResolvedTargets;
import com.google.devtools.build.lib.cmdline.TargetParsingException;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.pkgcache.FilteringPolicies;
import com.google.devtools.build.lib.pkgcache.LoadingPhaseRunner;
import com.google.devtools.build.lib.pkgcache.LoadingPhaseRunner.Options;
@@ -35,6 +37,7 @@ import com.google.devtools.build.skyframe.ValueOrException;
import java.util.ArrayList;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -64,6 +67,18 @@ final class TargetPatternPhaseFunction implements SkyFunction {
testTargets = determineTests(env, options.getTargetPatterns(), options.getTestFilter());
Preconditions.checkState(env.valuesMissing() || (testTargets != null));
}
+
+ Map<Label, SkyKey> testExpansionKeys = new LinkedHashMap<>();
+ if (targets != null) {
+ for (Target target : targets.getTargets()) {
+ if (TargetUtils.isTestSuiteRule(target)) {
+ Label label = target.getLabel();
+ SkyKey testExpansionKey = TestSuiteExpansionValue.key(ImmutableSet.of(label));
+ testExpansionKeys.put(label, testExpansionKey);
+ }
+ }
+ }
+ Map<SkyKey, SkyValue> expandedTests = env.getValues(testExpansionKeys.values());
if (env.valuesMissing()) {
return null;
}
@@ -127,8 +142,22 @@ final class TargetPatternPhaseFunction implements SkyFunction {
LoadingPhaseRunner.maybeReportDeprecation(env.getListener(), targets.getTargets());
- return new TargetPatternPhaseValue(targets.getTargets(), testsToRun, targets.hasError(),
- filteredTargets, testFilteredTargets);
+ boolean preExpansionError = targets.hasError();
+ ResolvedTargets.Builder<Target> expandedTargetsBuilder = ResolvedTargets.builder();
+ for (Target target : targets.getTargets()) {
+ if (TargetUtils.isTestSuiteRule(target)) {
+ SkyKey expansionKey =
+ Preconditions.checkNotNull(testExpansionKeys.get(target.getLabel()));
+ TestSuiteExpansionValue testExpansion =
+ (TestSuiteExpansionValue) expandedTests.get(expansionKey);
+ expandedTargetsBuilder.merge(testExpansion.getTargets());
+ } else {
+ expandedTargetsBuilder.add(target);
+ }
+ }
+ targets = expandedTargetsBuilder.build();
+ return new TargetPatternPhaseValue(targets.getTargets(), testsToRun, preExpansionError,
+ targets.hasError(), filteredTargets, testFilteredTargets);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java
index d2982c0e94..6b3d5ae70d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java
@@ -43,16 +43,18 @@ public final class TargetPatternPhaseValue implements SkyValue {
private final ImmutableSet<Target> targets;
@Nullable private final ImmutableSet<Target> testsToRun;
private final boolean hasError;
+ private final boolean hasPostExpansionError;
private final ImmutableSet<Target> filteredTargets;
private final ImmutableSet<Target> testFilteredTargets;
TargetPatternPhaseValue(ImmutableSet<Target> targets, @Nullable ImmutableSet<Target> testsToRun,
- boolean hasError, ImmutableSet<Target> filteredTargets,
+ boolean hasError, boolean hasPostExpansionError, ImmutableSet<Target> filteredTargets,
ImmutableSet<Target> testFilteredTargets) {
this.targets = Preconditions.checkNotNull(targets);
this.testsToRun = testsToRun;
this.hasError = hasError;
+ this.hasPostExpansionError = hasPostExpansionError;
this.filteredTargets = Preconditions.checkNotNull(filteredTargets);
this.testFilteredTargets = Preconditions.checkNotNull(testFilteredTargets);
}
@@ -70,6 +72,10 @@ public final class TargetPatternPhaseValue implements SkyValue {
return hasError;
}
+ public boolean hasPostExpansionError() {
+ return hasPostExpansionError;
+ }
+
public ImmutableSet<Target> getFilteredTargets() {
return filteredTargets;
}