...
1
16
17 package build
18
19
20 func GetParamName(param Expr) (name, op string) {
21 ident, op := GetParamIdent(param)
22 if ident == nil {
23 return "", ""
24 }
25 return ident.Name, op
26 }
27
28
29 func GetParamIdent(param Expr) (ident *Ident, op string) {
30 switch param := param.(type) {
31 case *Ident:
32 return param, ""
33 case *TypedIdent:
34 return param.Ident, ""
35 case *AssignExpr:
36
37 return GetParamIdent(param.LHS)
38 case *UnaryExpr:
39
40 if param.X == nil {
41
42 break
43 }
44 ident, _ := GetParamIdent(param.X)
45 return ident, param.Op
46 }
47 return nil, ""
48 }
49
50
51
52
53
54
55 func GetTypes(t Expr) []string {
56 switch t := t.(type) {
57 case *TypedIdent:
58 return GetTypes(t.Type)
59 case *Ident:
60 return []string{t.Name}
61 case *DefStmt:
62 ret := GetTypes(t.Type)
63 params := make([]string, 0)
64 for _, p := range t.Params {
65 params = append(params, GetTypes(p)...)
66 }
67 return append(ret, params...)
68 case *IndexExpr:
69 left := GetTypes(t.X)
70 right := GetTypes(t.Y)
71 return append(left, right...)
72 case *DotExpr:
73
74 if t.Name == "type" {
75 return GetTypes(t.X)
76 }
77 return []string{}
78 default:
79 return []string{}
80 }
81 }
82
View as plain text