The sorted function now accepts sets and dictionaries inputs.
--
MOS_MIGRATED_REVID=101208507
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
index c166d80..a1aebbb 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
@@ -638,67 +638,88 @@
};
// slice operator
- @SkylarkSignature(name = "$slice", documented = false,
- mandatoryPositionals = {
- @Param(name = "self", type = Object.class, doc = "This string, list or tuple."),
- @Param(name = "start", type = Integer.class, doc = "start position of the slice."),
- @Param(name = "end", type = Integer.class, doc = "end position of the slice.")},
- doc = "x[<code>start</code>:<code>end</code>] returns a slice or a list slice.",
- useLocation = true, useEnvironment = true)
- private static BuiltinFunction slice = new BuiltinFunction("$slice") {
- public Object invoke(Object self, Integer left, Integer right,
- Location loc, Environment env) throws EvalException, ConversionException {
- // Substring
- if (self instanceof String) {
- return pythonSubstring((String) self, left, right, "");
- }
+ @SkylarkSignature(
+ name = "$slice",
+ documented = false,
+ mandatoryPositionals = {
+ @Param(name = "self", type = Object.class, doc = "This string, list or tuple."),
+ @Param(name = "start", type = Integer.class, doc = "start position of the slice."),
+ @Param(name = "end", type = Integer.class, doc = "end position of the slice.")
+ },
+ doc = "x[<code>start</code>:<code>end</code>] returns a slice or a list slice.",
+ useLocation = true,
+ useEnvironment = true
+ )
+ private static BuiltinFunction slice =
+ new BuiltinFunction("$slice") {
+ public Object invoke(
+ Object self, Integer left, Integer right, Location loc, Environment env)
+ throws EvalException, ConversionException {
+ // Substring
+ if (self instanceof String) {
+ return pythonSubstring((String) self, left, right, "");
+ }
- // List slice
- List<Object> list = Type.OBJECT_LIST.convert(self, "list operand");
- left = clampIndex(left, list.size());
- right = clampIndex(right, list.size());
- if (left > right) {
- left = right;
- }
- return convert(list.subList(left, right), env, loc);
- }
- };
+ // List slice
+ List<Object> list = Type.OBJECT_LIST.convert(self, "list operand");
+ left = clampIndex(left, list.size());
+ right = clampIndex(right, list.size());
+ if (left > right) {
+ left = right;
+ }
+ return convert(list.subList(left, right), env, loc);
+ }
+ };
// supported list methods
- @SkylarkSignature(name = "sorted", returnType = HackHackEitherList.class,
- doc = "Sort a collection. Elements are sorted first by their type, "
- + "then by their value (in ascending order).",
- mandatoryPositionals = {
- @Param(name = "self", type = HackHackEitherList.class, doc = "This list.")},
- useLocation = true, useEnvironment = true)
- private static BuiltinFunction sorted = new BuiltinFunction("sorted") {
- public Object invoke(Object self, Location loc, Environment env)
- throws EvalException, ConversionException {
- List<Object> list = Type.OBJECT_LIST.convert(self, "'sorted' operand");
- try {
- list = Ordering.from(EvalUtils.SKYLARK_COMPARATOR).sortedCopy(list);
- } catch (EvalUtils.ComparisonException e) {
- throw new EvalException(loc, e);
- }
- return convert(list, env, loc);
- }
- };
+ @SkylarkSignature(
+ name = "sorted",
+ returnType = HackHackEitherList.class,
+ doc =
+ "Sort a collection. Elements are sorted first by their type, "
+ + "then by their value (in ascending order).",
+ mandatoryPositionals = {@Param(name = "self", type = Object.class, doc = "This collection.")},
+ useLocation = true,
+ useEnvironment = true
+ )
+ private static BuiltinFunction sorted =
+ new BuiltinFunction("sorted") {
+ public Object invoke(Object self, Location loc, Environment env)
+ throws EvalException, ConversionException {
+ try {
+ Collection<?> col =
+ Ordering.from(EvalUtils.SKYLARK_COMPARATOR)
+ .sortedCopy(EvalUtils.toCollection(self, loc));
+ return convert(col, env, loc);
+ } catch (EvalUtils.ComparisonException e) {
+ throw new EvalException(loc, e);
+ }
+ }
+ };
// This function has a SkylarkSignature but is only used by the Build language, not Skylark.
- @SkylarkSignature(name = "append", returnType = Environment.NoneType.class, documented = false,
- doc = "Adds an item to the end of the list.",
- mandatoryPositionals = {
- // we use List rather than SkylarkList because this is actually for use *outside* Skylark
- @Param(name = "self", type = List.class, doc = "This list."),
- @Param(name = "item", type = Object.class, doc = "Item to add at the end.")},
- useLocation = true, useEnvironment = true)
- private static BuiltinFunction append = new BuiltinFunction("append") {
- public Environment.NoneType invoke(List<Object> self, Object item,
- Location loc, Environment env) throws EvalException, ConversionException {
- self.add(item);
- return Environment.NONE;
- }
- };
+ @SkylarkSignature(
+ name = "append",
+ returnType = Environment.NoneType.class,
+ documented = false,
+ doc = "Adds an item to the end of the list.",
+ mandatoryPositionals = {
+ // we use List rather than SkylarkList because this is actually for use *outside* Skylark
+ @Param(name = "self", type = List.class, doc = "This list."),
+ @Param(name = "item", type = Object.class, doc = "Item to add at the end.")
+ },
+ useLocation = true,
+ useEnvironment = true
+ )
+ private static BuiltinFunction append =
+ new BuiltinFunction("append") {
+ public Environment.NoneType invoke(
+ List<Object> self, Object item, Location loc, Environment env)
+ throws EvalException, ConversionException {
+ self.add(item);
+ return Environment.NONE;
+ }
+ };
// This function has a SkylarkSignature but is only used by the Build language, not Skylark.
@SkylarkSignature(name = "extend", returnType = Environment.NoneType.class, documented = false,