]> Cypherpunks repositories - gostls13.git/commitdiff
minor changes to walk
authorRobert Griesemer <gri@golang.org>
Fri, 23 Oct 2009 01:04:21 +0000 (18:04 -0700)
committerRobert Griesemer <gri@golang.org>
Fri, 23 Oct 2009 01:04:21 +0000 (18:04 -0700)
R=rsc
http://go/go-review/1012008

src/pkg/go/ast/walk.go

index 264bcc34bf98770f9f1d2ac78a8d51842b1438ab..472e6ea17b19cfda230a3e1ba70692c9de6c4cf8 100644 (file)
@@ -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);