From: Robert Griesemer Date: Fri, 23 Oct 2009 01:04:21 +0000 (-0700) Subject: minor changes to walk X-Git-Tag: weekly.2009-11-06~220 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=abc6ad427d96138ef5a3c8fdb9d2f6d5ab9a2bbb;p=gostls13.git minor changes to walk R=rsc http://go/go-review/1012008 --- diff --git a/src/pkg/go/ast/walk.go b/src/pkg/go/ast/walk.go index 264bcc34bf..472e6ea17b 100644 --- a/src/pkg/go/ast/walk.go +++ b/src/pkg/go/ast/walk.go @@ -38,21 +38,21 @@ func walkFieldList(v Visitor, list []*Field) { func walkIdentList(v Visitor, list []*Ident) { for _, x := range list { - walk(v, x); + Walk(v, x); } } func walkExprList(v Visitor, list []Expr) { for _, x := range list { - walk(v, x); + Walk(v, x); } } func walkStmtList(v Visitor, list []Stmt) { for _, s := range list { - walk(v, s); + Walk(v, s); } } @@ -64,19 +64,12 @@ func walkBlockStmt(v Visitor, b *BlockStmt) { } -func walk(v Visitor, n Node) { - if n != nil { - Walk(v, n); - } -} - - -// Walk recursively traverses an AST invokes v.Visit(n) for each -// node n encountered (starting with node). If v.Visit(n) returns -// true, Walk is invoked for each of the children of n. +// Walk traverses an AST in depth-first order and invokes v.Visit(n) for each +// non-nil node n encountered, starting with node. If v.Visit(n) returns true, +// Walk visits each of the children of n. // func Walk(v Visitor, node interface{}) { - if !v.Visit(node) { + if node != nil && !v.Visit(node) { return; } @@ -91,7 +84,7 @@ func Walk(v Visitor, node interface{}) { case *Field: walkCommentGroup(v, n.Doc); walkIdentList(v, n.Names); - walk(v, n.Type); + Walk(v, n.Type); for _, x := range n.Tag { Walk(v, x); } @@ -104,53 +97,53 @@ func Walk(v Visitor, node interface{}) { } case *FuncLit: - walk(v, n.Type); + Walk(v, n.Type); walkBlockStmt(v, n.Body); case *CompositeLit: - walk(v, n.Type); + Walk(v, n.Type); walkExprList(v, n.Elts); case *ParenExpr: - walk(v, n.X); + Walk(v, n.X); case *SelectorExpr: - walk(v, n.X); + Walk(v, n.X); if n.Sel != nil { Walk(v, n.Sel); } case *IndexExpr: - walk(v, n.X); - walk(v, n.Index); - walk(v, n.End); + Walk(v, n.X); + Walk(v, n.Index); + Walk(v, n.End); case *TypeAssertExpr: - walk(v, n.X); - walk(v, n.Type); + Walk(v, n.X); + Walk(v, n.Type); case *CallExpr: - walk(v, n.Fun); + Walk(v, n.Fun); walkExprList(v, n.Args); case *StarExpr: - walk(v, n.X); + Walk(v, n.X); case *UnaryExpr: - walk(v, n.X); + Walk(v, n.X); case *BinaryExpr: - walk(v, n.X); - walk(v, n.Y); + Walk(v, n.X); + Walk(v, n.Y); case *KeyValueExpr: - walk(v, n.Key); - walk(v, n.Value); + Walk(v, n.Key); + Walk(v, n.Value); // Types case *ArrayType: - walk(v, n.Len); - walk(v, n.Elt); + Walk(v, n.Len); + Walk(v, n.Elt); case *StructType: walkFieldList(v, n.Fields); @@ -163,25 +156,25 @@ func Walk(v Visitor, node interface{}) { walkFieldList(v, n.Methods); case *MapType: - walk(v, n.Key); - walk(v, n.Value); + Walk(v, n.Key); + Walk(v, n.Value); case *ChanType: - walk(v, n.Value); + Walk(v, n.Value); // Statements case *DeclStmt: - walk(v, n.Decl); + Walk(v, n.Decl); case *LabeledStmt: walkIdent(v, n.Label); - walk(v, n.Stmt); + Walk(v, n.Stmt); case *ExprStmt: - walk(v, n.X); + Walk(v, n.X); case *IncDecStmt: - walk(v, n.X); + Walk(v, n.X); case *AssignStmt: walkExprList(v, n.Lhs); @@ -207,18 +200,18 @@ func Walk(v Visitor, node interface{}) { walkStmtList(v, n.List); case *IfStmt: - walk(v, n.Init); - walk(v, n.Cond); + Walk(v, n.Init); + Walk(v, n.Cond); walkBlockStmt(v, n.Body); - walk(v, n.Else); + Walk(v, n.Else); case *CaseClause: walkExprList(v, n.Values); walkStmtList(v, n.Body); case *SwitchStmt: - walk(v, n.Init); - walk(v, n.Tag); + Walk(v, n.Init); + Walk(v, n.Tag); walkBlockStmt(v, n.Body); case *TypeCaseClause: @@ -226,28 +219,28 @@ func Walk(v Visitor, node interface{}) { walkStmtList(v, n.Body); case *TypeSwitchStmt: - walk(v, n.Init); - walk(v, n.Assign); + Walk(v, n.Init); + Walk(v, n.Assign); walkBlockStmt(v, n.Body); case *CommClause: - walk(v, n.Lhs); - walk(v, n.Rhs); + Walk(v, n.Lhs); + Walk(v, n.Rhs); walkStmtList(v, n.Body); case *SelectStmt: walkBlockStmt(v, n.Body); case *ForStmt: - walk(v, n.Init); - walk(v, n.Cond); - walk(v, n.Post); + Walk(v, n.Init); + Walk(v, n.Cond); + Walk(v, n.Post); walkBlockStmt(v, n.Body); case *RangeStmt: - walk(v, n.Key); - walk(v, n.Value); - walk(v, n.X); + Walk(v, n.Key); + Walk(v, n.Value); + Walk(v, n.X); walkBlockStmt(v, n.Body); // Declarations @@ -263,14 +256,14 @@ func Walk(v Visitor, node interface{}) { case *ValueSpec: walkCommentGroup(v, n.Doc); walkIdentList(v, n.Names); - walk(v, n.Type); + Walk(v, n.Type); walkExprList(v, n.Values); walkCommentGroup(v, n.Comment); case *TypeSpec: walkCommentGroup(v, n.Doc); walkIdent(v, n.Name); - walk(v, n.Type); + Walk(v, n.Type); walkCommentGroup(v, n.Comment); case *GenDecl: @@ -285,7 +278,7 @@ func Walk(v Visitor, node interface{}) { Walk(v, n.Recv); } walkIdent(v, n.Name); - walk(v, n.Type); + Walk(v, n.Type); walkBlockStmt(v, n.Body); // Files and packages @@ -293,7 +286,7 @@ func Walk(v Visitor, node interface{}) { walkCommentGroup(v, n.Doc); walkIdent(v, n.Name); for _, d := range n.Decls { - walk(v, d); + Walk(v, d); } walkCommentGroup(v, n.Comments);