11 var astTypes = map[string]reflect.Type{
12 "Ellipsis": reflect.TypeOf(ast.Ellipsis{}),
13 "RangeStmt": reflect.TypeOf(ast.RangeStmt{}),
14 "AssignStmt": reflect.TypeOf(ast.AssignStmt{}),
15 "IndexExpr": reflect.TypeOf(ast.IndexExpr{}),
16 "Ident": reflect.TypeOf(ast.Ident{}),
17 "ValueSpec": reflect.TypeOf(ast.ValueSpec{}),
18 "GenDecl": reflect.TypeOf(ast.GenDecl{}),
19 "BinaryExpr": reflect.TypeOf(ast.BinaryExpr{}),
20 "ForStmt": reflect.TypeOf(ast.ForStmt{}),
21 "ArrayType": reflect.TypeOf(ast.ArrayType{}),
22 "DeferStmt": reflect.TypeOf(ast.DeferStmt{}),
23 "MapType": reflect.TypeOf(ast.MapType{}),
24 "ReturnStmt": reflect.TypeOf(ast.ReturnStmt{}),
25 "SliceExpr": reflect.TypeOf(ast.SliceExpr{}),
26 "StarExpr": reflect.TypeOf(ast.StarExpr{}),
27 "UnaryExpr": reflect.TypeOf(ast.UnaryExpr{}),
28 "SendStmt": reflect.TypeOf(ast.SendStmt{}),
29 "SelectStmt": reflect.TypeOf(ast.SelectStmt{}),
30 "ImportSpec": reflect.TypeOf(ast.ImportSpec{}),
31 "IfStmt": reflect.TypeOf(ast.IfStmt{}),
32 "GoStmt": reflect.TypeOf(ast.GoStmt{}),
33 "Field": reflect.TypeOf(ast.Field{}),
34 "SelectorExpr": reflect.TypeOf(ast.SelectorExpr{}),
35 "StructType": reflect.TypeOf(ast.StructType{}),
36 "KeyValueExpr": reflect.TypeOf(ast.KeyValueExpr{}),
37 "FuncType": reflect.TypeOf(ast.FuncType{}),
38 "FuncLit": reflect.TypeOf(ast.FuncLit{}),
39 "FuncDecl": reflect.TypeOf(ast.FuncDecl{}),
40 "ChanType": reflect.TypeOf(ast.ChanType{}),
41 "CallExpr": reflect.TypeOf(ast.CallExpr{}),
42 "CaseClause": reflect.TypeOf(ast.CaseClause{}),
43 "CommClause": reflect.TypeOf(ast.CommClause{}),
44 "CompositeLit": reflect.TypeOf(ast.CompositeLit{}),
45 "EmptyStmt": reflect.TypeOf(ast.EmptyStmt{}),
46 "SwitchStmt": reflect.TypeOf(ast.SwitchStmt{}),
47 "TypeSwitchStmt": reflect.TypeOf(ast.TypeSwitchStmt{}),
48 "TypeAssertExpr": reflect.TypeOf(ast.TypeAssertExpr{}),
49 "TypeSpec": reflect.TypeOf(ast.TypeSpec{}),
50 "InterfaceType": reflect.TypeOf(ast.InterfaceType{}),
51 "BranchStmt": reflect.TypeOf(ast.BranchStmt{}),
52 "IncDecStmt": reflect.TypeOf(ast.IncDecStmt{}),
53 "BasicLit": reflect.TypeOf(ast.BasicLit{}),
56 func ASTToNode(node interface{}) Node {
57 switch node := node.(type) {
59 panic("cannot convert *ast.File to Node")
67 return ASTToNode(node.X)
72 return ASTToNode(node.List)
77 return ASTToNode(node.List)
83 return ASTToNode(node.X)
86 if node, ok := node.(ast.Node); ok {
87 name := reflect.TypeOf(node).Elem().Name()
88 T, ok := structNodes[name]
90 panic(fmt.Sprintf("internal error: unhandled type %T", node))
93 if reflect.ValueOf(node).IsNil() {
96 v := reflect.ValueOf(node).Elem()
97 objs := make([]Node, T.NumField())
98 for i := 0; i < T.NumField(); i++ {
99 f := v.FieldByName(T.Field(i).Name)
100 objs[i] = ASTToNode(f.Interface())
103 n, err := populateNode(name, objs, false)
105 panic(fmt.Sprintf("internal error: %s", err))
110 s := reflect.ValueOf(node)
111 if s.Kind() == reflect.Slice {
116 return ASTToNode(s.Index(0).Interface())
120 for i := s.Len() - 1; i >= 0; i-- {
121 head := ASTToNode(s.Index(i).Interface())
131 panic(fmt.Sprintf("internal error: unhandled type %T", node))
134 func NodeToAST(node Node, state State) interface{} {
135 switch node := node.(type) {
137 v, ok := state[node.Name]
139 // really we want to return an error here
142 switch v := v.(type) {
144 return &ast.Ident{Name: v.Name()}
148 case Builtin, Any, Object, Function, Not, Or:
151 if (node == List{}) {
154 x := []ast.Node{NodeToAST(node.Head, state).(ast.Node)}
155 x = append(x, NodeToAST(node.Tail, state).([]ast.Node)...)
158 return token.Token(node)
165 name := reflect.TypeOf(node).Name()
166 T, ok := astTypes[name]
168 panic(fmt.Sprintf("internal error: unhandled type %T", node))
170 v := reflect.ValueOf(node)
171 out := reflect.New(T)
172 for i := 0; i < T.NumField(); i++ {
173 fNode := v.FieldByName(T.Field(i).Name)
174 if (fNode == reflect.Value{}) {
177 fAST := out.Elem().FieldByName(T.Field(i).Name)
178 switch fAST.Type().Kind() {
180 c := reflect.ValueOf(NodeToAST(fNode.Interface().(Node), state))
181 if c.Kind() != reflect.Slice {
182 // it's a single node in the pattern, we have to wrap
184 slice := reflect.MakeSlice(fAST.Type(), 1, 1)
185 slice.Index(0).Set(c)
188 switch fAST.Interface().(type) {
190 switch cc := c.Interface().(type) {
195 for _, el := range cc {
196 slice = append(slice, el)
198 fAST.Set(reflect.ValueOf(slice))
203 switch cc := c.Interface().(type) {
206 for _, el := range cc {
207 slice = append(slice, el.(ast.Expr))
209 fAST.Set(reflect.ValueOf(slice))
219 c := reflect.ValueOf(NodeToAST(fNode.Interface().(Node), state))
222 tok, ok := tokensByString[c.Interface().(string)]
224 // really we want to return an error here
227 fAST.SetInt(int64(tok))
231 panic(fmt.Sprintf("internal error: unexpected kind %s", c.Kind()))
234 r := NodeToAST(fNode.Interface().(Node), state)
236 fAST.Set(reflect.ValueOf(r))
241 return out.Interface().(ast.Node)