Skip to content

Commit

Permalink
Simplified code to use Children() instead of type switches
Browse files Browse the repository at this point in the history
  • Loading branch information
elliotchance committed Aug 28, 2017
1 parent c2f47ef commit 16715db
Show file tree
Hide file tree
Showing 14 changed files with 78 additions and 400 deletions.
326 changes: 2 additions & 324 deletions ast/traverse.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,330 +16,8 @@ func GetAllNodesOfType(root Node, t reflect.Type) []Node {
nodes = append(nodes, root)
}

// I know that below looks like a lot of duplicate code. However, the ast
// package will evolve so that the Children attribute only appears on a
// handful of nodes. And each of those attributes will be listed below.
//
// I would also like to minimise the amount of places we need to have these
// comprehensive switch statements. Code that exists now or in the future
// should try to traverse package instead.
switch n := root.(type) {
case *AlignedAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *AlwaysInlineAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ArraySubscriptExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *AsmLabelAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *AvailabilityAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *BinaryOperator:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *BreakStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *BuiltinType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *CallExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *CaseStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *CharacterLiteral:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *CompoundStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ConditionalOperator:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ConstAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ConstantArrayType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ContinueStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *CompoundAssignOperator:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *CStyleCastExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *DeclRefExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *DeclStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *DefaultStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *DeprecatedAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *DoStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ElaboratedType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *Enum:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *EnumConstantDecl:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *EnumDecl:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *EnumType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *FieldDecl:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *FloatingLiteral:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *FormatAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *FunctionDecl:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *FunctionProtoType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ForStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *GotoStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *IfStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ImplicitCastExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ImplicitValueInitExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *IncompleteArrayType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *InitListExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *IntegerLiteral:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *LabelStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *MallocAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *MaxFieldAlignmentAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *MemberExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ModeAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *NoInlineAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *NoThrowAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *NonNullAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *OffsetOfExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *PackedAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ParenExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ParenType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ParmVarDecl:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *PointerType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *PredefinedExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *PureAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *QualType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *Record:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *RecordDecl:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *RecordType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *RestrictAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ReturnStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *ReturnsTwiceAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *StringLiteral:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *SwitchStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *TranslationUnitDecl:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *TransparentUnionAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *Typedef:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *TypedefDecl:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *TypedefType:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *UnaryExprOrTypeTraitExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *UnaryOperator:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *VAArgExpr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *VarDecl:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *WeakAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *WarnUnusedResultAttr:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case *WhileStmt:
for _, c := range n.ChildNodes {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}
case nil:
// Do nothing
default:
panic(n)
for _, c := range root.Children() {
nodes = append(nodes, GetAllNodesOfType(c, t)...)
}

return nodes
Expand Down
2 changes: 1 addition & 1 deletion program/struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ type Struct struct {
func NewStruct(n *ast.RecordDecl) *Struct {
fields := make(map[string]interface{})

for _, field := range n.ChildNodes {
for _, field := range n.Children() {
switch f := field.(type) {
case *ast.FieldDecl:
fields[f.Name] = f.Type
Expand Down
Loading

0 comments on commit 16715db

Please sign in to comment.