func()

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
}