aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Yun Peng <pcloudy@google.com>2016-02-08 12:36:05 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-02-09 12:16:33 +0000
commit837e8ec5a22e8e3b6d7d90c0494bcf110f96235a (patch)
tree64b8787d0220df10dcd307b79e3ead447fa1b915 /src
parent440965ce5d9411e539818906c28e5972ab9aee45 (diff)
Fixed the inconsistency when using list as the value of output_groups
-- MOS_MIGRATED_REVID=114098483
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
index 124f0f22c7..a07fb061af 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
@@ -23,11 +23,13 @@ import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.RunfilesSupport;
import com.google.devtools.build.lib.analysis.SkylarkProviderValidationUtil;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.rules.SkylarkRuleContext.Kind;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.syntax.BaseFunction;
import com.google.devtools.build.lib.syntax.ClassObject;
import com.google.devtools.build.lib.syntax.ClassObject.SkylarkClassObject;
@@ -37,6 +39,7 @@ import com.google.devtools.build.lib.syntax.EvalExceptionWithStackTrace;
import com.google.devtools.build.lib.syntax.EvalUtils;
import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.syntax.Runtime;
+import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
import com.google.devtools.build.lib.syntax.SkylarkType;
import com.google.devtools.build.lib.syntax.Type;
@@ -153,14 +156,45 @@ public final class SkylarkRuleConfiguredTargetBuilder {
private static void addOutputGroups(Object value, Location loc,
RuleConfiguredTargetBuilder builder)
throws EvalException {
- Map<String, SkylarkNestedSet> outputGroups = SkylarkType
- .castMap(value, String.class, SkylarkNestedSet.class, "output_groups");
+ Map<String, SkylarkValue> outputGroups =
+ SkylarkType.castMap(value, String.class, SkylarkValue.class, "output_groups");
for (String outputGroup : outputGroups.keySet()) {
- SkylarkNestedSet objects = outputGroups.get(outputGroup);
- builder.addOutputGroup(outputGroup,
- SkylarkType.cast(objects, SkylarkNestedSet.class, Artifact.class, loc,
- "Output group '%s'", outputGroup).getSet(Artifact.class));
+ SkylarkValue objects = outputGroups.get(outputGroup);
+ NestedSet<Artifact> artifacts;
+
+ String typeErrorMessage =
+ "Output group '%s' is of unexpected type. "
+ + "Should be list or set of Files, but got '%s' instead.";
+
+ if (objects instanceof SkylarkList) {
+ NestedSetBuilder<Artifact> nestedSetBuilder = NestedSetBuilder.stableOrder();
+ for (Object o : (SkylarkList) objects) {
+ if (o instanceof Artifact) {
+ nestedSetBuilder.add((Artifact) o);
+ } else {
+ throw new EvalException(
+ loc,
+ String.format(
+ typeErrorMessage,
+ outputGroup,
+ "list with an element of " + EvalUtils.getDataTypeNameFromClass(o.getClass())));
+ }
+ }
+ artifacts = nestedSetBuilder.build();
+ } else {
+ artifacts =
+ SkylarkType.cast(
+ objects,
+ SkylarkNestedSet.class,
+ Artifact.class,
+ loc,
+ typeErrorMessage,
+ outputGroup,
+ EvalUtils.getDataTypeName(objects, true))
+ .getSet(Artifact.class);
+ }
+ builder.addOutputGroup(outputGroup, artifacts);
}
}