in format.go [875:910]
func (un *formatter) lastChild(expr ast.Expr) ast.Expr {
call, ok := un.info.GetMacroCall(expr.ID())
if ok {
return un.lastChild(call)
}
switch expr.Kind() {
case ast.CallKind:
args := expr.AsCall().Args()
if len(args) == 0 {
return expr
}
return un.lastChild(args[len(args)-1])
case ast.ListKind:
elems := expr.AsList().Elements()
if len(elems) == 0 {
return expr
}
return un.lastChild(elems[len(elems)-1])
case ast.MapKind:
entries := expr.AsMap().Entries()
if len(entries) == 0 {
return expr
}
return un.lastChild(entries[len(entries)-1].AsMapEntry().Value())
case ast.SelectKind:
return un.lastChild(expr.AsSelect().Operand())
case ast.StructKind:
fields := expr.AsStruct().Fields()
if len(fields) == 0 {
return expr
}
return un.lastChild(fields[len(fields)-1].AsStructField().Value())
default:
return expr
}
}