Commit abc6ad42 authored by Robert Griesemer's avatar Robert Griesemer

minor changes to walk

R=rsc
http://go/go-review/1012008
parent ba15bbe6
...@@ -38,21 +38,21 @@ func walkFieldList(v Visitor, list []*Field) { ...@@ -38,21 +38,21 @@ func walkFieldList(v Visitor, list []*Field) {
func walkIdentList(v Visitor, list []*Ident) { func walkIdentList(v Visitor, list []*Ident) {
for _, x := range list { for _, x := range list {
walk(v, x); Walk(v, x);
} }
} }
func walkExprList(v Visitor, list []Expr) { func walkExprList(v Visitor, list []Expr) {
for _, x := range list { for _, x := range list {
walk(v, x); Walk(v, x);
} }
} }
func walkStmtList(v Visitor, list []Stmt) { func walkStmtList(v Visitor, list []Stmt) {
for _, s := range list { for _, s := range list {
walk(v, s); Walk(v, s);
} }
} }
...@@ -64,19 +64,12 @@ func walkBlockStmt(v Visitor, b *BlockStmt) { ...@@ -64,19 +64,12 @@ func walkBlockStmt(v Visitor, b *BlockStmt) {
} }
func walk(v Visitor, n Node) { // Walk traverses an AST in depth-first order and invokes v.Visit(n) for each
if n != nil { // non-nil node n encountered, starting with node. If v.Visit(n) returns true,
Walk(v, n); // Walk visits each of the children of 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.
// //
func Walk(v Visitor, node interface{}) { func Walk(v Visitor, node interface{}) {
if !v.Visit(node) { if node != nil && !v.Visit(node) {
return; return;
} }
...@@ -91,7 +84,7 @@ func Walk(v Visitor, node interface{}) { ...@@ -91,7 +84,7 @@ func Walk(v Visitor, node interface{}) {
case *Field: case *Field:
walkCommentGroup(v, n.Doc); walkCommentGroup(v, n.Doc);
walkIdentList(v, n.Names); walkIdentList(v, n.Names);
walk(v, n.Type); Walk(v, n.Type);
for _, x := range n.Tag { for _, x := range n.Tag {
Walk(v, x); Walk(v, x);
} }
...@@ -104,53 +97,53 @@ func Walk(v Visitor, node interface{}) { ...@@ -104,53 +97,53 @@ func Walk(v Visitor, node interface{}) {
} }
case *FuncLit: case *FuncLit:
walk(v, n.Type); Walk(v, n.Type);
walkBlockStmt(v, n.Body); walkBlockStmt(v, n.Body);
case *CompositeLit: case *CompositeLit:
walk(v, n.Type); Walk(v, n.Type);
walkExprList(v, n.Elts); walkExprList(v, n.Elts);
case *ParenExpr: case *ParenExpr:
walk(v, n.X); Walk(v, n.X);
case *SelectorExpr: case *SelectorExpr:
walk(v, n.X); Walk(v, n.X);
if n.Sel != nil { if n.Sel != nil {
Walk(v, n.Sel); Walk(v, n.Sel);
} }
case *IndexExpr: case *IndexExpr:
walk(v, n.X); Walk(v, n.X);
walk(v, n.Index); Walk(v, n.Index);
walk(v, n.End); Walk(v, n.End);
case *TypeAssertExpr: case *TypeAssertExpr:
walk(v, n.X); Walk(v, n.X);
walk(v, n.Type); Walk(v, n.Type);
case *CallExpr: case *CallExpr:
walk(v, n.Fun); Walk(v, n.Fun);
walkExprList(v, n.Args); walkExprList(v, n.Args);
case *StarExpr: case *StarExpr:
walk(v, n.X); Walk(v, n.X);
case *UnaryExpr: case *UnaryExpr:
walk(v, n.X); Walk(v, n.X);
case *BinaryExpr: case *BinaryExpr:
walk(v, n.X); Walk(v, n.X);
walk(v, n.Y); Walk(v, n.Y);
case *KeyValueExpr: case *KeyValueExpr:
walk(v, n.Key); Walk(v, n.Key);
walk(v, n.Value); Walk(v, n.Value);
// Types // Types
case *ArrayType: case *ArrayType:
walk(v, n.Len); Walk(v, n.Len);
walk(v, n.Elt); Walk(v, n.Elt);
case *StructType: case *StructType:
walkFieldList(v, n.Fields); walkFieldList(v, n.Fields);
...@@ -163,25 +156,25 @@ func Walk(v Visitor, node interface{}) { ...@@ -163,25 +156,25 @@ func Walk(v Visitor, node interface{}) {
walkFieldList(v, n.Methods); walkFieldList(v, n.Methods);
case *MapType: case *MapType:
walk(v, n.Key); Walk(v, n.Key);
walk(v, n.Value); Walk(v, n.Value);
case *ChanType: case *ChanType:
walk(v, n.Value); Walk(v, n.Value);
// Statements // Statements
case *DeclStmt: case *DeclStmt:
walk(v, n.Decl); Walk(v, n.Decl);
case *LabeledStmt: case *LabeledStmt:
walkIdent(v, n.Label); walkIdent(v, n.Label);
walk(v, n.Stmt); Walk(v, n.Stmt);
case *ExprStmt: case *ExprStmt:
walk(v, n.X); Walk(v, n.X);
case *IncDecStmt: case *IncDecStmt:
walk(v, n.X); Walk(v, n.X);
case *AssignStmt: case *AssignStmt:
walkExprList(v, n.Lhs); walkExprList(v, n.Lhs);
...@@ -207,18 +200,18 @@ func Walk(v Visitor, node interface{}) { ...@@ -207,18 +200,18 @@ func Walk(v Visitor, node interface{}) {
walkStmtList(v, n.List); walkStmtList(v, n.List);
case *IfStmt: case *IfStmt:
walk(v, n.Init); Walk(v, n.Init);
walk(v, n.Cond); Walk(v, n.Cond);
walkBlockStmt(v, n.Body); walkBlockStmt(v, n.Body);
walk(v, n.Else); Walk(v, n.Else);
case *CaseClause: case *CaseClause:
walkExprList(v, n.Values); walkExprList(v, n.Values);
walkStmtList(v, n.Body); walkStmtList(v, n.Body);
case *SwitchStmt: case *SwitchStmt:
walk(v, n.Init); Walk(v, n.Init);
walk(v, n.Tag); Walk(v, n.Tag);
walkBlockStmt(v, n.Body); walkBlockStmt(v, n.Body);
case *TypeCaseClause: case *TypeCaseClause:
...@@ -226,28 +219,28 @@ func Walk(v Visitor, node interface{}) { ...@@ -226,28 +219,28 @@ func Walk(v Visitor, node interface{}) {
walkStmtList(v, n.Body); walkStmtList(v, n.Body);
case *TypeSwitchStmt: case *TypeSwitchStmt:
walk(v, n.Init); Walk(v, n.Init);
walk(v, n.Assign); Walk(v, n.Assign);
walkBlockStmt(v, n.Body); walkBlockStmt(v, n.Body);
case *CommClause: case *CommClause:
walk(v, n.Lhs); Walk(v, n.Lhs);
walk(v, n.Rhs); Walk(v, n.Rhs);
walkStmtList(v, n.Body); walkStmtList(v, n.Body);
case *SelectStmt: case *SelectStmt:
walkBlockStmt(v, n.Body); walkBlockStmt(v, n.Body);
case *ForStmt: case *ForStmt:
walk(v, n.Init); Walk(v, n.Init);
walk(v, n.Cond); Walk(v, n.Cond);
walk(v, n.Post); Walk(v, n.Post);
walkBlockStmt(v, n.Body); walkBlockStmt(v, n.Body);
case *RangeStmt: case *RangeStmt:
walk(v, n.Key); Walk(v, n.Key);
walk(v, n.Value); Walk(v, n.Value);
walk(v, n.X); Walk(v, n.X);
walkBlockStmt(v, n.Body); walkBlockStmt(v, n.Body);
// Declarations // Declarations
...@@ -263,14 +256,14 @@ func Walk(v Visitor, node interface{}) { ...@@ -263,14 +256,14 @@ func Walk(v Visitor, node interface{}) {
case *ValueSpec: case *ValueSpec:
walkCommentGroup(v, n.Doc); walkCommentGroup(v, n.Doc);
walkIdentList(v, n.Names); walkIdentList(v, n.Names);
walk(v, n.Type); Walk(v, n.Type);
walkExprList(v, n.Values); walkExprList(v, n.Values);
walkCommentGroup(v, n.Comment); walkCommentGroup(v, n.Comment);
case *TypeSpec: case *TypeSpec:
walkCommentGroup(v, n.Doc); walkCommentGroup(v, n.Doc);
walkIdent(v, n.Name); walkIdent(v, n.Name);
walk(v, n.Type); Walk(v, n.Type);
walkCommentGroup(v, n.Comment); walkCommentGroup(v, n.Comment);
case *GenDecl: case *GenDecl:
...@@ -285,7 +278,7 @@ func Walk(v Visitor, node interface{}) { ...@@ -285,7 +278,7 @@ func Walk(v Visitor, node interface{}) {
Walk(v, n.Recv); Walk(v, n.Recv);
} }
walkIdent(v, n.Name); walkIdent(v, n.Name);
walk(v, n.Type); Walk(v, n.Type);
walkBlockStmt(v, n.Body); walkBlockStmt(v, n.Body);
// Files and packages // Files and packages
...@@ -293,7 +286,7 @@ func Walk(v Visitor, node interface{}) { ...@@ -293,7 +286,7 @@ func Walk(v Visitor, node interface{}) {
walkCommentGroup(v, n.Doc); walkCommentGroup(v, n.Doc);
walkIdent(v, n.Name); walkIdent(v, n.Name);
for _, d := range n.Decls { for _, d := range n.Decls {
walk(v, d); Walk(v, d);
} }
walkCommentGroup(v, n.Comments); walkCommentGroup(v, n.Comments);
......
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