diff options
author | Roger Peppe <rogpeppe@gmail.com> | 2010-01-04 10:34:37 -0800 |
---|---|---|
committer | Roger Peppe <rogpeppe@gmail.com> | 2010-01-04 10:34:37 -0800 |
commit | dbb286face748192e71931027686e41964991f2d (patch) | |
tree | 407f50deb0322873e371046871cb5c362c7ef344 | |
parent | a2063ec068aec730adfaf6def5816164338f9c19 (diff) | |
download | go-dbb286face748192e71931027686e41964991f2d.tar.gz |
Allow a nil Ident to print without crashing.
Allow Walk of []Decl
R=gri
CC=golang-dev, rsc
http://codereview.appspot.com/183112
Committer: Robert Griesemer <gri@golang.org>
-rw-r--r-- | src/pkg/go/ast/ast.go | 9 | ||||
-rw-r--r-- | src/pkg/go/ast/walk.go | 11 |
2 files changed, 14 insertions, 6 deletions
diff --git a/src/pkg/go/ast/ast.go b/src/pkg/go/ast/ast.go index 16a0c66a1..49b92fe28 100644 --- a/src/pkg/go/ast/ast.go +++ b/src/pkg/go/ast/ast.go @@ -357,7 +357,12 @@ func IsExported(name string) bool { // (i.e., whether it begins with an uppercase letter). func (name *Ident) IsExported() bool { return IsExported(name.Value) } -func (name *Ident) String() string { return name.Value } +func (name *Ident) String() string { + if name != nil { + return name.Value + } + return "<nil>" +} // ---------------------------------------------------------------------------- @@ -598,7 +603,7 @@ type ( TypeSpec struct { Doc *CommentGroup // associated documentation; or nil Name *Ident // type name - Type Expr + Type Expr // *ArrayType, *StructType, *FuncType, *InterfaceType, *MapType, *ChanType or *Ident Comment *CommentGroup // line comments; or nil } ) diff --git a/src/pkg/go/ast/walk.go b/src/pkg/go/ast/walk.go index 104596623..33a2d3294 100644 --- a/src/pkg/go/ast/walk.go +++ b/src/pkg/go/ast/walk.go @@ -41,7 +41,7 @@ func walkBlockStmt(v Visitor, b *BlockStmt) { // followed by a call of w.Visit(nil). // // Walk may be called with any of the named ast node types. It also -// accepts arguments of type []*Field, []*Ident, []Expr and []Stmt; +// accepts arguments of type []*Field, []*Ident, []Expr, []Stmt and []Decl; // the respective children are the slice elements. // func Walk(v Visitor, node interface{}) { @@ -291,9 +291,7 @@ func Walk(v Visitor, node interface{}) { case *File: walkCommentGroup(v, n.Doc) walkIdent(v, n.Name) - for _, d := range n.Decls { - Walk(v, d) - } + Walk(v, n.Decls) walkCommentGroup(v, n.Comments) case *Package: @@ -321,6 +319,11 @@ func Walk(v Visitor, node interface{}) { Walk(v, x) } + case []Decl: + for _, x := range n { + Walk(v, x) + } + default: fmt.Printf("ast.Walk: unexpected type %T", n) panic() |