diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java | 46 |
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); } } |