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 @@ ...@@ -89,10 +89,14 @@
If an operand implements interface Formatter, that interface If an operand implements interface Formatter, that interface
can be used for fine control of formatting. 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 will be used to convert the object to a string, which will then
be formatted as required by the verb (if any). To avoid be formatted as required by the verb (if any).
recursion in cases such as
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 type X int
func (x X) String() string { return Sprintf("%d", x) } func (x X) String() string { return Sprintf("%d", x) }
cast the value before recurring: cast the value before recurring:
......
...@@ -630,12 +630,23 @@ func (p *pp) handleMethods(verb rune, plus, goSyntax bool, depth int) (wasString ...@@ -630,12 +630,23 @@ func (p *pp) handleMethods(verb rune, plus, goSyntax bool, depth int) (wasString
return return
} }
} else { } else {
// Is it a Stringer? // Is it an error or Stringer?
if stringer, ok := p.field.(Stringer); ok { // 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 wasString = false
handled = true handled = true
defer p.catchPanic(p.field, verb) 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 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