-
Notifications
You must be signed in to change notification settings - Fork 5
/
expr.go
89 lines (67 loc) · 1.83 KB
/
expr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package astutil
import (
"fmt"
"go/ast"
"strings"
)
//ExprString generates code by ast.Expr like printer.Fprint()
// 经过拼装,可能与源码不完全一致
// TODO 2019.9.28 最开始不知道有 printer 这个包,手写了一坨,后面可能会直接接过去。。
// Deprecated
func ExprString(expr ast.Expr) (name string) {
switch exp := expr.(type) {
// 字面值 literal
case *ast.BasicLit:
name = exp.Value
// a.b
case *ast.SelectorExpr:
name = ExprString(exp.X) + "." + exp.Sel.Name
case *ast.CompositeLit:
name = ExprString(exp.Type) + ExprString(exp.Elts[0])
if len(exp.Elts) > 0 {
elts := make([]string, 0, len(exp.Elts))
for _, elt := range exp.Elts {
elts = append(elts, ExprString(elt))
}
name = `{` + strings.Join(elts, `,`) + `}`
}
case *ast.MapType:
name = fmt.Sprintf("map[%s]%s", ExprString(exp.Key), ExprString(exp.Value))
// @todo interface 先都显示 interface{}
case *ast.InterfaceType:
name = `interface{}`
case *ast.KeyValueExpr:
name = ExprString(exp.Key) + ":" + ExprString(exp.Value)
case *ast.ArrayType:
name = "[" + ExprString(exp.Len) + "]" + ExprString(exp.Elt)
case *ast.StarExpr:
name = "*" + ExprString(exp.X)
// a
case *ast.Ident:
name = exp.Name
case *ast.CallExpr:
name = ExprString(exp.Fun)
name += `(`
if len(exp.Args) > 0 {
args := make([]string, 0, len(exp.Args))
for _, arg := range exp.Args {
args = append(args, ExprString(arg))
}
name += strings.Join(args, `,`)
}
name += `)`
// &a
case *ast.UnaryExpr:
name = "&" + ExprString(exp.X)
// a["3"]
case *ast.IndexExpr:
name = ExprString(exp.X) + "[" + ExprString(exp.Index) + "]"
case *ast.BinaryExpr:
name = ExprString(exp.X) + exp.Op.String() + ExprString(exp.Y)
case nil:
return ""
default:
name = fmt.Sprintf("Unknown(%T)", expr)
}
return
}