2.7.0Beta2 (#1829)

* opt: 优化自动化package注册gorm_biz代码,替换为Inspect

* opt: 自动化代码插件gorm改造完成

* opt: 自动化代码插件路由注册改造完成
This commit is contained in:
PiexlMax(奇淼
2024-07-24 15:24:50 +08:00
committed by GitHub
parent 4512aa7ff8
commit 1494bc9db3
4 changed files with 209 additions and 476 deletions
+58 -190
View File
@@ -2,7 +2,6 @@ package ast
import (
"go/ast"
"go/token"
"io"
)
@@ -31,207 +30,76 @@ func (a *PluginInitializeGorm) Parse(filename string, writer io.Writer) (file *a
}
func (a *PluginInitializeGorm) Rollback(file *ast.File) error {
for i := 0; i < len(file.Decls); i++ {
v1, o1 := file.Decls[i].(*ast.FuncDecl)
if o1 {
if v1.Name.Name != "Gorm" {
var needRollBackImport bool
ast.Inspect(file, func(n ast.Node) bool {
callExpr, ok := n.(*ast.CallExpr)
if !ok {
return true
}
selExpr, seok := callExpr.Fun.(*ast.SelectorExpr)
if !seok || selExpr.Sel.Name != "AutoMigrate" {
return true
}
if len(callExpr.Args) <= 1 {
needRollBackImport = true
}
// 删除指定的参数
for i, arg := range callExpr.Args {
compLit, cok := arg.(*ast.CompositeLit)
if !cok {
continue
}
for j := 0; j < len(v1.Body.List); j++ {
v2, o2 := v1.Body.List[j].(*ast.AssignStmt)
if o2 {
for k := 0; k < len(v2.Rhs); k++ {
v3, o3 := v2.Rhs[k].(*ast.CallExpr)
if o3 {
v4, o4 := v3.Fun.(*ast.SelectorExpr)
if o4 {
if v4.Sel.Name != "AutoMigrate" {
continue
}
length := len(v3.Args)
var removeStruct bool
var hasImport bool
for l := 0; l < length; l++ {
if a.IsNew {
v5, o5 := v3.Args[l].(*ast.CallExpr)
if o5 {
for m := 0; m < len(v5.Args); m++ {
v6, o6 := v5.Args[m].(*ast.SelectorExpr)
if o6 {
v7, o7 := v6.X.(*ast.Ident)
if o7 {
if v7.Name == a.PackageName && v6.Sel.Name == a.StructName {
v3.Args = append(v3.Args[:l], v3.Args[l+1:]...)
length--
removeStruct = true
continue
} // TODO 优化 空行未删除
}
}
}
}
continue
}
if l >= length {
break
} // 防止越界
v6, o6 := v3.Args[l].(*ast.UnaryExpr)
if o6 {
v7, o7 := v6.X.(*ast.CompositeLit)
if o7 {
v8, o8 := v7.Type.(*ast.SelectorExpr)
if o8 {
v9, o9 := v8.X.(*ast.Ident)
if o9 {
if v6.Op == token.AND && v9.Name == a.PackageName && v8.Sel.Name == a.StructName {
v3.Args = append(v3.Args[:l], v3.Args[l+1:]...)
length--
removeStruct = true
continue
}
}
}
}
}
}
for l := 0; l < length; l++ {
v5, o5 := v3.Args[l].(*ast.CallExpr)
if o5 {
for m := 0; m < len(v5.Args); m++ {
v6, o6 := v5.Args[m].(*ast.SelectorExpr)
if o6 {
v7, o7 := v6.X.(*ast.Ident)
if o7 {
if removeStruct {
if v7.Name == a.PackageName {
hasImport = true
}
}
}
}
} // 判断new关键字的package是否有其他结构体使用
}
v6, o6 := v3.Args[l].(*ast.UnaryExpr)
if o6 {
v7, o7 := v6.X.(*ast.CompositeLit)
if o7 {
v8, o8 := v7.Type.(*ast.SelectorExpr)
if o8 {
v9, o9 := v8.X.(*ast.Ident)
if o9 {
if v9.Name == a.PackageName {
hasImport = true
}
}
}
}
} // 判断&关键字的package是否有其他结构体使用
}
if removeStruct && !hasImport {
_ = NewImport(a.ImportPath).Rollback(file)
}
}
}
}
}
cselExpr, sok := compLit.Type.(*ast.SelectorExpr)
if !sok {
continue
}
ident, idok := cselExpr.X.(*ast.Ident)
if idok && ident.Name == a.PackageName && cselExpr.Sel.Name == a.StructName {
// 删除参数
callExpr.Args = append(callExpr.Args[:i], callExpr.Args[i+1:]...)
break
}
}
return true
})
if needRollBackImport {
_ = NewImport(a.ImportPath).Rollback(file)
}
return nil
}
func (a *PluginInitializeGorm) Injection(file *ast.File) error {
_ = NewImport(a.ImportPath).Injection(file)
for i := 0; i < len(file.Decls); i++ {
v1, o1 := file.Decls[i].(*ast.FuncDecl)
if o1 {
if v1.Name.Name != "Gorm" {
continue
}
for j := 0; j < len(v1.Body.List); j++ {
v2, o2 := v1.Body.List[j].(*ast.AssignStmt)
if o2 {
for k := 0; k < len(v2.Rhs); k++ {
v3, o3 := v2.Rhs[k].(*ast.CallExpr)
if o3 {
v4, o4 := v3.Fun.(*ast.SelectorExpr)
if o4 {
if v4.Sel.Name != "AutoMigrate" {
continue
}
var has bool
for l := 0; l < len(v3.Args); l++ {
if a.IsNew {
v5, o5 := v3.Args[l].(*ast.CallExpr)
if o5 {
for m := 0; m < len(v5.Args); m++ {
v6, o6 := v5.Args[m].(*ast.SelectorExpr)
if o6 {
v7, o7 := v6.X.(*ast.Ident)
if o7 {
if v7.Name == a.PackageName && v6.Sel.Name == a.StructName {
has = true
break
}
}
}
}
}
continue
}
v6, o6 := v3.Args[l].(*ast.UnaryExpr)
if o6 {
v7, o7 := v6.X.(*ast.CompositeLit)
if o7 {
v8, o8 := v7.Type.(*ast.SelectorExpr)
if o8 {
v9, o9 := v8.X.(*ast.Ident)
if o9 {
if v6.Op == token.AND && v9.Name == a.PackageName && v8.Sel.Name == a.StructName {
has = true
break
}
}
}
}
}
}
if !has {
if a.IsNew {
arg := &ast.CallExpr{
Fun: &ast.Ident{
Name: "\n\t\tnew",
},
Args: []ast.Expr{
&ast.SelectorExpr{
X: &ast.Ident{Name: a.PackageName},
Sel: &ast.Ident{Name: a.StructName},
},
},
}
v3.Args = append(v3.Args, arg)
v3.Args = append(v3.Args, ast.NewIdent("\n"))
} else { // TODO 程序可用,但是格式并没有优雅回车
arg := &ast.UnaryExpr{
Op: token.AND,
X: &ast.CompositeLit{
Type: &ast.SelectorExpr{
X: &ast.Ident{Name: a.PackageName},
Sel: &ast.Ident{Name: a.StructName},
},
},
}
v3.Args = append(v3.Args, arg)
}
}
}
}
}
}
}
var call *ast.CallExpr
ast.Inspect(file, func(n ast.Node) bool {
callExpr, ok := n.(*ast.CallExpr)
if !ok {
return true
}
selExpr, ok := callExpr.Fun.(*ast.SelectorExpr)
if ok && selExpr.Sel.Name == "AutoMigrate" {
call = callExpr
return false
}
return true
})
arg := &ast.CompositeLit{
Type: &ast.SelectorExpr{
X: &ast.Ident{Name: a.PackageName},
Sel: &ast.Ident{Name: a.StructName},
},
}
call.Args = append(call.Args, arg)
return nil
}