Expose aspect-related information in the extra-action proto that Bazel hands to action_listener() rules.

RELNOTES: Extra actions now contain aspect-related information.

--
MOS_MIGRATED_REVID=138832922
diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
index a20888b..69bcac0 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
@@ -41,6 +41,7 @@
 import com.google.devtools.build.lib.vfs.Symlinks;
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Map;
 import javax.annotation.Nullable;
 
 /**
@@ -440,10 +441,24 @@
 
   @Override
   public ExtraActionInfo.Builder getExtraActionInfo() {
-    return ExtraActionInfo.newBuilder()
-        .setOwner(getOwner().getLabel().toString())
-        .setId(getKey())
-        .setMnemonic(getMnemonic());
+    ActionOwner owner = getOwner();
+    ExtraActionInfo.Builder result =
+        ExtraActionInfo.newBuilder()
+            .setOwner(owner.getLabel().toString())
+            .setId(getKey())
+            .setMnemonic(getMnemonic());
+    if (owner.getAspectName() != null) {
+      result.setAspectName(owner.getAspectName());
+    }
+    if (owner.getAspectParameters() != null) {
+      for (Map.Entry<String, Collection<String>> entry :
+          owner.getAspectParameters().getAttributes().asMap().entrySet()) {
+        result.putAspectParameters(
+            entry.getKey(),
+            ExtraActionInfo.StringList.newBuilder().addAllValue(entry.getValue()).build());
+      }
+    }
+    return result;
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java b/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java
index a7a4aa7..b641a4d 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.util.Preconditions;
 import javax.annotation.Nullable;
 
@@ -32,10 +33,12 @@
 public abstract class ActionOwner {
   /** An action owner for special cases. Usage is strongly discouraged. */
   public static final ActionOwner SYSTEM_ACTION_OWNER =
-      ActionOwner.create(null, null, "system", "empty target kind", "system", null);
+      ActionOwner.create(null, null, null, null, "system", "empty target kind", "system", null);
 
   public static ActionOwner create(
       @Nullable Label label,
+      @Nullable String aspectName,
+      @Nullable AspectParameters aspectParameters,
       @Nullable Location location,
       @Nullable String mnemonic,
       @Nullable String targetKind,
@@ -44,6 +47,8 @@
     return new AutoValue_ActionOwner(
         location,
         label,
+        aspectName,
+        aspectParameters,
         mnemonic,
         Preconditions.checkNotNull(configurationChecksum),
         targetKind,
@@ -58,6 +63,12 @@
   @Nullable
   public abstract Label getLabel();
 
+  @Nullable
+  public abstract String getAspectName();
+
+  @Nullable
+  public abstract AspectParameters getAspectParameters();
+
   /** Returns the configuration's mnemonic. */
   @Nullable
   public abstract String getConfigurationMnemonic();
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 239fd93..f90123d 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
@@ -1055,6 +1055,7 @@
             env,
             (Rule) target.getTarget(),
             null,
+            null,
             targetConfig,
             configurations.getHostConfiguration(),
             ruleClassProvider.getPrerequisiteValidator(),
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 fdd38db..7a375ce 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
@@ -228,6 +228,7 @@
                 env,
                 rule,
                 null,
+                null,
                 configuration,
                 hostConfiguration,
                 ruleClassProvider.getPrerequisiteValidator(),
@@ -317,13 +318,16 @@
       BuildConfiguration aspectConfiguration,
       BuildConfiguration hostConfiguration)
       throws InterruptedException {
-    RuleContext.Builder builder = new RuleContext.Builder(env,
-        associatedTarget.getTarget(),
-        aspect.getAspectClass().getName(),
-        aspectConfiguration,
-        hostConfiguration,
-        ruleClassProvider.getPrerequisiteValidator(),
-        aspect.getDefinition().getConfigurationFragmentPolicy());
+    RuleContext.Builder builder =
+        new RuleContext.Builder(
+            env,
+            associatedTarget.getTarget(),
+            aspect.getAspectClass().getName(),
+            aspect.getParameters(),
+            aspectConfiguration,
+            hostConfiguration,
+            ruleClassProvider.getPrerequisiteValidator(),
+            aspect.getDefinition().getConfigurationFragmentPolicy());
     RuleContext ruleContext =
         builder
             .setVisibility(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 8f186d4..8bee13b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -53,6 +53,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.Location;
+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.SplitTransition;
@@ -106,6 +107,7 @@
  */
 public final class RuleContext extends TargetContext
     implements ActionConstructionContext, ActionRegistry, RuleErrorConsumer {
+
   /**
    * The configured version of FilesetEntry.
    */
@@ -147,6 +149,8 @@
   private static final String HOST_CONFIGURATION_PROGRESS_TAG = "for host";
 
   private final Rule rule;
+  @Nullable private final String aspectName;
+  @Nullable private final AspectParameters aspectParameters;
   private final ListMultimap<String, ConfiguredTarget> targetMap;
   private final ListMultimap<String, ConfiguredFilesetEntry> filesetEntryMap;
   private final ImmutableMap<Label, ConfigMatchingProvider> configConditions;
@@ -178,6 +182,8 @@
     super(builder.env, builder.rule, builder.configuration, builder.prerequisiteMap.get(null),
         builder.visibility);
     this.rule = builder.rule;
+    this.aspectName = builder.getAspectName();
+    this.aspectParameters = builder.getAspectParameters();
     this.configurationFragmentPolicy = builder.configurationFragmentPolicy;
     this.universalFragment = universalFragment;
     this.targetMap = targetMap;
@@ -322,7 +328,7 @@
   @Override
   public ActionOwner getActionOwner() {
     if (actionOwner == null) {
-      actionOwner = createActionOwner(rule, getConfiguration());
+      actionOwner = createActionOwner(rule, aspectName, aspectParameters, getConfiguration());
     }
     return actionOwner;
   }
@@ -398,9 +404,15 @@
   }
 
   @VisibleForTesting
-  public static ActionOwner createActionOwner(Rule rule, BuildConfiguration configuration) {
+  public static ActionOwner createActionOwner(
+      Rule rule,
+      @Nullable String aspectName,
+      @Nullable AspectParameters aspectParameters,
+      BuildConfiguration configuration) {
     return ActionOwner.create(
         rule.getLabel(),
+        aspectName,
+        aspectParameters,
         rule.getLocation(),
         configuration.getMnemonic(),
         rule.getTargetKind(),
@@ -1402,6 +1414,7 @@
     private final BuildConfiguration hostConfiguration;
     private final PrerequisiteValidator prerequisiteValidator;
     @Nullable private final String aspectName;
+    @Nullable private final AspectParameters aspectParameters;
     private final ErrorReporter reporter;
     private OrderedSetMultimap<Attribute, ConfiguredTarget> prerequisiteMap;
     private ImmutableMap<Label, ConfigMatchingProvider> configConditions;
@@ -1413,6 +1426,7 @@
         AnalysisEnvironment env,
         Rule rule,
         @Nullable String aspectName,
+        @Nullable AspectParameters aspectParameters,
         BuildConfiguration configuration,
         BuildConfiguration hostConfiguration,
         PrerequisiteValidator prerequisiteValidator,
@@ -1420,6 +1434,7 @@
       this.env = Preconditions.checkNotNull(env);
       this.rule = Preconditions.checkNotNull(rule);
       this.aspectName = aspectName;
+      this.aspectParameters = aspectParameters;
       this.configurationFragmentPolicy = Preconditions.checkNotNull(configurationFragmentPolicy);
       this.configuration = Preconditions.checkNotNull(configuration);
       this.hostConfiguration = Preconditions.checkNotNull(hostConfiguration);
@@ -1924,6 +1939,16 @@
         prerequisiteValidator.validate(this, prerequisite, attribute);
       }
     }
+
+    @Nullable
+    public AspectParameters getAspectParameters() {
+      return aspectParameters;
+    }
+
+    @Nullable
+    public String getAspectName() {
+      return aspectName;
+    }
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectParameters.java b/src/main/java/com/google/devtools/build/lib/packages/AspectParameters.java
index 6862f10..15ef2bb 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AspectParameters.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AspectParameters.java
@@ -19,7 +19,6 @@
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.Multimap;
-
 import java.util.Objects;
 
 /**
@@ -64,6 +63,10 @@
     return attributes.get(key);
   }
 
+  public ImmutableMultimap<String, String> getAttributes() {
+    return attributes;
+  }
+
   /**
    * Similar to {@link #getAttribute}}, but asserts that there's only one value for the provided
    * key.