in build/rewrite.go [380:444]
func sortStringLists(f *File) {
Walk(f, func(v Expr, stk []Expr) {
switch v := v.(type) {
case *CallExpr:
if f.Type == TypeDefault || f.Type == TypeBzl {
// Rule parameters, not applicable to .bzl or default file types
return
}
if leaveAlone(stk, v) {
return
}
rule := callName(v)
for _, arg := range v.List {
if leaveAlone1(arg) {
continue
}
as, ok := arg.(*AssignExpr)
if !ok || leaveAlone1(as) {
continue
}
key, ok := as.LHS.(*Ident)
if !ok {
continue
}
context := rule + "." + key.Name
if tables.SortableDenylist[context] {
continue
}
if tables.IsSortableListArg[key.Name] ||
tables.SortableAllowlist[context] ||
(!disabled("unsafesort") && allowedSort(context)) {
if doNotSort(as) {
deduplicateStringList(as.RHS)
} else {
SortStringList(as.RHS)
}
}
}
case *AssignExpr:
if disabled("unsafesort") {
return
}
// "keep sorted" comment on x = list forces sorting of list.
if keepSorted(v) {
SortStringList(v.RHS)
}
case *KeyValueExpr:
if disabled("unsafesort") {
return
}
// "keep sorted" before key: list also forces sorting of list.
if keepSorted(v) {
SortStringList(v.Value)
}
case *ListExpr:
if disabled("unsafesort") {
return
}
// "keep sorted" comment above first list element also forces sorting of list.
if len(v.List) > 0 && (keepSorted(v) || keepSorted(v.List[0])) {
SortStringList(v)
}
}
})
}