Use two configurations for AspectKeys.
In order for Aspects to support dynamic configuration, they need to have two
configurations: one to instantiate the Aspect with, containing all the fragment
dependencies of the Aspect itself, and one to create the ConfiguredTargetValue.key
with, containing only the dependencies of the Rule. This expands AspectKey to
have a second configuration, although it currently does not populate that key with
anything different.
--
MOS_MIGRATED_REVID=115997454
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index e48a1b1..b67ba2e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -464,6 +464,9 @@
aspectKeys.add(
AspectValue.createSkylarkAspectKey(
targetSpec.getLabel(),
+ // For invoking top-level aspects, use the top-level configuration for both the
+ // aspect and the base target while the top-level configuration is untrimmed.
+ targetSpec.getConfiguration(),
targetSpec.getConfiguration(),
bzlFile,
skylarkFunctionName));
@@ -477,6 +480,9 @@
aspectKeys.add(
AspectValue.createAspectKey(
targetSpec.getLabel(),
+ // For invoking top-level aspects, use the top-level configuration for both the
+ // aspect and the base target while the top-level configuration is untrimmed.
+ targetSpec.getConfiguration(),
targetSpec.getConfiguration(),
new NativeAspectClass<ConfiguredNativeAspectFactory>(aspectFactoryClass)));
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index 71a1626..06f6c87 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -296,6 +296,7 @@
Aspect aspect,
ListMultimap<Attribute, ConfiguredTarget> prerequisiteMap,
Set<ConfigMatchingProvider> configConditions,
+ BuildConfiguration aspectConfiguration,
BuildConfiguration hostConfiguration)
throws InterruptedException {
ConfigurationFragmentPolicy aspectPolicy =
@@ -305,7 +306,7 @@
RuleContext.Builder builder = new RuleContext.Builder(env,
associatedTarget.getTarget(),
aspect.getAspectClass().getName(),
- associatedTarget.getConfiguration(),
+ aspectConfiguration,
hostConfiguration,
ruleClassProvider.getPrerequisiteValidator(),
// TODO(mstaib): When AspectDefinition can no longer have null ConfigurationFragmentPolicy,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index 4917d28..400aba7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -159,7 +159,7 @@
try {
configuredTargetValue =
(ConfiguredTargetValue) env.getValueOrThrow(
- ConfiguredTargetValue.key(key.getLabel(), key.getConfiguration()),
+ ConfiguredTargetValue.key(key.getLabel(), key.getBaseConfiguration()),
ConfiguredValueCreationException.class);
} catch (ConfiguredValueCreationException e) {
throw new AspectFunctionException(new AspectCreationException(e.getRootCauses()));
@@ -179,12 +179,19 @@
SkyframeDependencyResolver resolver = view.createDependencyResolver(env);
- TargetAndConfiguration ctgValue =
- new TargetAndConfiguration(target, key.getConfiguration());
+ // When getting the dependencies of this hybrid aspect+base target, use the aspect's
+ // configuration. The configuration of the aspect will always be a superset of the target's
+ // (dynamic configuration mode: target is part of the aspect's config fragment requirements;
+ // static configuration mode: target is the same configuration as the aspect), so the fragments
+ // required by all dependencies (both those of the aspect and those of the base target)
+ // will be present this way.
+ TargetAndConfiguration originalTargetAndAspectConfiguration =
+ new TargetAndConfiguration(target, key.getAspectConfiguration());
try {
// Get the configuration targets that trigger this rule's configurable attributes.
Set<ConfigMatchingProvider> configConditions = ConfiguredTargetFunction.getConfigConditions(
- target, env, resolver, ctgValue, transitivePackages, transitiveRootCauses);
+ target, env, resolver, originalTargetAndAspectConfiguration,
+ transitivePackages, transitiveRootCauses);
if (configConditions == null) {
// Those targets haven't yet been resolved.
return null;
@@ -194,11 +201,11 @@
ConfiguredTargetFunction.computeDependencies(
env,
resolver,
- ctgValue,
+ originalTargetAndAspectConfiguration,
key.getAspect(),
configConditions,
ruleClassProvider,
- view.getHostConfiguration(ctgValue.getConfiguration()),
+ view.getHostConfiguration(originalTargetAndAspectConfiguration.getConfiguration()),
transitivePackages,
transitiveRootCauses);
if (depValueMap == null) {
@@ -214,6 +221,7 @@
key,
aspectFactory,
associatedTarget,
+ key.getAspectConfiguration(),
configConditions,
depValueMap,
transitivePackages);
@@ -239,17 +247,17 @@
AspectKey key,
ConfiguredAspectFactory aspectFactory,
RuleConfiguredTarget associatedTarget,
+ BuildConfiguration aspectConfiguration,
Set<ConfigMatchingProvider> configConditions,
ListMultimap<Attribute, ConfiguredTarget> directDeps,
NestedSetBuilder<Package> transitivePackages)
throws AspectFunctionException, InterruptedException {
SkyframeBuildView view = buildViewProvider.getSkyframeBuildView();
- BuildConfiguration configuration = associatedTarget.getConfiguration();
StoredEventHandler events = new StoredEventHandler();
CachingAnalysisEnvironment analysisEnvironment = view.createAnalysisEnvironment(
- key, false, events, env, configuration);
+ key, false, events, env, aspectConfiguration);
if (env.valuesMissing()) {
return null;
}
@@ -262,7 +270,8 @@
key.getAspect(),
directDeps,
configConditions,
- view.getHostConfiguration(associatedTarget.getConfiguration()));
+ aspectConfiguration,
+ view.getHostConfiguration(aspectConfiguration));
events.replayOn(env.getListener());
if (events.hasErrors()) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
index c2d6f2d..f67ae19 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
@@ -49,16 +49,19 @@
*/
public static final class AspectKey extends AspectValueKey {
private final Label label;
- private final BuildConfiguration configuration;
+ private final BuildConfiguration aspectConfiguration;
+ private final BuildConfiguration baseConfiguration;
private final Aspect aspect;
protected AspectKey(
Label label,
- BuildConfiguration configuration,
+ BuildConfiguration aspectConfiguration,
+ BuildConfiguration baseConfiguration,
AspectClass aspectClass,
AspectParameters parameters) {
this.label = label;
- this.configuration = configuration;
+ this.aspectConfiguration = aspectConfiguration;
+ this.baseConfiguration = baseConfiguration;
this.aspect = new Aspect(aspectClass, parameters);
}
@@ -91,13 +94,45 @@
return String.format("%s of %s", aspect.getAspectClass().getName(), getLabel());
}
- public BuildConfiguration getConfiguration() {
- return configuration;
+ /**
+ * Returns the configuration to be used for the evaluation of the aspect itself.
+ *
+ * <p>In dynamic configuration mode, the aspect may require more fragments than the target on
+ * which it is being evaluated; in addition to configuration fragments required by the target
+ * and its dependencies, an aspect has configuration fragment requirements of its own, as well
+ * as dependencies of its own with their own configuration fragment requirements.
+ *
+ * <p>The aspect configuration contains all of these fragments, and is used to create the
+ * aspect's RuleContext and to retrieve the dependencies. Note that dependencies will have their
+ * configurations trimmed from this one as normal.
+ *
+ * <p>Because of these properties, this configuration is always a superset of that returned by
+ * {@link #getBaseConfiguration()}. In static configuration mode, this configuration will be
+ * equivalent to that returned by {@link #getBaseConfiguration()}.
+ *
+ * @see #getBaseConfiguration()
+ */
+ public BuildConfiguration getAspectConfiguration() {
+ return aspectConfiguration;
+ }
+
+ /**
+ * Returns the configuration to be used for the base target.
+ *
+ * <p>In dynamic configuration mode, the configured target this aspect is attached to may have
+ * a different configuration than the aspect itself (see the documentation for
+ * {@link #getAspectConfiguration()} for an explanation why). The base configuration is the one
+ * used to construct a key to look up the base configured target.
+ *
+ * @see #getAspectConfiguration()
+ */
+ public BuildConfiguration getBaseConfiguration() {
+ return baseConfiguration;
}
@Override
public int hashCode() {
- return Objects.hashCode(label, configuration, aspect);
+ return Objects.hashCode(label, aspectConfiguration, baseConfiguration, aspect);
}
@Override
@@ -112,7 +147,8 @@
AspectKey that = (AspectKey) other;
return Objects.equal(label, that.label)
- && Objects.equal(configuration, that.configuration)
+ && Objects.equal(aspectConfiguration, that.aspectConfiguration)
+ && Objects.equal(baseConfiguration, that.baseConfiguration)
&& Objects.equal(aspect, that.aspect);
}
@@ -122,7 +158,9 @@
+ "#"
+ aspect.getAspectClass().getName()
+ " "
- + (configuration == null ? "null" : configuration.checksum())
+ + (aspectConfiguration == null ? "null" : aspectConfiguration.checksum())
+ + " "
+ + (baseConfiguration == null ? "null" : baseConfiguration.checksum())
+ " "
+ aspect.getParameters();
}
@@ -134,16 +172,19 @@
public static class SkylarkAspectLoadingKey extends AspectValueKey {
private final Label targetLabel;
+ private final BuildConfiguration aspectConfiguration;
private final BuildConfiguration targetConfiguration;
private final PathFragment extensionFile;
private final String skylarkValueName;
private SkylarkAspectLoadingKey(
Label targetLabel,
+ BuildConfiguration aspectConfiguration,
BuildConfiguration targetConfiguration,
PathFragment extensionFile,
String skylarkFunctionName) {
this.targetLabel = targetLabel;
+ this.aspectConfiguration = aspectConfiguration;
this.targetConfiguration = targetConfiguration;
this.extensionFile = extensionFile;
@@ -167,6 +208,16 @@
return targetLabel;
}
+ /**
+ * @see AspectKey#getAspectConfiguration()
+ */
+ public BuildConfiguration getAspectConfiguration() {
+ return aspectConfiguration;
+ }
+
+ /**
+ * @see AspectKey#getBaseConfiguration()
+ */
public BuildConfiguration getTargetConfiguration() {
return targetConfiguration;
}
@@ -220,14 +271,19 @@
return transitivePackages;
}
+ /**
+ * Constructs a new SkyKey containing an AspectKey.
+ */
public static SkyKey key(
Label label,
- BuildConfiguration configuration,
+ BuildConfiguration aspectConfiguration,
+ BuildConfiguration baseConfiguration,
AspectClass aspectFactory,
AspectParameters additionalConfiguration) {
return new SkyKey(
SkyFunctions.ASPECT,
- new AspectKey(label, configuration, aspectFactory, additionalConfiguration));
+ new AspectKey(
+ label, aspectConfiguration, baseConfiguration, aspectFactory, additionalConfiguration));
}
public static SkyKey key(AspectValueKey aspectKey) {
@@ -235,16 +291,21 @@
}
public static AspectKey createAspectKey(
- Label label, BuildConfiguration configuration, AspectClass aspectFactory) {
- return new AspectKey(label, configuration, aspectFactory, AspectParameters.EMPTY);
+ Label label,
+ BuildConfiguration aspectConfiguration,
+ BuildConfiguration baseConfiguration,
+ AspectClass aspectFactory) {
+ return new AspectKey(
+ label, aspectConfiguration, baseConfiguration, aspectFactory, AspectParameters.EMPTY);
}
public static SkylarkAspectLoadingKey createSkylarkAspectKey(
Label targetLabel,
+ BuildConfiguration aspectConfiguration,
BuildConfiguration targetConfiguration,
PathFragment skylarkFile,
String skylarkExportName) {
return new SkylarkAspectLoadingKey(
- targetLabel, targetConfiguration, skylarkFile, skylarkExportName);
+ targetLabel, aspectConfiguration, targetConfiguration, skylarkFile, skylarkExportName);
}
}
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 1224c3e..08410ee 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
@@ -77,6 +77,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
@@ -597,8 +598,9 @@
ListMultimap<SkyKey, ConfiguredAspect> result = ArrayListMultimap.create();
Set<SkyKey> aspectKeys = new HashSet<>();
for (Dependency dep : deps) {
- for (Aspect depAspect : dep.getAspects()) {
- aspectKeys.add(createAspectKey(dep.getLabel(), dep.getConfiguration(), depAspect));
+ for (Entry<Aspect, BuildConfiguration> depAspect : dep.getAspectConfigurations().entrySet()) {
+ aspectKeys.add(createAspectKey(
+ dep.getLabel(), depAspect.getValue(), dep.getConfiguration(), depAspect.getKey()));
}
}
@@ -613,12 +615,13 @@
continue;
}
ConfiguredTarget depConfiguredTarget = configuredTargetMap.get(depKey);
- for (Aspect depAspect : dep.getAspects()) {
- if (!aspectMatchesConfiguredTarget(depConfiguredTarget, depAspect)) {
+ for (Entry<Aspect, BuildConfiguration> depAspect : dep.getAspectConfigurations().entrySet()) {
+ if (!aspectMatchesConfiguredTarget(depConfiguredTarget, depAspect.getKey())) {
continue;
}
- SkyKey aspectKey = createAspectKey(dep.getLabel(), dep.getConfiguration(), depAspect);
+ SkyKey aspectKey = createAspectKey(
+ dep.getLabel(), depAspect.getValue(), dep.getConfiguration(), depAspect.getKey());
AspectValue aspectValue = null;
try {
// TODO(ulfjack): Catch all thrown AspectCreationException and NoSuchThingException
@@ -628,7 +631,7 @@
throw new AspectCreationException(
String.format(
"Evaluation of aspect %s on %s failed: %s",
- depAspect.getDefinition().getName(),
+ depAspect.getKey().getDefinition().getName(),
dep.getLabel(),
e.toString()));
}
@@ -645,9 +648,13 @@
}
public static SkyKey createAspectKey(
- Label label, BuildConfiguration buildConfiguration, Aspect depAspect) {
+ Label label,
+ BuildConfiguration aspectConfiguration,
+ BuildConfiguration baseConfiguration,
+ Aspect depAspect) {
return AspectValue.key(label,
- buildConfiguration,
+ aspectConfiguration,
+ baseConfiguration,
depAspect.getAspectClass(),
depAspect.getParameters());
}
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 de7ddb2..f4ece81 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
@@ -1147,7 +1147,8 @@
skyKeys.add(ConfiguredTargetValue.key(key.getLabel(), configs.get(key)));
for (Aspect aspect : key.getAspects()) {
skyKeys.add(
- ConfiguredTargetFunction.createAspectKey(key.getLabel(), configs.get(key), aspect));
+ ConfiguredTargetFunction.createAspectKey(
+ key.getLabel(), configs.get(key), configs.get(key), aspect));
}
}
@@ -1168,7 +1169,8 @@
for (Aspect aspect : key.getAspects()) {
SkyKey aspectKey =
- ConfiguredTargetFunction.createAspectKey(key.getLabel(), configs.get(key), aspect);
+ ConfiguredTargetFunction.createAspectKey(
+ key.getLabel(), configs.get(key), configs.get(key), aspect);
if (result.get(aspectKey) == null) {
continue DependentNodeLoop;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToplevelSkylarkAspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToplevelSkylarkAspectFunction.java
index 5719111..ed93b8e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ToplevelSkylarkAspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToplevelSkylarkAspectFunction.java
@@ -75,6 +75,7 @@
SkyKey aspectKey =
AspectValue.key(
aspectLoadingKey.getTargetLabel(),
+ aspectLoadingKey.getAspectConfiguration(),
aspectLoadingKey.getTargetConfiguration(),
skylarkAspect.getAspectClass(),
AspectParameters.EMPTY);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectValueTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectValueTest.java
index 860f755..882b483 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectValueTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectValueTest.java
@@ -34,7 +34,7 @@
public class AspectValueTest extends AnalysisTestCase {
@Test
- public void equality() throws Exception {
+ public void keyEquality() throws Exception {
update();
BuildConfiguration c1 = getTargetConfiguration();
BuildConfiguration c2 = getHostConfiguration();
@@ -44,25 +44,166 @@
AspectParameters i1 = new AspectParameters.Builder()
.addAttribute("foo", "bar")
.build();
+ AspectParameters i1b = new AspectParameters.Builder()
+ .addAttribute("foo", "bar")
+ .build();
AspectParameters i2 = new AspectParameters.Builder()
.addAttribute("foo", "baz")
.build();
- NativeAspectClass a1 = new NativeAspectClass(AttributeAspect.class);
- NativeAspectClass a2 = new NativeAspectClass(ExtraAttributeAspect.class);
+ NativeAspectClass<AttributeAspect> a1 =
+ new NativeAspectClass<AttributeAspect>(AttributeAspect.class);
+ NativeAspectClass<AttributeAspect> a1b =
+ new NativeAspectClass<AttributeAspect>(AttributeAspect.class);
+ NativeAspectClass<ExtraAttributeAspect> a2 =
+ new NativeAspectClass<ExtraAttributeAspect>(ExtraAttributeAspect.class);
+
+ // label: //a:l1 or //a:l2
+ // aspectConfiguration: target or host
+ // baseConfiguration: target or host
+ // aspect: Attribute or ExtraAttribute
+ // parameters: bar or baz
new EqualsTester()
- .addEqualityGroup(AspectValue.key(l1, c1, a1, AspectParameters.EMPTY),
- AspectValue.key(l1b, c1, a1, AspectParameters.EMPTY))
- .addEqualityGroup(AspectValue.key(l1, c1, a1, i1))
- .addEqualityGroup(AspectValue.key(l1, c1, a1, i2))
- .addEqualityGroup(AspectValue.key(l2, c1, a1, AspectParameters.EMPTY))
- .addEqualityGroup(AspectValue.key(l1, c2, a1, AspectParameters.EMPTY))
- .addEqualityGroup(AspectValue.key(l2, c2, a1, AspectParameters.EMPTY))
- .addEqualityGroup(AspectValue.key(l1, c1, a2, AspectParameters.EMPTY))
- .addEqualityGroup(AspectValue.key(l2, c1, a2, AspectParameters.EMPTY))
- .addEqualityGroup(AspectValue.key(l1, c2, a2, AspectParameters.EMPTY))
- .addEqualityGroup(AspectValue.key(l2, c2, a2, AspectParameters.EMPTY))
- .addEqualityGroup(l1) // A random object
+ .addEqualityGroup(
+ AspectValue.key(l1, c1, c1, a1, i1),
+ AspectValue.key(l1, c1, c1, a1, i1b),
+ AspectValue.key(l1, c1, c1, a1b, i1),
+ AspectValue.key(l1, c1, c1, a1b, i1b),
+ AspectValue.key(l1b, c1, c1, a1, i1),
+ AspectValue.key(l1b, c1, c1, a1, i1b),
+ AspectValue.key(l1b, c1, c1, a1b, i1),
+ AspectValue.key(l1b, c1, c1, a1b, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l1, c1, c1, a1, i2),
+ AspectValue.key(l1, c1, c1, a1b, i2),
+ AspectValue.key(l1b, c1, c1, a1, i2),
+ AspectValue.key(l1b, c1, c1, a1b, i2))
+ .addEqualityGroup(
+ AspectValue.key(l1, c1, c1, a2, i1),
+ AspectValue.key(l1, c1, c1, a2, i1b),
+ AspectValue.key(l1b, c1, c1, a2, i1),
+ AspectValue.key(l1b, c1, c1, a2, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l1, c1, c1, a2, i2),
+ AspectValue.key(l1b, c1, c1, a2, i2))
+ .addEqualityGroup(
+ AspectValue.key(l1, c1, c2, a1, i1),
+ AspectValue.key(l1, c1, c2, a1, i1b),
+ AspectValue.key(l1, c1, c2, a1b, i1),
+ AspectValue.key(l1, c1, c2, a1b, i1b),
+ AspectValue.key(l1b, c1, c2, a1, i1),
+ AspectValue.key(l1b, c1, c2, a1, i1b),
+ AspectValue.key(l1b, c1, c2, a1b, i1),
+ AspectValue.key(l1b, c1, c2, a1b, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l1, c1, c2, a1, i2),
+ AspectValue.key(l1, c1, c2, a1b, i2),
+ AspectValue.key(l1b, c1, c2, a1, i2),
+ AspectValue.key(l1b, c1, c2, a1b, i2))
+ .addEqualityGroup(
+ AspectValue.key(l1, c1, c2, a2, i1),
+ AspectValue.key(l1, c1, c2, a2, i1b),
+ AspectValue.key(l1b, c1, c2, a2, i1),
+ AspectValue.key(l1b, c1, c2, a2, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l1, c1, c2, a2, i2),
+ AspectValue.key(l1b, c1, c2, a2, i2))
+ .addEqualityGroup(
+ AspectValue.key(l1, c2, c1, a1, i1),
+ AspectValue.key(l1, c2, c1, a1, i1b),
+ AspectValue.key(l1, c2, c1, a1b, i1),
+ AspectValue.key(l1, c2, c1, a1b, i1b),
+ AspectValue.key(l1b, c2, c1, a1, i1),
+ AspectValue.key(l1b, c2, c1, a1, i1b),
+ AspectValue.key(l1b, c2, c1, a1b, i1),
+ AspectValue.key(l1b, c2, c1, a1b, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l1, c2, c1, a1, i2),
+ AspectValue.key(l1, c2, c1, a1b, i2),
+ AspectValue.key(l1b, c2, c1, a1, i2),
+ AspectValue.key(l1b, c2, c1, a1b, i2))
+ .addEqualityGroup(
+ AspectValue.key(l1, c2, c1, a2, i1),
+ AspectValue.key(l1, c2, c1, a2, i1b),
+ AspectValue.key(l1b, c2, c1, a2, i1),
+ AspectValue.key(l1b, c2, c1, a2, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l1, c2, c1, a2, i2),
+ AspectValue.key(l1b, c2, c1, a2, i2))
+ .addEqualityGroup(
+ AspectValue.key(l1, c2, c2, a1, i1),
+ AspectValue.key(l1, c2, c2, a1, i1b),
+ AspectValue.key(l1, c2, c2, a1b, i1),
+ AspectValue.key(l1, c2, c2, a1b, i1b),
+ AspectValue.key(l1b, c2, c2, a1, i1),
+ AspectValue.key(l1b, c2, c2, a1, i1b),
+ AspectValue.key(l1b, c2, c2, a1b, i1),
+ AspectValue.key(l1b, c2, c2, a1b, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l1, c2, c2, a1, i2),
+ AspectValue.key(l1, c2, c2, a1b, i2),
+ AspectValue.key(l1b, c2, c2, a1, i2),
+ AspectValue.key(l1b, c2, c2, a1b, i2))
+ .addEqualityGroup(
+ AspectValue.key(l1, c2, c2, a2, i1),
+ AspectValue.key(l1, c2, c2, a2, i1b),
+ AspectValue.key(l1b, c2, c2, a2, i1),
+ AspectValue.key(l1b, c2, c2, a2, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l1, c2, c2, a2, i2),
+ AspectValue.key(l1b, c2, c2, a2, i2))
+ .addEqualityGroup(
+ AspectValue.key(l2, c1, c1, a1, i1),
+ AspectValue.key(l2, c1, c1, a1, i1b),
+ AspectValue.key(l2, c1, c1, a1b, i1),
+ AspectValue.key(l2, c1, c1, a1b, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l2, c1, c1, a1, i2),
+ AspectValue.key(l2, c1, c1, a1b, i2))
+ .addEqualityGroup(
+ AspectValue.key(l2, c1, c1, a2, i1),
+ AspectValue.key(l2, c1, c1, a2, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l2, c1, c1, a2, i2))
+ .addEqualityGroup(
+ AspectValue.key(l2, c1, c2, a1, i1),
+ AspectValue.key(l2, c1, c2, a1, i1b),
+ AspectValue.key(l2, c1, c2, a1b, i1),
+ AspectValue.key(l2, c1, c2, a1b, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l2, c1, c2, a1, i2),
+ AspectValue.key(l2, c1, c2, a1b, i2))
+ .addEqualityGroup(
+ AspectValue.key(l2, c1, c2, a2, i1),
+ AspectValue.key(l2, c1, c2, a2, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l2, c1, c2, a2, i2))
+ .addEqualityGroup(
+ AspectValue.key(l2, c2, c1, a1, i1),
+ AspectValue.key(l2, c2, c1, a1, i1b),
+ AspectValue.key(l2, c2, c1, a1b, i1),
+ AspectValue.key(l2, c2, c1, a1b, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l2, c2, c1, a1, i2),
+ AspectValue.key(l2, c2, c1, a1b, i2))
+ .addEqualityGroup(
+ AspectValue.key(l2, c2, c1, a2, i1),
+ AspectValue.key(l2, c2, c1, a2, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l2, c2, c1, a2, i2))
+ .addEqualityGroup(
+ AspectValue.key(l2, c2, c2, a1, i1),
+ AspectValue.key(l2, c2, c2, a1, i1b),
+ AspectValue.key(l2, c2, c2, a1b, i1),
+ AspectValue.key(l2, c2, c2, a1b, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l2, c2, c2, a1, i2),
+ AspectValue.key(l2, c2, c2, a1b, i2))
+ .addEqualityGroup(
+ AspectValue.key(l2, c2, c2, a2, i1),
+ AspectValue.key(l2, c2, c2, a2, i1b))
+ .addEqualityGroup(
+ AspectValue.key(l2, c2, c2, a2, i2))
.testEquals();
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 552ca78..dd35f8d 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -907,6 +907,7 @@
AspectValue.key(
owner.getLabel(),
owner.getConfiguration(),
+ owner.getConfiguration(),
new NativeAspectClass(creatingAspectFactory),
AspectParameters.EMPTY)
.argument());
@@ -972,6 +973,7 @@
AspectValue.key(
owner.getLabel(),
owner.getConfiguration(),
+ owner.getConfiguration(),
new NativeAspectClass(creatingAspectFactory),
AspectParameters.EMPTY)
.argument());