1
1
package ast
2
2
3
3
import (
4
+ "fmt"
4
5
"go/ast"
5
6
"go/token"
6
7
"io"
@@ -39,179 +40,80 @@ func (a *PackageInitializeRouter) Parse(filename string, writer io.Writer) (file
39
40
}
40
41
41
42
func (a * PackageInitializeRouter ) Rollback (file * ast.File ) error {
42
- for i := 0 ; i < len (file .Decls ); i ++ {
43
- v1 , o1 := file .Decls [i ].(* ast.FuncDecl )
44
- if o1 {
45
- if v1 .Name .Name != "initBizRouter" {
46
- continue
47
- }
48
- for j := 0 ; j < len (v1 .Body .List ); j ++ {
49
- v2 , o2 := v1 .Body .List [j ].(* ast.BlockStmt )
50
- if o2 {
51
- for k := 0 ; k < len (v2 .List ); k ++ {
52
- if k == 0 {
53
- v3 , o3 := v2 .List [0 ].(* ast.AssignStmt )
54
- if o3 {
55
- if len (v3 .Lhs ) == 1 && len (v3 .Rhs ) == 1 {
56
- v4 , o4 := v3 .Lhs [0 ].(* ast.Ident )
57
- v5 , o5 := v3 .Rhs [0 ].(* ast.SelectorExpr )
58
- v6 , o6 := v5 .X .(* ast.SelectorExpr )
59
- v7 , o7 := v6 .X .(* ast.Ident )
60
- if o4 && o5 && o6 && o7 {
61
- if v4 .Name != a .ModuleName && v7 .Name != a .PackageName && v6 .Sel .Name != a .AppName && v5 .Sel .Name != a .GroupName {
62
- break
63
- }
64
- }
65
- }
66
- }
67
- } // 判断是否有路由组和作用域
68
- v3 , o3 := v2 .List [k ].(* ast.ExprStmt )
69
- if o3 {
70
- v4 , o4 := v3 .X .(* ast.CallExpr )
71
- if o4 {
72
- v5 , o5 := v4 .Fun .(* ast.SelectorExpr )
73
- if o5 {
74
- v6 , o6 := v5 .X .(* ast.Ident )
75
- if o6 {
76
- if v6 .Name == a .ModuleName && v5 .Sel .Name == a .FunctionName {
77
- v2 .List = append (v2 .List [:k ], v2 .List [k + 1 :]... )
78
- length := len (v2 .List )
79
- if length == 1 {
80
- v1 .Body .List = append (v1 .Body .List [:j ], v1 .Body .List [j + 1 :]... )
81
- // TODO 删除作用域之后会出现两种情况需要删除空行, 中间模块被删除和最后的模块被删除
82
- // if j < len(v1.Body.List) {
83
- // v2, o2 = v1.Body.List[j].(*ast.BlockStmt)
84
- // if o2 {
85
- // v2.Lbrace -= 3
86
- // // v2.Rbrace -= 2
87
- // }
88
- // } // 中间模块被删除
89
- // if j == len(v1.Body.List) {
90
- // v1.Body.Rbrace -= 10
91
- // } // 最后的模块被删除
92
- break
93
- } // 无调用路由初始化函数 => 删除局部变量 && 删除作用域 && 导包
94
- if k < length - 1 {
95
- v3 , o3 = v2 .List [k ].(* ast.ExprStmt )
96
- if o3 {
97
- v4 , o4 = v3 .X .(* ast.CallExpr )
98
- if o4 {
99
- v5 , o5 = v4 .Fun .(* ast.SelectorExpr )
100
- if o5 {
101
- v6 , o6 = v5 .X .(* ast.Ident )
102
- if o6 {
103
- v6 .NamePos -= 10
104
- }
105
- v5 .Sel .NamePos -= 20
106
- }
107
- }
108
- }
109
- } // 删除空行
110
- }
111
- }
112
- }
113
- }
114
- }
43
+ funcDecl := FindFunction (file , "initBizRouter" )
44
+ exprNum := 0
45
+ for i := range funcDecl .Body .List {
46
+ if IsBlockStmt (funcDecl .Body .List [i ]) {
47
+ if VariableExistsInBlock (funcDecl .Body .List [i ].(* ast.BlockStmt ), a .ModuleName ) {
48
+ for ii , stmt := range funcDecl .Body .List [i ].(* ast.BlockStmt ).List {
49
+ // 检查语句是否为 *ast.ExprStmt
50
+ exprStmt , ok := stmt .(* ast.ExprStmt )
51
+ if ! ok {
52
+ continue
53
+ }
54
+ // 检查表达式是否为 *ast.CallExpr
55
+ callExpr , ok := exprStmt .X .(* ast.CallExpr )
56
+ if ! ok {
57
+ continue
58
+ }
59
+ // 检查是否调用了我们正在寻找的函数
60
+ selExpr , ok := callExpr .Fun .(* ast.SelectorExpr )
61
+ if ! ok {
62
+ continue
63
+ }
64
+ // 检查调用的函数是否为 systemRouter.InitApiRouter
65
+ ident , ok := selExpr .X .(* ast.Ident )
66
+ //只要存在调用则+1
67
+ if ok && ident .Name == a .ModuleName {
68
+ exprNum ++
115
69
}
70
+ //判断是否为目标结构
71
+ if ! ok || ident .Name != a .ModuleName || selExpr .Sel .Name != a .FunctionName {
72
+ continue
73
+ }
74
+ exprNum --
75
+ // 从语句列表中移除。
76
+ funcDecl .Body .List [i ].(* ast.BlockStmt ).List = append (funcDecl .Body .List [i ].(* ast.BlockStmt ).List [:ii ], funcDecl .Body .List [i ].(* ast.BlockStmt ).List [ii + 1 :]... )
77
+ // 如果不再存在任何调用,则删除导入和变量。
78
+ if exprNum == 0 {
79
+ funcDecl .Body .List = append (funcDecl .Body .List [:i ], funcDecl .Body .List [i + 1 :]... )
80
+ }
81
+ break
116
82
}
83
+ break
117
84
}
118
85
}
119
86
}
87
+
120
88
return nil
121
89
}
122
90
123
91
func (a * PackageInitializeRouter ) Injection (file * ast.File ) error {
124
- _ = NewImport (a .ImportPath ).Injection (file )
125
- for i := 0 ; i < len (file .Decls ); i ++ {
126
- v1 , o1 := file .Decls [i ].(* ast.FuncDecl )
127
- if o1 {
128
- if v1 .Name .Name != "initBizRouter" {
129
- continue
130
- }
131
- var (
132
- hasInit bool
133
- blockStmt * ast.BlockStmt
134
- )
135
- for j := 0 ; j < len (v1 .Body .List ); j ++ {
136
- v2 , o2 := v1 .Body .List [j ].(* ast.BlockStmt )
137
- if o2 {
138
- for k := 0 ; k < len (v2 .List ); k ++ {
139
- if k == 0 {
140
- v3 , o3 := v2 .List [0 ].(* ast.AssignStmt )
141
- if o3 {
142
- if len (v3 .Lhs ) == 1 && len (v3 .Rhs ) == 1 {
143
- v4 , o4 := v3 .Lhs [0 ].(* ast.Ident )
144
- v5 , o5 := v3 .Rhs [0 ].(* ast.SelectorExpr )
145
- v6 , o6 := v5 .X .(* ast.SelectorExpr )
146
- v7 , o7 := v6 .X .(* ast.Ident )
147
- if o4 && o5 && o6 && o7 {
148
- if v4 .Name == a .ModuleName && v7 .Name == a .PackageName && v6 .Sel .Name == a .AppName && v5 .Sel .Name == a .GroupName {
149
- blockStmt = v2
150
- continue
151
- }
152
- }
153
- }
154
- }
155
- } // 判断是否有路由组和作用域
156
- v3 , o3 := v2 .List [k ].(* ast.ExprStmt )
157
- if o3 {
158
- v4 , o4 := v3 .X .(* ast.CallExpr )
159
- if o4 {
160
- v5 , o5 := v4 .Fun .(* ast.SelectorExpr )
161
- if o5 {
162
- v6 , o6 := v5 .X .(* ast.Ident )
163
- if o6 {
164
- if v6 .Name == a .ModuleName && v5 .Sel .Name == a .FunctionName {
165
- hasInit = true
166
- continue
167
- } // 判断是否存在调用函数
168
- }
169
- }
170
- }
171
- }
172
- }
173
- }
174
- }
175
- if hasInit {
176
- continue
177
- }
178
- stmt := & ast.ExprStmt {
179
- X : & ast.CallExpr {
180
- Fun : & ast.SelectorExpr {
181
- X : & ast.Ident {Name : a .ModuleName },
182
- Sel : & ast.Ident {Name : a .FunctionName },
183
- },
184
- Args : []ast.Expr {
185
- & ast.Ident {Name : a .LeftRouterGroupName },
186
- & ast.Ident {Name : a .RightRouterGroupName },
187
- },
188
- },
189
- }
190
- if blockStmt == nil {
191
- blockStmt = & ast.BlockStmt {
192
- List : []ast.Stmt {
193
- & ast.AssignStmt {
194
- Lhs : []ast.Expr {& ast.Ident {Name : a .ModuleName , Obj : ast .NewObj (ast .Var , a .ModuleName )}},
195
- Tok : token .DEFINE ,
196
- Rhs : []ast.Expr {
197
- & ast.SelectorExpr {
198
- X : & ast.SelectorExpr {
199
- X : & ast.Ident {Name : a .PackageName },
200
- Sel : & ast.Ident {Name : a .AppName },
201
- },
202
- Sel : & ast.Ident {Name : a .GroupName },
203
- },
204
- },
205
- },
206
- stmt ,
207
- },
208
- }
209
- v1 .Body .List = append (v1 .Body .List , blockStmt )
92
+ funcDecl := FindFunction (file , "initBizRouter" )
93
+ hasRouter := false
94
+ var varBlock * ast.BlockStmt
95
+ for i := range funcDecl .Body .List {
96
+ if IsBlockStmt (funcDecl .Body .List [i ]) {
97
+ if VariableExistsInBlock (funcDecl .Body .List [i ].(* ast.BlockStmt ), a .ModuleName ) {
98
+ hasRouter = true
99
+ varBlock = funcDecl .Body .List [i ].(* ast.BlockStmt )
210
100
break
211
- } // 创建作用域 && 创建路由组 && 调用路由初始化函数
212
- blockStmt .List = append (blockStmt .List , stmt )
101
+ }
102
+ }
103
+ }
104
+ if ! hasRouter {
105
+ stmt := a .CreateAssignStmt ()
106
+ varBlock = & ast.BlockStmt {
107
+ List : []ast.Stmt {
108
+ stmt ,
109
+ },
213
110
}
214
111
}
112
+ routerStmt := CreateStmt (fmt .Sprintf ("%s.%s(%s,%s)" , a .ModuleName , a .FunctionName , a .LeftRouterGroupName , a .RightRouterGroupName ))
113
+ varBlock .List = append (varBlock .List , routerStmt )
114
+ if ! hasRouter {
115
+ funcDecl .Body .List = append (funcDecl .Body .List , varBlock )
116
+ }
215
117
return nil
216
118
}
217
119
@@ -221,3 +123,28 @@ func (a *PackageInitializeRouter) Format(filename string, writer io.Writer, file
221
123
}
222
124
return a .Base .Format (filename , writer , file )
223
125
}
126
+
127
+ func (a * PackageInitializeRouter ) CreateAssignStmt () * ast.AssignStmt {
128
+ //创建左侧变量
129
+ ident := & ast.Ident {
130
+ Name : a .ModuleName ,
131
+ }
132
+
133
+ //创建右侧的赋值语句
134
+ selector := & ast.SelectorExpr {
135
+ X : & ast.SelectorExpr {
136
+ X : & ast.Ident {Name : a .PackageName },
137
+ Sel : & ast.Ident {Name : a .AppName },
138
+ },
139
+ Sel : & ast.Ident {Name : a .GroupName },
140
+ }
141
+
142
+ // 创建一个组合的赋值语句
143
+ stmt := & ast.AssignStmt {
144
+ Lhs : []ast.Expr {ident },
145
+ Tok : token .DEFINE ,
146
+ Rhs : []ast.Expr {selector },
147
+ }
148
+
149
+ return stmt
150
+ }
0 commit comments