Implement aspect attributes and expose them to aspect implementation function.

--
MOS_MIGRATED_REVID=110356954
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java
index 3ea5106..ab9c57a 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java
@@ -90,7 +90,7 @@
         "test/aspect.bzl",
         "def _impl(target, ctx):",
         "   s = set([target.label])",
-        "   for i in ctx.attr.deps:",
+        "   for i in ctx.rule.attr.deps:",
         "       s += i.target_labels",
         "   return struct(target_labels = s)",
         "",
@@ -154,7 +154,7 @@
         "test/aspect.bzl",
         "def _aspect_impl(target, ctx):",
         "   s = set([target.label])",
-        "   for i in ctx.attr.deps:",
+        "   for i in ctx.rule.attr.deps:",
         "       s += i.target_labels",
         "   return struct(target_labels = s)",
         "",
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 1dc7896..717a132 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -33,6 +33,7 @@
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
 import com.google.devtools.build.lib.rules.SkylarkAttr;
+import com.google.devtools.build.lib.rules.SkylarkAttr.Descriptor;
 import com.google.devtools.build.lib.rules.SkylarkFileType;
 import com.google.devtools.build.lib.rules.SkylarkRuleClassFunctions;
 import com.google.devtools.build.lib.rules.SkylarkRuleClassFunctions.RuleFunction;
@@ -41,6 +42,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.FileTypeSet;
+import com.google.devtools.build.lib.util.Pair;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -211,11 +213,35 @@
         "def _impl(target, ctx):",
         "   pass",
         "my_aspect = aspect(_impl,",
-        "   extra_deps=['//foo/bar:baz']",
-        ")"
-    );
+        "   attrs = { '_extra_deps' : attr.label(default = Label('//foo/bar:baz')) }",
+        ")");
     SkylarkAspect aspect = (SkylarkAspect) ev.lookup("my_aspect");
-    assertThat(aspect.getExtraDeps()).containsExactly(Label.parseAbsolute("//foo/bar:baz"));
+    Pair<String, Descriptor> pair = Iterables.getOnlyElement(aspect.getAttributes());
+    assertThat(pair.first).isEqualTo("$extra_deps");
+    assertThat(pair.second.getAttributeBuilder().build("$extra_deps").getDefaultValue(null))
+        .isEqualTo(Label.parseAbsolute("//foo/bar:baz"));
+  }
+
+  @Test
+  public void testAspectNonImplicitAttribute() throws Exception {
+    checkErrorContains(
+        "Aspect attribute 'extra_deps' must be implicit (its name should start with '_')",
+        "def _impl(target, ctx):",
+        "   pass",
+        "my_aspect = aspect(_impl,",
+        "   attrs = { 'extra_deps' : attr.label(default = Label('//foo/bar:baz')) }",
+        ")");
+  }
+
+  @Test
+  public void testAspectNoDefaultValueAttribute() throws Exception {
+    checkErrorContains(
+        "Aspect attribute '_extra_deps' has no default value",
+        "def _impl(target, ctx):",
+        "   pass",
+        "my_aspect = aspect(_impl,",
+        "   attrs = { '_extra_deps' : attr.label() }",
+        ")");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
index 670029f..bc54518 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
@@ -26,6 +26,7 @@
 import com.google.devtools.build.lib.packages.PackageFactory.PackageContext;
 import com.google.devtools.build.lib.rules.SkylarkModules;
 import com.google.devtools.build.lib.rules.SkylarkRuleContext;
+import com.google.devtools.build.lib.rules.SkylarkRuleContext.Kind;
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
@@ -90,7 +91,7 @@
   }
 
   protected SkylarkRuleContext createRuleContext(String label) throws Exception {
-    return new SkylarkRuleContext(getRuleContextForSkylark(getConfiguredTarget(label)));
+    return new SkylarkRuleContext(getRuleContextForSkylark(getConfiguredTarget(label)), Kind.RULE);
   }
 
   protected Object evalRuleContextCode(String... lines) throws Exception {