-
Notifications
You must be signed in to change notification settings - Fork 0
/
ast_test.go
125 lines (106 loc) · 2.29 KB
/
ast_test.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package ag
import (
"go/ast"
"go/parser"
"go/token"
"testing"
)
// @Enum eabc
type Eabc int
// @Enum abc
type Abc struct {
}
func (abc *Abc) Init(
// @Enum a
a int,
b int, // @Enum b
) {
}
func TestAAA(t *testing.T) {
const src = `package main
//ExampleFunction is an example
func ExampleFunction(
//Param1 is the first param
Param1 int,
// Param2 is for aaa
// @Enum Param2 is the second param
Param2 string, // @123
) {
//function body
}`
// 创建一个新的token.FileSet
fset := token.NewFileSet()
// 解析源码以获得AST
file, err := parser.ParseFile(fset, "", src, parser.ParseComments)
//file, err := ast.ParseFile(fset, "./annotation.go", nil, ast.ParseComments)
if err != nil {
panic(err)
}
// 遍历AST中的所有声明
for _, decl := range file.Decls {
// 确保声明是函数
if fn, ok := decl.(*ast.FuncDecl); ok {
// 遍历函数的参数
for _, field := range fn.Type.Params.List {
for _, name := range field.Names {
// 找到Param2参数
if name.Name == "Param2" {
// 获取Param2参数的位置
}
}
}
}
}
}
func TestInspectAnnotation(t *testing.T) {
const src = `package main
// @Enum{cat, dog}
type MyEnum int
const (
MyEnumA MyEnum = 0
MyEnumB MyEnum = 1
)
// @Singleton
// struct doc comment
type MyInitTest struct {
Name string
} // struct inline comment
func (m *MyInitTest) Init(
abc int, // @V("123")
ddd string, // @V(abc)
) {
}
func (m MyInitTest) Init1(
abc int, // @V("123")
) {
}
//ExampleFunction is an example
func ExampleFunction(
//Param1 is the first param
Param1 int,
// Param2 is for aaa
// @Enum Param2 is the second param
Param2 string, // @123
) {
//function body
}
func abc(){}
`
// 创建一个新的token.FileSet
fset := token.NewFileSet()
// 解析源码以获得AST
_, err := parser.ParseFile(fset, "", src, parser.ParseComments)
//file, err := ast.ParseFile(fset, "./annotation.go", nil, ast.ParseComments)
if err != nil {
panic(err)
}
//InspectMapper[ast.TypeSpec, any](file, fset, func(x *ast.TypeSpec) *any {
// fmt.Printf("InspectMapper.TypeSpec: %#v\n", x)
// return nil
//})
//
//InspectMapper[ast.FuncDecl, any](file, fset, func(x *ast.FuncDecl) *any {
// fmt.Printf("InspectMapper.FuncDecl: %#v\n", x)
// return nil
//})
}