aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Laurent Le Brun <laurentlb@google.com>2015-04-01 12:48:27 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-04-01 15:36:36 +0000
commitaef370e27ca1cdfac6b89ecd7f91c5a097cb1e1d (patch)
tree607995687b9d515d39d52c69f1ed3b80c7c023cb /src/main/java/com
parentd52d32ef0ecfc0d784ec2fd0f1b4dcbbc03aa389 (diff)
Skylark: Make ctx.attr.<attr_name> return Targets instead of Labels.
Careful, this is a breaking change. To get the Label value as before, use ctx.attr.<labelattr>.label. The goal is to remove ctx.targets and simplify access to label attributes. -- MOS_MIGRATED_REVID=90056829
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
index b4af0191db..1b3ee1d140 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
@@ -184,7 +184,7 @@ public final class SkylarkRuleContext {
artifactLabelMap = artifactLabelMapBuilder.build();
outputsObject = new SkylarkClassObject(outputsBuilder, "No such output '%s'");
- ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
+ ImmutableMap.Builder<String, Object> attrBuilder = new ImmutableMap.Builder<>();
ImmutableMap.Builder<String, Object> executableBuilder = new ImmutableMap.Builder<>();
ImmutableMap.Builder<Artifact, FilesToRunProvider> executableRunfilesbuilder =
new ImmutableMap.Builder<>();
@@ -195,10 +195,10 @@ public final class SkylarkRuleContext {
for (Attribute a : ruleContext.getRule().getAttributes()) {
Type<?> type = a.getType();
Object val = ruleContext.attributes().get(a.getName(), type);
- builder.put(attributeToSkylark(a.getName()), val == null ? Environment.NONE
- // Attribute values should be type safe
- : SkylarkType.convertToSkylark(val, null));
if (type != Type.LABEL && type != Type.LABEL_LIST) {
+ attrBuilder.put(attributeToSkylark(a.getName()), val == null ? Environment.NONE
+ // Attribute values should be type safe
+ : SkylarkType.convertToSkylark(val, null));
continue;
}
String skyname = attributeToSkylark(a.getName());
@@ -224,18 +224,21 @@ public final class SkylarkRuleContext {
}
}
filesBuilder.put(skyname, ruleContext.getPrerequisiteArtifacts(a.getName(), mode).list());
- targetsBuilder.put(skyname, SkylarkList.list(
- ruleContext.getPrerequisites(a.getName(), mode), TransitiveInfoCollection.class));
+ List<?> allPrereq = ruleContext.getPrerequisites(a.getName(), mode);
+ targetsBuilder.put(skyname, SkylarkList.list(allPrereq, TransitiveInfoCollection.class));
if (type == Type.LABEL) {
Object prereq = ruleContext.getPrerequisite(a.getName(), mode);
- if (prereq != null) {
- targetBuilder.put(skyname, prereq);
- } else {
- targetBuilder.put(skyname, Environment.NONE);
+ if (prereq == null) {
+ prereq = Environment.NONE;
}
+ targetBuilder.put(skyname, prereq);
+ attrBuilder.put(skyname, prereq);
+ } else {
+ // Type.LABEL_LIST
+ attrBuilder.put(skyname, SkylarkList.list(allPrereq, TransitiveInfoCollection.class));
}
}
- attrObject = new SkylarkClassObject(builder.build(), "No such attribute '%s'");
+ attrObject = new SkylarkClassObject(attrBuilder.build(), "No such attribute '%s'");
executableObject = new SkylarkClassObject(executableBuilder.build(), "No such executable. "
+ "Make sure there is a '%s' label type attribute marked as 'executable'");
fileObject = new SkylarkClassObject(fileBuilder.build(),