1
0
mirror of https://github.com/golang/go synced 2024-11-20 09:54:45 -07:00

- gofmt-ify walk.go

- fixed several bugs

R=rsc
http://go/go-review/1015015
This commit is contained in:
Robert Griesemer 2009-10-26 19:21:13 -07:00
parent 5a75ac88c9
commit ae3c9992ae

View File

@ -69,18 +69,28 @@ func walkBlockStmt(v Visitor, b *BlockStmt) {
// Walk visits each of the children of n. // Walk visits each of the children of n.
// //
func Walk(v Visitor, node interface{}) { func Walk(v Visitor, node interface{}) {
if node != nil && !v.Visit(node) { if node == nil || !v.Visit(node) {
return; return;
} }
// walk children // walk children
// (the order of the cases matches the order
// of the corresponding declaration in ast.go)
switch n := node.(type) { switch n := node.(type) {
// Comments and fields // Comments and fields
case *Comment:
// nothing to do
case *CommentGroup: case *CommentGroup:
for _, c := range n.List { for _, c := range n.List {
Walk(v, c); Walk(v, c);
} }
// TODO(gri): Keep comments in a list/vector instead
// of linking them via Next. Following next will lead
// to multiple visits and potentially n^2 behavior
// since Doc and Comments fields point into the global
// comments list.
case *Field: case *Field:
walkCommentGroup(v, n.Doc); walkCommentGroup(v, n.Doc);
walkIdentList(v, n.Names); walkIdentList(v, n.Names);
@ -91,51 +101,54 @@ func Walk(v Visitor, node interface{}) {
walkCommentGroup(v, n.Comment); walkCommentGroup(v, n.Comment);
// Expressions // Expressions
case *BadExpr, *Ident, *Ellipsis, *BasicLit:
// nothing to do
case *StringList: case *StringList:
for _, x := range n.Strings { for _, x := range n.Strings {
Walk(v, x); Walk(v, x);
} }
case *FuncLit: case *FuncLit:
Walk(v, n.Type); if n != nil {
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 { walkIdent(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);
@ -144,76 +157,82 @@ func Walk(v Visitor, node interface{}) {
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);
case *FuncType: case *FuncType:
walkFieldList(v, n.Params); walkFieldList(v, n.Params);
walkFieldList(v, n.Results); walkFieldList(v, n.Results);
case *InterfaceType: case *InterfaceType:
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 *BadStmt:
// nothing to do
case *DeclStmt: case *DeclStmt:
Walk(v, n.Decl); Walk(v, n.Decl);
case *EmptyStmt:
// nothing to do
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);
walkExprList(v, n.Rhs); walkExprList(v, n.Rhs);
case *GoStmt: case *GoStmt:
if n.Call != nil { if n.Call != nil {
Walk(v, n.Call); Walk(v, n.Call);
} }
case *DeferStmt: case *DeferStmt:
if n.Call != nil { if n.Call != nil {
Walk(v, n.Call); Walk(v, n.Call);
} }
case *ReturnStmt: case *ReturnStmt:
walkExprList(v, n.Results); walkExprList(v, n.Results);
case *BranchStmt: case *BranchStmt:
walkIdent(v, n.Label); walkIdent(v, n.Label);
case *BlockStmt: case *BlockStmt:
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:
walkExprList(v, n.Types); walkExprList(v, n.Types);
walkStmtList(v, n.Body); walkStmtList(v, n.Body);
@ -222,12 +241,12 @@ func Walk(v Visitor, node interface{}) {
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);
@ -236,13 +255,13 @@ func Walk(v Visitor, node interface{}) {
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
case *ImportSpec: case *ImportSpec:
walkCommentGroup(v, n.Doc); walkCommentGroup(v, n.Doc);
@ -251,34 +270,38 @@ func Walk(v Visitor, node interface{}) {
Walk(v, x); Walk(v, x);
} }
walkCommentGroup(v, n.Comment); walkCommentGroup(v, n.Comment);
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 *BadDecl:
// nothing to do
case *GenDecl: case *GenDecl:
walkCommentGroup(v, n.Doc); walkCommentGroup(v, n.Doc);
for _, s := range n.Specs { for _, s := range n.Specs {
Walk(v, s); Walk(v, s);
} }
case *FuncDecl: case *FuncDecl:
walkCommentGroup(v, n.Doc); walkCommentGroup(v, n.Doc);
if n.Recv != nil { if n.Recv != nil {
Walk(v, n.Recv); Walk(v, n.Recv);
} }
walkIdent(v, n.Name); walkIdent(v, n.Name);
Walk(v, n.Type); if n.Type != nil {
Walk(v, n.Type);
}
walkBlockStmt(v, n.Body); walkBlockStmt(v, n.Body);
// Files and packages // Files and packages