Add support for aspects to attr.label() attributes

Fixes #1739

RELNOTES: Add support for aspects to attr.label() attributes

--
MOS_MIGRATED_REVID=133275712
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
index 2e4bbb6..634a42f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
@@ -82,8 +82,9 @@
           + "compatiblity), use providers instead.";
 
   private static final String ASPECTS_ARG = "aspects";
-  private static final String ASPECT_ARG_DOC =
-      "aspects that should be applied to dependencies specified by this attribute";
+  private static final String ASPECTS_ARG_DOC =
+      "aspects that should be applied to the dependency or dependencies specified by this "
+          + "attribute";
 
   private static final String CONFIGURATION_ARG = "cfg";
   private static final String CONFIGURATION_DOC =
@@ -540,6 +541,15 @@
         named = true,
         positional = false,
         doc = CONFIGURATION_DOC
+      ),
+      @Param(
+          name = ASPECTS_ARG,
+          type = SkylarkList.class,
+          generic1 = SkylarkAspect.class,
+          defaultValue = "[]",
+          named = true,
+          positional = false,
+          doc = ASPECTS_ARG_DOC
       )
     },
     useAst = true,
@@ -557,34 +567,42 @@
             Object allowRules,
             Boolean singleFile,
             Object cfg,
+            SkylarkList<?> aspects,
             FuncallExpression ast,
             Environment env)
             throws EvalException {
           env.checkLoadingOrWorkspacePhase("attr.label", ast.getLocation());
-          return createAttrDescriptor(
-              EvalUtils.<String, Object>optionMap(
-                  env,
-                  DEFAULT_ARG,
-                  defaultO,
-                  EXECUTABLE_ARG,
-                  executable,
-                  ALLOW_FILES_ARG,
-                  allowFiles,
-                  ALLOW_SINGLE_FILE_ARG,
-                  allowSingleFile,
-                  MANDATORY_ARG,
-                  mandatory,
-                  PROVIDERS_ARG,
-                  providers,
-                  ALLOW_RULES_ARG,
-                  allowRules,
-                  SINGLE_FILE_ARG,
-                  singleFile,
-                  CONFIGURATION_ARG,
-                  cfg),
-              BuildType.LABEL,
-              ast,
-              env);
+          try {
+            Attribute.Builder<?> attribute = createAttribute(
+                BuildType.LABEL,
+                EvalUtils.<String, Object>optionMap(
+                    env,
+                    DEFAULT_ARG,
+                    defaultO,
+                    EXECUTABLE_ARG,
+                    executable,
+                    ALLOW_FILES_ARG,
+                    allowFiles,
+                    ALLOW_SINGLE_FILE_ARG,
+                    allowSingleFile,
+                    MANDATORY_ARG,
+                    mandatory,
+                    PROVIDERS_ARG,
+                    providers,
+                    ALLOW_RULES_ARG,
+                    allowRules,
+                    SINGLE_FILE_ARG,
+                    singleFile,
+                    CONFIGURATION_ARG,
+                    cfg),
+                ast,
+                env);
+            ImmutableList<SkylarkAspect> skylarkAspects =
+                ImmutableList.copyOf(aspects.getContents(SkylarkAspect.class, "aspects"));
+            return new Descriptor(attribute, skylarkAspects);
+          } catch (EvalException e) {
+            throw new EvalException(ast.getLocation(), e.getMessage(), e);
+          }
         }
       };
 
@@ -811,7 +829,7 @@
         defaultValue = "[]",
         named = true,
         positional = false,
-        doc = ASPECT_ARG_DOC
+        doc = ASPECTS_ARG_DOC
       )
     },
     useAst = true,