aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2015-11-26 11:18:12 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2015-11-26 13:20:30 +0000
commitc1b1eedc14856997d2bf68be5d94f937fb21d3a3 (patch)
tree9ff682be1b4cea1f5c6586efe07f4c50c708d939 /src
parent1d0086089f48c7bf3cd7bedf4ac5412841f884ae (diff)
Implements 'extra_deps' for Skylark aspects.
-- MOS_MIGRATED_REVID=108779139
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java47
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java14
2 files changed, 54 insertions, 7 deletions
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 df27c88169..7d32b7705b 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
@@ -356,20 +356,45 @@ public class SkylarkRuleClassFunctions {
type = SkylarkList.class,
generic1 = String.class,
defaultValue = "[]"
+ ),
+ @Param(
+ name = "extra_deps",
+ type = SkylarkList.class,
+ generic1 = String.class,
+ defaultValue = "[]"
)
},
- useEnvironment = true
+ useEnvironment = true,
+ useAst = true
)
private static final BuiltinFunction aspect =
new BuiltinFunction("aspect") {
public SkylarkAspect invoke(
- BaseFunction implementation, SkylarkList attributeAspects, Environment funcallEnv)
- throws ConversionException {
- ImmutableList.Builder<String> builder = ImmutableList.<String>builder();
+ BaseFunction implementation,
+ SkylarkList attributeAspects,
+ SkylarkList extraDeps,
+ FuncallExpression ast,
+ Environment funcallEnv) throws EvalException {
+ ImmutableList.Builder<String> attributeListBuilder = ImmutableList.builder();
for (Object attributeAspect : attributeAspects) {
- builder.add(STRING.convert(attributeAspect, ""));
+ attributeListBuilder.add(STRING.convert(attributeAspect, "attr_aspects"));
+ }
+ ImmutableList.Builder<Label> extraDepsBuilder = ImmutableList.builder();
+ for (Object extraDep : extraDeps) {
+ String extraDepsString = STRING.convert(extraDep, "extra_deps");
+ Label label;
+ try {
+ label = Label.parseAbsolute(extraDepsString);
+ } catch (LabelSyntaxException e) {
+ throw new EvalException(ast.getLocation(), e.getMessage());
+ }
+ extraDepsBuilder.add(label);
}
- return new SkylarkAspect(implementation, builder.build(), funcallEnv);
+
+ return new SkylarkAspect(implementation,
+ attributeListBuilder.build(),
+ extraDepsBuilder.build(),
+ funcallEnv);
}
};
@@ -433,6 +458,7 @@ public class SkylarkRuleClassFunctions {
}
attributeBuilder.aspect(new SkylarkAspectClass(skylarkAspect));
}
+
addAttribute(definitionLocation, builder,
descriptor.getAttributeBuilder().build(attribute.getFirst()));
}
@@ -609,15 +635,17 @@ public class SkylarkRuleClassFunctions {
public static class SkylarkAspect implements SkylarkValue {
private final BaseFunction implementation;
private final ImmutableList<String> attributeAspects;
+ private final ImmutableList<Label> extraDeps;
private final Environment funcallEnv;
private Exported exported;
public SkylarkAspect(
BaseFunction implementation,
ImmutableList<String> attributeAspects,
- Environment funcallEnv) {
+ ImmutableList<Label> extraDeps, Environment funcallEnv) {
this.implementation = implementation;
this.attributeAspects = attributeAspects;
+ this.extraDeps = extraDeps;
this.funcallEnv = funcallEnv;
}
@@ -633,6 +661,10 @@ public class SkylarkRuleClassFunctions {
return funcallEnv;
}
+ public ImmutableList<Label> getExtraDeps() {
+ return extraDeps;
+ }
+
@Override
public boolean isImmutable() {
return implementation.isImmutable();
@@ -698,6 +730,7 @@ public class SkylarkRuleClassFunctions {
for (String attributeAspect : skylarkAspect.getAttributeAspects()) {
builder.attributeAspect(attributeAspect, this);
}
+ builder.add(attr("$extra_deps", LABEL_LIST).value(skylarkAspect.getExtraDeps()));
this.aspectDefinition = builder.build();
this.extensionLabel = skylarkAspect.getExtensionLabel();
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 83ea26a7f6..17591037fa 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
@@ -32,6 +32,7 @@ import com.google.devtools.build.lib.rules.SkylarkAttr;
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;
+import com.google.devtools.build.lib.rules.SkylarkRuleClassFunctions.SkylarkAspect;
import com.google.devtools.build.lib.skylark.util.SkylarkTestCase;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Type;
@@ -202,6 +203,19 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase {
}
@Test
+ public void testAspectExtraDeps() throws Exception {
+ evalAndExport(
+ "def _impl(target, ctx):",
+ " pass",
+ "my_aspect = aspect(_impl,",
+ " extra_deps=['//foo/bar:baz']",
+ ")"
+ );
+ SkylarkAspect aspect = (SkylarkAspect) ev.lookup("my_aspect");
+ assertThat(aspect.getExtraDeps()).containsExactly(Label.parseAbsolute("//foo/bar:baz"));
+ }
+
+ @Test
public void testNonLabelAttrWithProviders() throws Exception {
checkErrorContains(
"unexpected keyword 'providers' in call to string", "attr.string(providers = ['a'])");