From 7977bcb737f01d19f0fba949f3d19dfffb8d0b0b Mon Sep 17 00:00:00 2001 From: oldme Date: Sun, 14 Apr 2024 20:37:44 +0800 Subject: [PATCH 01/36] up --- .../internal/cmd/testdata/genservice/logic/article/article.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go index 26e695a8c0..b65070e7c2 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go @@ -8,6 +8,7 @@ package article import ( "context" + t "time" "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service" ) @@ -30,5 +31,7 @@ func (s *sArticle) Get(ctx context.Context, id uint) (info struct{}, err error) * @author oldme */ func (s *sArticle) Create(ctx context.Context, info struct{}) (id uint, err error) { + // Use time package to test alias import. + t.Now() return id, err } From 299d009a30b2c2e701d4abf500b85e2965463bae Mon Sep 17 00:00:00 2001 From: oldme Date: Mon, 15 Apr 2024 17:26:02 +0800 Subject: [PATCH 02/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E7=9A=84=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genservice/logic/article/article.go | 5 ++++ .../genservice/logic/article/article_extra.go | 24 +++++++++++++++++++ .../testdata/genservice/service/article.go | 7 ++++++ 3 files changed, 36 insertions(+) create mode 100644 cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go index b65070e7c2..07545f7908 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go @@ -8,6 +8,7 @@ package article import ( "context" + "go/ast" t "time" "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service" @@ -35,3 +36,7 @@ func (s *sArticle) Create(ctx context.Context, info struct{}) (id uint, err erro t.Now() return id, err } + +func (s *sArticle) A1o2(ctx context.Context, str string, a, b *ast.GoStmt) error { + return nil +} diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go new file mode 100644 index 0000000000..e738d3ee62 --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go @@ -0,0 +1,24 @@ +package article + +import ( + "context" + + gdbas "github.com/gogf/gf/v2/database/gdb" +) + +func (s *sArticle) T1(ctx context.Context, id, id2 uint) (gdb gdbas.Model, err error) { + g := gdbas.Model{} + return g, err +} + +func (s *sArticle) t2(ctx context.Context) (err error) { + return nil +} + +func (s *sArticle) T3(ctx context.Context, b *gdbas.Model) (c, d *gdbas.Model, err error) { + return nil, nil, nil +} + +func (s *sArticle) T4(i interface{}) interface{} { + return nil +} diff --git a/cmd/gf/internal/cmd/testdata/genservice/service/article.go b/cmd/gf/internal/cmd/testdata/genservice/service/article.go index 765a1c8a5a..7e03af5b13 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/service/article.go +++ b/cmd/gf/internal/cmd/testdata/genservice/service/article.go @@ -7,6 +7,9 @@ package service import ( "context" + "go/ast" + + gdbas "github.com/gogf/gf/v2/database/gdb" ) type ( @@ -19,6 +22,10 @@ type ( * @author oldme */ Create(ctx context.Context, info struct{}) (id uint, err error) + A1o2(ctx context.Context, str string, a, b *ast.GoStmt) error + T1(ctx context.Context, id, id2 uint) (gdb gdbas.Model, err error) + T3(ctx context.Context, b *gdbas.Model) (c, d *gdbas.Model, err error) + T4(i interface{}) interface{} } ) From 8c731bc60d04f1abeaa990a8891fa15d8c5162b4 Mon Sep 17 00:00:00 2001 From: oldme Date: Mon, 15 Apr 2024 17:30:08 +0800 Subject: [PATCH 03/36] =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=89=88=E6=9D=83?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/testdata/genservice/logic/article/article_extra.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go index e738d3ee62..6e2bf90338 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go @@ -1,3 +1,9 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + package article import ( From 429a38ab31c485694b54f127509b0f6d3da4b4d0 Mon Sep 17 00:00:00 2001 From: oldme Date: Mon, 15 Apr 2024 17:44:32 +0800 Subject: [PATCH 04/36] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=8D=A2=E4=B8=80=E4=B8=AA=E5=80=BC=E6=8E=A5=E6=94=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/testdata/genservice/logic/article/article_extra.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go index 6e2bf90338..dfb14db019 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go @@ -12,7 +12,7 @@ import ( gdbas "github.com/gogf/gf/v2/database/gdb" ) -func (s *sArticle) T1(ctx context.Context, id, id2 uint) (gdb gdbas.Model, err error) { +func (s sArticle) T1(ctx context.Context, id, id2 uint) (gdb gdbas.Model, err error) { g := gdbas.Model{} return g, err } From a2fbf05516eb610c2f6ea14572653763262c56d1 Mon Sep 17 00:00:00 2001 From: oldme Date: Mon, 15 Apr 2024 17:50:03 +0800 Subject: [PATCH 05/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0logicItem,=E7=94=A8?= =?UTF-8?q?=E6=9D=A5=E4=BF=9D=E5=AD=98ast=E5=88=86=E6=9E=90=E5=90=8E?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/genservice/genservice_logic_item.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 cmd/gf/internal/cmd/genservice/genservice_logic_item.go diff --git a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go new file mode 100644 index 0000000000..9633fb3bb4 --- /dev/null +++ b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go @@ -0,0 +1,15 @@ +// Copyright GoFrame gf Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package genservice + +type logicItem struct { + Receiver string `eg:"sUser"` + MethodName string `eg:"GetList"` + InputParam []map[string]string `eg:"ctx context.Context, cond *SearchInput"` + OutputParam []map[string]string `eg:"list []*User, err error"` + Comment string `eg:"Get user list"` +} From cda7d3c3980967fc3b7faf5c99918fc04496c35c Mon Sep 17 00:00:00 2001 From: oldme Date: Mon, 15 Apr 2024 17:52:20 +0800 Subject: [PATCH 06/36] =?UTF-8?q?TODO=20=E5=9F=BA=E6=9C=ACAst=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=92=8C=E6=B5=8B=E8=AF=95=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/g_temp_test.go | 16 ++++ .../cmd/genservice/genservice_calculate.go | 94 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 cmd/gf/internal/cmd/g_temp_test.go diff --git a/cmd/gf/internal/cmd/g_temp_test.go b/cmd/gf/internal/cmd/g_temp_test.go new file mode 100644 index 0000000000..14e6dd7365 --- /dev/null +++ b/cmd/gf/internal/cmd/g_temp_test.go @@ -0,0 +1,16 @@ +package cmd + +import ( + "testing" + + "github.com/gogf/gf/cmd/gf/v2/internal/cmd/genservice" + "github.com/gogf/gf/v2/test/gtest" +) + +func TestTemp(t *testing.T) { + path := gtest.DataPath("genservice", "logic", "article", "article_extra.go") + _, err := genservice.CGenService{}.CalculateInterfaceFunctions2(path) + if err != nil { + panic(err) + } +} diff --git a/cmd/gf/internal/cmd/genservice/genservice_calculate.go b/cmd/gf/internal/cmd/genservice/genservice_calculate.go index 4312a6b399..e6bc0fe080 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -7,12 +7,16 @@ package genservice import ( + "bytes" "fmt" + "go/ast" + "go/format" "go/parser" "go/token" "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/container/gmap" + "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/text/gregex" "github.com/gogf/gf/v2/text/gstr" ) @@ -173,3 +177,93 @@ func (c CGenService) calculateInterfaceFunctions( } return nil } + +func (c CGenService) CalculateInterfaceFunctions2(filePath string) ([]map[string]string, error) { + var ( + fileContent = gfile.GetContents(filePath) + fileSet = token.NewFileSet() + ) + + node, err := parser.ParseFile(fileSet, "", fileContent, parser.ParseComments) + if err != nil { + return nil, err + } + res := make([]map[string]string, 0) + + // 遍历AST节点,获取属于结构体的方法 + ast.Inspect(node, func(n ast.Node) bool { + switch x := n.(type) { + case *ast.FuncDecl: + if x.Recv == nil { + return true + } + var ( + // 函数名 + funcName = x.Name.Name + receiverName string + funcComment string + ) + + receiverName, _ = c.astExprToString(x.Recv.List[0].Type) + + if x.Doc != nil { + funcComment = x.Doc.Text() + } + + // 获取函数形参的名称和类型 + funcParams := make([]string, 0) + params := make([]string, 0) + if x.Type.Params != nil { + for _, param := range x.Type.Params.List { + for _, name := range param.Names { + funcParams = append(funcParams, name.Name) + s, _ := c.astExprToString(param.Type) + params = append(params, s) + } + } + } + + // 获取函数返回值的名称和类型 + funcResults := make([]string, 0) + results := make([]string, 0) + if x.Type.Results != nil { + for _, result := range x.Type.Results.List { + for _, name := range result.Names { + funcResults = append(funcResults, name.Name) + s, _ := c.astExprToString(result.Type) + results = append(results, s) + } + } + } + + res = append(res, map[string]string{ + "funcName": funcName, + "funcComment": funcComment, + "receiverName": receiverName, + // "funcParams": gstr.Join(funcParams, ","), + // "funcResults": gstr.Join(funcResults, ","), + }) + } + return true + }) + return res, nil +} + +// exprToString converts ast.Expr to string. +// For example: +// +// ast.Expr -> "context.Context" +// ast.Expr -> "*v1.XxxReq" +// ast.Expr -> "error" +// ast.Expr -> "int" +func (c CGenService) astExprToString(expr ast.Expr) (string, error) { + var ( + buf bytes.Buffer + err error + ) + err = format.Node(&buf, token.NewFileSet(), expr) + if err != nil { + return "", err + } + return buf.String(), nil +} From 3c4418e7351d380af3fc1bdca8fb04b5cc73fd17 Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 16 Apr 2024 14:48:37 +0800 Subject: [PATCH 07/36] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E9=9A=8F=E6=9C=BA=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genservice/logic/article/article_extra.go | 12 ++++++++++++ .../cmd/testdata/genservice/service/article.go | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go index dfb14db019..451667732f 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go @@ -12,19 +12,31 @@ import ( gdbas "github.com/gogf/gf/v2/database/gdb" ) +// T1 random comment func (s sArticle) T1(ctx context.Context, id, id2 uint) (gdb gdbas.Model, err error) { g := gdbas.Model{} return g, err } +// t2 random comment func (s *sArticle) t2(ctx context.Context) (err error) { return nil } +// T3 +/** + * random comment @*4213hHY1&%##%>< ? , . / func (s *sArticle) T4(i interface{}) interface{} { return nil } diff --git a/cmd/gf/internal/cmd/testdata/genservice/service/article.go b/cmd/gf/internal/cmd/testdata/genservice/service/article.go index 7e03af5b13..bc02334662 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/service/article.go +++ b/cmd/gf/internal/cmd/testdata/genservice/service/article.go @@ -23,8 +23,19 @@ type ( */ Create(ctx context.Context, info struct{}) (id uint, err error) A1o2(ctx context.Context, str string, a, b *ast.GoStmt) error + // T1 random comment T1(ctx context.Context, id, id2 uint) (gdb gdbas.Model, err error) + // T3 + /** + * random comment @*4213hHY1&%##%>< ? , . / T4(i interface{}) interface{} } ) From 7b8f22738992f4a87776d58bd1782156dbd647e4 Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 16 Apr 2024 14:57:35 +0800 Subject: [PATCH 08/36] =?UTF-8?q?=E5=AE=8C=E5=96=84GetLogicItemInSrc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/genservice/genservice_calculate.go | 94 ------------ .../cmd/genservice/genservice_logic_item.go | 138 +++++++++++++++++- 2 files changed, 136 insertions(+), 96 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice_calculate.go b/cmd/gf/internal/cmd/genservice/genservice_calculate.go index e6bc0fe080..4312a6b399 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -7,16 +7,12 @@ package genservice import ( - "bytes" "fmt" - "go/ast" - "go/format" "go/parser" "go/token" "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/container/gmap" - "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/text/gregex" "github.com/gogf/gf/v2/text/gstr" ) @@ -177,93 +173,3 @@ func (c CGenService) calculateInterfaceFunctions( } return nil } - -func (c CGenService) CalculateInterfaceFunctions2(filePath string) ([]map[string]string, error) { - var ( - fileContent = gfile.GetContents(filePath) - fileSet = token.NewFileSet() - ) - - node, err := parser.ParseFile(fileSet, "", fileContent, parser.ParseComments) - if err != nil { - return nil, err - } - res := make([]map[string]string, 0) - - // 遍历AST节点,获取属于结构体的方法 - ast.Inspect(node, func(n ast.Node) bool { - switch x := n.(type) { - case *ast.FuncDecl: - if x.Recv == nil { - return true - } - var ( - // 函数名 - funcName = x.Name.Name - receiverName string - funcComment string - ) - - receiverName, _ = c.astExprToString(x.Recv.List[0].Type) - - if x.Doc != nil { - funcComment = x.Doc.Text() - } - - // 获取函数形参的名称和类型 - funcParams := make([]string, 0) - params := make([]string, 0) - if x.Type.Params != nil { - for _, param := range x.Type.Params.List { - for _, name := range param.Names { - funcParams = append(funcParams, name.Name) - s, _ := c.astExprToString(param.Type) - params = append(params, s) - } - } - } - - // 获取函数返回值的名称和类型 - funcResults := make([]string, 0) - results := make([]string, 0) - if x.Type.Results != nil { - for _, result := range x.Type.Results.List { - for _, name := range result.Names { - funcResults = append(funcResults, name.Name) - s, _ := c.astExprToString(result.Type) - results = append(results, s) - } - } - } - - res = append(res, map[string]string{ - "funcName": funcName, - "funcComment": funcComment, - "receiverName": receiverName, - // "funcParams": gstr.Join(funcParams, ","), - // "funcResults": gstr.Join(funcResults, ","), - }) - } - return true - }) - return res, nil -} - -// exprToString converts ast.Expr to string. -// For example: -// -// ast.Expr -> "context.Context" -// ast.Expr -> "*v1.XxxReq" -// ast.Expr -> "error" -// ast.Expr -> "int" -func (c CGenService) astExprToString(expr ast.Expr) (string, error) { - var ( - buf bytes.Buffer - err error - ) - err = format.Node(&buf, token.NewFileSet(), expr) - if err != nil { - return "", err - } - return buf.String(), nil -} diff --git a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go index 9633fb3bb4..1f579ea953 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go +++ b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go @@ -6,10 +6,144 @@ package genservice +import ( + "bytes" + "go/ast" + "go/format" + "go/parser" + "go/token" + + "github.com/gogf/gf/v2/os/gfile" +) + type logicItem struct { Receiver string `eg:"sUser"` MethodName string `eg:"GetList"` - InputParam []map[string]string `eg:"ctx context.Context, cond *SearchInput"` - OutputParam []map[string]string `eg:"list []*User, err error"` + InputParam []map[string]string `eg:"ctx: context.Context, cond: *SearchInput"` + OutputParam []map[string]string `eg:"list: []*User, err: error"` Comment string `eg:"Get user list"` } + +func (c CGenService) GetLogicItemInSrc(filePath string) (items []logicItem, err error) { + var ( + fileContent = gfile.GetContents(filePath) + fileSet = token.NewFileSet() + ) + + node, err := parser.ParseFile(fileSet, "", fileContent, parser.ParseComments) + if err != nil { + return nil, err + } + + ast.Inspect(node, func(n ast.Node) bool { + switch x := n.(type) { + case *ast.FuncDecl: + if x.Recv == nil { + return true + } + var funcName = x.Name.Name + items = append(items, logicItem{ + Receiver: c.getFuncReceiverTypeName(x), + MethodName: funcName, + InputParam: c.getFuncInputParams(x), + OutputParam: c.getFuncOutputParams(x), + Comment: c.getFuncComment(x), + }) + } + return true + }) + return +} + +// getFuncReceiverTypeName retrieves the receiver type of the function. +// For example: +// +// func(s *sArticle) -> *sArticle +// func(s sArticle) -> sArticle +func (c CGenService) getFuncReceiverTypeName(node *ast.FuncDecl) (receiverType string) { + if node.Recv == nil { + return "" + } + receiverType, err := c.astExprToString(node.Recv.List[0].Type) + if err != nil { + return "" + } + return +} + +// getFuncInputParams retrieves the input parameters of the function. +// It returns the name and type of the input parameters. +// For example: +// +// ctx: context.Context +// req: *v1.XxxReq +func (c CGenService) getFuncInputParams(node *ast.FuncDecl) (inputParams []map[string]string) { + if node.Type.Params == nil { + return + } + for _, param := range node.Type.Params.List { + for _, name := range param.Names { + paramType, err := c.astExprToString(param.Type) + if err != nil { + continue + } + inputParams = append(inputParams, map[string]string{ + "paramName": name.Name, + "paramType": paramType, + }) + } + } + return +} + +// getFuncOutputParams retrieves the output parameters of the function. +// It returns the name and type of the output parameters. +// For example: +// +// list: []*User +// err: error +func (c CGenService) getFuncOutputParams(node *ast.FuncDecl) (outputParams []map[string]string) { + if node.Type.Results == nil { + return + } + for _, result := range node.Type.Results.List { + for _, name := range result.Names { + resultType, err := c.astExprToString(result.Type) + if err != nil { + continue + } + outputParams = append(outputParams, map[string]string{ + "paramName": name.Name, + "paramType": resultType, + }) + } + } + return +} + +// getFuncComment retrieves the comment of the function. +func (c CGenService) getFuncComment(node *ast.FuncDecl) string { + if node.Doc == nil { + return "" + } + return node.Doc.Text() +} + +// exprToString converts ast.Expr to string. +// For example: +// +// ast.Expr -> "context.Context" +// ast.Expr -> "*v1.XxxReq" +// ast.Expr -> "error" +// ast.Expr -> "int" +func (c CGenService) astExprToString(expr ast.Expr) (string, error) { + var ( + buf bytes.Buffer + err error + ) + err = format.Node(&buf, token.NewFileSet(), expr) + if err != nil { + return "", err + } + return buf.String(), nil +} From b2d0a838cea8e8d1d55219f3690f506de373a5e8 Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 16 Apr 2024 15:08:49 +0800 Subject: [PATCH 09/36] =?UTF-8?q?=E8=B7=B3=E8=BF=87=E7=A7=81=E6=9C=89?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/g_temp_test.go | 4 +++- cmd/gf/internal/cmd/genservice/genservice_logic_item.go | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/cmd/gf/internal/cmd/g_temp_test.go b/cmd/gf/internal/cmd/g_temp_test.go index 14e6dd7365..b4761b2edd 100644 --- a/cmd/gf/internal/cmd/g_temp_test.go +++ b/cmd/gf/internal/cmd/g_temp_test.go @@ -5,12 +5,14 @@ import ( "github.com/gogf/gf/cmd/gf/v2/internal/cmd/genservice" "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/util/gutil" ) func TestTemp(t *testing.T) { path := gtest.DataPath("genservice", "logic", "article", "article_extra.go") - _, err := genservice.CGenService{}.CalculateInterfaceFunctions2(path) + res, err := genservice.CGenService{}.GetLogicItemInSrc(path) if err != nil { panic(err) } + gutil.Dump(res) } diff --git a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go index 1f579ea953..23a175d195 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go +++ b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go @@ -14,6 +14,7 @@ import ( "go/token" "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/text/gstr" ) type logicItem struct { @@ -24,6 +25,8 @@ type logicItem struct { Comment string `eg:"Get user list"` } +// GetLogicItemInSrc retrieves the logic items in the specified source file. +// It can skip the private methods. func (c CGenService) GetLogicItemInSrc(filePath string) (items []logicItem, err error) { var ( fileContent = gfile.GetContents(filePath) @@ -41,6 +44,12 @@ func (c CGenService) GetLogicItemInSrc(filePath string) (items []logicItem, err if x.Recv == nil { return true } + + // Skip private methods. + if !gstr.IsLetterUpper(x.Name.Name[0]) { + return true + } + var funcName = x.Name.Name items = append(items, logicItem{ Receiver: c.getFuncReceiverTypeName(x), From 02bef4fa0efe369e91f58236f0bb2046038d9a8d Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 16 Apr 2024 15:44:10 +0800 Subject: [PATCH 10/36] =?UTF-8?q?=E8=8E=B7=E5=8F=96pkgitems?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/g_temp_test.go | 5 ++- .../cmd/genservice/genservice_logic_item.go | 43 ++++++++++++++----- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/cmd/gf/internal/cmd/g_temp_test.go b/cmd/gf/internal/cmd/g_temp_test.go index b4761b2edd..955975dc48 100644 --- a/cmd/gf/internal/cmd/g_temp_test.go +++ b/cmd/gf/internal/cmd/g_temp_test.go @@ -10,9 +10,10 @@ import ( func TestTemp(t *testing.T) { path := gtest.DataPath("genservice", "logic", "article", "article_extra.go") - res, err := genservice.CGenService{}.GetLogicItemInSrc(path) + pkgs, items, err := genservice.CGenService{}.GetLogicItemInSrc(path) if err != nil { panic(err) } - gutil.Dump(res) + gutil.Dump(pkgs) + gutil.Dump(items) } diff --git a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go index 23a175d195..13522d7add 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go +++ b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go @@ -14,7 +14,6 @@ import ( "go/token" "github.com/gogf/gf/v2/os/gfile" - "github.com/gogf/gf/v2/text/gstr" ) type logicItem struct { @@ -26,8 +25,9 @@ type logicItem struct { } // GetLogicItemInSrc retrieves the logic items in the specified source file. -// It can skip the private methods. -func (c CGenService) GetLogicItemInSrc(filePath string) (items []logicItem, err error) { +// It can't skip the private methods. +// It can't skip the imported packages of import alias equal to `_`. +func (c CGenService) GetLogicItemInSrc(filePath string) (pkgItems []packageItem, logicItems []logicItem, err error) { var ( fileContent = gfile.GetContents(filePath) fileSet = token.NewFileSet() @@ -35,23 +35,23 @@ func (c CGenService) GetLogicItemInSrc(filePath string) (items []logicItem, err node, err := parser.ParseFile(fileSet, "", fileContent, parser.ParseComments) if err != nil { - return nil, err + return } ast.Inspect(node, func(n ast.Node) bool { switch x := n.(type) { + case *ast.ImportSpec: + // calculate the imported packages + pkgItems = append(pkgItems, c.getImportPackages(x)) + case *ast.FuncDecl: + // calculate the logic items if x.Recv == nil { return true } - // Skip private methods. - if !gstr.IsLetterUpper(x.Name.Name[0]) { - return true - } - var funcName = x.Name.Name - items = append(items, logicItem{ + logicItems = append(logicItems, logicItem{ Receiver: c.getFuncReceiverTypeName(x), MethodName: funcName, InputParam: c.getFuncInputParams(x), @@ -64,6 +64,29 @@ func (c CGenService) GetLogicItemInSrc(filePath string) (items []logicItem, err return } +// getImportPackages retrieves the imported packages from the specified ast.ImportSpec. +func (c CGenService) getImportPackages(node *ast.ImportSpec) (packages packageItem) { + if node.Path == nil { + return + } + var ( + alias string + path = node.Path.Value + rawImport string + ) + if node.Name != nil { + alias = node.Name.Name + rawImport = alias + " " + path + } else { + rawImport = path + } + return packageItem{ + Alias: alias, + Path: path, + RawImport: rawImport, + } +} + // getFuncReceiverTypeName retrieves the receiver type of the function. // For example: // From 5e5ea1eafefd5a2cd6387e0b4cb5fdf7242969b8 Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 16 Apr 2024 16:34:05 +0800 Subject: [PATCH 11/36] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E5=8C=BF=E5=90=8D?= =?UTF-8?q?=E5=8C=85=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/testdata/genservice/logic/article/article_extra.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go index 451667732f..91f93e6ff4 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go @@ -10,6 +10,7 @@ import ( "context" gdbas "github.com/gogf/gf/v2/database/gdb" + _ "github.com/gogf/gf/v2/os/gfile" ) // T1 random comment From 57207e6d2ab1531f3cc358cecf2f1497bc814dce Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 16 Apr 2024 16:34:52 +0800 Subject: [PATCH 12/36] =?UTF-8?q?=E5=AE=8C=E5=96=84CalculateItemsInSrc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/g_temp_test.go | 2 +- cmd/gf/internal/cmd/genservice/genservice_logic_item.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/gf/internal/cmd/g_temp_test.go b/cmd/gf/internal/cmd/g_temp_test.go index 955975dc48..4c4520deb7 100644 --- a/cmd/gf/internal/cmd/g_temp_test.go +++ b/cmd/gf/internal/cmd/g_temp_test.go @@ -10,7 +10,7 @@ import ( func TestTemp(t *testing.T) { path := gtest.DataPath("genservice", "logic", "article", "article_extra.go") - pkgs, items, err := genservice.CGenService{}.GetLogicItemInSrc(path) + pkgs, items, err := genservice.CGenService{}.CalculateItemsInSrc(path) if err != nil { panic(err) } diff --git a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go index 13522d7add..e628baa238 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go +++ b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go @@ -24,10 +24,10 @@ type logicItem struct { Comment string `eg:"Get user list"` } -// GetLogicItemInSrc retrieves the logic items in the specified source file. +// CalculateItemsInSrc retrieves the logic items in the specified source file. // It can't skip the private methods. // It can't skip the imported packages of import alias equal to `_`. -func (c CGenService) GetLogicItemInSrc(filePath string) (pkgItems []packageItem, logicItems []logicItem, err error) { +func (c CGenService) CalculateItemsInSrc(filePath string) (pkgItems []packageItem, logicItems []logicItem, err error) { var ( fileContent = gfile.GetContents(filePath) fileSet = token.NewFileSet() From db2e6152e776d6c514b2d983e8947b44a336200d Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 16 Apr 2024 17:29:22 +0800 Subject: [PATCH 13/36] =?UTF-8?q?=E5=AE=8C=E5=96=84CalculateItemsInSrc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/genservice/genservice_logic_item.go | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go index e628baa238..152c046774 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go +++ b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go @@ -17,11 +17,11 @@ import ( ) type logicItem struct { - Receiver string `eg:"sUser"` - MethodName string `eg:"GetList"` - InputParam []map[string]string `eg:"ctx: context.Context, cond: *SearchInput"` - OutputParam []map[string]string `eg:"list: []*User, err: error"` - Comment string `eg:"Get user list"` + Receiver string `eg:"sUser"` + MethodName string `eg:"GetList"` + InputParams []map[string]string `eg:"ctx: context.Context, cond: *SearchInput"` + OutputParams []map[string]string `eg:"list: []*User, err: error"` + Comment string `eg:"Get user list"` } // CalculateItemsInSrc retrieves the logic items in the specified source file. @@ -52,11 +52,11 @@ func (c CGenService) CalculateItemsInSrc(filePath string) (pkgItems []packageIte var funcName = x.Name.Name logicItems = append(logicItems, logicItem{ - Receiver: c.getFuncReceiverTypeName(x), - MethodName: funcName, - InputParam: c.getFuncInputParams(x), - OutputParam: c.getFuncOutputParams(x), - Comment: c.getFuncComment(x), + Receiver: c.getFuncReceiverTypeName(x), + MethodName: funcName, + InputParams: c.getFuncInputParams(x), + OutputParams: c.getFuncOutputParams(x), + Comment: c.getFuncComment(x), }) } return true @@ -114,6 +114,18 @@ func (c CGenService) getFuncInputParams(node *ast.FuncDecl) (inputParams []map[s return } for _, param := range node.Type.Params.List { + if param.Names == nil { + // No name for the return value. + resultType, err := c.astExprToString(param.Type) + if err != nil { + continue + } + inputParams = append(inputParams, map[string]string{ + "paramName": "", + "paramType": resultType, + }) + continue + } for _, name := range param.Names { paramType, err := c.astExprToString(param.Type) if err != nil { @@ -134,17 +146,29 @@ func (c CGenService) getFuncInputParams(node *ast.FuncDecl) (inputParams []map[s // // list: []*User // err: error -func (c CGenService) getFuncOutputParams(node *ast.FuncDecl) (outputParams []map[string]string) { +func (c CGenService) getFuncOutputParams(node *ast.FuncDecl) (results []map[string]string) { if node.Type.Results == nil { return } for _, result := range node.Type.Results.List { + if result.Names == nil { + // No name for the return value. + resultType, err := c.astExprToString(result.Type) + if err != nil { + continue + } + results = append(results, map[string]string{ + "paramName": "", + "paramType": resultType, + }) + continue + } for _, name := range result.Names { resultType, err := c.astExprToString(result.Type) if err != nil { continue } - outputParams = append(outputParams, map[string]string{ + results = append(results, map[string]string{ "paramName": name.Name, "paramType": resultType, }) From 23c73c470d610ea9fc81160e62efcf03485a7b3e Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 16 Apr 2024 17:36:18 +0800 Subject: [PATCH 14/36] =?UTF-8?q?=E5=91=BD=E5=90=8D=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E6=A0=87=E5=87=86=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/genservice/genservice_logic_item.go | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go index 152c046774..c5746e7831 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go +++ b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go @@ -17,11 +17,11 @@ import ( ) type logicItem struct { - Receiver string `eg:"sUser"` - MethodName string `eg:"GetList"` - InputParams []map[string]string `eg:"ctx: context.Context, cond: *SearchInput"` - OutputParams []map[string]string `eg:"list: []*User, err: error"` - Comment string `eg:"Get user list"` + Receiver string `eg:"sUser"` + MethodName string `eg:"GetList"` + Params []map[string]string `eg:"ctx: context.Context, cond: *SearchInput"` + Results []map[string]string `eg:"list: []*User, err: error"` + Comment string `eg:"Get user list"` } // CalculateItemsInSrc retrieves the logic items in the specified source file. @@ -52,11 +52,11 @@ func (c CGenService) CalculateItemsInSrc(filePath string) (pkgItems []packageIte var funcName = x.Name.Name logicItems = append(logicItems, logicItem{ - Receiver: c.getFuncReceiverTypeName(x), - MethodName: funcName, - InputParams: c.getFuncInputParams(x), - OutputParams: c.getFuncOutputParams(x), - Comment: c.getFuncComment(x), + Receiver: c.getFuncReceiverTypeName(x), + MethodName: funcName, + Params: c.getFuncParams(x), + Results: c.getFuncResults(x), + Comment: c.getFuncComment(x), }) } return true @@ -103,13 +103,12 @@ func (c CGenService) getFuncReceiverTypeName(node *ast.FuncDecl) (receiverType s return } -// getFuncInputParams retrieves the input parameters of the function. +// getFuncParams retrieves the input parameters of the function. // It returns the name and type of the input parameters. // For example: // -// ctx: context.Context -// req: *v1.XxxReq -func (c CGenService) getFuncInputParams(node *ast.FuncDecl) (inputParams []map[string]string) { +// []map[string]string{paramName:ctx paramType:context.Context, paramName:info paramType:struct{}} +func (c CGenService) getFuncParams(node *ast.FuncDecl) (params []map[string]string) { if node.Type.Params == nil { return } @@ -120,7 +119,7 @@ func (c CGenService) getFuncInputParams(node *ast.FuncDecl) (inputParams []map[s if err != nil { continue } - inputParams = append(inputParams, map[string]string{ + params = append(params, map[string]string{ "paramName": "", "paramType": resultType, }) @@ -131,7 +130,7 @@ func (c CGenService) getFuncInputParams(node *ast.FuncDecl) (inputParams []map[s if err != nil { continue } - inputParams = append(inputParams, map[string]string{ + params = append(params, map[string]string{ "paramName": name.Name, "paramType": paramType, }) @@ -140,13 +139,13 @@ func (c CGenService) getFuncInputParams(node *ast.FuncDecl) (inputParams []map[s return } -// getFuncOutputParams retrieves the output parameters of the function. +// getFuncResults retrieves the output parameters of the function. // It returns the name and type of the output parameters. // For example: // -// list: []*User -// err: error -func (c CGenService) getFuncOutputParams(node *ast.FuncDecl) (results []map[string]string) { +// []map[string]string{resultName:list resultType:[]*User, resultName:err resultType:error} +// []map[string]string{resultName: "", resultType: error} +func (c CGenService) getFuncResults(node *ast.FuncDecl) (results []map[string]string) { if node.Type.Results == nil { return } @@ -158,8 +157,8 @@ func (c CGenService) getFuncOutputParams(node *ast.FuncDecl) (results []map[stri continue } results = append(results, map[string]string{ - "paramName": "", - "paramType": resultType, + "resultName": "", + "resultType": resultType, }) continue } @@ -169,8 +168,8 @@ func (c CGenService) getFuncOutputParams(node *ast.FuncDecl) (results []map[stri continue } results = append(results, map[string]string{ - "paramName": name.Name, - "paramType": resultType, + "resultName": name.Name, + "resultType": resultType, }) } } From 0214ed55e94f1de28edeee2702b03a1f589dba14 Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 16 Apr 2024 17:43:03 +0800 Subject: [PATCH 15/36] =?UTF-8?q?=E9=87=8D=E6=9E=84calculateInterfaceFunct?= =?UTF-8?q?ions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/genservice/genservice.go | 21 ++-- .../cmd/genservice/genservice_calculate.go | 118 ++++++++++-------- 2 files changed, 76 insertions(+), 63 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index c15a70433c..8cdc5e34e3 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -11,6 +11,8 @@ import ( "fmt" "path/filepath" + "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog" + "github.com/gogf/gf/cmd/gf/v2/internal/utility/utils" "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/container/gmap" "github.com/gogf/gf/v2/container/gset" @@ -21,9 +23,7 @@ import ( "github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/gtag" - - "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog" - "github.com/gogf/gf/cmd/gf/v2/internal/utility/utils" + "github.com/gogf/gf/v2/util/gutil" ) const ( @@ -187,7 +187,11 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe ) generatedDstFilePathSet.Add(dstFilePath) for _, file := range files { - var packageItems []packageItem + packageItems, logicItems, err := c.CalculateItemsInSrc(file) + if err != nil { + return nil, err + } + fileContent = gfile.GetContents(file) // Calculate code comments in source Go files. err = c.calculateCodeCommented(in, fileContent, srcCodeCommentedMap) @@ -200,11 +204,6 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe return nil, err } - // Calculate imported packages of source go files. - packageItems, err = c.calculateImportedPackages(fileContent) - if err != nil { - return nil, err - } // try finding the conflicts imports between files. for _, item := range packageItems { var alias = item.Alias @@ -277,7 +276,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe } // Calculate functions and interfaces for service generating. - err = c.calculateInterfaceFunctions(in, fileContent, srcPkgInterfaceMap) + err = c.calculateInterfaceFunctions(in, logicItems, srcPkgInterfaceMap) if err != nil { return nil, err } @@ -295,6 +294,8 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe ) continue } + + gutil.Dump(srcPkgInterfaceMap) // Generating service go file for single logic package. if ok, err = c.generateServiceFile(generateServiceFilesInput{ CGenServiceInput: in, diff --git a/cmd/gf/internal/cmd/genservice/genservice_calculate.go b/cmd/gf/internal/cmd/genservice/genservice_calculate.go index 4312a6b399..abee0d85b9 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -100,76 +100,88 @@ func (c CGenService) calculateCodeCommented(in CGenServiceInput, fileContent str } func (c CGenService) calculateInterfaceFunctions( - in CGenServiceInput, fileContent string, srcPkgInterfaceMap *gmap.ListMap, + in CGenServiceInput, logicItems []logicItem, srcPkgInterfaceMap *gmap.ListMap, ) (err error) { - var ( - matches [][]string - srcPkgInterfaceFuncArray *garray.StrArray - ) - // calculate struct name and its functions according function definitions. - matches, err = gregex.MatchAllString(`func \((.+?)\) ([\s\S]+?) {`, fileContent) - if err != nil { - return err - } - for _, match := range matches { + var srcPkgInterfaceFuncArray *garray.StrArray + + for _, item := range logicItems { var ( - structName string - structMatch []string - funcReceiver = gstr.Trim(match[1]) - receiverArray = gstr.SplitAndTrim(funcReceiver, " ") - functionHead = gstr.Trim(gstr.Replace(match[2], "\n", "")) + // eg: "sArticle" + receiverName string + receiverMatch []string + + // eg: "GetList(ctx context.Context, req *v1.ArticleListReq) (list []*v1.Article, err error)" + methodHead string ) - if len(receiverArray) > 1 { - structName = receiverArray[1] - } else if len(receiverArray) == 1 { - structName = receiverArray[0] - } - structName = gstr.Trim(structName, "*") - // Case of: - // Xxx(\n ctx context.Context, req *v1.XxxReq,\n) -> Xxx(ctx context.Context, req *v1.XxxReq) - functionHead = gstr.Replace(functionHead, `,)`, `)`) - functionHead, _ = gregex.ReplaceString(`\(\s+`, `(`, functionHead) - functionHead, _ = gregex.ReplaceString(`\s{2,}`, ` `, functionHead) - if !gstr.IsLetterUpper(functionHead[0]) { + // handle the receiver name. + if item.Receiver == "" { continue } + receiverName = item.Receiver + receiverName = gstr.Trim(receiverName, "*") // Match and pick the struct name from receiver. - if structMatch, err = gregex.MatchString(in.StPattern, structName); err != nil { + if receiverMatch, err = gregex.MatchString(in.StPattern, receiverName); err != nil { return err } - if len(structMatch) < 1 { + if len(receiverMatch) < 1 { continue } - structName = gstr.CaseCamel(structMatch[1]) - if !srcPkgInterfaceMap.Contains(structName) { + receiverName = gstr.CaseCamel(receiverMatch[1]) + + // check if the method name is public. + if !gstr.IsLetterUpper(item.MethodName[0]) { + continue + } + + inputParamStr := c.tidyParam(item.Params) + outputParamStr := c.tidyResult(item.Results) + + methodHead = fmt.Sprintf("%s(%s) (%s)", item.MethodName, inputParamStr, outputParamStr) + if !srcPkgInterfaceMap.Contains(receiverName) { srcPkgInterfaceFuncArray = garray.NewStrArray() - srcPkgInterfaceMap.Set(structName, srcPkgInterfaceFuncArray) + srcPkgInterfaceMap.Set(receiverName, srcPkgInterfaceFuncArray) } else { - srcPkgInterfaceFuncArray = srcPkgInterfaceMap.Get(structName).(*garray.StrArray) + srcPkgInterfaceFuncArray = srcPkgInterfaceMap.Get(receiverName).(*garray.StrArray) } - srcPkgInterfaceFuncArray.Append(functionHead) - } - // calculate struct name according type definitions. - matches, err = gregex.MatchAllString(`type (.+) struct\s*{`, fileContent) - if err != nil { - return err + srcPkgInterfaceFuncArray.Append(methodHead) } - for _, match := range matches { - var ( - structName string - structMatch []string - ) - if structMatch, err = gregex.MatchString(in.StPattern, match[1]); err != nil { - return err + return nil +} + +// tidyParam tidies the input parameters. +// For example: +// +// []map[string]string{paramName:ctx paramType:context.Context, paramName:info paramType:struct{}} +// -> ctx context.Context, info struct{} +func (c CGenService) tidyParam(paramSlice []map[string]string) (paramStr string) { + for i, param := range paramSlice { + if i > 0 { + paramStr += ", " } - if len(structMatch) < 1 { - continue + paramStr += fmt.Sprintf("%s %s", param["paramName"], param["paramType"]) + } + return +} + +// tidyResult tidies the output parameters. +// For example: +// +// []map[string]string{resultName:list resultType:[]*User, resultName:err resultType:error} +// -> list []*User, err error +// +// []map[string]string{resultName: "", resultType: error} +// -> error +func (c CGenService) tidyResult(resultSlice []map[string]string) (resultStr string) { + for i, result := range resultSlice { + if i > 0 { + resultStr += ", " } - structName = gstr.CaseCamel(structMatch[1]) - if !srcPkgInterfaceMap.Contains(structName) { - srcPkgInterfaceMap.Set(structName, garray.NewStrArray()) + if result["resultName"] != "" { + resultStr += fmt.Sprintf("%s %s", result["resultName"], result["resultType"]) + } else { + resultStr += result["resultType"] } } - return nil + return } From 67560a6f91de30cfc98ea5d2090c90b12c3a07a7 Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 13:56:27 +0800 Subject: [PATCH 16/36] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/cmd/genservice/genservice_ast.go | 48 +++++++++++++++++++ .../cmd/genservice/genservice_logic_item.go | 26 +--------- 2 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 cmd/gf/internal/cmd/genservice/genservice_ast.go diff --git a/cmd/gf/internal/cmd/genservice/genservice_ast.go b/cmd/gf/internal/cmd/genservice/genservice_ast.go new file mode 100644 index 0000000000..8fc12e208e --- /dev/null +++ b/cmd/gf/internal/cmd/genservice/genservice_ast.go @@ -0,0 +1,48 @@ +// Copyright GoFrame gf Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package genservice + +import ( + "bytes" + "go/ast" + "go/format" + "go/token" + "strings" +) + +// exprToString converts ast.Expr to string. +// For example: +// +// ast.Expr -> "context.Context" +// ast.Expr -> "*v1.XxxReq" +// ast.Expr -> "error" +// ast.Expr -> "int" +func (c CGenService) astExprToString(expr ast.Expr) (string, error) { + var ( + buf bytes.Buffer + err error + ) + err = format.Node(&buf, token.NewFileSet(), expr) + if err != nil { + return "", err + } + return buf.String(), nil +} + +// astCommentToString returns the raw (original) text of the comment. +// It includes the comment markers (//, /*, and */). +// It adds a newline at the end of the comment. +func (c CGenService) astCommentToString(node *ast.CommentGroup) string { + if node == nil { + return "" + } + var b strings.Builder + for _, c := range node.List { + b.WriteString(c.Text + "\n") + } + return b.String() +} diff --git a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go index c5746e7831..b81803eb2c 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go +++ b/cmd/gf/internal/cmd/genservice/genservice_logic_item.go @@ -7,9 +7,7 @@ package genservice import ( - "bytes" "go/ast" - "go/format" "go/parser" "go/token" @@ -178,27 +176,5 @@ func (c CGenService) getFuncResults(node *ast.FuncDecl) (results []map[string]st // getFuncComment retrieves the comment of the function. func (c CGenService) getFuncComment(node *ast.FuncDecl) string { - if node.Doc == nil { - return "" - } - return node.Doc.Text() -} - -// exprToString converts ast.Expr to string. -// For example: -// -// ast.Expr -> "context.Context" -// ast.Expr -> "*v1.XxxReq" -// ast.Expr -> "error" -// ast.Expr -> "int" -func (c CGenService) astExprToString(expr ast.Expr) (string, error) { - var ( - buf bytes.Buffer - err error - ) - err = format.Node(&buf, token.NewFileSet(), expr) - if err != nil { - return "", err - } - return buf.String(), nil + return c.astCommentToString(node.Doc) } From 6517da4b877d42704ce393daf0861a4f6cbe339e Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 13:58:48 +0800 Subject: [PATCH 17/36] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go index d01495b406..a7c08bbf6b 100644 --- a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go +++ b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go @@ -39,7 +39,7 @@ func Test_Gen_Service_Default(t *testing.T) { err = gfile.Mkdir(path) t.AssertNil(err) - defer gfile.Remove(path) + // defer gfile.Remove(path) _, err = genservice.CGenService{}.Service(ctx, in) t.AssertNil(err) From c69c31d3055d74832cd55f4f0a42aec0eee8d2ae Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 13:59:29 +0800 Subject: [PATCH 18/36] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go | 2 +- cmd/gf/internal/cmd/testdata/genservice/service/article.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go index a7c08bbf6b..d01495b406 100644 --- a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go +++ b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go @@ -39,7 +39,7 @@ func Test_Gen_Service_Default(t *testing.T) { err = gfile.Mkdir(path) t.AssertNil(err) - // defer gfile.Remove(path) + defer gfile.Remove(path) _, err = genservice.CGenService{}.Service(ctx, in) t.AssertNil(err) diff --git a/cmd/gf/internal/cmd/testdata/genservice/service/article.go b/cmd/gf/internal/cmd/testdata/genservice/service/article.go index bc02334662..7869d4ac93 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/service/article.go +++ b/cmd/gf/internal/cmd/testdata/genservice/service/article.go @@ -22,9 +22,9 @@ type ( * @author oldme */ Create(ctx context.Context, info struct{}) (id uint, err error) - A1o2(ctx context.Context, str string, a, b *ast.GoStmt) error + A1o2(ctx context.Context, str string, a *ast.GoStmt, b *ast.GoStmt) error // T1 random comment - T1(ctx context.Context, id, id2 uint) (gdb gdbas.Model, err error) + T1(ctx context.Context, id uint, id2 uint) (gdb gdbas.Model, err error) // T3 /** * random comment @*4213hHY1&%##%>< ? , . / T4(i interface{}) interface{} From ed310d3b9239fc2e281fe046034ff5a6dad67dc1 Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 14:08:07 +0800 Subject: [PATCH 19/36] =?UTF-8?q?=E5=A2=9E=E6=B7=BB=E5=A4=9A=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/cmd_z_unit_gen_service_test.go | 2 + .../testdata/genservice/logic/logic_expect.go | 1 + .../testdata/genservice/logic/user/user.go | 49 +++++++++++++++++++ .../cmd/testdata/genservice/service/user.go | 40 +++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 cmd/gf/internal/cmd/testdata/genservice/logic/user/user.go create mode 100644 cmd/gf/internal/cmd/testdata/genservice/service/user.go diff --git a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go index d01495b406..2cbb0025d4 100644 --- a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go +++ b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go @@ -57,12 +57,14 @@ func Test_Gen_Service_Default(t *testing.T) { t.AssertNil(err) t.Assert(files, []string{ dstFolder + filepath.FromSlash("/article.go"), + dstFolder + filepath.FromSlash("/user.go"), }) // contents testPath := gtest.DataPath("genservice", "service") expectFiles := []string{ testPath + filepath.FromSlash("/article.go"), + testPath + filepath.FromSlash("/user.go"), } for i := range files { t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i])) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go b/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go index c7c3f52e9c..f455526b8b 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go @@ -6,4 +6,5 @@ package logic import ( _ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/article" + _ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/user" ) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/user/user.go b/cmd/gf/internal/cmd/testdata/genservice/logic/user/user.go new file mode 100644 index 0000000000..1b5d5b1112 --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/user/user.go @@ -0,0 +1,49 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package user + +import ( + "context" + + "github.com/gogf/gf/cmd/gf/v2/internal/service" +) + +func init() { + service.RegisterUser(New()) +} + +type sUser struct { +} + +func New() *sUser { + return &sUser{} +} + +// Create creates a new user. +func (s *sUser) Create(ctx context.Context, name string) (id int, err error) { + return 0, nil +} + +// GetOne retrieves user by id. +func (s *sUser) GetOne(ctx context.Context, id int) (name string, err error) { + return "", nil +} + +// GetList retrieves user list. +func (s *sUser) GetList(ctx context.Context) (names []string, err error) { + return nil, nil +} + +// Update updates user by id. +func (s *sUser) Update(ctx context.Context, id int) (name string, err error) { + return "", nil +} + +// Delete deletes user by id. +func (s *sUser) Delete(ctx context.Context, id int) (err error) { + return nil +} diff --git a/cmd/gf/internal/cmd/testdata/genservice/service/user.go b/cmd/gf/internal/cmd/testdata/genservice/service/user.go new file mode 100644 index 0000000000..731ee87c50 --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/genservice/service/user.go @@ -0,0 +1,40 @@ +// ================================================================================ +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" +) + +type ( + IUser interface { + // Create creates a new user. + Create(ctx context.Context, name string) (id int, err error) + // GetOne retrieves user by id. + GetOne(ctx context.Context, id int) (name string, err error) + // GetList retrieves user list. + GetList(ctx context.Context) (names []string, err error) + // Update updates user by id. + Update(ctx context.Context, id int) (name string, err error) + // Delete deletes user by id. + Delete(ctx context.Context, id int) (err error) + } +) + +var ( + localUser IUser +) + +func User() IUser { + if localUser == nil { + panic("implement not found for interface IUser, forgot register?") + } + return localUser +} + +func RegisterUser(i IUser) { + localUser = i +} From 9aa3dc58508cab6db57b2353b7e00d7c36301157 Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 14:08:57 +0800 Subject: [PATCH 20/36] =?UTF-8?q?=E5=A2=9E=E6=B7=BB=E5=A4=9A=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/testdata/genservice/logic/user/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/user/user.go b/cmd/gf/internal/cmd/testdata/genservice/logic/user/user.go index 1b5d5b1112..a95e22740e 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/user/user.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/user/user.go @@ -9,7 +9,7 @@ package user import ( "context" - "github.com/gogf/gf/cmd/gf/v2/internal/service" + "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service" ) func init() { From 856119c2ebcc523368d34125667f0b884e25133a Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 14:36:30 +0800 Subject: [PATCH 21/36] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=BA=90=E6=96=87=E4=BB=B6=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/genservice/genservice_calculate.go | 113 +++--------------- .../cmd/genservice/genservice_generate.go | 35 +++--- ...vice_logic_item.go => genservice_parse.go} | 50 ++++---- 3 files changed, 62 insertions(+), 136 deletions(-) rename cmd/gf/internal/cmd/genservice/{genservice_logic_item.go => genservice_parse.go} (69%) diff --git a/cmd/gf/internal/cmd/genservice/genservice_calculate.go b/cmd/gf/internal/cmd/genservice/genservice_calculate.go index abee0d85b9..7908994156 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -8,103 +8,18 @@ package genservice import ( "fmt" - "go/parser" - "go/token" - "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/container/gmap" "github.com/gogf/gf/v2/text/gregex" "github.com/gogf/gf/v2/text/gstr" ) -type packageItem struct { - Alias string - Path string - RawImport string -} - -func (c CGenService) calculateImportedPackages(fileContent string) (packages []packageItem, err error) { - f, err := parser.ParseFile(token.NewFileSet(), "", fileContent, parser.ImportsOnly) - if err != nil { - return nil, err - } - packages = make([]packageItem, 0) - for _, s := range f.Imports { - if s.Path != nil { - if s.Name != nil { - // If it has alias, and it is not `_`. - if pkgAlias := s.Name.String(); pkgAlias != "_" { - packages = append(packages, packageItem{ - Alias: pkgAlias, - Path: s.Path.Value, - RawImport: pkgAlias + " " + s.Path.Value, - }) - } - } else { - // no alias - packages = append(packages, packageItem{ - Alias: "", - Path: s.Path.Value, - RawImport: s.Path.Value, - }) - } - } - } - return packages, nil -} - -func (c CGenService) calculateCodeCommented(in CGenServiceInput, fileContent string, srcCodeCommentedMap map[string]string) error { - matches, err := gregex.MatchAllString(`((((//.*)|(/\*[\s\S]*?\*/))\s)+)func \((.+?)\) ([\s\S]+?) {`, fileContent) - if err != nil { - return err - } - for _, match := range matches { - var ( - structName string - structMatch []string - funcReceiver = gstr.Trim(match[1+5]) - receiverArray = gstr.SplitAndTrim(funcReceiver, " ") - functionHead = gstr.Trim(gstr.Replace(match[2+5], "\n", "")) - commentedInfo = "" - ) - if len(receiverArray) > 1 { - structName = receiverArray[1] - } else if len(receiverArray) == 1 { - structName = receiverArray[0] - } - structName = gstr.Trim(structName, "*") - - // Case of: - // Xxx(\n ctx context.Context, req *v1.XxxReq,\n) -> Xxx(ctx context.Context, req *v1.XxxReq) - functionHead = gstr.Replace(functionHead, `,)`, `)`) - functionHead, _ = gregex.ReplaceString(`\(\s+`, `(`, functionHead) - functionHead, _ = gregex.ReplaceString(`\s{2,}`, ` `, functionHead) - if !gstr.IsLetterUpper(functionHead[0]) { - continue - } - // Match and pick the struct name from receiver. - if structMatch, err = gregex.MatchString(in.StPattern, structName); err != nil { - return err - } - if len(structMatch) < 1 { - continue - } - structName = gstr.CaseCamel(structMatch[1]) - - commentedInfo = match[1] - if len(commentedInfo) > 0 { - srcCodeCommentedMap[fmt.Sprintf("%s-%s", structName, functionHead)] = commentedInfo - } - } - return nil -} - func (c CGenService) calculateInterfaceFunctions( - in CGenServiceInput, logicItems []logicItem, srcPkgInterfaceMap *gmap.ListMap, + in CGenServiceInput, funcItems []funcItem, srcPkgInterfaceMap *gmap.ListMap, ) (err error) { - var srcPkgInterfaceFuncArray *garray.StrArray + var srcPkgInterfaceFunc []map[string]string - for _, item := range logicItems { + for _, item := range funcItems { var ( // eg: "sArticle" receiverName string @@ -134,17 +49,23 @@ func (c CGenService) calculateInterfaceFunctions( continue } - inputParamStr := c.tidyParam(item.Params) - outputParamStr := c.tidyResult(item.Results) - - methodHead = fmt.Sprintf("%s(%s) (%s)", item.MethodName, inputParamStr, outputParamStr) if !srcPkgInterfaceMap.Contains(receiverName) { - srcPkgInterfaceFuncArray = garray.NewStrArray() - srcPkgInterfaceMap.Set(receiverName, srcPkgInterfaceFuncArray) + srcPkgInterfaceFunc = make([]map[string]string, 0) + srcPkgInterfaceMap.Set(receiverName, srcPkgInterfaceFunc) } else { - srcPkgInterfaceFuncArray = srcPkgInterfaceMap.Get(receiverName).(*garray.StrArray) + srcPkgInterfaceFunc = srcPkgInterfaceMap.Get(receiverName).([]map[string]string) } - srcPkgInterfaceFuncArray.Append(methodHead) + + // make the method head. + inputParamStr := c.tidyParam(item.Params) + outputParamStr := c.tidyResult(item.Results) + methodHead = fmt.Sprintf("%s(%s) (%s)", item.MethodName, inputParamStr, outputParamStr) + + srcPkgInterfaceFunc = append(srcPkgInterfaceFunc, map[string]string{ + "methodHead": methodHead, + "methodComment": item.Comment, + }) + srcPkgInterfaceMap.Set(receiverName, srcPkgInterfaceFunc) } return nil } diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate.go b/cmd/gf/internal/cmd/genservice/genservice_generate.go index 4753de7e84..9107e15bca 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate.go @@ -9,16 +9,15 @@ package genservice import ( "fmt" + "github.com/gogf/gf/cmd/gf/v2/internal/consts" + "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog" + "github.com/gogf/gf/cmd/gf/v2/internal/utility/utils" "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/container/gmap" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/text/gregex" "github.com/gogf/gf/v2/text/gstr" - - "github.com/gogf/gf/cmd/gf/v2/internal/consts" - "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog" - "github.com/gogf/gf/cmd/gf/v2/internal/utility/utils" ) type generateServiceFilesInput struct { @@ -28,13 +27,12 @@ type generateServiceFilesInput struct { SrcImportedPackages []string SrcPackageName string DstPackageName string - SrcCodeCommentedMap map[string]string } func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, err error) { var ( - generatedContent string - allFuncArray = garray.NewStrArray() // Used for check whether interface dirty, going to change file content. + generatedContent string + // allFuncArray = garray.NewStrArray() // Used for check whether interface dirty, going to change file content. importedPackagesContent = fmt.Sprintf( "import (\n%s\n)", gstr.Join(in.SrcImportedPackages, "\n"), ) @@ -48,15 +46,16 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, generatedContent += "type(" generatedContent += "\n" in.SrcStructFunctions.Iterator(func(key, value interface{}) bool { - structName, funcArray := key.(string), value.(*garray.StrArray) - allFuncArray.Append(funcArray.Slice()...) + structName, funcSlice := key.(string), value.([]map[string]string) + funcs := make([]string, 0) + // allFuncArray.Append(funcArray.Slice()...) // Add comments to a method. - for index, funcName := range funcArray.Slice() { - if commentedInfo, exist := in.SrcCodeCommentedMap[fmt.Sprintf("%s-%s", structName, funcName)]; exist { - funcName = commentedInfo + funcName - _ = funcArray.Set(index, funcName) - } + for _, funcInfo := range funcSlice { + funName := funcInfo["methodComment"] + funcInfo["methodHead"] + funcs = append(funcs, funName) } + // funcs to string + funcArray := garray.NewStrArrayFrom(funcs) generatedContent += gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentInterface, g.MapStrStr{ "{InterfaceName}": "I" + structName, "{FuncDefinition}": funcArray.Join("\n\t"), @@ -120,10 +119,10 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, mlog.Printf(`ignore file as it is manually maintained: %s`, in.DstFilePath) return false, nil } - if !c.isToGenerateServiceGoFile(in.DstPackageName, in.DstFilePath, allFuncArray) { - mlog.Printf(`not dirty, ignore generating service go file: %s`, in.DstFilePath) - return false, nil - } + // if !c.isToGenerateServiceGoFile(in.DstPackageName, in.DstFilePath, allFuncArray) { + // mlog.Printf(`not dirty, ignore generating service go file: %s`, in.DstFilePath) + // return false, nil + // } } mlog.Printf(`generating service go file: %s`, in.DstFilePath) if err = gfile.PutContents(in.DstFilePath, generatedContent); err != nil { diff --git a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go b/cmd/gf/internal/cmd/genservice/genservice_parse.go similarity index 69% rename from cmd/gf/internal/cmd/genservice/genservice_logic_item.go rename to cmd/gf/internal/cmd/genservice/genservice_parse.go index b81803eb2c..6a7785ffa1 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_logic_item.go +++ b/cmd/gf/internal/cmd/genservice/genservice_parse.go @@ -14,7 +14,13 @@ import ( "github.com/gogf/gf/v2/os/gfile" ) -type logicItem struct { +type pkgItem struct { + Alias string `eg:"gdbas"` + Path string `eg:"github.com/gogf/gf/v2/database/gdb"` + RawImport string `eg:"gdbas github.com/gogf/gf/v2/database/gdb"` +} + +type funcItem struct { Receiver string `eg:"sUser"` MethodName string `eg:"GetList"` Params []map[string]string `eg:"ctx: context.Context, cond: *SearchInput"` @@ -22,10 +28,10 @@ type logicItem struct { Comment string `eg:"Get user list"` } -// CalculateItemsInSrc retrieves the logic items in the specified source file. +// parseItemsInSrc parses the pkgItem and funcItem from the specified file. // It can't skip the private methods. // It can't skip the imported packages of import alias equal to `_`. -func (c CGenService) CalculateItemsInSrc(filePath string) (pkgItems []packageItem, logicItems []logicItem, err error) { +func (c CGenService) parseItemsInSrc(filePath string) (pkgItems []pkgItem, funcItems []funcItem, err error) { var ( fileContent = gfile.GetContents(filePath) fileSet = token.NewFileSet() @@ -39,22 +45,22 @@ func (c CGenService) CalculateItemsInSrc(filePath string) (pkgItems []packageIte ast.Inspect(node, func(n ast.Node) bool { switch x := n.(type) { case *ast.ImportSpec: - // calculate the imported packages - pkgItems = append(pkgItems, c.getImportPackages(x)) + // parse the imported packages. + pkgItems = append(pkgItems, c.parseImportPackages(x)) case *ast.FuncDecl: - // calculate the logic items + // parse the function items. if x.Recv == nil { return true } var funcName = x.Name.Name - logicItems = append(logicItems, logicItem{ - Receiver: c.getFuncReceiverTypeName(x), + funcItems = append(funcItems, funcItem{ + Receiver: c.parseFuncReceiverTypeName(x), MethodName: funcName, - Params: c.getFuncParams(x), - Results: c.getFuncResults(x), - Comment: c.getFuncComment(x), + Params: c.parseFuncParams(x), + Results: c.parseFuncResults(x), + Comment: c.parseFuncComment(x), }) } return true @@ -62,8 +68,8 @@ func (c CGenService) CalculateItemsInSrc(filePath string) (pkgItems []packageIte return } -// getImportPackages retrieves the imported packages from the specified ast.ImportSpec. -func (c CGenService) getImportPackages(node *ast.ImportSpec) (packages packageItem) { +// parseImportPackages retrieves the imported packages from the specified ast.ImportSpec. +func (c CGenService) parseImportPackages(node *ast.ImportSpec) (packages pkgItem) { if node.Path == nil { return } @@ -78,19 +84,19 @@ func (c CGenService) getImportPackages(node *ast.ImportSpec) (packages packageIt } else { rawImport = path } - return packageItem{ + return pkgItem{ Alias: alias, Path: path, RawImport: rawImport, } } -// getFuncReceiverTypeName retrieves the receiver type of the function. +// parseFuncReceiverTypeName retrieves the receiver type of the function. // For example: // // func(s *sArticle) -> *sArticle // func(s sArticle) -> sArticle -func (c CGenService) getFuncReceiverTypeName(node *ast.FuncDecl) (receiverType string) { +func (c CGenService) parseFuncReceiverTypeName(node *ast.FuncDecl) (receiverType string) { if node.Recv == nil { return "" } @@ -101,12 +107,12 @@ func (c CGenService) getFuncReceiverTypeName(node *ast.FuncDecl) (receiverType s return } -// getFuncParams retrieves the input parameters of the function. +// parseFuncParams retrieves the input parameters of the function. // It returns the name and type of the input parameters. // For example: // // []map[string]string{paramName:ctx paramType:context.Context, paramName:info paramType:struct{}} -func (c CGenService) getFuncParams(node *ast.FuncDecl) (params []map[string]string) { +func (c CGenService) parseFuncParams(node *ast.FuncDecl) (params []map[string]string) { if node.Type.Params == nil { return } @@ -137,13 +143,13 @@ func (c CGenService) getFuncParams(node *ast.FuncDecl) (params []map[string]stri return } -// getFuncResults retrieves the output parameters of the function. +// parseFuncResults retrieves the output parameters of the function. // It returns the name and type of the output parameters. // For example: // // []map[string]string{resultName:list resultType:[]*User, resultName:err resultType:error} // []map[string]string{resultName: "", resultType: error} -func (c CGenService) getFuncResults(node *ast.FuncDecl) (results []map[string]string) { +func (c CGenService) parseFuncResults(node *ast.FuncDecl) (results []map[string]string) { if node.Type.Results == nil { return } @@ -174,7 +180,7 @@ func (c CGenService) getFuncResults(node *ast.FuncDecl) (results []map[string]st return } -// getFuncComment retrieves the comment of the function. -func (c CGenService) getFuncComment(node *ast.FuncDecl) string { +// parseFuncComment retrieves the comment of the function. +func (c CGenService) parseFuncComment(node *ast.FuncDecl) string { return c.astCommentToString(node.Doc) } From 3372f0cc99f410a8ab8417413ed76a646ea00617 Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 14:50:47 +0800 Subject: [PATCH 22/36] =?UTF-8?q?=E5=AE=8C=E5=96=84func=20item?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/genservice/genservice.go | 18 +----- .../cmd/genservice/genservice_calculate.go | 12 ++-- .../cmd/genservice/genservice_generate.go | 62 +++---------------- 3 files changed, 16 insertions(+), 76 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index 8cdc5e34e3..35aa6812fa 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -23,7 +23,6 @@ import ( "github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/gtag" - "github.com/gogf/gf/v2/util/gutil" ) const ( @@ -183,26 +182,15 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe dstFilePath = gfile.Join(in.DstFolder, c.getDstFileNameCase(srcPackageName, in.DstFileNameCase)+".go", ) - srcCodeCommentedMap = make(map[string]string) ) generatedDstFilePathSet.Add(dstFilePath) for _, file := range files { - packageItems, logicItems, err := c.CalculateItemsInSrc(file) + packageItems, funcItems, err := c.parseItemsInSrc(file) if err != nil { return nil, err } fileContent = gfile.GetContents(file) - // Calculate code comments in source Go files. - err = c.calculateCodeCommented(in, fileContent, srcCodeCommentedMap) - if err != nil { - return nil, err - } - // remove all comments. - fileContent, err = gregex.ReplaceString(`(//.*)|((?s)/\*.*?\*/)`, "", fileContent) - if err != nil { - return nil, err - } // try finding the conflicts imports between files. for _, item := range packageItems { @@ -276,7 +264,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe } // Calculate functions and interfaces for service generating. - err = c.calculateInterfaceFunctions(in, logicItems, srcPkgInterfaceMap) + err = c.calculateInterfaceFunctions(in, funcItems, srcPkgInterfaceMap) if err != nil { return nil, err } @@ -295,7 +283,6 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe continue } - gutil.Dump(srcPkgInterfaceMap) // Generating service go file for single logic package. if ok, err = c.generateServiceFile(generateServiceFilesInput{ CGenServiceInput: in, @@ -304,7 +291,6 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe SrcPackageName: srcPackageName, DstPackageName: dstPackageName, DstFilePath: dstFilePath, - SrcCodeCommentedMap: srcCodeCommentedMap, }); err != nil { return } diff --git a/cmd/gf/internal/cmd/genservice/genservice_calculate.go b/cmd/gf/internal/cmd/genservice/genservice_calculate.go index 7908994156..0f38c9ca98 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -26,7 +26,7 @@ func (c CGenService) calculateInterfaceFunctions( receiverMatch []string // eg: "GetList(ctx context.Context, req *v1.ArticleListReq) (list []*v1.Article, err error)" - methodHead string + funcHead string ) // handle the receiver name. @@ -44,7 +44,7 @@ func (c CGenService) calculateInterfaceFunctions( } receiverName = gstr.CaseCamel(receiverMatch[1]) - // check if the method name is public. + // check if the func name is public. if !gstr.IsLetterUpper(item.MethodName[0]) { continue } @@ -56,14 +56,14 @@ func (c CGenService) calculateInterfaceFunctions( srcPkgInterfaceFunc = srcPkgInterfaceMap.Get(receiverName).([]map[string]string) } - // make the method head. + // make the func head. inputParamStr := c.tidyParam(item.Params) outputParamStr := c.tidyResult(item.Results) - methodHead = fmt.Sprintf("%s(%s) (%s)", item.MethodName, inputParamStr, outputParamStr) + funcHead = fmt.Sprintf("%s(%s) (%s)", item.MethodName, inputParamStr, outputParamStr) srcPkgInterfaceFunc = append(srcPkgInterfaceFunc, map[string]string{ - "methodHead": methodHead, - "methodComment": item.Comment, + "funcHead": funcHead, + "funcComment": item.Comment, }) srcPkgInterfaceMap.Set(receiverName, srcPkgInterfaceFunc) } diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate.go b/cmd/gf/internal/cmd/genservice/genservice_generate.go index 9107e15bca..94af205c62 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate.go @@ -31,11 +31,12 @@ type generateServiceFilesInput struct { func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, err error) { var ( - generatedContent string - // allFuncArray = garray.NewStrArray() // Used for check whether interface dirty, going to change file content. + generatedContent string importedPackagesContent = fmt.Sprintf( "import (\n%s\n)", gstr.Join(in.SrcImportedPackages, "\n"), ) + funcContents = make([]string, 0) + funcContent string ) generatedContent += gstr.ReplaceByMap(consts.TemplateGenServiceContentHead, g.MapStrStr{ "{Imports}": importedPackagesContent, @@ -47,15 +48,13 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, generatedContent += "\n" in.SrcStructFunctions.Iterator(func(key, value interface{}) bool { structName, funcSlice := key.(string), value.([]map[string]string) - funcs := make([]string, 0) - // allFuncArray.Append(funcArray.Slice()...) - // Add comments to a method. + // Generating interface content. for _, funcInfo := range funcSlice { - funName := funcInfo["methodComment"] + funcInfo["methodHead"] - funcs = append(funcs, funName) + funcContent = funcInfo["funcComment"] + funcInfo["funcHead"] + funcContents = append(funcContents, funcContent) } - // funcs to string - funcArray := garray.NewStrArrayFrom(funcs) + // funcContents to string + funcArray := garray.NewStrArrayFrom(funcContents) generatedContent += gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentInterface, g.MapStrStr{ "{InterfaceName}": "I" + structName, "{FuncDefinition}": funcArray.Join("\n\t"), @@ -119,10 +118,6 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, mlog.Printf(`ignore file as it is manually maintained: %s`, in.DstFilePath) return false, nil } - // if !c.isToGenerateServiceGoFile(in.DstPackageName, in.DstFilePath, allFuncArray) { - // mlog.Printf(`not dirty, ignore generating service go file: %s`, in.DstFilePath) - // return false, nil - // } } mlog.Printf(`generating service go file: %s`, in.DstFilePath) if err = gfile.PutContents(in.DstFilePath, generatedContent); err != nil { @@ -131,47 +126,6 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, return true, nil } -// isToGenerateServiceGoFile checks and returns whether the service content dirty. -func (c CGenService) isToGenerateServiceGoFile(dstPackageName, filePath string, funcArray *garray.StrArray) bool { - var ( - err error - fileContent = gfile.GetContents(filePath) - generatedFuncArray = garray.NewSortedStrArrayFrom(funcArray.Slice()) - contentFuncArray = garray.NewSortedStrArray() - ) - if fileContent == "" { - return true - } - // remove all comments. - fileContent, err = gregex.ReplaceString(`(//.*)|((?s)/\*.*?\*/)`, "", fileContent) - if err != nil { - panic(err) - return false - } - matches, _ := gregex.MatchAllString(`\s+interface\s+{([\s\S]+?)}`, fileContent) - for _, match := range matches { - contentFuncArray.Append(gstr.SplitAndTrim(match[1], "\n")...) - } - if generatedFuncArray.Len() != contentFuncArray.Len() { - mlog.Debugf( - `dirty, generatedFuncArray.Len()[%d] != contentFuncArray.Len()[%d]`, - generatedFuncArray.Len(), contentFuncArray.Len(), - ) - return true - } - var funcDefinition string - for i := 0; i < generatedFuncArray.Len(); i++ { - funcDefinition, _ = gregex.ReplaceString( - fmt.Sprintf(`\*{0,1}%s\.`, dstPackageName), ``, generatedFuncArray.At(i), - ) - if funcDefinition != contentFuncArray.At(i) { - mlog.Debugf(`dirty, %s != %s`, funcDefinition, contentFuncArray.At(i)) - return true - } - } - return false -} - // generateInitializationFile generates `logic.go`. func (c CGenService) generateInitializationFile(in CGenServiceInput, importSrcPackages []string) (err error) { var ( From cd809dc1c06ec421d3ec5da598d34674e5b0fb4b Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 16:27:33 +0800 Subject: [PATCH 23/36] =?UTF-8?q?#3492=20=E6=B5=8B=E8=AF=95=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/testdata/genservice/logic/article/article.go | 5 +++++ cmd/gf/internal/cmd/testdata/genservice/service/article.go | 2 ++ 2 files changed, 7 insertions(+) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go index 07545f7908..57b6a31a6e 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article.go @@ -12,6 +12,7 @@ import ( t "time" "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service" + gdbalias "github.com/gogf/gf/v2/database/gdb" ) type sArticle struct { @@ -40,3 +41,7 @@ func (s *sArticle) Create(ctx context.Context, info struct{}) (id uint, err erro func (s *sArticle) A1o2(ctx context.Context, str string, a, b *ast.GoStmt) error { return nil } + +func (s *sArticle) B_2(ctx context.Context, db gdbalias.Raw) (err error) { + return nil +} diff --git a/cmd/gf/internal/cmd/testdata/genservice/service/article.go b/cmd/gf/internal/cmd/testdata/genservice/service/article.go index 7869d4ac93..03e17acb0b 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/service/article.go +++ b/cmd/gf/internal/cmd/testdata/genservice/service/article.go @@ -9,6 +9,7 @@ import ( "context" "go/ast" + gdbalias "github.com/gogf/gf/v2/database/gdb" gdbas "github.com/gogf/gf/v2/database/gdb" ) @@ -23,6 +24,7 @@ type ( */ Create(ctx context.Context, info struct{}) (id uint, err error) A1o2(ctx context.Context, str string, a *ast.GoStmt, b *ast.GoStmt) error + B_2(ctx context.Context, db gdbalias.Raw) (err error) // T1 random comment T1(ctx context.Context, id uint, id2 uint) (gdb gdbas.Model, err error) // T3 From 844252c0376678e780ddd3ab9f3a04b55a3dc2ac Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 16:56:28 +0800 Subject: [PATCH 24/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genservice/logic/article/article_extra.go | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go index 91f93e6ff4..165747407d 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/article/article_extra.go @@ -6,10 +6,19 @@ package article +// import ( +// "context" +// +// "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service" +// ) import ( "context" + // This is a random comment gdbas "github.com/gogf/gf/v2/database/gdb" + /** + * + */ _ "github.com/gogf/gf/v2/os/gfile" ) @@ -19,8 +28,16 @@ func (s sArticle) T1(ctx context.Context, id, id2 uint) (gdb gdbas.Model, err er return g, err } +// I'm a random comment + // t2 random comment func (s *sArticle) t2(ctx context.Context) (err error) { + /** + * random comment + * i (1). func (s *sArticle) t2(ctx context.Context) (err error) { /** 1883 + * + */ + _ = func(ctx2 context.Context) {} return nil } @@ -33,11 +50,26 @@ func (s *sArticle) t2(ctx context.Context) (err error) { * @author oldme */ func (s *sArticle) T3(ctx context.Context, b *gdbas.Model) (c, d *gdbas.Model, err error) { + /* import ( + * "context" + * + * "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service" + */ return nil, nil, nil } +/** + * random comment + */ + // func (s *sArticle) T4(i interface{}) interface{} // # $ % ^ & * ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . / func (s *sArticle) T4(i interface{}) interface{} { return nil } + +/** + * func (s *sArticle) T4(i interface{}) interface{} { + * return nil + * } + */ From a1bd2c669dd0913da62fa3469280f9df43fb6690 Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 16:59:48 +0800 Subject: [PATCH 25/36] done! --- cmd/gf/internal/cmd/genservice/genservice.go | 95 +++---------------- .../cmd/genservice/genservice_calculate.go | 48 +++++++++- 2 files changed, 56 insertions(+), 87 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index 35aa6812fa..197f7bb3eb 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -148,7 +148,6 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe var ( isDirty bool // Temp boolean. files []string // Temp file array. - fileContent string // Temp file content for handling go file. initImportSrcPackages []string // Used for generating logic.go. inputPackages = in.Packages // Custom packages. dstPackageName = gstr.ToLower(gfile.Basename(in.DstFolder)) // Package name for generated go files. @@ -172,99 +171,29 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe } // Parse single logic package folder. var ( - // StructName => FunctionDefinitions - srcPkgInterfaceMap = gmap.NewListMap() - srcImportedPackages = garray.NewSortedStrArray().SetUnique(true) - importAliasToPathMap = gmap.NewStrStrMap() // for conflict imports check. alias => import path(with `"`) - importPathToAliasMap = gmap.NewStrStrMap() // for conflict imports check. import path(with `"`) => alias - srcPackageName = gfile.Basename(srcFolderPath) - ok bool - dstFilePath = gfile.Join(in.DstFolder, + srcPackageName = gfile.Basename(srcFolderPath) + srcPkgInterface = gmap.NewListMap() + srcImportedPackages = garray.NewSortedStrArray().SetUnique(true) + ok bool + dstFilePath = gfile.Join(in.DstFolder, c.getDstFileNameCase(srcPackageName, in.DstFileNameCase)+".go", ) ) generatedDstFilePathSet.Add(dstFilePath) for _, file := range files { - packageItems, funcItems, err := c.parseItemsInSrc(file) + pkgItems, funcItems, err := c.parseItemsInSrc(file) if err != nil { return nil, err } - fileContent = gfile.GetContents(file) - - // try finding the conflicts imports between files. - for _, item := range packageItems { - var alias = item.Alias - if alias == "" { - alias = gfile.Basename(gstr.Trim(item.Path, `"`)) - } - - // ignore unused import paths, which do not exist in function definitions. - if !gregex.IsMatchString(fmt.Sprintf(`func .+?([^\w])%s(\.\w+).+?{`, alias), fileContent) { - mlog.Debugf(`ignore unused package: %s`, item.RawImport) - continue - } - - // find the exist alias with the same import path. - var existAlias = importPathToAliasMap.Get(item.Path) - if existAlias != "" { - fileContent, err = gregex.ReplaceStringFuncMatch( - fmt.Sprintf(`([^\w])%s(\.\w+)`, alias), fileContent, - func(match []string) string { - return match[1] + existAlias + match[2] - }, - ) - if err != nil { - return nil, err - } - continue - } - - // resolve alias conflicts. - var importPath = importAliasToPathMap.Get(alias) - if importPath == "" { - importAliasToPathMap.Set(alias, item.Path) - importPathToAliasMap.Set(item.Path, alias) - srcImportedPackages.Add(item.RawImport) - continue - } - if importPath != item.Path { - // update the conflicted alias for import path with suffix. - // eg: - // v1 -> v10 - // v11 -> v110 - for aliasIndex := 0; ; aliasIndex++ { - item.Alias = fmt.Sprintf(`%s%d`, alias, aliasIndex) - var existPathForAlias = importAliasToPathMap.Get(item.Alias) - if existPathForAlias != "" { - if existPathForAlias == item.Path { - break - } - continue - } - break - } - importPathToAliasMap.Set(item.Path, item.Alias) - importAliasToPathMap.Set(item.Alias, item.Path) - // reformat the import path with alias. - item.RawImport = fmt.Sprintf(`%s %s`, item.Alias, item.Path) - - // update the file content with new alias import. - fileContent, err = gregex.ReplaceStringFuncMatch( - fmt.Sprintf(`([^\w])%s(\.\w+)`, alias), fileContent, - func(match []string) string { - return match[1] + item.Alias + match[2] - }, - ) - if err != nil { - return nil, err - } - srcImportedPackages.Add(item.RawImport) - } + // Calculate imported packages for service generating. + err = c.calculatePkgItems(in, pkgItems, funcItems, srcImportedPackages) + if err != nil { + return nil, err } // Calculate functions and interfaces for service generating. - err = c.calculateInterfaceFunctions(in, funcItems, srcPkgInterfaceMap) + err = c.calculateFuncItems(in, funcItems, srcPkgInterface) if err != nil { return nil, err } @@ -286,7 +215,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe // Generating service go file for single logic package. if ok, err = c.generateServiceFile(generateServiceFilesInput{ CGenServiceInput: in, - SrcStructFunctions: srcPkgInterfaceMap, + SrcStructFunctions: srcPkgInterface, SrcImportedPackages: srcImportedPackages.Slice(), SrcPackageName: srcPackageName, DstPackageName: dstPackageName, diff --git a/cmd/gf/internal/cmd/genservice/genservice_calculate.go b/cmd/gf/internal/cmd/genservice/genservice_calculate.go index 0f38c9ca98..b9a4942823 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -8,13 +8,53 @@ package genservice import ( "fmt" + "strings" + "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog" + "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/container/gmap" + "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/text/gregex" "github.com/gogf/gf/v2/text/gstr" ) -func (c CGenService) calculateInterfaceFunctions( +func (c CGenService) calculatePkgItems( + in CGenServiceInput, pkgItems []pkgItem, funcItems []funcItem, srcImportedPackages *garray.SortedStrArray, +) (err error) { + // allFuncParamType saves all the param and result types of the functions. + var allFuncParamType strings.Builder + + for _, item := range funcItems { + for _, param := range item.Params { + allFuncParamType.WriteString(param["paramType"] + ",") + } + for _, result := range item.Results { + allFuncParamType.WriteString(result["resultType"] + ",") + } + } + + for _, item := range pkgItems { + alias := item.Alias + + // If the alias is _, it means that the package is not generated. + if alias == "_" { + mlog.Debugf(`ignore anonymous package: %s`, item.RawImport) + continue + } + // If the alias is empty, it will use the package name as the alias. + if alias == "" { + alias = gfile.Basename(gstr.Trim(item.Path, `"`)) + } + if !gstr.Contains(allFuncParamType.String(), alias) { + mlog.Debugf(`ignore unused package: %s`, item.RawImport) + continue + } + srcImportedPackages.Add(item.RawImport) + } + return nil +} + +func (c CGenService) calculateFuncItems( in CGenServiceInput, funcItems []funcItem, srcPkgInterfaceMap *gmap.ListMap, ) (err error) { var srcPkgInterfaceFunc []map[string]string @@ -57,9 +97,9 @@ func (c CGenService) calculateInterfaceFunctions( } // make the func head. - inputParamStr := c.tidyParam(item.Params) - outputParamStr := c.tidyResult(item.Results) - funcHead = fmt.Sprintf("%s(%s) (%s)", item.MethodName, inputParamStr, outputParamStr) + paramsStr := c.tidyParam(item.Params) + resultsStr := c.tidyResult(item.Results) + funcHead = fmt.Sprintf("%s(%s) (%s)", item.MethodName, paramsStr, resultsStr) srcPkgInterfaceFunc = append(srcPkgInterfaceFunc, map[string]string{ "funcHead": funcHead, From 2e2463d1ee3ea63547501e43b36c09640f3b3b8a Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 17:00:12 +0800 Subject: [PATCH 26/36] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/g_temp_test.go | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 cmd/gf/internal/cmd/g_temp_test.go diff --git a/cmd/gf/internal/cmd/g_temp_test.go b/cmd/gf/internal/cmd/g_temp_test.go deleted file mode 100644 index 4c4520deb7..0000000000 --- a/cmd/gf/internal/cmd/g_temp_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package cmd - -import ( - "testing" - - "github.com/gogf/gf/cmd/gf/v2/internal/cmd/genservice" - "github.com/gogf/gf/v2/test/gtest" - "github.com/gogf/gf/v2/util/gutil" -) - -func TestTemp(t *testing.T) { - path := gtest.DataPath("genservice", "logic", "article", "article_extra.go") - pkgs, items, err := genservice.CGenService{}.CalculateItemsInSrc(path) - if err != nil { - panic(err) - } - gutil.Dump(pkgs) - gutil.Dump(items) -} From 3f9db25877a25c4233f31e8551ed19714c392a1f Mon Sep 17 00:00:00 2001 From: oldme Date: Wed, 17 Apr 2024 17:01:17 +0800 Subject: [PATCH 27/36] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genservice/{genservice_parse.go => genservice_ast_parse.go} | 0 .../cmd/genservice/{genservice_ast.go => genservice_ast_utils.go} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename cmd/gf/internal/cmd/genservice/{genservice_parse.go => genservice_ast_parse.go} (100%) rename cmd/gf/internal/cmd/genservice/{genservice_ast.go => genservice_ast_utils.go} (100%) diff --git a/cmd/gf/internal/cmd/genservice/genservice_parse.go b/cmd/gf/internal/cmd/genservice/genservice_ast_parse.go similarity index 100% rename from cmd/gf/internal/cmd/genservice/genservice_parse.go rename to cmd/gf/internal/cmd/genservice/genservice_ast_parse.go diff --git a/cmd/gf/internal/cmd/genservice/genservice_ast.go b/cmd/gf/internal/cmd/genservice/genservice_ast_utils.go similarity index 100% rename from cmd/gf/internal/cmd/genservice/genservice_ast.go rename to cmd/gf/internal/cmd/genservice/genservice_ast_utils.go From bccfe134efb14893d320a2fce0b0aba7ab68e5f5 Mon Sep 17 00:00:00 2001 From: oldme Date: Thu, 18 Apr 2024 09:25:37 +0800 Subject: [PATCH 28/36] up --- cmd/gf/internal/cmd/genservice/genservice.go | 14 ++++++++------ .../cmd/genservice/genservice_calculate.go | 10 +++++++--- .../internal/cmd/genservice/genservice_generate.go | 6 +++--- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index 197f7bb3eb..cde0b01d14 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -172,8 +172,8 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe // Parse single logic package folder. var ( srcPackageName = gfile.Basename(srcFolderPath) - srcPkgInterface = gmap.NewListMap() srcImportedPackages = garray.NewSortedStrArray().SetUnique(true) + srcStructFunctions = gmap.NewListMap() ok bool dstFilePath = gfile.Join(in.DstFolder, c.getDstFileNameCase(srcPackageName, in.DstFileNameCase)+".go", @@ -187,13 +187,13 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe } // Calculate imported packages for service generating. - err = c.calculatePkgItems(in, pkgItems, funcItems, srcImportedPackages) + err = c.calculateImportedItems(in, pkgItems, funcItems, srcImportedPackages) if err != nil { return nil, err } // Calculate functions and interfaces for service generating. - err = c.calculateFuncItems(in, funcItems, srcPkgInterface) + err = c.calculateFuncItems(in, funcItems, srcStructFunctions) if err != nil { return nil, err } @@ -215,9 +215,9 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe // Generating service go file for single logic package. if ok, err = c.generateServiceFile(generateServiceFilesInput{ CGenServiceInput: in, - SrcStructFunctions: srcPkgInterface, - SrcImportedPackages: srcImportedPackages.Slice(), SrcPackageName: srcPackageName, + SrcImportedPackages: srcImportedPackages.Slice(), + SrcStructFunctions: srcStructFunctions, DstPackageName: dstPackageName, DstFilePath: dstFilePath, }); err != nil { @@ -236,7 +236,9 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe var relativeFilePath string for _, file := range files { relativeFilePath = gstr.SubStrFromR(file, in.DstFolder) - if !generatedDstFilePathSet.Contains(relativeFilePath) && utils.IsFileDoNotEdit(relativeFilePath) { + if !generatedDstFilePathSet.Contains(relativeFilePath) && + utils.IsFileDoNotEdit(relativeFilePath) { + mlog.Printf(`remove no longer used service file: %s`, relativeFilePath) if err = gfile.Remove(file); err != nil { return nil, err diff --git a/cmd/gf/internal/cmd/genservice/genservice_calculate.go b/cmd/gf/internal/cmd/genservice/genservice_calculate.go index b9a4942823..53553a0403 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -18,8 +18,10 @@ import ( "github.com/gogf/gf/v2/text/gstr" ) -func (c CGenService) calculatePkgItems( - in CGenServiceInput, pkgItems []pkgItem, funcItems []funcItem, srcImportedPackages *garray.SortedStrArray, +func (c CGenService) calculateImportedItems( + in CGenServiceInput, + pkgItems []pkgItem, funcItems []funcItem, + srcImportedPackages *garray.SortedStrArray, ) (err error) { // allFuncParamType saves all the param and result types of the functions. var allFuncParamType strings.Builder @@ -55,7 +57,9 @@ func (c CGenService) calculatePkgItems( } func (c CGenService) calculateFuncItems( - in CGenServiceInput, funcItems []funcItem, srcPkgInterfaceMap *gmap.ListMap, + in CGenServiceInput, + funcItems []funcItem, + srcPkgInterfaceMap *gmap.ListMap, ) (err error) { var srcPkgInterfaceFunc []map[string]string diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate.go b/cmd/gf/internal/cmd/genservice/genservice_generate.go index 94af205c62..41743d4e05 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate.go @@ -22,11 +22,11 @@ import ( type generateServiceFilesInput struct { CGenServiceInput - DstFilePath string // Absolute file path for generated service go file. - SrcStructFunctions *gmap.ListMap - SrcImportedPackages []string SrcPackageName string + SrcImportedPackages []string + SrcStructFunctions *gmap.ListMap DstPackageName string + DstFilePath string // Absolute file path for generated service go file. } func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, err error) { From 520776d6d044fb58b07d34004d8c0039f2b1666e Mon Sep 17 00:00:00 2001 From: oldme Date: Thu, 2 May 2024 09:46:52 +0800 Subject: [PATCH 29/36] temp --- cmd/gf/internal/cmd/aa/service/article.go | 58 ++++++++++++++++++ cmd/gf/internal/cmd/aa/service/delivery.go | 60 +++++++++++++++++++ cmd/gf/internal/cmd/aa/service/user.go | 40 +++++++++++++ .../cmd/cmd_z_unit_gen_service_test.go | 9 ++- .../genservice/logic/delivery/delivery_app.go | 35 +++++++++++ .../logic/delivery/delivery_cluster.go | 32 ++++++++++ 6 files changed, 231 insertions(+), 3 deletions(-) create mode 100644 cmd/gf/internal/cmd/aa/service/article.go create mode 100644 cmd/gf/internal/cmd/aa/service/delivery.go create mode 100644 cmd/gf/internal/cmd/aa/service/user.go create mode 100644 cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go create mode 100644 cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_cluster.go diff --git a/cmd/gf/internal/cmd/aa/service/article.go b/cmd/gf/internal/cmd/aa/service/article.go new file mode 100644 index 0000000000..03e17acb0b --- /dev/null +++ b/cmd/gf/internal/cmd/aa/service/article.go @@ -0,0 +1,58 @@ +// ================================================================================ +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + "go/ast" + + gdbalias "github.com/gogf/gf/v2/database/gdb" + gdbas "github.com/gogf/gf/v2/database/gdb" +) + +type ( + IArticle interface { + // Get article details + Get(ctx context.Context, id uint) (info struct{}, err error) + // Create + /** + * create an article. + * @author oldme + */ + Create(ctx context.Context, info struct{}) (id uint, err error) + A1o2(ctx context.Context, str string, a *ast.GoStmt, b *ast.GoStmt) error + B_2(ctx context.Context, db gdbalias.Raw) (err error) + // T1 random comment + T1(ctx context.Context, id uint, id2 uint) (gdb gdbas.Model, err error) + // T3 + /** + * random comment @*4213hHY1&%##%>< ? , . / + T4(i interface{}) interface{} + } +) + +var ( + localArticle IArticle +) + +func Article() IArticle { + if localArticle == nil { + panic("implement not found for interface IArticle, forgot register?") + } + return localArticle +} + +func RegisterArticle(i IArticle) { + localArticle = i +} diff --git a/cmd/gf/internal/cmd/aa/service/delivery.go b/cmd/gf/internal/cmd/aa/service/delivery.go new file mode 100644 index 0000000000..70d40056ee --- /dev/null +++ b/cmd/gf/internal/cmd/aa/service/delivery.go @@ -0,0 +1,60 @@ +// ================================================================================ +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + gdbas "github.com/gogf/gf/v2/database/gdb" +) + +type ( + IDeliveryApp interface { + Create(ctx context.Context) (err error) + GetList(ctx context.Context) (err error) + GetOne(ctx context.Context) (err error) + Delete(ctx context.Context) (err error) + AA(ctx context.Context) (err error) + } + IDeliveryCluster interface { + Create(ctx context.Context) (err error) + GetList(ctx context.Context) (err error) + GetOne(ctx context.Context) (err error) + Delete(ctx context.Context) (err error) + AA(ctx context.Context) (err error) + // Create 自动创建Cluster及Project. + Create(ctx context.Context) (err error, gdb gdbas.Model) + Delete(ctx context.Context) (err error) + GetList(ctx context.Context) (err error) + } +) + +var ( + localDeliveryApp IDeliveryApp + localDeliveryCluster IDeliveryCluster +) + +func DeliveryApp() IDeliveryApp { + if localDeliveryApp == nil { + panic("implement not found for interface IDeliveryApp, forgot register?") + } + return localDeliveryApp +} + +func RegisterDeliveryApp(i IDeliveryApp) { + localDeliveryApp = i +} + +func DeliveryCluster() IDeliveryCluster { + if localDeliveryCluster == nil { + panic("implement not found for interface IDeliveryCluster, forgot register?") + } + return localDeliveryCluster +} + +func RegisterDeliveryCluster(i IDeliveryCluster) { + localDeliveryCluster = i +} diff --git a/cmd/gf/internal/cmd/aa/service/user.go b/cmd/gf/internal/cmd/aa/service/user.go new file mode 100644 index 0000000000..731ee87c50 --- /dev/null +++ b/cmd/gf/internal/cmd/aa/service/user.go @@ -0,0 +1,40 @@ +// ================================================================================ +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" +) + +type ( + IUser interface { + // Create creates a new user. + Create(ctx context.Context, name string) (id int, err error) + // GetOne retrieves user by id. + GetOne(ctx context.Context, id int) (name string, err error) + // GetList retrieves user list. + GetList(ctx context.Context) (names []string, err error) + // Update updates user by id. + Update(ctx context.Context, id int) (name string, err error) + // Delete deletes user by id. + Delete(ctx context.Context, id int) (err error) + } +) + +var ( + localUser IUser +) + +func User() IUser { + if localUser == nil { + panic("implement not found for interface IUser, forgot register?") + } + return localUser +} + +func RegisterUser(i IUser) { + localUser = i +} diff --git a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go index 2cbb0025d4..1e2e0383d5 100644 --- a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go +++ b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go @@ -13,14 +13,15 @@ import ( "github.com/gogf/gf/cmd/gf/v2/internal/cmd/genservice" "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/test/gtest" - "github.com/gogf/gf/v2/util/guid" "github.com/gogf/gf/v2/util/gutil" ) func Test_Gen_Service_Default(t *testing.T) { gtest.C(t, func(t *gtest.T) { var ( - path = gfile.Temp(guid.S()) + //path = gfile.Temp(guid.S()) + // TODO + path = "aa" dstFolder = path + filepath.FromSlash("/service") apiFolder = gtest.DataPath("genservice", "logic") in = genservice.CGenServiceInput{ @@ -34,12 +35,14 @@ func Test_Gen_Service_Default(t *testing.T) { Clear: false, } ) + gfile.Remove(path) err := gutil.FillStructWithDefault(&in) t.AssertNil(err) err = gfile.Mkdir(path) t.AssertNil(err) - defer gfile.Remove(path) + // TODO + //defer gfile.Remove(path) _, err = genservice.CGenService{}.Service(ctx, in) t.AssertNil(err) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go b/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go new file mode 100644 index 0000000000..c9f1d41cc7 --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go @@ -0,0 +1,35 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package delivery + +import ( + "context" +) + +type sDeliveryApp struct{} + +func NewDeliveryApp() *sDeliveryApp { + return &sDeliveryApp{} +} + +func (s *sDeliveryApp) Create(ctx context.Context) (err error) { + return +} + +func (s *sDeliveryApp) GetList(ctx context.Context) (err error) { + return +} + +func (s *sDeliveryApp) GetOne(ctx context.Context) (err error) { + return +} + +func (s *sDeliveryApp) Delete(ctx context.Context) (err error) { + return +} + +func (s *sDeliveryApp) AA(ctx context.Context) (err error) { return } diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_cluster.go b/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_cluster.go new file mode 100644 index 0000000000..4be21e7754 --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_cluster.go @@ -0,0 +1,32 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package delivery + +import ( + "context" + + gdbas "github.com/gogf/gf/v2/database/gdb" +) + +type sDeliveryCluster struct{} + +func NewDeliveryCluster() *sDeliveryCluster { + return &sDeliveryCluster{} +} + +// Create 自动创建Cluster及Project. +func (s *sDeliveryCluster) Create(ctx context.Context) (err error, gdb gdbas.Model) { + return +} + +func (s *sDeliveryCluster) Delete(ctx context.Context) (err error) { + return +} + +func (s *sDeliveryCluster) GetList(ctx context.Context) (err error) { + return +} From c4ac360ca0da2995e44c3a75f28160856118ceea Mon Sep 17 00:00:00 2001 From: oldme Date: Thu, 2 May 2024 11:31:34 +0800 Subject: [PATCH 30/36] done1 --- cmd/gf/internal/cmd/aa/service/article.go | 58 ----------- cmd/gf/internal/cmd/aa/service/user.go | 40 -------- .../cmd/cmd_z_unit_gen_service_test.go | 11 +-- .../cmd/genservice/genservice_generate.go | 90 ++--------------- .../genservice_generate_template.go | 98 +++++++++++++++++++ .../genservice/logic/delivery/delivery_app.go | 3 + .../testdata/genservice/logic/logic_expect.go | 1 + .../testdata/genservice/service/article.go | 2 +- .../genservice}/service/delivery.go | 5 - 9 files changed, 115 insertions(+), 193 deletions(-) delete mode 100644 cmd/gf/internal/cmd/aa/service/article.go delete mode 100644 cmd/gf/internal/cmd/aa/service/user.go create mode 100644 cmd/gf/internal/cmd/genservice/genservice_generate_template.go rename cmd/gf/internal/cmd/{aa => testdata/genservice}/service/delivery.go (87%) diff --git a/cmd/gf/internal/cmd/aa/service/article.go b/cmd/gf/internal/cmd/aa/service/article.go deleted file mode 100644 index 03e17acb0b..0000000000 --- a/cmd/gf/internal/cmd/aa/service/article.go +++ /dev/null @@ -1,58 +0,0 @@ -// ================================================================================ -// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. -// You can delete these comments if you wish manually maintain this interface file. -// ================================================================================ - -package service - -import ( - "context" - "go/ast" - - gdbalias "github.com/gogf/gf/v2/database/gdb" - gdbas "github.com/gogf/gf/v2/database/gdb" -) - -type ( - IArticle interface { - // Get article details - Get(ctx context.Context, id uint) (info struct{}, err error) - // Create - /** - * create an article. - * @author oldme - */ - Create(ctx context.Context, info struct{}) (id uint, err error) - A1o2(ctx context.Context, str string, a *ast.GoStmt, b *ast.GoStmt) error - B_2(ctx context.Context, db gdbalias.Raw) (err error) - // T1 random comment - T1(ctx context.Context, id uint, id2 uint) (gdb gdbas.Model, err error) - // T3 - /** - * random comment @*4213hHY1&%##%>< ? , . / - T4(i interface{}) interface{} - } -) - -var ( - localArticle IArticle -) - -func Article() IArticle { - if localArticle == nil { - panic("implement not found for interface IArticle, forgot register?") - } - return localArticle -} - -func RegisterArticle(i IArticle) { - localArticle = i -} diff --git a/cmd/gf/internal/cmd/aa/service/user.go b/cmd/gf/internal/cmd/aa/service/user.go deleted file mode 100644 index 731ee87c50..0000000000 --- a/cmd/gf/internal/cmd/aa/service/user.go +++ /dev/null @@ -1,40 +0,0 @@ -// ================================================================================ -// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. -// You can delete these comments if you wish manually maintain this interface file. -// ================================================================================ - -package service - -import ( - "context" -) - -type ( - IUser interface { - // Create creates a new user. - Create(ctx context.Context, name string) (id int, err error) - // GetOne retrieves user by id. - GetOne(ctx context.Context, id int) (name string, err error) - // GetList retrieves user list. - GetList(ctx context.Context) (names []string, err error) - // Update updates user by id. - Update(ctx context.Context, id int) (name string, err error) - // Delete deletes user by id. - Delete(ctx context.Context, id int) (err error) - } -) - -var ( - localUser IUser -) - -func User() IUser { - if localUser == nil { - panic("implement not found for interface IUser, forgot register?") - } - return localUser -} - -func RegisterUser(i IUser) { - localUser = i -} diff --git a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go index 1e2e0383d5..4491a3fcbc 100644 --- a/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go +++ b/cmd/gf/internal/cmd/cmd_z_unit_gen_service_test.go @@ -13,15 +13,14 @@ import ( "github.com/gogf/gf/cmd/gf/v2/internal/cmd/genservice" "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/util/guid" "github.com/gogf/gf/v2/util/gutil" ) func Test_Gen_Service_Default(t *testing.T) { gtest.C(t, func(t *gtest.T) { var ( - //path = gfile.Temp(guid.S()) - // TODO - path = "aa" + path = gfile.Temp(guid.S()) dstFolder = path + filepath.FromSlash("/service") apiFolder = gtest.DataPath("genservice", "logic") in = genservice.CGenServiceInput{ @@ -35,14 +34,12 @@ func Test_Gen_Service_Default(t *testing.T) { Clear: false, } ) - gfile.Remove(path) err := gutil.FillStructWithDefault(&in) t.AssertNil(err) err = gfile.Mkdir(path) t.AssertNil(err) - // TODO - //defer gfile.Remove(path) + defer gfile.Remove(path) _, err = genservice.CGenService{}.Service(ctx, in) t.AssertNil(err) @@ -60,6 +57,7 @@ func Test_Gen_Service_Default(t *testing.T) { t.AssertNil(err) t.Assert(files, []string{ dstFolder + filepath.FromSlash("/article.go"), + dstFolder + filepath.FromSlash("/delivery.go"), dstFolder + filepath.FromSlash("/user.go"), }) @@ -67,6 +65,7 @@ func Test_Gen_Service_Default(t *testing.T) { testPath := gtest.DataPath("genservice", "service") expectFiles := []string{ testPath + filepath.FromSlash("/article.go"), + testPath + filepath.FromSlash("/delivery.go"), testPath + filepath.FromSlash("/user.go"), } for i := range files { diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate.go b/cmd/gf/internal/cmd/genservice/genservice_generate.go index 41743d4e05..2b507cfa43 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate.go @@ -7,16 +7,15 @@ package genservice import ( + "bytes" "fmt" "github.com/gogf/gf/cmd/gf/v2/internal/consts" "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog" "github.com/gogf/gf/cmd/gf/v2/internal/utility/utils" - "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/container/gmap" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gfile" - "github.com/gogf/gf/v2/text/gregex" "github.com/gogf/gf/v2/text/gstr" ) @@ -30,87 +29,12 @@ type generateServiceFilesInput struct { } func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, err error) { - var ( - generatedContent string - importedPackagesContent = fmt.Sprintf( - "import (\n%s\n)", gstr.Join(in.SrcImportedPackages, "\n"), - ) - funcContents = make([]string, 0) - funcContent string - ) - generatedContent += gstr.ReplaceByMap(consts.TemplateGenServiceContentHead, g.MapStrStr{ - "{Imports}": importedPackagesContent, - "{PackageName}": in.DstPackageName, - }) - - // Type definitions. - generatedContent += "type(" - generatedContent += "\n" - in.SrcStructFunctions.Iterator(func(key, value interface{}) bool { - structName, funcSlice := key.(string), value.([]map[string]string) - // Generating interface content. - for _, funcInfo := range funcSlice { - funcContent = funcInfo["funcComment"] + funcInfo["funcHead"] - funcContents = append(funcContents, funcContent) - } - // funcContents to string - funcArray := garray.NewStrArrayFrom(funcContents) - generatedContent += gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentInterface, g.MapStrStr{ - "{InterfaceName}": "I" + structName, - "{FuncDefinition}": funcArray.Join("\n\t"), - })) - generatedContent += "\n" - return true - }) - generatedContent += ")" - generatedContent += "\n" - - // Generating variable and register definitions. - var ( - variableContent string - generatingInterfaceCheck string - ) - // Variable definitions. - in.SrcStructFunctions.Iterator(func(key, value interface{}) bool { - structName := key.(string) - generatingInterfaceCheck = fmt.Sprintf(`[^\w\d]+%s.I%s[^\w\d]`, in.DstPackageName, structName) - if gregex.IsMatchString(generatingInterfaceCheck, generatedContent) { - return true - } - variableContent += gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentVariable, g.MapStrStr{ - "{StructName}": structName, - "{InterfaceName}": "I" + structName, - })) - variableContent += "\n" - return true - }) - if variableContent != "" { - generatedContent += "var(" - generatedContent += "\n" - generatedContent += variableContent - generatedContent += ")" - generatedContent += "\n" - } - // Variable register function definitions. - in.SrcStructFunctions.Iterator(func(key, value interface{}) bool { - structName := key.(string) - generatingInterfaceCheck = fmt.Sprintf(`[^\w\d]+%s.I%s[^\w\d]`, in.DstPackageName, structName) - if gregex.IsMatchString(generatingInterfaceCheck, generatedContent) { - return true - } - generatedContent += gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentRegister, g.MapStrStr{ - "{StructName}": structName, - "{InterfaceName}": "I" + structName, - })) - generatedContent += "\n\n" - return true - }) - - // Replace empty braces that have new line. - generatedContent, _ = gregex.ReplaceString(`{[\s\t]+}`, `{}`, generatedContent) + var generatedContent bytes.Buffer - // Remove package name calls of `dstPackageName` in produced codes. - generatedContent, _ = gregex.ReplaceString(fmt.Sprintf(`\*{0,1}%s\.`, in.DstPackageName), ``, generatedContent) + c.generatePackageImports(&generatedContent, in.DstPackageName, in.SrcImportedPackages) + c.generateType(&generatedContent, in.SrcStructFunctions) + c.generateVar(&generatedContent, in.SrcStructFunctions) + c.generateFunc(&generatedContent, in.SrcStructFunctions) // Write file content to disk. if gfile.Exists(in.DstFilePath) { @@ -120,7 +44,7 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, } } mlog.Printf(`generating service go file: %s`, in.DstFilePath) - if err = gfile.PutContents(in.DstFilePath, generatedContent); err != nil { + if err = gfile.PutContents(in.DstFilePath, generatedContent.String()); err != nil { return true, err } return true, nil diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate_template.go b/cmd/gf/internal/cmd/genservice/genservice_generate_template.go new file mode 100644 index 0000000000..e058dc3403 --- /dev/null +++ b/cmd/gf/internal/cmd/genservice/genservice_generate_template.go @@ -0,0 +1,98 @@ +// Copyright GoFrame gf Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package genservice + +import ( + "bytes" + "fmt" + + "github.com/gogf/gf/cmd/gf/v2/internal/consts" + "github.com/gogf/gf/v2/container/gmap" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/text/gstr" +) + +func (c CGenService) generatePackageImports(generatedContent *bytes.Buffer, packageName string, imports []string) { + generatedContent.WriteString(gstr.ReplaceByMap(consts.TemplateGenServiceContentHead, g.MapStrStr{ + "{PackageName}": packageName, + "{Imports}": fmt.Sprintf( + "import (\n%s\n)", gstr.Join(imports, "\n"), + ), + })) +} + +// generateType type definitions. +// See: const.TemplateGenServiceContentInterface +func (c CGenService) generateType(generatedContent *bytes.Buffer, srcStructFunctions *gmap.ListMap) { + generatedContent.WriteString("type(") + generatedContent.WriteString("\n") + + srcStructFunctions.Iterator(func(key, value interface{}) bool { + var ( + funcContents = make([]string, 0) + funcContent string + ) + structName, funcSlice := key.(string), value.([]map[string]string) + // Generating interface content. + for _, funcInfo := range funcSlice { + funcContent = funcInfo["funcComment"] + funcInfo["funcHead"] + funcContents = append(funcContents, funcContent) + } + + // funcContents to string. + generatedContent.WriteString( + gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentInterface, g.MapStrStr{ + "{InterfaceName}": "I" + structName, + "{FuncDefinition}": gstr.Join(funcContents, "\n\t"), + })), + ) + generatedContent.WriteString("\n") + return true + }) + + generatedContent.WriteString(")") + generatedContent.WriteString("\n") +} + +// generateVar variable definitions. +// See: const.TemplateGenServiceContentVariable +func (c CGenService) generateVar(generatedContent *bytes.Buffer, srcStructFunctions *gmap.ListMap) { + // Generating variable and register definitions. + var variableContent string + + srcStructFunctions.Iterator(func(key, value interface{}) bool { + structName := key.(string) + variableContent += gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentVariable, g.MapStrStr{ + "{StructName}": structName, + "{InterfaceName}": "I" + structName, + })) + variableContent += "\n" + return true + }) + if variableContent != "" { + generatedContent.WriteString("var(") + generatedContent.WriteString("\n") + generatedContent.WriteString(variableContent) + generatedContent.WriteString(")") + generatedContent.WriteString("\n") + } +} + +// generateFunc function definitions. +// See: const.TemplateGenServiceContentRegister +func (c CGenService) generateFunc(generatedContent *bytes.Buffer, srcStructFunctions *gmap.ListMap) { + // Variable register function definitions. + srcStructFunctions.Iterator(func(key, value interface{}) bool { + structName := key.(string) + generatedContent.WriteString(gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentRegister, g.MapStrStr{ + "{StructName}": structName, + "{InterfaceName}": "I" + structName, + }))) + generatedContent.WriteString("\n\n") + return true + }) +} diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go b/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go index c9f1d41cc7..d441c42811 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go @@ -8,6 +8,8 @@ package delivery import ( "context" + + "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service" ) type sDeliveryApp struct{} @@ -21,6 +23,7 @@ func (s *sDeliveryApp) Create(ctx context.Context) (err error) { } func (s *sDeliveryApp) GetList(ctx context.Context) (err error) { + service.Article().Get(ctx, 1) return } diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go b/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go index f455526b8b..6efcac5e82 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go @@ -6,5 +6,6 @@ package logic import ( _ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/article" + _ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/delivery" _ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/user" ) diff --git a/cmd/gf/internal/cmd/testdata/genservice/service/article.go b/cmd/gf/internal/cmd/testdata/genservice/service/article.go index 03e17acb0b..0d10924634 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/service/article.go +++ b/cmd/gf/internal/cmd/testdata/genservice/service/article.go @@ -37,7 +37,7 @@ type ( */ T3(ctx context.Context, b *gdbas.Model) (c *gdbas.Model, d *gdbas.Model, err error) // func (s *sArticle) T4(i interface{}) interface{} - // # $ % ^ & * ( ) _ + - = {} | [ ] \ : " ; ' < > ? , . / + // # $ % ^ & * ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . / T4(i interface{}) interface{} } ) diff --git a/cmd/gf/internal/cmd/aa/service/delivery.go b/cmd/gf/internal/cmd/testdata/genservice/service/delivery.go similarity index 87% rename from cmd/gf/internal/cmd/aa/service/delivery.go rename to cmd/gf/internal/cmd/testdata/genservice/service/delivery.go index 70d40056ee..c6c2dfec3c 100644 --- a/cmd/gf/internal/cmd/aa/service/delivery.go +++ b/cmd/gf/internal/cmd/testdata/genservice/service/delivery.go @@ -20,11 +20,6 @@ type ( AA(ctx context.Context) (err error) } IDeliveryCluster interface { - Create(ctx context.Context) (err error) - GetList(ctx context.Context) (err error) - GetOne(ctx context.Context) (err error) - Delete(ctx context.Context) (err error) - AA(ctx context.Context) (err error) // Create 自动创建Cluster及Project. Create(ctx context.Context) (err error, gdb gdbas.Model) Delete(ctx context.Context) (err error) From bf91abe06f333e6f14d84a310e0174e237991850 Mon Sep 17 00:00:00 2001 From: oldme Date: Thu, 2 May 2024 12:16:43 +0800 Subject: [PATCH 31/36] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=8D=8F=E7=A8=8B?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/genservice/genservice.go | 26 ++++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index cde0b01d14..13d2a76e4c 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -10,6 +10,7 @@ import ( "context" "fmt" "path/filepath" + "sync" "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog" "github.com/gogf/gf/cmd/gf/v2/internal/utility/utils" @@ -158,6 +159,8 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe if err != nil { return nil, err } + // it will use goroutine to generate service files for each package. + var wg = sync.WaitGroup{} for _, srcFolderPath := range srcFolderPaths { if !gfile.IsDir(srcFolderPath) { continue @@ -174,12 +177,13 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe srcPackageName = gfile.Basename(srcFolderPath) srcImportedPackages = garray.NewSortedStrArray().SetUnique(true) srcStructFunctions = gmap.NewListMap() - ok bool dstFilePath = gfile.Join(in.DstFolder, c.getDstFileNameCase(srcPackageName, in.DstFileNameCase)+".go", ) ) generatedDstFilePathSet.Add(dstFilePath) + // if it were to use goroutine, + // it would cause the order of the generated functions in the file to be disordered. for _, file := range files { pkgItems, funcItems, err := c.parseItemsInSrc(file) if err != nil { @@ -213,20 +217,26 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe } // Generating service go file for single logic package. - if ok, err = c.generateServiceFile(generateServiceFilesInput{ + wg.Add(1) + go func(generateServiceFilesInput generateServiceFilesInput) { + defer wg.Done() + ok, err := c.generateServiceFile(generateServiceFilesInput) + if err != nil { + mlog.Printf(`error generating service file "%s": %v`, generateServiceFilesInput.DstFilePath, err) + } + if !isDirty && ok { + isDirty = true + } + }(generateServiceFilesInput{ CGenServiceInput: in, SrcPackageName: srcPackageName, SrcImportedPackages: srcImportedPackages.Slice(), SrcStructFunctions: srcStructFunctions, DstPackageName: dstPackageName, DstFilePath: dstFilePath, - }); err != nil { - return - } - if ok { - isDirty = true - } + }) } + wg.Wait() if in.Clear { files, err = gfile.ScanDirFile(in.DstFolder, "*.go", false) From 594f606684304e09a8321c19d6432efd64b18af8 Mon Sep 17 00:00:00 2001 From: oldme Date: Thu, 2 May 2024 12:52:52 +0800 Subject: [PATCH 32/36] =?UTF-8?q?=E5=8D=8F=E7=A8=8B=E5=AE=89=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/genservice/genservice.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index 13d2a76e4c..c3b1c3e733 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -11,6 +11,7 @@ import ( "fmt" "path/filepath" "sync" + "sync/atomic" "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog" "github.com/gogf/gf/cmd/gf/v2/internal/utility/utils" @@ -147,7 +148,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe } var ( - isDirty bool // Temp boolean. + isDirty atomic.Bool // Temp boolean. files []string // Temp file array. initImportSrcPackages []string // Used for generating logic.go. inputPackages = in.Packages // Custom packages. @@ -224,8 +225,8 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe if err != nil { mlog.Printf(`error generating service file "%s": %v`, generateServiceFilesInput.DstFilePath, err) } - if !isDirty && ok { - isDirty = true + if !isDirty.Load() && ok { + isDirty.Store(true) } }(generateServiceFilesInput{ CGenServiceInput: in, @@ -257,7 +258,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe } } - if isDirty { + if isDirty.Load() { // Generate initialization go file. if len(initImportSrcPackages) > 0 { if err = c.generateInitializationFile(in, initImportSrcPackages); err != nil { From 9b15b17a6b3dfb9d7260fbf9dce88aab2072e061 Mon Sep 17 00:00:00 2001 From: oldme Date: Thu, 2 May 2024 13:02:03 +0800 Subject: [PATCH 33/36] =?UTF-8?q?=E5=8D=8F=E7=A8=8B=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=85=BC=E5=AE=B9Go=201.18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/genservice/genservice.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index c3b1c3e733..18743a2982 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -148,7 +148,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe } var ( - isDirty atomic.Bool // Temp boolean. + isDirty atomic.Value // Temp boolean. files []string // Temp file array. initImportSrcPackages []string // Used for generating logic.go. inputPackages = in.Packages // Custom packages. @@ -225,7 +225,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe if err != nil { mlog.Printf(`error generating service file "%s": %v`, generateServiceFilesInput.DstFilePath, err) } - if !isDirty.Load() && ok { + if !isDirty.Load().(bool) && ok { isDirty.Store(true) } }(generateServiceFilesInput{ @@ -258,7 +258,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe } } - if isDirty.Load() { + if isDirty.Load().(bool) { // Generate initialization go file. if len(initImportSrcPackages) > 0 { if err = c.generateInitializationFile(in, initImportSrcPackages); err != nil { From 34d37fa98bd48d77c93911290fc2127df6eb743a Mon Sep 17 00:00:00 2001 From: oldme Date: Thu, 2 May 2024 13:10:48 +0800 Subject: [PATCH 34/36] =?UTF-8?q?=E5=8D=8F=E7=A8=8B=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=85=BC=E5=AE=B9Go=201.18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/genservice/genservice.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index 18743a2982..5b9ae7efc0 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -155,6 +155,8 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe dstPackageName = gstr.ToLower(gfile.Basename(in.DstFolder)) // Package name for generated go files. generatedDstFilePathSet = gset.NewStrSet() // All generated file path set. ) + isDirty.Store(false) + // The first level folders. srcFolderPaths, err := gfile.ScanDir(in.SrcFolder, "*", false) if err != nil { From fb7a217dadc96b1838ed0712b747bac5eec19991 Mon Sep 17 00:00:00 2001 From: oldme Date: Thu, 2 May 2024 13:21:47 +0800 Subject: [PATCH 35/36] =?UTF-8?q?=E4=BD=BF=E7=94=A8gfile.PutBytes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/genservice/genservice_generate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate.go b/cmd/gf/internal/cmd/genservice/genservice_generate.go index 2b507cfa43..445d4edccd 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate.go @@ -44,7 +44,7 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, } } mlog.Printf(`generating service go file: %s`, in.DstFilePath) - if err = gfile.PutContents(in.DstFilePath, generatedContent.String()); err != nil { + if err = gfile.PutBytes(in.DstFilePath, generatedContent.Bytes()); err != nil { return true, err } return true, nil From 8dd24cc46e9fbb755a4c741bb21d669c3f4c7581 Mon Sep 17 00:00:00 2001 From: oldme Date: Fri, 24 May 2024 11:16:52 +0800 Subject: [PATCH 36/36] up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加新的测试数据 --- cmd/gf/internal/cmd/genservice/genservice_generate.go | 2 +- .../cmd/genservice/genservice_generate_template.go | 10 ++++++++-- .../testdata/genservice/logic/delivery/delivery_app.go | 4 ++-- .../cmd/testdata/genservice/service/delivery.go | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate.go b/cmd/gf/internal/cmd/genservice/genservice_generate.go index 445d4edccd..a11d54e7f8 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate.go @@ -32,7 +32,7 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, var generatedContent bytes.Buffer c.generatePackageImports(&generatedContent, in.DstPackageName, in.SrcImportedPackages) - c.generateType(&generatedContent, in.SrcStructFunctions) + c.generateType(&generatedContent, in.SrcStructFunctions, in.DstPackageName) c.generateVar(&generatedContent, in.SrcStructFunctions) c.generateFunc(&generatedContent, in.SrcStructFunctions) diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate_template.go b/cmd/gf/internal/cmd/genservice/genservice_generate_template.go index e058dc3403..664ce699ee 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate_template.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate_template.go @@ -13,6 +13,7 @@ import ( "github.com/gogf/gf/cmd/gf/v2/internal/consts" "github.com/gogf/gf/v2/container/gmap" "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/text/gregex" "github.com/gogf/gf/v2/text/gstr" ) @@ -27,7 +28,7 @@ func (c CGenService) generatePackageImports(generatedContent *bytes.Buffer, pack // generateType type definitions. // See: const.TemplateGenServiceContentInterface -func (c CGenService) generateType(generatedContent *bytes.Buffer, srcStructFunctions *gmap.ListMap) { +func (c CGenService) generateType(generatedContent *bytes.Buffer, srcStructFunctions *gmap.ListMap, dstPackageName string) { generatedContent.WriteString("type(") generatedContent.WriteString("\n") @@ -39,7 +40,12 @@ func (c CGenService) generateType(generatedContent *bytes.Buffer, srcStructFunct structName, funcSlice := key.(string), value.([]map[string]string) // Generating interface content. for _, funcInfo := range funcSlice { - funcContent = funcInfo["funcComment"] + funcInfo["funcHead"] + // Remove package name calls of `dstPackageName` in produced codes. + funcHead, _ := gregex.ReplaceString( + fmt.Sprintf(`\*{0,1}%s\.`, dstPackageName), + ``, funcInfo["funcHead"], + ) + funcContent = funcInfo["funcComment"] + funcHead funcContents = append(funcContents, funcContent) } diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go b/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go index d441c42811..300260cc05 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/delivery/delivery_app.go @@ -18,11 +18,11 @@ func NewDeliveryApp() *sDeliveryApp { return &sDeliveryApp{} } -func (s *sDeliveryApp) Create(ctx context.Context) (err error) { +func (s *sDeliveryApp) Create(ctx context.Context) (i service.IDeliveryCluster, err error) { return } -func (s *sDeliveryApp) GetList(ctx context.Context) (err error) { +func (s *sDeliveryApp) GetList(ctx context.Context, i service.IDeliveryCluster) (err error) { service.Article().Get(ctx, 1) return } diff --git a/cmd/gf/internal/cmd/testdata/genservice/service/delivery.go b/cmd/gf/internal/cmd/testdata/genservice/service/delivery.go index c6c2dfec3c..842ed88dd2 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/service/delivery.go +++ b/cmd/gf/internal/cmd/testdata/genservice/service/delivery.go @@ -13,8 +13,8 @@ import ( type ( IDeliveryApp interface { - Create(ctx context.Context) (err error) - GetList(ctx context.Context) (err error) + Create(ctx context.Context) (i IDeliveryCluster, err error) + GetList(ctx context.Context, i IDeliveryCluster) (err error) GetOne(ctx context.Context) (err error) Delete(ctx context.Context) (err error) AA(ctx context.Context) (err error)