Split ConfigurationTransitionDependency into a new class
and break relation to the existing Dependency.
Part of work on toolchain transitions, #10523.
Closes #11398.
PiperOrigin-RevId: 312256302
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
index 30020f7..78d7c6a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
@@ -200,20 +200,17 @@
}
// We'll get the configs from ConfigurationsCollector#getConfigurations, which gets
- // configurations
- // for deps including transitions. So to satisfy its API we resolve transitions and repackage
- // each target as a Dependency (with a NONE transition if necessary).
- Multimap<BuildConfiguration, Dependency> asDeps = targetsToDeps(nodes, ruleClassProvider);
+ // configurations for deps including transitions.
+ Multimap<BuildConfiguration, DependencyKey> asDeps = targetsToDeps(nodes, ruleClassProvider);
return ConfigurationResolver.getConfigurationsFromExecutor(
nodes, asDeps, eventHandler, configurationsCollector);
}
@VisibleForTesting
- public static Multimap<BuildConfiguration, Dependency> targetsToDeps(
+ public static Multimap<BuildConfiguration, DependencyKey> targetsToDeps(
Collection<TargetAndConfiguration> nodes, ConfiguredRuleClassProvider ruleClassProvider) {
- Multimap<BuildConfiguration, Dependency> asDeps =
- ArrayListMultimap.<BuildConfiguration, Dependency>create();
+ Multimap<BuildConfiguration, DependencyKey> asDeps = ArrayListMultimap.create();
for (TargetAndConfiguration targetAndConfig : nodes) {
ConfigurationTransition transition =
TransitionResolver.evaluateTransition(
@@ -222,13 +219,13 @@
targetAndConfig.getTarget(),
ruleClassProvider.getTrimmingTransitionFactory());
if (targetAndConfig.getConfiguration() != null) {
+ // TODO(bazel-team): support top-level aspects
asDeps.put(
targetAndConfig.getConfiguration(),
- Dependency.withTransitionAndAspects(
- targetAndConfig.getLabel(),
- transition,
- // TODO(bazel-team): support top-level aspects
- AspectCollection.EMPTY));
+ DependencyKey.builder()
+ .setLabel(targetAndConfig.getLabel())
+ .setTransition(transition)
+ .build());
}
}
return asDeps;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
index ee6b7de..d22f09e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -320,6 +320,7 @@
":constraints/supported_environments",
":constraints/supported_environments_provider",
":dependency",
+ ":dependency_key",
":dependency_kind",
":duplicate_exception",
":extra/extra_action_info_file_write_action",
@@ -662,7 +663,7 @@
":config/build_configuration",
":config/build_options",
":config/invalid_configuration_exception",
- ":dependency",
+ ":dependency_key",
"//src/main/java/com/google/devtools/build/lib/events",
"//third_party:guava",
],
@@ -709,6 +710,17 @@
)
java_library(
+ name = "dependency_key",
+ srcs = ["DependencyKey.java"],
+ deps = [
+ ":aspect_collection",
+ ":config/transitions/configuration_transition",
+ "//src/main/java/com/google/devtools/build/lib/cmdline",
+ "//third_party:auto_value",
+ ],
+)
+
+java_library(
name = "dependency_kind",
srcs = ["DependencyKind.java"],
deps = [
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsCollector.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsCollector.java
index 3c66c76..8c7a778 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsCollector.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsCollector.java
@@ -28,6 +28,6 @@
* <p>Skips targets with loading phase errors.
*/
ConfigurationsResult getConfigurations(
- ExtendedEventHandler eventHandler, BuildOptions fromOptions, Iterable<Dependency> keys)
+ ExtendedEventHandler eventHandler, BuildOptions fromOptions, Iterable<DependencyKey> keys)
throws InvalidConfigurationException;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsResult.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsResult.java
index f1b4770..2916733 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsResult.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsResult.java
@@ -24,11 +24,11 @@
* registers if an error was recorded.
*/
public class ConfigurationsResult {
- private final Multimap<Dependency, BuildConfiguration> configurations;
+ private final Multimap<DependencyKey, BuildConfiguration> configurations;
private final boolean hasError;
private ConfigurationsResult(
- Multimap<Dependency, BuildConfiguration> configurations, boolean hasError) {
+ Multimap<DependencyKey, BuildConfiguration> configurations, boolean hasError) {
this.configurations = configurations;
this.hasError = hasError;
}
@@ -37,7 +37,7 @@
return hasError;
}
- public Multimap<Dependency, BuildConfiguration> getConfigurationMap() {
+ public Multimap<DependencyKey, BuildConfiguration> getConfigurationMap() {
return configurations;
}
@@ -47,11 +47,11 @@
/** Builder for {@link ConfigurationsResult} */
public static class Builder {
- private final Multimap<Dependency, BuildConfiguration> configurations =
- ArrayListMultimap.<Dependency, BuildConfiguration>create();
+ private final Multimap<DependencyKey, BuildConfiguration> configurations =
+ ArrayListMultimap.create();
private boolean hasError = false;
- public void put(Dependency key, BuildConfiguration value) {
+ public void put(DependencyKey key, BuildConfiguration value) {
configurations.put(key, value);
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java b/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java
index 0b7e227..c34be2a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java
@@ -27,17 +27,10 @@
/**
* A dependency of a configured target through a label.
*
- * <p>The dep's configuration can be specified in one of two ways:
- *
- * <p>Explicit configurations: includes the target and the configuration of the dependency
- * configured target and any aspects that may be required, as well as the configurations for these
- * aspects and transition keys. {@link Dependency#getTransitionKeys} provides some more context on
- * transition keys.
- *
- * <p>Configuration transitions: includes the target and the desired configuration transitions that
- * should be applied to produce the dependency's configuration. It's the caller's responsibility to
- * construct an actual configuration out of that. A set of aspects is also included; the caller must
- * also construct configurations for each of these.
+ * <p>All instances have an explicit configuration, which includes the target and the configuration
+ * of the dependency configured target and any aspects that may be required, as well as the
+ * configurations for these aspects and transition keys. {@link Dependency#getTransitionKeys}
+ * provides some more context on transition keys.
*
* <p>Note that the presence of an aspect here does not necessarily mean that it will be created.
* They will be filtered based on the {@link TransitiveInfoProvider} instances their associated
@@ -144,14 +137,6 @@
ImmutableList.of());
}
- /**
- * Creates a new {@link Dependency} with the given transition and aspects.
- */
- public static Dependency withTransitionAndAspects(
- Label label, ConfigurationTransition transition, AspectCollection aspects) {
- return new ConfigurationTransitionDependency(label, transition, aspects);
- }
-
protected final Label label;
/**
@@ -168,27 +153,12 @@
}
/**
- * Returns true if this dependency specifies an explicit configuration, false if it specifies
- * a configuration transition.
- */
- public abstract boolean hasExplicitConfiguration();
-
- /**
* Returns the explicit configuration intended for this dependency.
- *
- * @throws IllegalStateException if {@link #hasExplicitConfiguration} returns false.
*/
@Nullable
public abstract BuildConfiguration getConfiguration();
/**
- * Returns the configuration transition to apply to reach the target this dependency points to.
- *
- * @throws IllegalStateException if {@link #hasExplicitConfiguration} returns true.
- */
- public abstract ConfigurationTransition getTransition();
-
- /**
* Returns the set of aspects which should be evaluated and combined with the configured target
* pointed to by this dependency.
*
@@ -198,8 +168,6 @@
/**
* Returns the configuration an aspect should be evaluated with
- **
- * @throws IllegalStateException if {@link #hasExplicitConfiguration()} returns false.
*/
public abstract BuildConfiguration getAspectConfiguration(AspectDescriptor aspect);
@@ -211,8 +179,6 @@
* multiple entries if the dependency has a null configuration, yet the outgoing edge has a split
* transition. In such cases all transition keys returned by the transition are tagged to the
* dependency.
- *
- * @throws IllegalStateException if {@link #hasExplicitConfiguration()} returns false.
*/
public abstract ImmutableList<String> getTransitionKeys();
@@ -228,11 +194,6 @@
this.transitionKeys = Preconditions.checkNotNull(transitionKeys);
}
- @Override
- public boolean hasExplicitConfiguration() {
- return true;
- }
-
@Nullable
@Override
public BuildConfiguration getConfiguration() {
@@ -240,12 +201,6 @@
}
@Override
- public ConfigurationTransition getTransition() {
- throw new IllegalStateException(
- "This dependency has an explicit configuration, not a transition.");
- }
-
- @Override
public AspectCollection getAspects() {
return AspectCollection.EMPTY;
}
@@ -303,22 +258,11 @@
}
@Override
- public boolean hasExplicitConfiguration() {
- return true;
- }
-
- @Override
public BuildConfiguration getConfiguration() {
return configuration;
}
@Override
- public ConfigurationTransition getTransition() {
- throw new IllegalStateException(
- "This dependency has an explicit configuration, not a transition.");
- }
-
- @Override
public AspectCollection getAspects() {
return aspects;
}
@@ -358,74 +302,4 @@
}
}
- /**
- * Implementation of a dependency with a given configuration transition.
- */
- private static final class ConfigurationTransitionDependency extends Dependency {
- private final ConfigurationTransition transition;
- private final AspectCollection aspects;
-
- public ConfigurationTransitionDependency(
- Label label, ConfigurationTransition transition, AspectCollection aspects) {
- super(label);
- this.transition = Preconditions.checkNotNull(transition);
- this.aspects = Preconditions.checkNotNull(aspects);
- }
-
- @Override
- public boolean hasExplicitConfiguration() {
- return false;
- }
-
- @Override
- public BuildConfiguration getConfiguration() {
- throw new IllegalStateException(
- "This dependency has a transition, not an explicit configuration.");
- }
-
- @Override
- public ConfigurationTransition getTransition() {
- return transition;
- }
-
- @Override
- public AspectCollection getAspects() {
- return aspects;
- }
-
- @Override
- public BuildConfiguration getAspectConfiguration(AspectDescriptor aspect) {
- throw new IllegalStateException(
- "This dependency has a transition, not an explicit aspect configuration.");
- }
-
- @Override
- public ImmutableList<String> getTransitionKeys() {
- throw new IllegalStateException(
- "This dependency has a transition, not an explicit configuration.");
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(label, transition, aspects);
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof ConfigurationTransitionDependency)) {
- return false;
- }
- ConfigurationTransitionDependency otherDep = (ConfigurationTransitionDependency) other;
- return label.equals(otherDep.label)
- && transition.equals(otherDep.transition)
- && aspects.equals(otherDep.aspects);
- }
-
- @Override
- public String toString() {
- return String.format(
- "%s{label=%s, transition=%s, aspects=%s}",
- getClass().getSimpleName(), label, transition, aspects);
- }
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyKey.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyKey.java
new file mode 100644
index 0000000..f7ba381
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyKey.java
@@ -0,0 +1,56 @@
+// Copyright 2020 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.analysis;
+
+import com.google.auto.value.AutoValue;
+import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
+import com.google.devtools.build.lib.cmdline.Label;
+
+/**
+ * Information about a dependency, including the label and configuration transition. This will be
+ * used to create the actual {@link Dependency}.
+ */
+@AutoValue
+public abstract class DependencyKey {
+
+ /** Builder to help construct instances of {@link DependencyKey}. */
+ @AutoValue.Builder
+ public interface Builder {
+ /** Sets the label of the target this dependency points to. */
+ Builder setLabel(Label label);
+
+ /** Sets the transition to use when evaluating the target this dependency points to. */
+ Builder setTransition(ConfigurationTransition transition);
+
+ /** Sets the aspects that are propagating to the target this dependency points to. */
+ Builder setAspects(AspectCollection aspectCollection);
+
+ /** Returns the new instance. */
+ DependencyKey build();
+ }
+
+ /** Returns a new {@link Builder} to construct instances of {@link DependencyKey}. */
+ public static Builder builder() {
+ return new AutoValue_DependencyKey.Builder().setAspects(AspectCollection.EMPTY);
+ }
+
+ /** Returns the label of the target this dependency points to. */
+ public abstract Label getLabel();
+
+ /** Returns the transition to use when evaluating the target this dependency points to. */
+ public abstract ConfigurationTransition getTransition();
+
+ /** Returns the aspects that are propagating to the target this dependency points to. */
+ public abstract AspectCollection getAspects();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
index b8e7736..9711cba 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
@@ -117,7 +117,7 @@
* temporary feature; see the corresponding methods in ConfiguredRuleClassProvider)
* @return a mapping of each attribute in this rule or aspects to its dependent nodes
*/
- public final OrderedSetMultimap<DependencyKind, Dependency> dependentNodeMap(
+ public final OrderedSetMultimap<DependencyKind, DependencyKey> dependentNodeMap(
TargetAndConfiguration node,
BuildConfiguration hostConfig,
@Nullable Aspect aspect,
@@ -126,7 +126,7 @@
@Nullable TransitionFactory<Rule> trimmingTransitionFactory)
throws EvalException, InterruptedException, InconsistentAspectOrderException {
NestedSetBuilder<Cause> rootCauses = NestedSetBuilder.stableOrder();
- OrderedSetMultimap<DependencyKind, Dependency> outgoingEdges =
+ OrderedSetMultimap<DependencyKind, DependencyKey> outgoingEdges =
dependentNodeMap(
node,
hostConfig,
@@ -172,7 +172,7 @@
* @param rootCauses collector for dep labels that can't be (loading phase) loaded
* @return a mapping of each attribute in this rule or aspects to its dependent nodes
*/
- public final OrderedSetMultimap<DependencyKind, Dependency> dependentNodeMap(
+ public final OrderedSetMultimap<DependencyKind, DependencyKey> dependentNodeMap(
TargetAndConfiguration node,
BuildConfiguration hostConfig,
Iterable<Aspect> aspects,
@@ -219,7 +219,7 @@
partiallyResolveDependencies(
outgoingLabels, fromRule, attributeMap, toolchainContexts, aspects);
- OrderedSetMultimap<DependencyKind, Dependency> outgoingEdges =
+ OrderedSetMultimap<DependencyKind, DependencyKey> outgoingEdges =
fullyResolveDependencies(
partiallyResolvedDeps, targetMap, node.getConfiguration(), trimmingTransitionFactory);
@@ -331,13 +331,13 @@
* being calculated as an argument or its attributes and it should <b>NOT</b> do anything with the
* keys of {@code partiallyResolvedDeps} other than passing them on to the output map.
*/
- private OrderedSetMultimap<DependencyKind, Dependency> fullyResolveDependencies(
+ private OrderedSetMultimap<DependencyKind, DependencyKey> fullyResolveDependencies(
OrderedSetMultimap<DependencyKind, PartiallyResolvedDependency> partiallyResolvedDeps,
Map<Label, Target> targetMap,
BuildConfiguration originalConfiguration,
@Nullable TransitionFactory<Rule> trimmingTransitionFactory)
throws InconsistentAspectOrderException {
- OrderedSetMultimap<DependencyKind, Dependency> outgoingEdges = OrderedSetMultimap.create();
+ OrderedSetMultimap<DependencyKind, DependencyKey> outgoingEdges = OrderedSetMultimap.create();
for (Map.Entry<DependencyKind, PartiallyResolvedDependency> entry :
partiallyResolvedDeps.entries()) {
@@ -359,7 +359,11 @@
outgoingEdges.put(
entry.getKey(),
- Dependency.withTransitionAndAspects(dep.getLabel(), transition, requiredAspects));
+ DependencyKey.builder()
+ .setLabel(dep.getLabel())
+ .setTransition(transition)
+ .setAspects(requiredAspects)
+ .build());
}
return outgoingEdges;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
index 26b923c..2862d54 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
@@ -16,7 +16,6 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
-import com.google.common.base.Preconditions;
import com.google.common.base.Verify;
import com.google.common.base.VerifyException;
import com.google.common.collect.ImmutableList;
@@ -29,6 +28,7 @@
import com.google.devtools.build.lib.analysis.ConfigurationsCollector;
import com.google.devtools.build.lib.analysis.ConfigurationsResult;
import com.google.devtools.build.lib.analysis.Dependency;
+import com.google.devtools.build.lib.analysis.DependencyKey;
import com.google.devtools.build.lib.analysis.DependencyKind;
import com.google.devtools.build.lib.analysis.PlatformOptions;
import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
@@ -106,7 +106,7 @@
*
* @param env Skyframe evaluation environment
* @param ctgValue the label and configuration of the source target
- * @param originalDeps the transition requests for each dep and each dependency kind
+ * @param dependencyKeys the transition requests for each dep and each dependency kind
* @param hostConfiguration the host configuration
* @param defaultBuildOptions default build options to diff options against for optimization
* @param configConditions {@link ConfigMatchingProvider} map for the rule
@@ -118,7 +118,7 @@
public static OrderedSetMultimap<DependencyKind, Dependency> resolveConfigurations(
SkyFunction.Environment env,
TargetAndConfiguration ctgValue,
- OrderedSetMultimap<DependencyKind, Dependency> originalDeps,
+ OrderedSetMultimap<DependencyKind, DependencyKey> dependencyKeys,
BuildConfiguration hostConfiguration,
BuildOptions defaultBuildOptions,
ImmutableMap<Label, ConfigMatchingProvider> configConditions)
@@ -128,7 +128,7 @@
// configuration paired with a transition key corresponding to the BuildConfiguration. For cases
// where Skyframe isn't needed to get the configuration (e.g. when we just re-used the original
// rule's configuration), we should skip this outright.
- Multimap<SkyKey, Pair<Map.Entry<DependencyKind, Dependency>, String>> keysToEntries =
+ Multimap<SkyKey, Pair<Map.Entry<DependencyKind, DependencyKey>, String>> keysToEntries =
LinkedListMultimap.create();
// Stores the result of applying a transition to the current configuration using a
@@ -142,13 +142,13 @@
BuildConfiguration currentConfiguration = ctgValue.getConfiguration();
// Stores the configuration-resolved versions of each dependency. This method must preserve the
- // original label ordering of each attribute. For example, if originalDeps.get("data") is
+ // original label ordering of each attribute. For example, if dependencyKeys.get("data") is
// [":a", ":b"], the resolved variant must also be [":a", ":b"] in the same order. Because we
// may not actualize the results in order (some results need Skyframe-evaluated configurations
// while others can be computed trivially), we dump them all into this map, then as a final step
// iterate through the original list and pluck out values from here for the final value.
//
- // For split transitions, originaldeps.get("data") = [":a", ":b"] can produce the output
+ // For split transitions, dependencyKeys.get("data") = [":a", ":b"] can produce the output
// [":a"<config1>, ":a"<config2>, ..., ":b"<config1>, ":b"<config2>, ...]. All instances of ":a"
// still appear before all instances of ":b". But the [":a"<config1>, ":a"<config2>"] subset may
// be in any (deterministic) order. In particular, this may not be the same order as
@@ -159,19 +159,17 @@
// This map is used heavily by all builds. Inserts and gets should be as fast as possible.
Multimap<DependencyEdge, Dependency> resolvedDeps = LinkedHashMultimap.create();
- // Performance optimization: This method iterates over originalDeps twice. By storing
+ // Performance optimization: This method iterates over dependencyKeys twice. By storing
// DependencyEdge instances in this list, we avoid having to recreate them the second time
// (particularly avoid recomputing their hash codes). Profiling shows this shaves 25% off this
// method's execution time (at the time of this comment).
- ArrayList<DependencyEdge> attributesAndLabels = new ArrayList<>(originalDeps.size());
+ ArrayList<DependencyEdge> attributesAndLabels = new ArrayList<>(dependencyKeys.size());
- for (Map.Entry<DependencyKind, Dependency> depsEntry : originalDeps.entries()) {
- Dependency dep = depsEntry.getValue();
+ for (Map.Entry<DependencyKind, DependencyKey> depsEntry : dependencyKeys.entries()) {
+ DependencyKey dep = depsEntry.getValue();
DependencyKind depKind = depsEntry.getKey();
DependencyEdge dependencyEdge = new DependencyEdge(depKind, dep.getLabel());
attributesAndLabels.add(dependencyEdge);
- // DependencyResolver should never emit a Dependency with an explicit configuration
- Preconditions.checkState(!dep.hasExplicitConfiguration());
// The null configuration can be trivially computed (it's, well, null), so special-case that
// transition here and skip the rest of the logic. A *lot* of targets have null deps, so
@@ -399,8 +397,8 @@
}
BuildConfiguration trimmedConfig =
((BuildConfigurationValue) valueOrException.get()).getConfiguration();
- for (Pair<Map.Entry<DependencyKind, Dependency>, String> info : keysToEntries.get(key)) {
- Dependency originalDep = info.first.getValue();
+ for (Pair<Map.Entry<DependencyKind, DependencyKey>, String> info : keysToEntries.get(key)) {
+ DependencyKey originalDep = info.first.getValue();
if (trimmedConfig.trimConfigurationsRetroactively()
&& !originalDep.getAspects().isEmpty()) {
String message =
@@ -427,7 +425,7 @@
throw new DependencyEvaluationException(e);
}
- return sortResolvedDeps(originalDeps, resolvedDeps, attributesAndLabels);
+ return sortResolvedDeps(dependencyKeys, resolvedDeps, attributesAndLabels);
}
/**
@@ -629,7 +627,7 @@
SkyFunction.Environment env,
TargetAndConfiguration ctgValue,
Attribute attribute,
- Dependency dep,
+ DependencyKey dep,
Set<Class<? extends Fragment>> expectedDepFragments)
throws DependencyEvaluationException {
Set<String> ctgFragmentNames = new HashSet<>();
@@ -670,23 +668,20 @@
/**
* Returns a copy of the output deps using the same key and value ordering as the input deps.
*
- * @param originalDeps the input deps with the ordering to preserve
+ * @param dependencyKeys the input deps with the ordering to preserve
* @param resolvedDeps the unordered output deps
* @param attributesAndLabels collection of <attribute, depLabel> pairs guaranteed to match the
- * ordering of originalDeps.entries(). This is a performance optimization: see {@link
+ * ordering of dependencyKeys.entries(). This is a performance optimization: see {@link
* #resolveConfigurations#attributesAndLabels} for details.
*/
private static OrderedSetMultimap<DependencyKind, Dependency> sortResolvedDeps(
- OrderedSetMultimap<DependencyKind, Dependency> originalDeps,
+ OrderedSetMultimap<DependencyKind, DependencyKey> dependencyKeys,
Multimap<DependencyEdge, Dependency> resolvedDeps,
ArrayList<DependencyEdge> attributesAndLabels) {
Iterator<DependencyEdge> iterator = attributesAndLabels.iterator();
OrderedSetMultimap<DependencyKind, Dependency> result = OrderedSetMultimap.create();
- for (Map.Entry<DependencyKind, Dependency> depsEntry : originalDeps.entries()) {
+ for (Map.Entry<DependencyKind, DependencyKey> depsEntry : dependencyKeys.entries()) {
DependencyEdge edge = iterator.next();
- if (depsEntry.getValue().hasExplicitConfiguration()) {
- result.put(edge.dependencyKind, depsEntry.getValue());
- } else {
Collection<Dependency> resolvedDepWithSplit = resolvedDeps.get(edge);
Verify.verify(!resolvedDepWithSplit.isEmpty());
if (resolvedDepWithSplit.size() > 1) {
@@ -695,7 +690,6 @@
resolvedDepWithSplit = sortedSplitList;
}
result.putAll(depsEntry.getKey(), resolvedDepWithSplit);
- }
}
return result;
}
@@ -743,7 +737,7 @@
// Keep this in sync with {@link PrepareAnalysisPhaseFunction#resolveConfigurations}.
public static TopLevelTargetsAndConfigsResult getConfigurationsFromExecutor(
Iterable<TargetAndConfiguration> defaultContext,
- Multimap<BuildConfiguration, Dependency> targetsToEvaluate,
+ Multimap<BuildConfiguration, DependencyKey> targetsToEvaluate,
ExtendedEventHandler eventHandler,
ConfigurationsCollector configurationsCollector)
throws InvalidConfigurationException {
@@ -764,7 +758,7 @@
configurationsCollector.getConfigurations(
eventHandler, fromConfig.getOptions(), targetsToEvaluate.get(fromConfig));
hasError |= configurationsResult.hasError();
- for (Map.Entry<Dependency, BuildConfiguration> evaluatedTarget :
+ for (Map.Entry<DependencyKey, BuildConfiguration> evaluatedTarget :
configurationsResult.getConfigurationMap().entries()) {
Target target = labelsToTargets.get(evaluatedTarget.getKey().getLabel());
successfullyEvaluatedTargets.put(
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BUILD b/src/main/java/com/google/devtools/build/lib/query2/BUILD
index 8991d0a..287d410 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/query2/BUILD
@@ -36,7 +36,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/null_transition",
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/transition_factory",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
- "//src/main/java/com/google/devtools/build/lib/analysis:dependency",
+ "//src/main/java/com/google/devtools/build/lib/analysis:dependency_key",
"//src/main/java/com/google/devtools/build/lib/analysis:dependency_kind",
"//src/main/java/com/google/devtools/build/lib/analysis:inconsistent_aspect_order_exception",
"//src/main/java/com/google/devtools/build/lib/analysis:required_config_fragments_provider",
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
index 48c98b8..9991a1d 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
@@ -13,11 +13,10 @@
// limitations under the License.
package com.google.devtools.build.lib.query2.cquery;
-import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.Dependency;
+import com.google.devtools.build.lib.analysis.DependencyKey;
import com.google.devtools.build.lib.analysis.DependencyKind;
import com.google.devtools.build.lib.analysis.DependencyResolver;
import com.google.devtools.build.lib.analysis.InconsistentAspectOrderException;
@@ -113,7 +112,7 @@
if (!(configuredTarget instanceof RuleConfiguredTarget)) {
continue;
}
- OrderedSetMultimap<DependencyKind, Dependency> deps;
+ OrderedSetMultimap<DependencyKind, DependencyKey> deps;
ImmutableMap<Label, ConfigMatchingProvider> configConditions =
((RuleConfiguredTarget) configuredTarget).getConfigConditions();
@@ -136,15 +135,12 @@
} catch (EvalException | InconsistentAspectOrderException e) {
throw new InterruptedException(e.getMessage());
}
- for (Map.Entry<DependencyKind, Dependency> attributeAndDep : deps.entries()) {
- // DependencyResolver should only ever return Dependency instances with transitions and not
- // with explicit configurations
- Preconditions.checkState(!attributeAndDep.getValue().hasExplicitConfiguration());
+ for (Map.Entry<DependencyKind, DependencyKey> attributeAndDep : deps.entries()) {
if (attributeAndDep.getValue().getTransition() == NoTransition.INSTANCE
|| attributeAndDep.getValue().getTransition() == NullTransition.INSTANCE) {
continue;
}
- Dependency dep = attributeAndDep.getValue();
+ DependencyKey dep = attributeAndDep.getValue();
BuildOptions fromOptions = config.getOptions();
// TODO(bazel-team): support transitions on Starlark-defined build flags. These require
// Skyframe loading to get flag default values. See ConfigurationResolver.applyTransition
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index 5bcc96b..1d01bb8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -229,7 +229,6 @@
"//src/main/java/com/google/devtools/build/lib/actionsketch:action_sketch",
"//src/main/java/com/google/devtools/build/lib/analysis:actions/parameter_file_write_action",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
- "//src/main/java/com/google/devtools/build/lib/analysis:aspect_collection",
"//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
"//src/main/java/com/google/devtools/build/lib/analysis:buildinfo/build_info_collection",
"//src/main/java/com/google/devtools/build/lib/analysis:buildinfo/build_info_key",
@@ -248,6 +247,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis:configured_object_value",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
"//src/main/java/com/google/devtools/build/lib/analysis:dependency",
+ "//src/main/java/com/google/devtools/build/lib/analysis:dependency_key",
"//src/main/java/com/google/devtools/build/lib/analysis:dependency_kind",
"//src/main/java/com/google/devtools/build/lib/analysis:duplicate_exception",
"//src/main/java/com/google/devtools/build/lib/analysis:inconsistent_aspect_order_exception",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 08c5987..56efefd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -32,6 +32,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.Dependency;
+import com.google.devtools.build.lib.analysis.DependencyKey;
import com.google.devtools.build.lib.analysis.DependencyKind;
import com.google.devtools.build.lib.analysis.DuplicateException;
import com.google.devtools.build.lib.analysis.EmptyConfiguredTarget;
@@ -590,12 +591,12 @@
BuildOptions defaultBuildOptions)
throws DependencyEvaluationException, ConfiguredTargetFunctionException,
AspectCreationException, InterruptedException {
- // Create the map from attributes to set of (target, configuration) pairs.
- OrderedSetMultimap<DependencyKind, Dependency> depValueNames;
+ // Create the map from attributes to set of (target, transition) pairs.
+ OrderedSetMultimap<DependencyKind, DependencyKey> initialDependencies;
BuildConfiguration configuration = ctgValue.getConfiguration();
Label label = ctgValue.getLabel();
try {
- depValueNames =
+ initialDependencies =
resolver.dependentNodeMap(
ctgValue,
hostConfiguration,
@@ -616,11 +617,11 @@
}
// Trim each dep's configuration so it only includes the fragments needed by its transitive
// closure.
- depValueNames =
+ OrderedSetMultimap<DependencyKind, Dependency> depValueNames =
ConfigurationResolver.resolveConfigurations(
env,
ctgValue,
- depValueNames,
+ initialDependencies,
hostConfiguration,
defaultBuildOptions,
configConditions);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseFunction.java
index ce2c580..4ab7bf2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseFunction.java
@@ -21,7 +21,7 @@
import com.google.common.collect.Multimap;
import com.google.devtools.build.lib.analysis.AnalysisUtils;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
-import com.google.devtools.build.lib.analysis.Dependency;
+import com.google.devtools.build.lib.analysis.DependencyKey;
import com.google.devtools.build.lib.analysis.PlatformOptions;
import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -166,7 +166,7 @@
// for now, to satisfy its API we resolve transitions and repackage each target as a Dependency
// (with a NONE transition if necessary).
// Keep this in sync with AnalysisUtils#getTargetsWithConfigs.
- Multimap<BuildConfiguration, Dependency> asDeps =
+ Multimap<BuildConfiguration, DependencyKey> asDeps =
AnalysisUtils.targetsToDeps(nodes, ruleClassProvider);
LinkedHashSet<TargetAndConfiguration> topLevelTargetsWithConfigs;
try {
@@ -211,7 +211,7 @@
private LinkedHashSet<TargetAndConfiguration> resolveConfigurations(
SkyFunction.Environment env,
Iterable<TargetAndConfiguration> nodes,
- Multimap<BuildConfiguration, Dependency> asDeps)
+ Multimap<BuildConfiguration, DependencyKey> asDeps)
throws InterruptedException, TransitionException, OptionsParsingException {
Map<Label, Target> labelsToTargets = new LinkedHashMap<>();
for (TargetAndConfiguration node : nodes) {
@@ -223,13 +223,12 @@
Map<TargetAndConfiguration, TargetAndConfiguration> successfullyEvaluatedTargets =
new LinkedHashMap<>();
for (BuildConfiguration fromConfig : asDeps.keySet()) {
- Multimap<Dependency, BuildConfiguration> trimmedTargets =
- getConfigurations(
- env, fromConfig.getOptions(), asDeps.get(fromConfig));
+ Multimap<DependencyKey, BuildConfiguration> trimmedTargets =
+ getConfigurations(env, fromConfig.getOptions(), asDeps.get(fromConfig));
if (trimmedTargets == null) {
continue;
}
- for (Map.Entry<Dependency, BuildConfiguration> trimmedTarget : trimmedTargets.entries()) {
+ for (Map.Entry<DependencyKey, BuildConfiguration> trimmedTarget : trimmedTargets.entries()) {
Target target = labelsToTargets.get(trimmedTarget.getKey().getLabel());
successfullyEvaluatedTargets.put(
new TargetAndConfiguration(target, fromConfig),
@@ -264,12 +263,11 @@
// Keep in sync with {@link SkyframeExecutor#getConfigurations}.
// Note: this implementation runs inside Skyframe, so it has access to SkyFunction.Environment.
- private Multimap<Dependency, BuildConfiguration> getConfigurations(
- SkyFunction.Environment env, BuildOptions fromOptions, Iterable<Dependency> keys)
+ private Multimap<DependencyKey, BuildConfiguration> getConfigurations(
+ SkyFunction.Environment env, BuildOptions fromOptions, Iterable<DependencyKey> keys)
throws InterruptedException, TransitionException, OptionsParsingException {
- Multimap<Dependency, BuildConfiguration> builder =
- ArrayListMultimap.<Dependency, BuildConfiguration>create();
- Set<Dependency> depsToEvaluate = new HashSet<>();
+ Multimap<DependencyKey, BuildConfiguration> builder = ArrayListMultimap.create();
+ Set<DependencyKey> depsToEvaluate = new HashSet<>();
ImmutableSortedSet<Class<? extends Fragment>> allFragments = null;
if (useUntrimmedConfigs(fromOptions)) {
@@ -280,10 +278,8 @@
final List<SkyKey> transitiveFragmentSkyKeys = new ArrayList<>();
Map<Label, ImmutableSortedSet<Class<? extends Fragment>>> fragmentsMap = new HashMap<>();
Set<Label> labelsWithErrors = new HashSet<>();
- for (Dependency key : keys) {
- if (key.hasExplicitConfiguration()) {
- builder.put(key, key.getConfiguration());
- } else if (useUntrimmedConfigs(fromOptions)) {
+ for (DependencyKey key : keys) {
+ if (useUntrimmedConfigs(fromOptions)) {
fragmentsMap.put(key.getLabel(), allFragments);
} else {
depsToEvaluate.add(key);
@@ -295,7 +291,7 @@
if (env.valuesMissing()) {
return null;
}
- for (Dependency key : keys) {
+ for (DependencyKey key : keys) {
if (!depsToEvaluate.contains(key)) {
// No fragments to compute here.
} else {
@@ -324,8 +320,8 @@
}
final List<SkyKey> configSkyKeys = new ArrayList<>();
- for (Dependency key : keys) {
- if (labelsWithErrors.contains(key.getLabel()) || key.hasExplicitConfiguration()) {
+ for (DependencyKey key : keys) {
+ if (labelsWithErrors.contains(key.getLabel())) {
continue;
}
if (key.getTransition() == NullTransition.INSTANCE) {
@@ -358,8 +354,8 @@
if (env.valuesMissing()) {
return null;
}
- for (Dependency key : keys) {
- if (labelsWithErrors.contains(key.getLabel()) || key.hasExplicitConfiguration()) {
+ for (DependencyKey key : keys) {
+ if (labelsWithErrors.contains(key.getLabel())) {
continue;
}
if (key.getTransition() == NullTransition.INSTANCE) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index b1df35b..20fa6e1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -65,7 +65,6 @@
import com.google.devtools.build.lib.actions.ResourceManager;
import com.google.devtools.build.lib.actions.UserExecException;
import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer;
-import com.google.devtools.build.lib.analysis.AspectCollection;
import com.google.devtools.build.lib.analysis.AspectValue;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfigurationsCollector;
@@ -74,6 +73,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.Dependency;
+import com.google.devtools.build.lib.analysis.DependencyKey;
import com.google.devtools.build.lib.analysis.DuplicateException;
import com.google.devtools.build.lib.analysis.PlatformOptions;
import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
@@ -1697,7 +1697,7 @@
public ImmutableList<ConfiguredTargetAndData> getConfiguredTargetsForTesting(
ExtendedEventHandler eventHandler,
BuildConfiguration originalConfig,
- Iterable<Dependency> keys)
+ Iterable<DependencyKey> keys)
throws TransitionException, InvalidConfigurationException, InterruptedException {
return getConfiguredTargetMapForTesting(eventHandler, originalConfig, keys).values().asList();
}
@@ -1714,7 +1714,7 @@
public ImmutableList<ConfiguredTargetAndData> getConfiguredTargetsForTesting(
ExtendedEventHandler eventHandler,
BuildConfigurationValue.Key originalConfig,
- Iterable<Dependency> keys)
+ Iterable<DependencyKey> keys)
throws InvalidConfigurationException, InterruptedException {
return getConfiguredTargetMapForTesting(eventHandler, originalConfig, keys).values().asList();
}
@@ -1729,10 +1729,10 @@
* returned list.
*/
@ThreadSafety.ThreadSafe
- public ImmutableMultimap<Dependency, ConfiguredTargetAndData> getConfiguredTargetMapForTesting(
+ public ImmutableMultimap<DependencyKey, ConfiguredTargetAndData> getConfiguredTargetMapForTesting(
ExtendedEventHandler eventHandler,
BuildConfigurationValue.Key originalConfig,
- Iterable<Dependency> keys)
+ Iterable<DependencyKey> keys)
throws InvalidConfigurationException, InterruptedException {
return getConfiguredTargetMapForTesting(
eventHandler, getConfiguration(eventHandler, originalConfig), keys);
@@ -1748,26 +1748,27 @@
* returned list except...
*/
@ThreadSafety.ThreadSafe
- private ImmutableMultimap<Dependency, ConfiguredTargetAndData> getConfiguredTargetMapForTesting(
- ExtendedEventHandler eventHandler,
- BuildConfiguration originalConfig,
- Iterable<Dependency> keys)
- throws InvalidConfigurationException, InterruptedException {
+ private ImmutableMultimap<DependencyKey, ConfiguredTargetAndData>
+ getConfiguredTargetMapForTesting(
+ ExtendedEventHandler eventHandler,
+ BuildConfiguration originalConfig,
+ Iterable<DependencyKey> keys)
+ throws InvalidConfigurationException, InterruptedException {
checkActive();
- Multimap<Dependency, BuildConfiguration> configs;
+ Multimap<DependencyKey, BuildConfiguration> configs;
if (originalConfig != null) {
configs =
getConfigurations(eventHandler, originalConfig.getOptions(), keys).getConfigurationMap();
} else {
- configs = ArrayListMultimap.<Dependency, BuildConfiguration>create();
- for (Dependency key : keys) {
+ configs = ArrayListMultimap.create();
+ for (DependencyKey key : keys) {
configs.put(key, null);
}
}
final List<SkyKey> skyKeys = new ArrayList<>();
- for (Dependency key : keys) {
+ for (DependencyKey key : keys) {
if (!configs.containsKey(key)) {
// If we couldn't compute a configuration for this target, the target was in error (e.g.
// it couldn't be loaded). Exclude it from the results.
@@ -1786,17 +1787,17 @@
EvaluationResult<SkyValue> result = evaluateSkyKeys(eventHandler, skyKeys);
- ImmutableMultimap.Builder<Dependency, ConfiguredTargetAndData> cts =
+ ImmutableMultimap.Builder<DependencyKey, ConfiguredTargetAndData> cts =
ImmutableMultimap.builder();
// Logic copied from ConfiguredTargetFunction#computeDependencies.
Set<SkyKey> aliasPackagesToFetch = new HashSet<>();
- List<Dependency> aliasKeysToRedo = new ArrayList<>();
+ List<DependencyKey> aliasKeysToRedo = new ArrayList<>();
EvaluationResult<SkyValue> aliasPackageValues = null;
- Iterable<Dependency> keysToProcess = keys;
+ Iterable<DependencyKey> keysToProcess = keys;
for (int i = 0; i < 2; i++) {
DependentNodeLoop:
- for (Dependency key : keysToProcess) {
+ for (DependencyKey key : keysToProcess) {
if (!configs.containsKey(key)) {
// If we couldn't compute a configuration for this target, the target was in error (e.g.
// it couldn't be loaded). Exclude it from the results.
@@ -1996,8 +1997,8 @@
/**
* Retrieves the configurations needed for the given deps. If {@link
- * CoreOptions#trimConfigurations()} is true, trims their fragments to only those needed by their
- * transitive closures. Else unconditionally includes all fragments.
+ * BuildConfiguration#trimConfigurations()} is true, trims their fragments to only those needed by
+ * their transitive closures. Else unconditionally includes all fragments.
*
* <p>Skips targets with loading phase errors.
*/
@@ -2005,10 +2006,10 @@
// TODO(ulfjack): Remove this legacy method after switching to the Skyframe-based implementation.
@Override
public ConfigurationsResult getConfigurations(
- ExtendedEventHandler eventHandler, BuildOptions fromOptions, Iterable<Dependency> keys)
+ ExtendedEventHandler eventHandler, BuildOptions fromOptions, Iterable<DependencyKey> keys)
throws InvalidConfigurationException {
ConfigurationsResult.Builder builder = ConfigurationsResult.newBuilder();
- Set<Dependency> depsToEvaluate = new HashSet<>();
+ Set<DependencyKey> depsToEvaluate = new HashSet<>();
ImmutableSortedSet<Class<? extends Fragment>> allFragments = null;
if (useUntrimmedConfigs(fromOptions)) {
@@ -2019,10 +2020,8 @@
final List<SkyKey> transitiveFragmentSkyKeys = new ArrayList<>();
Map<Label, ImmutableSortedSet<Class<? extends Fragment>>> fragmentsMap = new HashMap<>();
Set<Label> labelsWithErrors = new HashSet<>();
- for (Dependency key : keys) {
- if (key.hasExplicitConfiguration()) {
- builder.put(key, key.getConfiguration());
- } else if (useUntrimmedConfigs(fromOptions)) {
+ for (DependencyKey key : keys) {
+ if (useUntrimmedConfigs(fromOptions)) {
fragmentsMap.put(key.getLabel(), allFragments);
} else {
depsToEvaluate.add(key);
@@ -2034,7 +2033,7 @@
for (Map.Entry<SkyKey, ErrorInfo> entry : fragmentsResult.errorMap().entrySet()) {
reportCycles(eventHandler, entry.getValue().getCycleInfo(), entry.getKey());
}
- for (Dependency key : keys) {
+ for (DependencyKey key : keys) {
if (!depsToEvaluate.contains(key)) {
// No fragments to compute here.
} else if (fragmentsResult.getError(TransitiveTargetKey.of(key.getLabel())) != null) {
@@ -2055,8 +2054,8 @@
// Now get the configurations.
final List<SkyKey> configSkyKeys = new ArrayList<>();
- for (Dependency key : keys) {
- if (labelsWithErrors.contains(key.getLabel()) || key.hasExplicitConfiguration()) {
+ for (DependencyKey key : keys) {
+ if (labelsWithErrors.contains(key.getLabel())) {
continue;
}
ImmutableSortedSet<Class<? extends Fragment>> depFragments = fragmentsMap.get(key.getLabel());
@@ -2085,8 +2084,8 @@
}
EvaluationResult<SkyValue> configsResult =
evaluateSkyKeys(eventHandler, configSkyKeys, /*keepGoing=*/ true);
- for (Dependency key : keys) {
- if (labelsWithErrors.contains(key.getLabel()) || key.hasExplicitConfiguration()) {
+ for (DependencyKey key : keys) {
+ if (labelsWithErrors.contains(key.getLabel())) {
continue;
}
ImmutableSortedSet<Class<? extends Fragment>> depFragments = fragmentsMap.get(key.getLabel());
@@ -2310,15 +2309,14 @@
BuildConfiguration configuration,
ConfigurationTransition transition)
throws TransitionException, InvalidConfigurationException, InterruptedException {
+
+ ConfigurationTransition transition1 =
+ configuration == null ? NullTransition.INSTANCE : transition;
+ DependencyKey dependencyKey =
+ DependencyKey.builder().setLabel(label).setTransition(transition1).build();
return Iterables.getFirst(
getConfiguredTargetsForTesting(
- eventHandler,
- configuration,
- ImmutableList.of(
- configuration == null
- ? Dependency.withNullConfiguration(label)
- : Dependency.withTransitionAndAspects(
- label, transition, AspectCollection.EMPTY))),
+ eventHandler, configuration, ImmutableList.of(dependencyKey)),
null);
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/BUILD
index e7a91f7..a7b2baf 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BUILD
@@ -82,6 +82,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitive_option_details",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
"//src/main/java/com/google/devtools/build/lib/analysis:dependency",
+ "//src/main/java/com/google/devtools/build/lib/analysis:dependency_key",
"//src/main/java/com/google/devtools/build/lib/analysis:dependency_kind",
"//src/main/java/com/google/devtools/build/lib/analysis:extra_action_artifacts_provider",
"//src/main/java/com/google/devtools/build/lib/analysis:file_provider",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
index 854786a..cc0f020 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
@@ -546,22 +546,22 @@
"filegroup(name='top', srcs=[':inner', 'file'])",
"sh_binary(name='inner', srcs=['script.sh'])");
ConfiguredTarget top = Iterables.getOnlyElement(update("//package:top").getTargetsToBuild());
- Iterable<Dependency> targets =
+ Iterable<DependencyKey> targets =
getView()
.getDirectPrerequisiteDependenciesForTesting(
reporter, top, getBuildConfigurationCollection(), /*toolchainContext=*/ null)
.values();
- Dependency innerDependency =
- Dependency.withTransitionAndAspects(
- Label.parseAbsolute("//package:inner", ImmutableMap.of()),
- NoTransition.INSTANCE,
- AspectCollection.EMPTY);
- Dependency fileDependency =
- Dependency.withTransitionAndAspects(
- Label.parseAbsolute("//package:file", ImmutableMap.of()),
- NullTransition.INSTANCE,
- AspectCollection.EMPTY);
+ DependencyKey innerDependency =
+ DependencyKey.builder()
+ .setLabel(Label.parseAbsolute("//package:inner", ImmutableMap.of()))
+ .setTransition(NoTransition.INSTANCE)
+ .build();
+ DependencyKey fileDependency =
+ DependencyKey.builder()
+ .setLabel(Label.parseAbsolute("//package:file", ImmutableMap.of()))
+ .setTransition(NullTransition.INSTANCE)
+ .build();
assertThat(targets).containsExactly(innerDependency, fileDependency);
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyKeyTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyKeyTest.java
new file mode 100644
index 0000000..6827537
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyKeyTest.java
@@ -0,0 +1,216 @@
+// Copyright 2020 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.analysis;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.testing.EqualsTester;
+import com.google.common.testing.NullPointerTester;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.HostTransition;
+import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
+import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
+import com.google.devtools.build.lib.analysis.util.TestAspects;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.AspectDescriptor;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for {@link DependencyKey}. */
+@RunWith(JUnit4.class)
+public class DependencyKeyTest extends AnalysisTestCase {
+
+ @Test
+ public void withTransitionAndAspects_BasicAccessors() throws Exception {
+ AspectDescriptor simpleAspect = new AspectDescriptor(TestAspects.SIMPLE_ASPECT);
+ AspectDescriptor attributeAspect = new AspectDescriptor(TestAspects.ATTRIBUTE_ASPECT);
+ AspectCollection twoAspects =
+ AspectCollection.createForTests(ImmutableSet.of(simpleAspect, attributeAspect));
+ DependencyKey hostDep =
+ DependencyKey.builder()
+ .setLabel(Label.parseAbsolute("//a", ImmutableMap.of()))
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(twoAspects)
+ .build();
+
+ assertThat(hostDep.getLabel()).isEqualTo(Label.parseAbsolute("//a", ImmutableMap.of()));
+ assertThat(hostDep.getAspects().getAllAspects())
+ .containsExactlyElementsIn(twoAspects.getAllAspects());
+ assertThat(hostDep.getTransition().isHostTransition()).isTrue();
+ }
+
+ @Test
+ public void withTransitionAndAspects_AllowsEmptyAspectSet() throws Exception {
+ update();
+ DependencyKey dep =
+ DependencyKey.builder()
+ .setLabel(Label.parseAbsolute("//a", ImmutableMap.of()))
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(AspectCollection.EMPTY)
+ .build();
+ // Here we're also checking that this doesn't throw an exception. No boom? OK. Good.
+ assertThat(dep.getAspects().getAllAspects()).isEmpty();
+ }
+
+ @Test
+ public void factoriesPassNullableTester() throws Exception {
+ update();
+
+ new NullPointerTester()
+ .setDefault(Label.class, Label.parseAbsolute("//a", ImmutableMap.of()))
+ .setDefault(BuildConfiguration.class, getTargetConfiguration())
+ .testAllPublicStaticMethods(Dependency.class);
+ }
+
+ @Test
+ public void equalsPassesEqualsTester() throws Exception {
+ update();
+
+ Label a = Label.parseAbsolute("//a", ImmutableMap.of());
+ Label aExplicit = Label.parseAbsolute("//a:a", ImmutableMap.of());
+ Label b = Label.parseAbsolute("//b", ImmutableMap.of());
+
+ AspectDescriptor simpleAspect = new AspectDescriptor(TestAspects.SIMPLE_ASPECT);
+ AspectDescriptor attributeAspect = new AspectDescriptor(TestAspects.ATTRIBUTE_ASPECT);
+ AspectDescriptor errorAspect = new AspectDescriptor(TestAspects.ERROR_ASPECT);
+
+ AspectCollection twoAspects = AspectCollection.createForTests(simpleAspect, attributeAspect);
+ AspectCollection inverseAspects =
+ AspectCollection.createForTests(attributeAspect, simpleAspect);
+ AspectCollection differentAspects =
+ AspectCollection.createForTests(attributeAspect, errorAspect);
+
+ new EqualsTester()
+ .addEqualityGroup(
+ // base set but with transition HOST
+ DependencyKey.builder()
+ .setLabel(a)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(twoAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(aExplicit)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(twoAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(a)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(inverseAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(aExplicit)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(inverseAspects)
+ .build())
+ .addEqualityGroup(
+ // base set but with transition HOST and different aspects
+ DependencyKey.builder()
+ .setLabel(a)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(differentAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(aExplicit)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(differentAspects)
+ .build())
+ .addEqualityGroup(
+ // base set but with transition HOST and label //b
+ DependencyKey.builder()
+ .setLabel(b)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(twoAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(b)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(inverseAspects)
+ .build())
+ .addEqualityGroup(
+ // inverse of base set: transition HOST, label //b, different aspects
+ DependencyKey.builder()
+ .setLabel(b)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(differentAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(b)
+ .setTransition(HostTransition.INSTANCE)
+ .setAspects(differentAspects)
+ .build())
+ .addEqualityGroup(
+ // base set but with transition NONE
+ DependencyKey.builder()
+ .setLabel(a)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(twoAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(aExplicit)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(twoAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(a)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(inverseAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(aExplicit)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(inverseAspects)
+ .build())
+ .addEqualityGroup(
+ // base set but with transition NONE and different aspects
+ DependencyKey.builder()
+ .setLabel(a)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(differentAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(aExplicit)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(differentAspects)
+ .build())
+ .addEqualityGroup(
+ // base set but with transition NONE and label //b
+ DependencyKey.builder()
+ .setLabel(b)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(twoAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(b)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(inverseAspects)
+ .build())
+ .addEqualityGroup(
+ // inverse of base set: transition NONE, label //b, different aspects
+ DependencyKey.builder()
+ .setLabel(b)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(differentAspects)
+ .build(),
+ DependencyKey.builder()
+ .setLabel(b)
+ .setTransition(NoTransition.INSTANCE)
+ .setAspects(differentAspects)
+ .build())
+ .testEquals();
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
index a29a806..abf3ee6 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
@@ -84,11 +84,11 @@
scratch.file("" + name + "/BUILD", contents);
}
- private OrderedSetMultimap<DependencyKind, Dependency> dependentNodeMap(
+ private OrderedSetMultimap<DependencyKind, DependencyKey> dependentNodeMap(
String targetName, NativeAspectClass aspect) throws Exception {
Target target =
packageManager.getTarget(reporter, Label.parseAbsolute(targetName, ImmutableMap.of()));
- OrderedSetMultimap<DependencyKind, Dependency> prerequisiteMap =
+ OrderedSetMultimap<DependencyKind, DependencyKey> prerequisiteMap =
dependencyResolver.dependentNodeMap(
new TargetAndConfiguration(target, getTargetConfiguration()),
getHostConfiguration(),
@@ -101,8 +101,8 @@
}
@SafeVarargs
- private final Dependency assertDep(
- OrderedSetMultimap<DependencyKind, Dependency> dependentNodeMap,
+ private final DependencyKey assertDep(
+ OrderedSetMultimap<DependencyKind, DependencyKey> dependentNodeMap,
String attrName,
String dep,
AspectDescriptor... aspects) {
@@ -115,8 +115,8 @@
}
assertWithMessage("Attribute '" + attrName + "' not found").that(kind).isNotNull();
- Dependency dependency = null;
- for (Dependency depCandidate : dependentNodeMap.get(kind)) {
+ DependencyKey dependency = null;
+ for (DependencyKey depCandidate : dependentNodeMap.get(kind)) {
if (depCandidate.getLabel().toString().equals(dep)) {
dependency = depCandidate;
break;
@@ -136,7 +136,7 @@
pkg("a",
"aspect(name='a', foo=[':b'])",
"aspect(name='b', foo=[])");
- OrderedSetMultimap<DependencyKind, Dependency> map = dependentNodeMap("//a:a", null);
+ OrderedSetMultimap<DependencyKind, DependencyKey> map = dependentNodeMap("//a:a", null);
assertDep(
map, "foo", "//a:b",
new AspectDescriptor(TestAspects.SIMPLE_ASPECT));
@@ -148,7 +148,7 @@
pkg("a",
"simple(name='a', foo=[':b'])",
"simple(name='b', foo=[])");
- OrderedSetMultimap<DependencyKind, Dependency> map =
+ OrderedSetMultimap<DependencyKind, DependencyKey> map =
dependentNodeMap("//a:a", TestAspects.ATTRIBUTE_ASPECT);
assertDep(
map, "foo", "//a:b",
@@ -161,7 +161,7 @@
pkg("a",
"simple(name='a', foo=[':b'])",
"simple(name='b', foo=[])");
- OrderedSetMultimap<DependencyKind, Dependency> map =
+ OrderedSetMultimap<DependencyKind, DependencyKey> map =
dependentNodeMap("//a:a", TestAspects.ALL_ATTRIBUTES_ASPECT);
assertDep(
map, "foo", "//a:b",
@@ -173,7 +173,7 @@
setRulesAvailableInTests(TestAspects.BASE_RULE);
pkg("a", "base(name='a')");
pkg("extra", "base(name='extra')");
- OrderedSetMultimap<DependencyKind, Dependency> map =
+ OrderedSetMultimap<DependencyKind, DependencyKey> map =
dependentNodeMap("//a:a", TestAspects.EXTRA_ATTRIBUTE_ASPECT);
assertDep(map, "$dep", "//extra:extra");
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java
index 7bf491c..83a4df7 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java
@@ -21,8 +21,6 @@
import com.google.common.testing.EqualsTester;
import com.google.common.testing.NullPointerTester;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.HostTransition;
-import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
import com.google.devtools.build.lib.analysis.util.TestAspects;
import com.google.devtools.build.lib.cmdline.Label;
@@ -44,11 +42,8 @@
Dependency.withNullConfiguration(Label.parseAbsolute("//a", ImmutableMap.of()));
assertThat(nullDep.getLabel()).isEqualTo(Label.parseAbsolute("//a", ImmutableMap.of()));
- assertThat(nullDep.hasExplicitConfiguration()).isTrue();
assertThat(nullDep.getConfiguration()).isNull();
assertThat(nullDep.getAspects().getAllAspects()).isEmpty();
-
- assertThrows(IllegalStateException.class, () -> nullDep.getTransition());
}
@Test
@@ -59,11 +54,8 @@
Label.parseAbsolute("//a", ImmutableMap.of()), getTargetConfiguration());
assertThat(targetDep.getLabel()).isEqualTo(Label.parseAbsolute("//a", ImmutableMap.of()));
- assertThat(targetDep.hasExplicitConfiguration()).isTrue();
assertThat(targetDep.getConfiguration()).isEqualTo(getTargetConfiguration());
assertThat(targetDep.getAspects().getAllAspects()).isEmpty();
-
- assertThrows(IllegalStateException.class, () -> targetDep.getTransition());
}
@Test
@@ -78,14 +70,11 @@
Label.parseAbsolute("//a", ImmutableMap.of()), getTargetConfiguration(), twoAspects);
assertThat(targetDep.getLabel()).isEqualTo(Label.parseAbsolute("//a", ImmutableMap.of()));
- assertThat(targetDep.hasExplicitConfiguration()).isTrue();
assertThat(targetDep.getConfiguration()).isEqualTo(getTargetConfiguration());
assertThat(targetDep.getAspects()).isEqualTo(twoAspects);
assertThat(targetDep.getAspectConfiguration(simpleAspect)).isEqualTo(getTargetConfiguration());
assertThat(targetDep.getAspectConfiguration(attributeAspect))
.isEqualTo(getTargetConfiguration());
-
- assertThrows(IllegalStateException.class, () -> targetDep.getTransition());
}
@Test
@@ -132,15 +121,12 @@
twoAspectMap);
assertThat(targetDep.getLabel()).isEqualTo(Label.parseAbsolute("//a", ImmutableMap.of()));
- assertThat(targetDep.hasExplicitConfiguration()).isTrue();
assertThat(targetDep.getConfiguration()).isEqualTo(getTargetConfiguration());
assertThat(targetDep.getAspects().getAllAspects())
.containsExactly(simpleAspect, attributeAspect);
assertThat(targetDep.getAspectConfiguration(simpleAspect)).isEqualTo(getTargetConfiguration());
assertThat(targetDep.getAspectConfiguration(attributeAspect))
.isEqualTo(getHostConfiguration());
-
- assertThrows(IllegalStateException.class, () -> targetDep.getTransition());
}
@@ -158,42 +144,6 @@
}
@Test
- public void withTransitionAndAspects_BasicAccessors() throws Exception {
- AspectDescriptor simpleAspect = new AspectDescriptor(TestAspects.SIMPLE_ASPECT);
- AspectDescriptor attributeAspect = new AspectDescriptor(TestAspects.ATTRIBUTE_ASPECT);
- AspectCollection twoAspects = AspectCollection.createForTests(
- ImmutableSet.of(simpleAspect, attributeAspect));
- Dependency hostDep =
- Dependency.withTransitionAndAspects(
- Label.parseAbsolute("//a", ImmutableMap.of()), HostTransition.INSTANCE, twoAspects);
-
- assertThat(hostDep.getLabel()).isEqualTo(Label.parseAbsolute("//a", ImmutableMap.of()));
- assertThat(hostDep.hasExplicitConfiguration()).isFalse();
- assertThat(hostDep.getAspects().getAllAspects())
- .containsExactlyElementsIn(twoAspects.getAllAspects());
- assertThat(hostDep.getTransition().isHostTransition()).isTrue();
-
- assertThrows(IllegalStateException.class, () -> hostDep.getConfiguration());
-
- assertThrows(IllegalStateException.class, () -> hostDep.getAspectConfiguration(simpleAspect));
-
- assertThrows(
- IllegalStateException.class, () -> hostDep.getAspectConfiguration(attributeAspect));
- }
-
- @Test
- public void withTransitionAndAspects_AllowsEmptyAspectSet() throws Exception {
- update();
- Dependency dep =
- Dependency.withTransitionAndAspects(
- Label.parseAbsolute("//a", ImmutableMap.of()),
- HostTransition.INSTANCE,
- AspectCollection.EMPTY);
- // Here we're also checking that this doesn't throw an exception. No boom? OK. Good.
- assertThat(dep.getAspects().getAllAspects()).isEmpty();
- }
-
- @Test
public void factoriesPassNullableTester() throws Exception {
update();
@@ -324,45 +274,6 @@
Dependency.withConfiguration(b, target),
Dependency.withConfigurationAndAspects(b, target, noAspects),
Dependency.withConfiguredAspects(b, target, noAspects, noAspectsMap))
- .addEqualityGroup(
- // base set but with transition HOST
- Dependency.withTransitionAndAspects(a, HostTransition.INSTANCE, twoAspects),
- Dependency.withTransitionAndAspects(
- aExplicit, HostTransition.INSTANCE, twoAspects),
- Dependency.withTransitionAndAspects(a, HostTransition.INSTANCE, inverseAspects),
- Dependency.withTransitionAndAspects(
- aExplicit, HostTransition.INSTANCE, inverseAspects))
- .addEqualityGroup(
- // base set but with transition HOST and different aspects
- Dependency.withTransitionAndAspects(a, HostTransition.INSTANCE, differentAspects),
- Dependency.withTransitionAndAspects(
- aExplicit, HostTransition.INSTANCE, differentAspects))
- .addEqualityGroup(
- // base set but with transition HOST and label //b
- Dependency.withTransitionAndAspects(b, HostTransition.INSTANCE, twoAspects),
- Dependency.withTransitionAndAspects(b, HostTransition.INSTANCE, inverseAspects))
- .addEqualityGroup(
- // inverse of base set: transition HOST, label //b, different aspects
- Dependency.withTransitionAndAspects(b, HostTransition.INSTANCE, differentAspects),
- Dependency.withTransitionAndAspects(b, HostTransition.INSTANCE, differentAspects))
- .addEqualityGroup(
- // base set but with transition NONE
- Dependency.withTransitionAndAspects(a, NoTransition.INSTANCE, twoAspects),
- Dependency.withTransitionAndAspects(aExplicit, NoTransition.INSTANCE, twoAspects),
- Dependency.withTransitionAndAspects(a, NoTransition.INSTANCE, inverseAspects),
- Dependency.withTransitionAndAspects(aExplicit, NoTransition.INSTANCE, inverseAspects))
- .addEqualityGroup(
- // base set but with transition NONE and different aspects
- Dependency.withTransitionAndAspects(a, NoTransition.INSTANCE, differentAspects),
- Dependency.withTransitionAndAspects(aExplicit, NoTransition.INSTANCE, differentAspects))
- .addEqualityGroup(
- // base set but with transition NONE and label //b
- Dependency.withTransitionAndAspects(b, NoTransition.INSTANCE, twoAspects),
- Dependency.withTransitionAndAspects(b, NoTransition.INSTANCE, inverseAspects))
- .addEqualityGroup(
- // inverse of base set: transition NONE, label //b, different aspects
- Dependency.withTransitionAndAspects(b, NoTransition.INSTANCE, differentAspects),
- Dependency.withTransitionAndAspects(b, NoTransition.INSTANCE, differentAspects))
.testEquals();
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
index d241ca4..f9152c7 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
@@ -58,7 +58,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/null_transition",
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/patch_transition",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
- "//src/main/java/com/google/devtools/build/lib/analysis:dependency",
+ "//src/main/java/com/google/devtools/build/lib/analysis:dependency_key",
"//src/main/java/com/google/devtools/build/lib/analysis:dependency_kind",
"//src/main/java/com/google/devtools/build/lib/analysis:extra_action_artifacts_provider",
"//src/main/java/com/google/devtools/build/lib/analysis:file_provider",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
index 69de54e..1823b58 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
@@ -34,7 +34,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.ConfiguredTargetFactory;
-import com.google.devtools.build.lib.analysis.Dependency;
+import com.google.devtools.build.lib.analysis.DependencyKey;
import com.google.devtools.build.lib.analysis.DependencyKind;
import com.google.devtools.build.lib.analysis.DependencyResolver;
import com.google.devtools.build.lib.analysis.InconsistentAspectOrderException;
@@ -199,12 +199,11 @@
Target target, BuildConfiguration config, ExtendedEventHandler eventHandler)
throws InvalidConfigurationException {
List<TargetAndConfiguration> node =
- ImmutableList.<TargetAndConfiguration>of(new TargetAndConfiguration(target, config));
+ ImmutableList.of(new TargetAndConfiguration(target, config));
Collection<TargetAndConfiguration> configs =
ConfigurationResolver.getConfigurationsFromExecutor(
node,
- AnalysisUtils.targetsToDeps(
- new LinkedHashSet<TargetAndConfiguration>(node), ruleClassProvider),
+ AnalysisUtils.targetsToDeps(new LinkedHashSet<>(node), ruleClassProvider),
eventHandler,
skyframeExecutor)
.getTargetsAndConfigs();
@@ -277,13 +276,14 @@
}
@VisibleForTesting
- public OrderedSetMultimap<DependencyKind, Dependency> getDirectPrerequisiteDependenciesForTesting(
- final ExtendedEventHandler eventHandler,
- final ConfiguredTarget ct,
- BuildConfigurationCollection configurations,
- @Nullable ToolchainCollection<ToolchainContext> toolchainContexts)
- throws EvalException, InterruptedException, InconsistentAspectOrderException,
- StarlarkTransition.TransitionException, InvalidConfigurationException {
+ public OrderedSetMultimap<DependencyKind, DependencyKey>
+ getDirectPrerequisiteDependenciesForTesting(
+ final ExtendedEventHandler eventHandler,
+ final ConfiguredTarget ct,
+ BuildConfigurationCollection configurations,
+ @Nullable ToolchainCollection<ToolchainContext> toolchainContexts)
+ throws EvalException, InterruptedException, InconsistentAspectOrderException,
+ StarlarkTransition.TransitionException, InvalidConfigurationException {
Target target = null;
try {
@@ -371,17 +371,17 @@
@Nullable ToolchainCollection<ToolchainContext> toolchainContexts)
throws EvalException, InvalidConfigurationException, InterruptedException,
InconsistentAspectOrderException, StarlarkTransition.TransitionException {
- OrderedSetMultimap<DependencyKind, Dependency> depNodeNames =
+ OrderedSetMultimap<DependencyKind, DependencyKey> depNodeNames =
getDirectPrerequisiteDependenciesForTesting(
eventHandler, target, configurations, toolchainContexts);
- ImmutableMultimap<Dependency, ConfiguredTargetAndData> cts =
+ ImmutableMultimap<DependencyKey, ConfiguredTargetAndData> cts =
skyframeExecutor.getConfiguredTargetMapForTesting(
eventHandler, target.getConfigurationKey(), ImmutableSet.copyOf(depNodeNames.values()));
OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> result =
OrderedSetMultimap.create();
- for (Map.Entry<DependencyKind, Dependency> entry : depNodeNames.entries()) {
+ for (Map.Entry<DependencyKind, DependencyKey> entry : depNodeNames.entries()) {
result.putAll(entry.getKey(), cts.get(entry.getValue()));
}
return result;