Aspects can get information from their base rule.
--
MOS_MIGRATED_REVID=102126786
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 bcb6d3d..eb3b934 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
@@ -118,8 +118,8 @@
ListMultimap<Attribute, ConfiguredTarget> depValueMap =
ConfiguredTargetFunction.computeDependencies(env, resolver, ctgValue,
- aspectFactory.getDefinition(), configConditions, ruleClassProvider,
- view.getHostConfiguration(ctgValue.getConfiguration()));
+ aspectFactory.getDefinition(), key.getParameters(), configConditions,
+ ruleClassProvider, view.getHostConfiguration(ctgValue.getConfiguration()));
return createAspect(env, key, associatedTarget, configConditions, depValueMap);
} catch (DependencyEvaluationException e) {
@@ -143,8 +143,9 @@
ConfiguredAspectFactory aspectFactory =
(ConfiguredAspectFactory) AspectFactory.Util.create(key.getAspect());
- Aspect aspect = view.createAspect(analysisEnvironment, associatedTarget, aspectFactory,
- directDeps, configConditions);
+ Aspect aspect = view.createAspect(
+ analysisEnvironment, associatedTarget, aspectFactory, directDeps, configConditions,
+ key.getParameters());
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 2657caa..f1260ba 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
@@ -15,15 +15,20 @@
package com.google.devtools.build.lib.skyframe;
import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.analysis.Aspect;
+import com.google.devtools.build.lib.analysis.AspectWithParameters;
import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.devtools.build.skyframe.SkyKey;
+import javax.annotation.Nullable;
+
/**
* An aspect in the context of the Skyframe graph.
*/
@@ -34,16 +39,15 @@
public static final class AspectKey extends ActionLookupKey {
private final Label label;
private final BuildConfiguration configuration;
- // TODO(bazel-team): class objects are not really hashable or comparable for equality other than
- // by reference. We should identify the aspect here in a way that does not rely on comparison
- // by reference so that keys can be serialized and deserialized properly.
- private final Class<? extends ConfiguredAspectFactory> aspectFactory;
+ private final AspectWithParameters aspect;
private AspectKey(Label label, BuildConfiguration configuration,
- Class<? extends ConfiguredAspectFactory> aspectFactory) {
+ Class<? extends ConfiguredAspectFactory> aspectFactory,
+ AspectParameters parameters) {
+ Preconditions.checkNotNull(parameters);
this.label = label;
this.configuration = configuration;
- this.aspectFactory = aspectFactory;
+ this.aspect = new AspectWithParameters(aspectFactory, parameters);
}
@Override
@@ -56,7 +60,12 @@
}
public Class<? extends ConfiguredAspectFactory> getAspect() {
- return aspectFactory;
+ return aspect.getAspectFactory();
+ }
+
+ @Nullable
+ public AspectParameters getParameters() {
+ return aspect.getParameters();
}
@Override
@@ -66,7 +75,7 @@
@Override
public int hashCode() {
- return Objects.hashCode(label, configuration, aspectFactory);
+ return Objects.hashCode(label, configuration, aspect);
}
@Override
@@ -82,13 +91,14 @@
AspectKey that = (AspectKey) other;
return Objects.equal(label, that.label)
&& Objects.equal(configuration, that.configuration)
- && Objects.equal(aspectFactory, that.aspectFactory);
+ && Objects.equal(aspect, that.aspect);
}
@Override
public String toString() {
- return label + "#" + aspectFactory.getSimpleName() + " "
- + (configuration == null ? "null" : configuration.checksum());
+ return label + "#" + aspect.getAspectFactory().getSimpleName() + " "
+ + (configuration == null ? "null" : configuration.checksum()) + " "
+ + aspect.getParameters();
}
}
@@ -123,8 +133,10 @@
}
public static SkyKey key(Label label, BuildConfiguration configuration,
- Class<? extends ConfiguredAspectFactory> aspectFactory) {
- return new SkyKey(SkyFunctions.ASPECT, new AspectKey(label, configuration, aspectFactory));
+ Class<? extends ConfiguredAspectFactory> aspectFactory,
+ AspectParameters additionalConfiguration) {
+ return new SkyKey(SkyFunctions.ASPECT,
+ new AspectKey(label, configuration, aspectFactory, additionalConfiguration));
}
public static SkyKey key(AspectKey aspectKey) {
@@ -135,6 +147,6 @@
Label label,
BuildConfiguration configuration,
Class<? extends ConfiguredAspectFactory> aspectFactory) {
- return new AspectKey(label, configuration, aspectFactory);
+ return new AspectKey(label, configuration, aspectFactory, AspectParameters.EMPTY);
}
}
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 5df28bd..b565f1e 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
@@ -27,6 +27,7 @@
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
import com.google.devtools.build.lib.analysis.Aspect;
+import com.google.devtools.build.lib.analysis.AspectWithParameters;
import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment;
import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
@@ -45,6 +46,7 @@
import com.google.devtools.build.lib.events.StoredEventHandler;
import com.google.devtools.build.lib.packages.AspectDefinition;
import com.google.devtools.build.lib.packages.AspectFactory;
+import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.InputFile;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
@@ -181,7 +183,7 @@
}
ListMultimap<Attribute, ConfiguredTarget> depValueMap = computeDependencies(env, resolver,
- ctgValue, null, configConditions, ruleClassProvider,
+ ctgValue, null, AspectParameters.EMPTY, configConditions, ruleClassProvider,
view.getHostConfiguration(configuration));
ConfiguredTargetValue ans = createConfiguredTarget(
view, env, target, configuration, depValueMap, configConditions);
@@ -202,7 +204,8 @@
* @param resolver The dependency resolver
* @param ctgValue The label and the configuration of the node
* @param aspectDefinition the aspect of the node (if null, the node is a configured target,
- * otherwise it's an asect)
+ * otherwise it's an aspect)
+ * @param aspectParameters additional parameters for aspect construction
* @param configConditions the configuration conditions for evaluating the attributes of the node
* @param ruleClassProvider rule class provider for determining the right configuration fragments
* to apply to deps
@@ -215,15 +218,16 @@
@Nullable
static ListMultimap<Attribute, ConfiguredTarget> computeDependencies(
Environment env, SkyframeDependencyResolver resolver, TargetAndConfiguration ctgValue,
- AspectDefinition aspectDefinition, Set<ConfigMatchingProvider> configConditions,
- RuleClassProvider ruleClassProvider, BuildConfiguration hostConfiguration)
+ AspectDefinition aspectDefinition, AspectParameters aspectParameters,
+ Set<ConfigMatchingProvider> configConditions, RuleClassProvider ruleClassProvider,
+ BuildConfiguration hostConfiguration)
throws DependencyEvaluationException {
// Create the map from attributes to list of (target, configuration) pairs.
ListMultimap<Attribute, Dependency> depValueNames;
try {
depValueNames = resolver.dependentNodeMap(ctgValue, hostConfiguration, aspectDefinition,
- configConditions);
+ aspectParameters, configConditions);
} catch (EvalException e) {
env.getListener().handle(Event.error(e.getLocation(), e.getMessage()));
throw new DependencyEvaluationException(new ConfiguredValueCreationException(e.print()));
@@ -479,8 +483,8 @@
ListMultimap<SkyKey, Aspect> result = ArrayListMultimap.create();
Set<SkyKey> aspectKeys = new HashSet<>();
for (Dependency dep : deps) {
- for (Class<? extends ConfiguredAspectFactory> depAspect : dep.getAspects()) {
- aspectKeys.add(AspectValue.key(dep.getLabel(), dep.getConfiguration(), depAspect));
+ for (AspectWithParameters depAspect : dep.getAspects()) {
+ aspectKeys.add(createAspectKey(dep.getLabel(), dep.getConfiguration(), depAspect));
}
}
@@ -497,12 +501,12 @@
continue;
}
ConfiguredTarget depConfiguredTarget = configuredTargetMap.get(depKey);
- for (Class<? extends ConfiguredAspectFactory> depAspect : dep.getAspects()) {
- if (!aspectMatchesConfiguredTarget(depConfiguredTarget, depAspect)) {
+ for (AspectWithParameters depAspect : dep.getAspects()) {
+ if (!aspectMatchesConfiguredTarget(depConfiguredTarget, depAspect.getAspectFactory())) {
continue;
}
- SkyKey aspectKey = AspectValue.key(dep.getLabel(), dep.getConfiguration(), depAspect);
+ SkyKey aspectKey = createAspectKey(dep.getLabel(), dep.getConfiguration(), depAspect);
AspectValue aspectValue = null;
try {
aspectValue = (AspectValue) depAspects.get(aspectKey).get();
@@ -510,7 +514,8 @@
// The configured target should have been created in resolveConfiguredTargetDependencies()
throw new IllegalStateException(e);
} catch (NoSuchThingException | AspectCreationException e) {
- AspectFactory<?, ?, ?> depAspectFactory = AspectFactory.Util.create(depAspect);
+ AspectFactory<?, ?, ?> depAspectFactory =
+ AspectFactory.Util.create(depAspect.getAspectFactory());
throw new DependencyEvaluationException(new ConfiguredValueCreationException(
String.format("Evaluation of aspect %s on %s failed: %s",
depAspectFactory.getDefinition().getName(), dep.getLabel(), e.toString())));
@@ -523,10 +528,17 @@
result.put(depKey, aspectValue.getAspect());
}
}
-
return result;
}
+ public static SkyKey createAspectKey(Label label, BuildConfiguration buildConfiguration,
+ AspectWithParameters depAspect) {
+ return AspectValue.key(label,
+ buildConfiguration,
+ depAspect.getAspectFactory(),
+ depAspect.getParameters());
+ }
+
private static boolean aspectMatchesConfiguredTarget(ConfiguredTarget dep,
Class<? extends ConfiguredAspectFactory> aspectFactory) {
AspectDefinition aspectDefinition = AspectFactory.Util.create(aspectFactory).getDefinition();
@@ -573,8 +585,7 @@
// Collect the corresponding Skyframe configured target values. Abort early if they haven't
// been computed yet.
- Collection<Dependency> configValueNames =
- resolver.resolveRuleLabels(ctgValue, null, configLabelMap);
+ Collection<Dependency> configValueNames = resolver.resolveRuleLabels(ctgValue, configLabelMap);
// No need to get new configs from Skyframe - config_setting rules always use the current
// target's config.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java
index 5f5d538..d14bf46 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java
@@ -100,7 +100,8 @@
try {
BuildConfiguration hostConfiguration =
buildViewProvider.getSkyframeBuildView().getHostConfiguration(ct.getConfiguration());
- deps = resolver.dependentNodeMap(ctgValue, hostConfiguration, null, configConditions);
+ deps = resolver.dependentNodeMap(ctgValue, hostConfiguration, /*aspect=*/null,
+ /*aspectParameters=*/null, configConditions);
if (ct.getConfiguration() != null && ct.getConfiguration().useDynamicConfigurations()) {
deps = ConfiguredTargetFunction.trimConfigurations(env, ctgValue, deps, hostConfiguration,
ruleClassProvider);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index 1eecdb7..0e6e419 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -48,6 +48,7 @@
import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.Target;
@@ -459,9 +460,11 @@
AnalysisEnvironment env, RuleConfiguredTarget associatedTarget,
ConfiguredAspectFactory aspectFactory,
ListMultimap<Attribute, ConfiguredTarget> prerequisiteMap,
- Set<ConfigMatchingProvider> configConditions) {
- return factory.createAspect(env, associatedTarget, aspectFactory, prerequisiteMap,
- configConditions, getHostConfiguration(associatedTarget.getConfiguration()));
+ Set<ConfigMatchingProvider> configConditions,
+ AspectParameters aspectParameters) {
+ return factory.createAspect(env, associatedTarget, aspectFactory, aspectParameters,
+ prerequisiteMap, configConditions,
+ getHostConfiguration(associatedTarget.getConfiguration()));
}
@Nullable
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 e5c6cf1..22bd506 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
@@ -46,9 +46,9 @@
import com.google.devtools.build.lib.actions.ResourceManager;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.analysis.Aspect;
+import com.google.devtools.build.lib.analysis.AspectWithParameters;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.BuildView.Options;
-import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.DependencyResolver.Dependency;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget;
@@ -1110,8 +1110,9 @@
final List<SkyKey> skyKeys = new ArrayList<>();
for (Dependency key : keys) {
skyKeys.add(ConfiguredTargetValue.key(key.getLabel(), configs.get(key)));
- for (Class<? extends ConfiguredAspectFactory> aspect : key.getAspects()) {
- skyKeys.add(AspectValue.key(key.getLabel(), configs.get(key), aspect));
+ for (AspectWithParameters aspect : key.getAspects()) {
+ skyKeys.add(
+ ConfiguredTargetFunction.createAspectKey(key.getLabel(), configs.get(key), aspect));
}
}
@@ -1130,8 +1131,9 @@
((ConfiguredTargetValue) result.get(configuredTargetKey)).getConfiguredTarget();
List<Aspect> aspects = new ArrayList<>();
- for (Class<? extends ConfiguredAspectFactory> aspect : key.getAspects()) {
- SkyKey aspectKey = AspectValue.key(key.getLabel(), configs.get(key), aspect);
+ for (AspectWithParameters aspect : key.getAspects()) {
+ SkyKey aspectKey =
+ ConfiguredTargetFunction.createAspectKey(key.getLabel(), configs.get(key), aspect);
if (result.get(aspectKey) == null) {
continue DependentNodeLoop;
}