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:
parent
5a75ac88c9
commit
ae3c9992ae
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user