Commit 0e81e508 authored by Russ Cox's avatar Russ Cox

fmt: handle os.Error values

Handling os.Error is no different than handling fmt.Stringer
here, so the code is redundant now, but it will be necessary
once error goes in.

Adding it now will make gofix fix it.

R=r
CC=golang-dev
https://golang.org/cl/5331045
parent 853c8463
......@@ -89,10 +89,14 @@
If an operand implements interface Formatter, that interface
can be used for fine control of formatting.
If an operand implements method String() string that method
Next, if an operand implements the error interface, the Error method
will be used to convert the object to a string, which will then
be formatted as required by the verb (if any). To avoid
recursion in cases such as
be formatted as required by the verb (if any).
Finally, if an operand implements method String() string that method
will be used to convert the object to a string, which will then
be formatted as required by the verb (if any).
To avoid recursion in cases such as
type X int
func (x X) String() string { return Sprintf("%d", x) }
cast the value before recurring:
......
......@@ -630,12 +630,23 @@ func (p *pp) handleMethods(verb rune, plus, goSyntax bool, depth int) (wasString
return
}
} else {
// Is it a Stringer?
if stringer, ok := p.field.(Stringer); ok {
// Is it an error or Stringer?
// The duplication in the bodies is necessary:
// setting wasString and handled and deferring catchPanic
// must happen before calling the method.
switch v := p.field.(type) {
case os.Error:
wasString = false
handled = true
defer p.catchPanic(p.field, verb)
p.printField(stringer.String(), verb, plus, false, depth)
p.printField(v.String(), verb, plus, false, depth)
return
case Stringer:
wasString = false
handled = true
defer p.catchPanic(p.field, verb)
p.printField(v.String(), verb, plus, false, depth)
return
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment