in format.go [399:516]
func (un *formatter) visitCallFunc(expr ast.Expr, macro bool) error {
c := expr.AsCall()
fun := c.FunctionName()
args := c.Args()
if c.IsMemberFunction() {
nested := isBinaryOrTernaryOperator(c.Target())
err := un.visitMaybeNested(c.Target(), nested)
if err != nil {
return err
}
un.WriteString(".")
}
if len(args) == 0 {
un.WriteString(fun + "()")
return nil
}
switch {
case macro:
un.WriteString(fun + "(")
// get AST ID for macro. this is not stored in the
// expression, so we need to do a scan of all macros.
var id int64
for candid, cand := range un.info.MacroCalls() {
if expr == cand {
id = candid
break
}
}
base := un.info.GetStartLocation(id).Line()
var (
last int
wasTern bool
)
for i, arg := range args {
var line int
lastLine := un.info.GetStartLocation(un.lastChild(arg).ID()).Line()
if arg.Kind() == ast.CallKind && arg.AsCall().FunctionName() == operators.Conditional {
line = un.info.GetStartLocation(arg.ID()).Line()
if line != lastLine {
wasTern = true
}
} else {
line = lastLine
}
if line != base {
break
}
last = i + 1
}
// write single-line section.
for i, arg := range args[:last] {
err := un.visit(arg, false)
if err != nil {
return err
}
if i < last-1 {
un.WriteString(", ")
}
}
if last != 0 && last < len(args) {
un.WriteString(",")
}
if last == len(args) {
if wasTern {
un.WriteNewLine()
}
un.WriteString(")")
return nil
}
// write multi-line section.
un.indent++
for i, arg := range args[last:] {
un.WriteNewLine()
err := un.visit(arg, false)
if err != nil {
return err
}
if i < len(args[last:])-1 {
un.WriteString(",")
}
}
un.indent--
un.WriteNewLine()
un.WriteString(")")
case un.isMultiline(expr):
un.WriteString(fun + "(")
un.indent++
for i, arg := range args {
un.WriteNewLine()
err := un.visit(arg, false)
if err != nil {
return err
}
if i < len(args)-1 {
un.WriteString(",")
}
}
un.indent--
un.WriteNewLine()
un.WriteString(")")
default:
un.WriteString(fun + "(")
for i, arg := range args {
err := un.visit(arg, false)
if err != nil {
return err
}
if i < len(args)-1 {
un.WriteString(", ")
}
}
un.WriteString(")")
}
return nil
}