Skip to content

Commit 39be2d0

Browse files
authored
BetaBug修复 (#1825)
* feature:调整package注入路由方法 * feature:调整package回滚路由方法 * feature:调整创建自动化代码enter重复import的问题
1 parent 5492e0d commit 39be2d0

File tree

4 files changed

+123
-171
lines changed

4 files changed

+123
-171
lines changed

server/utils/ast/ast.go

+22
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,25 @@ func CreateStmt(statement string) *ast.ExprStmt {
6969
}
7070
return &ast.ExprStmt{X: expr}
7171
}
72+
73+
func IsBlockStmt(node ast.Node) bool {
74+
_, ok := node.(*ast.BlockStmt)
75+
return ok
76+
}
77+
78+
func VariableExistsInBlock(block *ast.BlockStmt, varName string) bool {
79+
exists := false
80+
ast.Inspect(block, func(n ast.Node) bool {
81+
switch node := n.(type) {
82+
case *ast.AssignStmt:
83+
for _, expr := range node.Lhs {
84+
if ident, ok := expr.(*ast.Ident); ok && ident.Name == varName {
85+
exists = true
86+
return false
87+
}
88+
}
89+
}
90+
return true
91+
})
92+
return exists
93+
}

server/utils/ast/import.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"go/ast"
55
"go/token"
66
"io"
7+
"strings"
78
)
89

910
type Import struct {
@@ -57,7 +58,7 @@ func (a *Import) Injection(file *ast.File) error {
5758
}
5859
for j := 0; j < len(v1.Specs); j++ {
5960
v2, o2 := v1.Specs[j].(*ast.ImportSpec)
60-
if o2 && v2.Path.Value == a.ImportPath {
61+
if o2 && strings.Contains(a.ImportPath, v2.Path.Value) {
6162
has = true
6263
break
6364
}
+88-161
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ast
22

33
import (
4+
"fmt"
45
"go/ast"
56
"go/token"
67
"io"
@@ -39,179 +40,80 @@ func (a *PackageInitializeRouter) Parse(filename string, writer io.Writer) (file
3940
}
4041

4142
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++
11569
}
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
11682
}
83+
break
11784
}
11885
}
11986
}
87+
12088
return nil
12189
}
12290

12391
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)
210100
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+
},
213110
}
214111
}
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+
}
215117
return nil
216118
}
217119

@@ -221,3 +123,28 @@ func (a *PackageInitializeRouter) Format(filename string, writer io.Writer, file
221123
}
222124
return a.Base.Format(filename, writer, file)
223125
}
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+
}

server/utils/ast/package_initialize_router_test.go

+11-9
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,17 @@ func TestPackageInitializeRouter_Injection(t *testing.T) {
5757
for _, tt := range tests {
5858
t.Run(tt.name, func(t *testing.T) {
5959
a := &PackageInitializeRouter{
60-
Type: tt.fields.Type,
61-
Path: tt.fields.Path,
62-
ImportPath: tt.fields.ImportPath,
63-
AppName: tt.fields.AppName,
64-
GroupName: tt.fields.GroupName,
65-
ModuleName: tt.fields.ModuleName,
66-
PackageName: tt.fields.PackageName,
67-
FunctionName: tt.fields.FunctionName,
68-
RouterGroupName: tt.fields.RouterGroupName,
60+
Type: tt.fields.Type,
61+
Path: tt.fields.Path,
62+
ImportPath: tt.fields.ImportPath,
63+
AppName: tt.fields.AppName,
64+
GroupName: tt.fields.GroupName,
65+
ModuleName: tt.fields.ModuleName,
66+
PackageName: tt.fields.PackageName,
67+
FunctionName: tt.fields.FunctionName,
68+
RouterGroupName: tt.fields.RouterGroupName,
69+
LeftRouterGroupName: "privateGroup",
70+
RightRouterGroupName: "publicGroup",
6971
}
7072
file, err := a.Parse(a.Path, nil)
7173
if err != nil {

0 commit comments

Comments
 (0)