From: Robert Griesemer Date: Fri, 31 Jul 2009 02:39:47 +0000 (-0700) Subject: - don't call String method of AST nodes when converting them to text X-Git-Tag: weekly.2009-11-06~1005 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9299ae461d14b2e7564fbd3d82b0ad16d4993ac8;p=gostls13.git - don't call String method of AST nodes when converting them to text - make token.Position.String more robust TBR=rsc DELTA=20 (10 added, 6 deleted, 4 changed) OCL=32564 CL=32564 --- diff --git a/src/cmd/godoc/godoc.go b/src/cmd/godoc/godoc.go index 4fe628fb50..688806c426 100644 --- a/src/cmd/godoc/godoc.go +++ b/src/cmd/godoc/godoc.go @@ -213,19 +213,21 @@ func nodeText(node interface{}) []byte { // Convert x, whatever it is, to text form. func toText(x interface{}) []byte { - type String interface { String() string } + type Stringer interface { String() string } switch v := x.(type) { case []byte: return v; case string: return strings.Bytes(v); - case String: - return strings.Bytes(v.String()); case ast.Decl: return nodeText(v); case ast.Expr: return nodeText(v); + case Stringer: + // last resort (AST nodes get a String method + // from token.Position - don't call that one) + return strings.Bytes(v.String()); } var buf bytes.Buffer; fmt.Fprint(&buf, x); diff --git a/src/pkg/go/token/token.go b/src/pkg/go/token/token.go index 61a0c622c8..32958b53f0 100644 --- a/src/pkg/go/token/token.go +++ b/src/pkg/go/token/token.go @@ -353,15 +353,17 @@ func (pos *Position) IsValid() bool { func (pos *Position) String() string { - s := pos.Filename; - if pos.IsValid() { + if pos != nil { + s := pos.Filename; + if pos.IsValid() { + if s != "" { + s += ":"; + } + s += fmt.Sprintf("%d:%d", pos.Line, pos.Column); + } if s != "" { - s += ":"; + return s; } - s += fmt.Sprintf("%d:%d", pos.Line, pos.Column); - } - if s != "" { - return s; } return ""; }