Parametrize aspect definition with AspectParameters.

--
MOS_MIGRATED_REVID=106848269
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 8f40fcd..76ad8d1 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
@@ -51,7 +51,6 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.StoredEventHandler;
-import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
@@ -892,9 +891,12 @@
     TargetAndConfiguration ctNode = new TargetAndConfiguration(target);
     ListMultimap<Attribute, Dependency> depNodeNames;
     try {
-      depNodeNames = resolver.dependentNodeMap(ctNode, configurations.getHostConfiguration(),
-          /*aspect=*/null, AspectParameters.EMPTY,
-          getConfigurableAttributeKeysForTesting(eventHandler, ctNode));
+      depNodeNames =
+          resolver.dependentNodeMap(
+              ctNode,
+              configurations.getHostConfiguration(),
+              /*aspect=*/ null,
+              getConfigurableAttributeKeysForTesting(eventHandler, ctNode));
     } catch (EvalException e) {
       throw new IllegalStateException(e);
     }
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 a18902b..fcea153 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
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.collect.ImmutableSortedKeyListMultimap;
 import com.google.devtools.build.lib.packages.AspectClass;
 import com.google.devtools.build.lib.packages.AspectDefinition;
-import com.google.devtools.build.lib.packages.AspectParameters;
+import com.google.devtools.build.lib.packages.AspectWithParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
 import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
@@ -204,9 +204,9 @@
    * represent those edges. Visibility attributes are only visited if {@code visitVisibility} is
    * {@code true}.
    *
-   * <p>If {@code aspect} is null, returns the dependent nodes of the configured target node
-   * representing the given target and configuration, otherwise that of the aspect node accompanying
-   * the aforementioned configured target node for the specified aspect.
+   * <p>If {@code aspectWithParameters} is null, returns the dependent nodes of the configured
+   * target node representing the given target and configuration, otherwise that of the aspect
+   * node accompanying the aforementioned configured target node for the specified aspect.
    *
    * <p>The values are not simply labels because this also implements the first step of applying
    * configuration transitions, namely, split transitions. This needs to be done before the labels
@@ -218,8 +218,10 @@
    * dependency.
    */
   public final ListMultimap<Attribute, Dependency> dependentNodeMap(
-      TargetAndConfiguration node, BuildConfiguration hostConfig, AspectDefinition aspect,
-      AspectParameters aspectParameters, Set<ConfigMatchingProvider> configConditions)
+      TargetAndConfiguration node,
+      BuildConfiguration hostConfig,
+      AspectWithParameters aspectWithParameters,
+      Set<ConfigMatchingProvider> configConditions)
       throws EvalException, InterruptedException {
     Target target = node.getTarget();
     BuildConfiguration config = node.getConfiguration();
@@ -238,8 +240,13 @@
       visitTargetVisibility(node, outgoingEdges.get(null));
       Rule rule = (Rule) target;
       ListMultimap<Attribute, LabelAndConfiguration> labelMap =
-          resolveAttributes(rule, aspect, config, hostConfig, configConditions);
-      visitRule(rule, aspect, aspectParameters, labelMap, outgoingEdges);
+          resolveAttributes(
+              rule,
+              aspectWithParameters != null ? aspectWithParameters.getDefinition() : null,
+              config,
+              hostConfig,
+              configConditions);
+      visitRule(rule, aspectWithParameters, labelMap, outgoingEdges);
     } else if (target instanceof PackageGroup) {
       visitPackageGroup(node, (PackageGroup) target, outgoingEdges.get(null));
     } else {
@@ -502,8 +509,8 @@
       TargetAndConfiguration node, BuildConfiguration hostConfig,
       Set<ConfigMatchingProvider> configConditions) throws InterruptedException {
     try {
-      return ImmutableSet.copyOf(dependentNodeMap(node, hostConfig, /*aspect=*/null,
-          AspectParameters.EMPTY, configConditions).values());
+      return ImmutableSet.copyOf(
+          dependentNodeMap(node, hostConfig, /*aspect=*/ null, configConditions).values());
     } catch (EvalException e) {
       throw new IllegalStateException(e);
     }
@@ -548,20 +555,22 @@
     }
   }
 
-  private ImmutableSet<AspectWithParameters> requiredAspects(AspectDefinition aspectDefinition,
-      AspectParameters aspectParameters, Attribute attribute, Target target, Rule originalRule) {
+  private ImmutableSet<AspectWithParameters> requiredAspects(
+      AspectWithParameters aspectWithParameters,
+      Attribute attribute,
+      Target target,
+      Rule originalRule) {
     if (!(target instanceof Rule)) {
       return ImmutableSet.of();
     }
 
     Set<AspectWithParameters> aspectCandidates =
-        extractAspectCandidates(aspectDefinition, aspectParameters, attribute, originalRule);
+        extractAspectCandidates(aspectWithParameters, attribute, originalRule);
     RuleClass ruleClass = ((Rule) target).getRuleClassObject();
     ImmutableSet.Builder<AspectWithParameters> result = ImmutableSet.builder();
     for (AspectWithParameters candidateClass : aspectCandidates) {
-      AspectClass aspectClass = candidateClass.getAspectClass();
       if (Sets.difference(
-              aspectClass.getDefinition().getRequiredProviders(),
+              candidateClass.getDefinition().getRequiredProviders(),
               ruleClass.getAdvertisedProviders())
           .isEmpty()) {
         result.add(candidateClass);
@@ -571,21 +580,18 @@
   }
 
   private static Set<AspectWithParameters> extractAspectCandidates(
-      AspectDefinition aspectDefinition, AspectParameters aspectParameters,
-      Attribute attribute, Rule originalRule) {
+      AspectWithParameters aspectWithParameters, Attribute attribute, Rule originalRule) {
     // The order of this set will be deterministic. This is necessary because this order eventually
     // influences the order in which aspects are merged into the main configured target, which in
     // turn influences which aspect takes precedence if two emit the same provider (maybe this
     // should be an error)
     Set<AspectWithParameters> aspectCandidates = new LinkedHashSet<>();
-    for (Map.Entry<AspectClass, AspectParameters> aspectWithParameters :
-        attribute.getAspectsWithParameters(originalRule).entrySet()) {
-      AspectClass key = aspectWithParameters.getKey();
-      aspectCandidates.add(new AspectWithParameters(key, aspectWithParameters.getValue()));
-    }
-    if (aspectDefinition != null) {
-      for (AspectClass aspect : aspectDefinition.getAttributeAspects().get(attribute.getName())) {
-        aspectCandidates.add(new AspectWithParameters(aspect, aspectParameters));
+    aspectCandidates.addAll(attribute.getAspectsWithParameters(originalRule));
+    if (aspectWithParameters != null) {
+      for (AspectClass aspect :
+          aspectWithParameters.getDefinition().getAttributeAspects().get(attribute.getName())) {
+        aspectCandidates.add(
+            new AspectWithParameters(aspect, aspectWithParameters.getParameters()));
       }
     }
     return aspectCandidates;
@@ -593,10 +599,12 @@
 
   private void visitRule(Rule rule, ListMultimap<Attribute, LabelAndConfiguration> labelMap,
       ListMultimap<Attribute, Dependency> outgoingEdges) {
-    visitRule(rule, /*aspect=*/null, AspectParameters.EMPTY, labelMap, outgoingEdges);
+    visitRule(rule, /*aspect=*/ null, labelMap, outgoingEdges);
   }
 
-  private void visitRule(Rule rule, AspectDefinition aspect, AspectParameters aspectParameters,
+  private void visitRule(
+      Rule rule,
+      AspectWithParameters aspectWithParameters,
       ListMultimap<Attribute, LabelAndConfiguration> labelMap,
       ListMultimap<Attribute, Dependency> outgoingEdges) {
     Preconditions.checkNotNull(labelMap);
@@ -637,8 +645,9 @@
         } else {
           config.evaluateTransition(rule, attribute, toTarget, transitionApplier);
         }
-        for (Dependency dependency : transitionApplier.getDependencies(label,
-            requiredAspects(aspect, aspectParameters, attribute, toTarget, rule))) {
+        for (Dependency dependency :
+            transitionApplier.getDependencies(
+                label, requiredAspects(aspectWithParameters, attribute, toTarget, rule))) {
           outgoingEdges.put(
               entry.getKey(),
               dependency);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 90548f1..a5f2c6b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -33,7 +33,6 @@
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.PackageRootResolver;
 import com.google.devtools.build.lib.actions.Root;
-import com.google.devtools.build.lib.analysis.AspectWithParameters;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.DependencyResolver;
@@ -44,6 +43,7 @@
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.packages.AspectWithParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Attribute.Configurator;
 import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
index c01e10d..44e8188 100644
--- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
@@ -91,7 +91,7 @@
   };
 
   @Override
-  public AspectDefinition getDefinition() {
+  public AspectDefinition getDefinition(AspectParameters aspectParameters) {
     return new AspectDefinition.Builder(NAME)
         .attributeAspect("deps", AndroidStudioInfoAspect.class)
         .attributeAspect("exports", AndroidStudioInfoAspect.class)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectClass.java b/src/main/java/com/google/devtools/build/lib/packages/AspectClass.java
index 834379c..1a3d52d 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AspectClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AspectClass.java
@@ -32,5 +32,5 @@
    */
   String getName();
 
-  AspectDefinition getDefinition();
+  AspectDefinition getDefinition(AspectParameters aspectParameters);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
index 7c5fa83..9b5b5b9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
@@ -132,27 +132,27 @@
     }
     RuleClass ruleClass = ((Rule) to).getRuleClassObject();
     ImmutableSet<Class<?>> providers = ruleClass.getAdvertisedProviders();
-    return visitAspectsIfRequired(from, attribute, toStringSet(providers));
+    return visitAspectsIfRequired((Rule) from, attribute, toStringSet(providers));
   }
 
   /**
    * Returns the attribute -&gt; set of labels that are provided by aspects of attribute.
    */
   public static ImmutableMultimap<Attribute, Label> visitAspectsIfRequired(
-      Target from, Attribute attribute, Set<String> advertisedProviders) {
+      Rule from, Attribute attribute, Set<String> advertisedProviders) {
     if (advertisedProviders.isEmpty()) {
       return ImmutableMultimap.of();
     }
 
     LinkedHashMultimap<Attribute, Label> result = LinkedHashMultimap.create();
-    for (AspectClass candidateClass : attribute.getAspects()) {
+    for (AspectWithParameters candidateClass : attribute.getAspectsWithParameters(from)) {
       // Check if target satisfies condition for this aspect (has to provide all required
       // TransitiveInfoProviders)
       if (!advertisedProviders.containsAll(
           candidateClass.getDefinition().getRequiredProviderNames())) {
         continue;
       }
-      addAllAttributesOfAspect((Rule) from, result, candidateClass.getDefinition(), Rule.ALL_DEPS);
+      addAllAttributesOfAspect(from, result, candidateClass.getDefinition(), Rule.ALL_DEPS);
     }
     return ImmutableMultimap.copyOf(result);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectWithParameters.java b/src/main/java/com/google/devtools/build/lib/packages/AspectWithParameters.java
similarity index 85%
rename from src/main/java/com/google/devtools/build/lib/analysis/AspectWithParameters.java
rename to src/main/java/com/google/devtools/build/lib/packages/AspectWithParameters.java
index 0d35c98..6f47f9a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AspectWithParameters.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AspectWithParameters.java
@@ -11,18 +11,16 @@
 // 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;
+package com.google.devtools.build.lib.packages;
 
 import com.google.common.base.Preconditions;
-import com.google.devtools.build.lib.packages.AspectClass;
-import com.google.devtools.build.lib.packages.AspectParameters;
 
 import java.util.Objects;
 
 /**
- * Wrapper around {@link ConfiguredAspectFactory} class and {@link AspectParameters}. Aspects are
+ * Wrapper around {@link AspectClass} class and {@link AspectParameters}. Aspects are
  * created with help of aspect factory instances and parameters are used to configure them, so we
- * have to keep them together. 
+ * have to keep them together.
  */
 public final class AspectWithParameters {
   // TODO(bazel-team): class objects are not really hashable or comparable for equality other than
@@ -32,14 +30,14 @@
   private final AspectParameters parameters;
 
   public AspectWithParameters(AspectClass aspect, AspectParameters parameters) {
+    Preconditions.checkNotNull(aspect);
     Preconditions.checkNotNull(parameters);
     this.aspectClass = aspect;
     this.parameters = parameters;
   }
 
   public AspectWithParameters(AspectClass aspect) {
-    this.aspectClass = aspect;
-    this.parameters = AspectParameters.EMPTY;
+    this(aspect, AspectParameters.EMPTY);
   }
 
   /**
@@ -78,4 +76,8 @@
   public String toString() {
     return String.format("AspectWithParameters %s(%s)", aspectClass, parameters);
   }
+
+  public AspectDefinition getDefinition() {
+    return aspectClass.getDefinition(parameters);
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index b501579..d11efff 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -20,7 +20,6 @@
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
@@ -1346,10 +1345,12 @@
   /**
    * Returns set of pairs of aspect factories and corresponding aspect parameters.
    */
-  public ImmutableMap<AspectClass, AspectParameters> getAspectsWithParameters(Rule rule) {
-    ImmutableMap.Builder<AspectClass, AspectParameters> builder = ImmutableMap.builder();
+  public ImmutableList<AspectWithParameters> getAspectsWithParameters(Rule rule) {
+    ImmutableList.Builder<AspectWithParameters> builder = ImmutableList.builder();
     for (RuleAspect aspect : aspects) {
-      builder.put(aspect.getAspectFactory(), aspect.getParametersExtractor().apply(rule));
+      builder.add(
+          new AspectWithParameters(
+              aspect.getAspectFactory(), aspect.getParametersExtractor().apply(rule)));
     }
     return builder.build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java b/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java
index 7477ea0..59bc6af 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java
@@ -34,8 +34,8 @@
   }
 
   @Override
-  public AspectDefinition getDefinition() {
-    return newInstance().getDefinition();
+  public AspectDefinition getDefinition(AspectParameters aspectParameters) {
+    return newInstance().getDefinition(aspectParameters);
   }
 
   public T newInstance() {
@@ -66,6 +66,6 @@
     /**
      * Returns the definition of the aspect.
      */
-    AspectDefinition getDefinition();
+    AspectDefinition getDefinition(AspectParameters aspectParameters);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
index 9825e2d..9d21980 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
@@ -691,7 +691,7 @@
       BinaryPredicate<Rule, Attribute> predicate) {
     LinkedHashMultimap<Attribute, Label> labels = LinkedHashMultimap.create();
     for (Attribute attribute : this.getAttributes()) {
-      for (AspectClass candidateClass : attribute.getAspects()) {
+      for (AspectWithParameters candidateClass : attribute.getAspectsWithParameters(this)) {
         AspectDefinition.addAllAttributesOfAspect(
             Rule.this, labels, candidateClass.getDefinition(), predicate);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/ConservativeAspectResolver.java b/src/main/java/com/google/devtools/build/lib/query2/output/ConservativeAspectResolver.java
index 7404126..3f210f1 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/ConservativeAspectResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/ConservativeAspectResolver.java
@@ -18,8 +18,8 @@
 import com.google.common.collect.LinkedHashMultimap;
 import com.google.common.collect.Multimap;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.packages.AspectClass;
 import com.google.devtools.build.lib.packages.AspectDefinition;
+import com.google.devtools.build.lib.packages.AspectWithParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.Target;
@@ -38,12 +38,13 @@
     if (!(target instanceof Rule)) {
       return ImmutableMultimap.of();
     }
+    Rule rule = (Rule) target;
 
     Multimap<Attribute, Label> result = LinkedHashMultimap.create();
-    for (Attribute attribute : ((Rule) target).getAttributes()) {
-      for (AspectClass aspectFactory : attribute.getAspects()) {
+    for (Attribute attribute : rule.getAttributes()) {
+      for (AspectWithParameters aspectWithParameters : attribute.getAspectsWithParameters(rule)) {
         AspectDefinition.addAllAttributesOfAspect(
-            (Rule) target, result, aspectFactory.getDefinition(), Rule.ALL_DEPS);
+            rule, result, aspectWithParameters.getDefinition(), Rule.ALL_DEPS);
       }
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/PreciseAspectResolver.java b/src/main/java/com/google/devtools/build/lib/query2/output/PreciseAspectResolver.java
index 011cd9c..3067006 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/PreciseAspectResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/PreciseAspectResolver.java
@@ -20,8 +20,8 @@
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.events.EventHandler;
-import com.google.devtools.build.lib.packages.AspectClass;
 import com.google.devtools.build.lib.packages.AspectDefinition;
+import com.google.devtools.build.lib.packages.AspectWithParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.packages.NoSuchThingException;
@@ -94,9 +94,10 @@
               .getTransitions(
                   new BinaryPredicate<Rule, Attribute>() {
                     @Override
-                    public boolean apply(@Nullable Rule rule, @Nullable Attribute attribute) {
-                      for (AspectClass aspectClass : attribute.getAspects()) {
-                        if (!aspectClass.getDefinition().getAttributes().isEmpty()) {
+                    public boolean apply(@Nullable Rule rule, Attribute attribute) {
+                      for (AspectWithParameters aspectWithParameters :
+                          attribute.getAspectsWithParameters(rule)) {
+                        if (!aspectWithParameters.getDefinition().getAttributes().isEmpty()) {
                           return true;
                         }
                       }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
index b27fb45..80185e0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
@@ -46,6 +46,7 @@
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.AspectClass;
 import com.google.devtools.build.lib.packages.AspectDefinition;
+import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
 import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
@@ -666,7 +667,7 @@
     }
 
     @Override
-    public AspectDefinition getDefinition() {
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
       return aspectDefinition;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
index e3e0856..b2a865b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
@@ -77,7 +77,7 @@
   }
 
   @Override
-  public AspectDefinition getDefinition() {
+  public AspectDefinition getDefinition(AspectParameters aspectParameters) {
     AspectDefinition.Builder builder = new AspectDefinition.Builder("AndroidNeverlinkAspect");
     for (String attribute : ATTRIBUTES) {
       builder.attributeAspect(attribute, AndroidNeverlinkAspect.class);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java
index 7d7ff05..b792bc2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java
@@ -52,7 +52,7 @@
 public abstract class AbstractJ2ObjcProtoAspect implements ConfiguredNativeAspectFactory {
   public static final String NAME = "J2ObjcProtoAspect";
 
-  public AspectDefinition getDefinition() {
+  public AspectDefinition getDefinition(AspectParameters aspectParameters) {
     AspectDefinition.Builder builder = new AspectDefinition.Builder("J2ObjcProtoAspect")
         .requireProvider(ProtoSourcesProvider.class)
         .attributeAspect("deps", getClass())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
index 9fc55cc..410d6d4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
@@ -66,7 +66,7 @@
   }
 
   @Override
-  public AspectDefinition getDefinition() {
+  public AspectDefinition getDefinition(AspectParameters aspectParameters) {
     return addAttributeAspects(new AspectDefinition.Builder("J2ObjCAspect"))
         .requireProvider(JavaSourceInfoProvider.class)
         .requireProvider(JavaCompilationArgsProvider.class)
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 13764f6..1ddd626 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
@@ -181,8 +181,7 @@
               env,
               resolver,
               ctgValue,
-              key.getAspect().getDefinition(),
-              key.getParameters(),
+              key.getAspectWithParameters(),
               configConditions,
               ruleClassProvider,
               view.getHostConfiguration(ctgValue.getConfiguration()),
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 318b668..4b0d678 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
@@ -17,7 +17,6 @@
 import com.google.common.base.Objects;
 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.config.BuildConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
@@ -25,6 +24,7 @@
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.AspectClass;
 import com.google.devtools.build.lib.packages.AspectParameters;
+import com.google.devtools.build.lib.packages.AspectWithParameters;
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
@@ -32,7 +32,7 @@
 import javax.annotation.Nullable;
 
 /**
- * An aspect in the context of the Skyframe graph.
+ * An aspectWithParameters in the context of the Skyframe graph.
  */
 public final class AspectValue extends ActionLookupValue {
 
@@ -50,8 +50,7 @@
   public static final class AspectKey extends AspectValueKey {
     private final Label label;
     private final BuildConfiguration configuration;
-    private final AspectWithParameters aspect;
-    private final String aspectName;
+    private final AspectWithParameters aspectWithParameters;
 
     protected AspectKey(
         Label label,
@@ -60,8 +59,7 @@
         AspectParameters parameters) {
       this.label = label;
       this.configuration = configuration;
-      this.aspectName = aspectClass.getName();
-      this.aspect = new AspectWithParameters(aspectClass, parameters);
+      this.aspectWithParameters = new AspectWithParameters(aspectClass, parameters);
     }
 
     @Override
@@ -76,16 +74,20 @@
     }
 
     public AspectClass getAspect() {
-      return aspect.getAspectClass();
+      return aspectWithParameters.getAspectClass();
     }
 
     @Nullable
     public AspectParameters getParameters() {
-      return aspect.getParameters();
+      return aspectWithParameters.getParameters();
+    }
+
+    public AspectWithParameters getAspectWithParameters() {
+      return aspectWithParameters;
     }
 
     public String getDescription() {
-      return String.format("%s of %s", aspect.getAspectClass().getName(), getLabel());
+      return String.format("%s of %s", aspectWithParameters.getAspectClass().getName(), getLabel());
     }
 
     public BuildConfiguration getConfiguration() {
@@ -94,7 +96,7 @@
 
     @Override
     public int hashCode() {
-      return Objects.hashCode(label, configuration, aspect);
+      return Objects.hashCode(label, configuration, aspectWithParameters);
     }
 
     @Override
@@ -110,19 +112,23 @@
       AspectKey that = (AspectKey) other;
       return Objects.equal(label, that.label)
           && Objects.equal(configuration, that.configuration)
-          && Objects.equal(aspect, that.aspect);
+          && Objects.equal(aspectWithParameters, that.aspectWithParameters);
     }
 
     @Override
     public String toString() {
-      return label + "#" + aspect.getAspectClass().getName() + " "
-          + (configuration == null ? "null" : configuration.checksum()) + " "
-          + aspect.getParameters();
+      return label
+          + "#"
+          + aspectWithParameters.getAspectClass().getName()
+          + " "
+          + (configuration == null ? "null" : configuration.checksum())
+          + " "
+          + aspectWithParameters.getParameters();
     }
   }
 
   /**
-   * The key for a skylark aspect.
+   * The key for a skylark aspectWithParameters.
    */
   public static class SkylarkAspectLoadingKey extends AspectValueKey {
 
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 4493229..d139ea6 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,7 +27,6 @@
 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.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.DependencyResolver.Dependency;
@@ -45,9 +44,8 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.StoredEventHandler;
-import com.google.devtools.build.lib.packages.AspectClass;
 import com.google.devtools.build.lib.packages.AspectDefinition;
-import com.google.devtools.build.lib.packages.AspectParameters;
+import com.google.devtools.build.lib.packages.AspectWithParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException;
 import com.google.devtools.build.lib.packages.BuildType;
@@ -186,9 +184,16 @@
         return null;
       }
 
-      ListMultimap<Attribute, ConfiguredTarget> depValueMap = computeDependencies(env, resolver,
-          ctgValue, null, AspectParameters.EMPTY, configConditions, ruleClassProvider,
-          view.getHostConfiguration(configuration), transitivePackages);
+      ListMultimap<Attribute, ConfiguredTarget> depValueMap =
+          computeDependencies(
+              env,
+              resolver,
+              ctgValue,
+              null,
+              configConditions,
+              ruleClassProvider,
+              view.getHostConfiguration(configuration),
+              transitivePackages);
       ConfiguredTargetValue ans = createConfiguredTarget(
           view, env, target, configuration, depValueMap, configConditions, transitivePackages);
       return ans;
@@ -206,34 +211,34 @@
    *
    * <p>Returns null if Skyframe hasn't evaluated the required dependencies yet. In this case, the
    * caller should also return null to Skyframe.
-   *
-   * @param env the Skyframe environment
+   *  @param env the Skyframe environment
    * @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 aspect)
-   * @param aspectParameters additional parameters for aspect construction
+   * @param aspectWithParameters
    * @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
    * @param hostConfiguration the host configuration. There's a noticeable performance hit from
    *     instantiating this on demand for every dependency that wants it, so it's best to compute
    *     the host configuration as early as possible and pass this reference to all consumers
-   *     without involving Skyframe.
-   * @return an attribute -&gt; direct dependency multimap
-   */
+   * */
   @Nullable
   static ListMultimap<Attribute, ConfiguredTarget> computeDependencies(
-      Environment env, SkyframeDependencyResolver resolver, TargetAndConfiguration ctgValue,
-      AspectDefinition aspectDefinition, AspectParameters aspectParameters, 
-      Set<ConfigMatchingProvider> configConditions, RuleClassProvider ruleClassProvider,
-      BuildConfiguration hostConfiguration, NestedSetBuilder<Package> transitivePackages)
+      Environment env,
+      SkyframeDependencyResolver resolver,
+      TargetAndConfiguration ctgValue,
+      AspectWithParameters aspectWithParameters,
+      Set<ConfigMatchingProvider> configConditions,
+      RuleClassProvider ruleClassProvider,
+      BuildConfiguration hostConfiguration,
+      NestedSetBuilder<Package> transitivePackages)
       throws DependencyEvaluationException, AspectCreationException, InterruptedException {
     // Create the map from attributes to list of (target, configuration) pairs.
     ListMultimap<Attribute, Dependency> depValueNames;
     try {
-      depValueNames = resolver.dependentNodeMap(ctgValue, hostConfiguration, aspectDefinition,
-          aspectParameters, configConditions);
+      depValueNames =
+          resolver.dependentNodeMap(
+              ctgValue, hostConfiguration, aspectWithParameters, configConditions);
     } catch (EvalException e) {
       env.getListener().handle(Event.error(e.getLocation(), e.getMessage()));
       throw new DependencyEvaluationException(new ConfiguredValueCreationException(e.print()));
@@ -509,8 +514,7 @@
       }
       ConfiguredTarget depConfiguredTarget = configuredTargetMap.get(depKey);
       for (AspectWithParameters depAspect : dep.getAspects()) {
-        AspectClass depAspectClass = depAspect.getAspectClass();
-        if (!aspectMatchesConfiguredTarget(depConfiguredTarget, depAspectClass)) {
+        if (!aspectMatchesConfiguredTarget(depConfiguredTarget, depAspect)) {
           continue;
         }
 
@@ -525,7 +529,7 @@
           throw new AspectCreationException(
               String.format(
                   "Evaluation of aspect %s on %s failed: %s",
-                  depAspectClass.getDefinition().getName(),
+                  depAspect.getDefinition().getName(),
                   dep.getLabel(),
                   e.toString()));
         }
@@ -550,7 +554,7 @@
   }
 
   private static boolean aspectMatchesConfiguredTarget(
-      ConfiguredTarget dep, AspectClass aspectClass) {
+      ConfiguredTarget dep, AspectWithParameters aspectClass) {
     AspectDefinition aspectDefinition = aspectClass.getDefinition();
     for (Class<?> provider : aspectDefinition.getRequiredProviders()) {
       if (dep.getProvider(provider.asSubclass(TransitiveInfoProvider.class)) == null) {
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 d227a43..4844477 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
@@ -27,7 +27,6 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.RawAttributeMapper;
@@ -102,8 +101,9 @@
     try {
       BuildConfiguration hostConfiguration =
           buildViewProvider.getSkyframeBuildView().getHostConfiguration(ct.getConfiguration());
-      deps = resolver.dependentNodeMap(ctgValue, hostConfiguration, /*aspect=*/null,
-          AspectParameters.EMPTY, configConditions);
+      deps =
+          resolver.dependentNodeMap(
+              ctgValue, hostConfiguration, /*aspect=*/ 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/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index f13505b..80d52b5 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
@@ -49,7 +49,6 @@
 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.ConfiguredRuleClassProvider;
@@ -75,6 +74,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Reporter;
+import com.google.devtools.build.lib.packages.AspectWithParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveBaseTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveBaseTraversalFunction.java
index 8623b78..c3ef948 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveBaseTraversalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveBaseTraversalFunction.java
@@ -174,7 +174,7 @@
         ValueOrException2<NoSuchPackageException, NoSuchTargetException> value =
             labelDepMap.get(entry.getValue());
         for (Label label :
-                getAspectLabels(target, entry.getKey(), entry.getValue(), value, env)) {
+                getAspectLabels((Rule) target, entry.getKey(), entry.getValue(), value, env)) {
           depKeys.add(getKey(label));
         }
       }
@@ -184,7 +184,7 @@
 
   /** Get the Aspect-related Label deps for the given edge. */
   protected abstract Collection<Label> getAspectLabels(
-      Target fromTarget,
+      Rule fromRule,
       Attribute attr,
       Label toLabel,
       ValueOrException2<NoSuchPackageException, NoSuchTargetException> toVal,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
index bc39fe1..280e1a2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
@@ -150,7 +150,7 @@
     return builder.build(errorLoadingTarget);
   }
 
-  protected Collection<Label> getAspectLabels(Target fromTarget, Attribute attr, Label toLabel,
+  protected Collection<Label> getAspectLabels(Rule fromRule, Attribute attr, Label toLabel,
       ValueOrException2<NoSuchPackageException, NoSuchTargetException> toVal,
       Environment env) {
     SkyKey packageKey = PackageValue.key(toLabel.getPackageIdentifier());
@@ -167,7 +167,7 @@
         return ImmutableList.of();
       }
       Target dependedTarget = pkgValue.getPackage().getTarget(toLabel.getName());
-      return AspectDefinition.visitAspectsIfRequired(fromTarget, attr, dependedTarget).values();
+      return AspectDefinition.visitAspectsIfRequired(fromRule, attr, dependedTarget).values();
     } catch (NoSuchThingException e) {
       // Do nothing. This error was handled when we computed the corresponding
       // TransitiveTargetValue.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java
index abd6b5c..66820ca 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunction.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
 import com.google.devtools.build.lib.packages.NoSuchThingException;
-import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.skyframe.TransitiveTraversalFunction.FirstErrorMessageAccumulator;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
@@ -83,7 +83,7 @@
     }
   }
 
-  protected Collection<Label> getAspectLabels(Target fromTarget, Attribute attr, Label toLabel,
+  protected Collection<Label> getAspectLabels(Rule fromRule, Attribute attr, Label toLabel,
       ValueOrException2<NoSuchPackageException, NoSuchTargetException> toVal, Environment env) {
     try {
       if (toVal == null) {
@@ -96,7 +96,7 @@
       // Retrieve the providers of the dep from the TransitiveTraversalValue, so we can avoid
       // issuing a dep on its defining Package.
       Set<String> providers = traversalVal.getProviders();
-      return AspectDefinition.visitAspectsIfRequired(fromTarget, attr, providers).values();
+      return AspectDefinition.visitAspectsIfRequired(fromRule, attr, providers).values();
     } catch (NoSuchThingException e) {
       // Do nothing. This error was handled when we computed the corresponding
       // TransitiveTargetValue.
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
index b81f2f2..973a469 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
@@ -52,7 +52,7 @@
     }
 
     @Override
-    public AspectDefinition getDefinition() {
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
       return definition;
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
index 1fee104..33881a8 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
@@ -104,6 +104,28 @@
   }
 
   @Test
+  public void aspectWithParametrizedDefinition() throws Exception {
+    setRules(
+        new TestAspects.BaseRule(),
+        new TestAspects.HonestRule(),
+        new TestAspects.ParametrizedDefinitionAspectRule());
+
+    pkg(
+        "a",
+        "honest(name='q', foo=[])",
+        "parametrized_definition_aspect(name='a', foo=[':b'], baz='//a:q')",
+        "honest(name='c', foo=[])",
+        "honest(name='b', foo=[':c'])");
+
+    ConfiguredTarget a = getConfiguredTarget("//a:a");
+    assertThat(a.getProvider(TestAspects.RuleInfo.class).getData())
+        .containsExactly(
+            "rule //a:a",
+            "aspect //a:b data //a:q $dep:[ //a:q]",
+            "aspect //a:c data //a:q $dep:[ //a:q]");
+  }
+
+  @Test
   public void aspectInError() throws Exception {
     setRules(new TestAspects.BaseRule(), new TestAspects.ErrorAspectRule(),
         new TestAspects.SimpleRule());
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 1a7a24c..5a190d5 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
@@ -26,8 +26,7 @@
 import com.google.devtools.build.lib.analysis.util.TestAspects;
 import com.google.devtools.build.lib.analysis.util.TestAspects.AspectRequiringRule;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.packages.AspectDefinition;
-import com.google.devtools.build.lib.packages.AspectParameters;
+import com.google.devtools.build.lib.packages.AspectWithParameters;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
 import com.google.devtools.build.lib.packages.NoSuchThingException;
@@ -107,16 +106,14 @@
     update();
   }
 
-  private ListMultimap<Attribute, Dependency> dependentNodeMap(
-      String targetName, Class<? extends ConfiguredAspectFactory> aspect) throws Exception {
-    AspectDefinition aspectDefinition =
-        aspect == null ? null : new NativeAspectClass(aspect).getDefinition();
+  private <T extends ConfiguredNativeAspectFactory>
+    ListMultimap<Attribute, Dependency> dependentNodeMap(
+      String targetName, Class<T> aspect) throws Exception {
     Target target = packageManager.getTarget(reporter, Label.parseAbsolute(targetName));
     return dependencyResolver.dependentNodeMap(
         new TargetAndConfiguration(target, getTargetConfiguration()),
         getHostConfiguration(),
-        aspectDefinition,
-        AspectParameters.EMPTY,
+        aspect != null ? new AspectWithParameters(new NativeAspectClass<T>(aspect)) : null,
         ImmutableSet.<ConfigMatchingProvider>of());
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
index 1b2ffbb..0551f11 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
@@ -23,6 +23,7 @@
 import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
 
 import com.google.common.base.Function;
+import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.Aspect;
@@ -35,20 +36,25 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.analysis.Runfiles;
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
+import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder;
 import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.util.FileTypeSet;
 
+import java.util.List;
+
 /**
  * Various rule and aspect classes that aid in testing the aspect machinery.
  *
@@ -157,7 +163,7 @@
    */
   public static class SimpleAspect extends BaseAspect {
     @Override
-    public AspectDefinition getDefinition() {
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
       return SIMPLE_ASPECT;
     }
   }
@@ -178,7 +184,7 @@
    */
   public static class ExtraAttributeAspect extends BaseAspect {
     @Override
-    public AspectDefinition getDefinition() {
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
       return EXTRA_ATTRIBUTE_ASPECT;
     }
   }
@@ -192,7 +198,7 @@
    */
   public static class AttributeAspect extends BaseAspect {
     @Override
-    public AspectDefinition getDefinition() {
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
       return ATTRIBUTE_ASPECT;
     }
   }
@@ -202,18 +208,64 @@
    */
   public static class ExtraAttributeAspectRequiringProvider extends BaseAspect {
     @Override
-    public AspectDefinition getDefinition() {
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
       return EXTRA_ATTRIBUTE_ASPECT_REQUIRING_PROVIDER;
     }
   }
 
   public static class AspectRequiringProvider extends BaseAspect {
     @Override
-    public AspectDefinition getDefinition() {
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
       return ASPECT_REQUIRING_PROVIDER;
     }
   }
 
+  /**
+   * An aspect that has a definition depending on parameters provided by originating rule.
+   */
+  public static class ParametrizedDefinitionAspect implements ConfiguredNativeAspectFactory {
+
+    @Override
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
+      AspectDefinition.Builder builder =
+          new AspectDefinition.Builder("parametrized_definition_aspect")
+              .attributeAspect("foo", ParametrizedDefinitionAspect.class);
+      ImmutableCollection<String> baz = aspectParameters.getAttribute("baz");
+      if (baz != null) {
+        try {
+          builder.add(
+              Attribute.attr("$dep", LABEL).value(Label.parseAbsolute(baz.iterator().next())));
+        } catch (LabelSyntaxException e) {
+          throw new IllegalStateException();
+        }
+      }
+      return builder.build();
+    }
+
+    public Aspect create(
+        ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) {
+      StringBuilder information = new StringBuilder("aspect " + ruleContext.getLabel());
+      if (!parameters.isEmpty()) {
+        information.append(" data " + Iterables.getFirst(parameters.getAttribute("baz"), null));
+        information.append(" ");
+      }
+      List<? extends TransitiveInfoCollection> deps =
+          ruleContext.getPrerequisites("$dep", Mode.TARGET);
+      information.append("$dep:[");
+      for (TransitiveInfoCollection dep : deps) {
+        information.append(" ");
+        information.append(dep.getLabel());
+      }
+      information.append("]");
+      return new Aspect.Builder(getClass().getName())
+          .addProvider(
+              AspectInfo.class,
+              new AspectInfo(collectAspectData(information.toString(), ruleContext)))
+          .build();
+    }
+  }
+
+
   private static final AspectDefinition ASPECT_REQUIRING_PROVIDER =
       new AspectDefinition.Builder("requiring_provider")
           .requireProvider(RequiredProvider.class)
@@ -231,7 +283,7 @@
     }
 
     @Override
-    public AspectDefinition getDefinition() {
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
       return ERROR_ASPECT;
     }
   }
@@ -337,6 +389,46 @@
   }
 
   /**
+   * A rule that defines an {@link ParametrizedDefinitionAspect} on one of its attributes.
+   */
+  public static class ParametrizedDefinitionAspectRule implements RuleDefinition {
+
+    private static final class TestAspectParametersExtractor
+        implements Function<Rule, AspectParameters> {
+      @Override
+      public AspectParameters apply(Rule rule) {
+        if (rule.isAttrDefined("baz", STRING)) {
+          String value = rule.getAttributeContainer().getAttr("baz").toString();
+          if (!value.equals("")) {
+            return new AspectParameters.Builder().addAttribute("baz", value).build();
+          }
+        }
+        return AspectParameters.EMPTY;
+      }
+    }
+
+    @Override
+    public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
+      return builder
+          .add(
+              attr("foo", LABEL_LIST)
+                  .allowedFileTypes(FileTypeSet.ANY_FILE)
+                  .aspect(ParametrizedDefinitionAspect.class, new TestAspectParametersExtractor()))
+          .add(attr("baz", STRING))
+          .build();
+    }
+
+    @Override
+    public Metadata getMetadata() {
+      return RuleDefinition.Metadata.builder()
+          .name("parametrized_definition_aspect")
+          .factoryClass(DummyRuleFactory.class)
+          .ancestors(BaseRule.class)
+          .build();
+    }
+  }
+
+  /**
    * A rule that defines an {@link ExtraAttributeAspectRequiringProvider} on one of its attributes.
    */
   public static class ExtraAttributeAspectRequiringProviderRule implements RuleDefinition {