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 99769f820..dddb8513b 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 @@ -8,6 +8,7 @@ package cmd import ( "path/filepath" + "strings" "testing" "github.com/gogf/gf/v2/os/gfile" @@ -60,6 +61,7 @@ func Test_Gen_Service_Default(t *testing.T) { dstFolder + filepath.FromSlash("/article.go"), dstFolder + filepath.FromSlash("/base.go"), dstFolder + filepath.FromSlash("/delivery.go"), + dstFolder + filepath.FromSlash("/pointer.go"), dstFolder + filepath.FromSlash("/user.go"), }) @@ -69,6 +71,7 @@ func Test_Gen_Service_Default(t *testing.T) { testPath + filepath.FromSlash("/article.go"), testPath + filepath.FromSlash("/base.go"), testPath + filepath.FromSlash("/delivery.go"), + testPath + filepath.FromSlash("/pointer.go"), testPath + filepath.FromSlash("/user.go"), } for i := range files { @@ -195,6 +198,7 @@ func Test_Gen_Service_CamelCase(t *testing.T) { dstFolder + filepath.FromSlash("/Article.go"), dstFolder + filepath.FromSlash("/Base.go"), dstFolder + filepath.FromSlash("/Delivery.go"), + dstFolder + filepath.FromSlash("/Pointer.go"), dstFolder + filepath.FromSlash("/User.go"), }) }) @@ -283,3 +287,50 @@ func Test_Issue4242(t *testing.T) { ) }) } + +func Test_Issue4741(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + var ( + path = gfile.Temp(guid.S()) + dstFolder = path + filepath.FromSlash("/service") + srvFolder = gtest.DataPath("genservice", "logic") + in = genservice.CGenServiceInput{ + SrcFolder: srvFolder, + DstFolder: dstFolder, + DstFileNameCase: "Snake", + WatchFile: "", + StPattern: "", + Packages: []string{"pointer"}, + ImportPrefix: "", + Clear: false, + } + genSrv = srvFolder + filepath.FromSlash("/logic.go") + ) + gfile.Remove(genSrv) + defer gfile.Remove(genSrv) + + err := gutil.FillStructWithDefault(&in) + t.AssertNil(err) + + err = gfile.Mkdir(path) + t.AssertNil(err) + defer gfile.Remove(path) + + _, err = genservice.CGenService{}.Service(ctx, in) + t.AssertNil(err) + + files, err := gfile.ScanDir(dstFolder, "*.go", true) + t.AssertNil(err) + t.Assert(files, []string{ + dstFolder + filepath.FromSlash("/pointer.go"), + }) + + // contents + testPath := gtest.DataPath("genservice", "service") + expectedFile := testPath + filepath.FromSlash("/pointer.go") + content := gfile.GetContents(files[0]) + expected := gfile.GetContents(expectedFile) + t.Assert(strings.TrimSpace(content), strings.TrimSpace(expected)) + t.Assert(strings.Contains(content, "*PointerOptions"), true) + }) +} diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate_template.go b/cmd/gf/internal/cmd/genservice/genservice_generate_template.go index f753ddb7b..a5a66b5e9 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate_template.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate_template.go @@ -43,8 +43,10 @@ func (c CGenService) generateType(generatedContent *bytes.Buffer, srcStructFunct for _, funcInfo := range funcSlice { // Remove package name calls of `dstPackageName` in produced codes. funcHead, _ := gregex.ReplaceString( - fmt.Sprintf(`\*{0,1}%s\.`, dstPackageName), - ``, funcInfo["funcHead"], + // Keep the optional pointer `*` (if any), but remove the `dstPackageName.` prefix + // so `*service.Type` becomes `*Type`. + fmt.Sprintf(`(\*)?%s\.`, dstPackageName), + `$1`, funcInfo["funcHead"], ) funcContent = funcInfo["funcComment"] + funcHead funcContents = append(funcContents, funcContent) 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 df1ebdae9..566bb98f9 100644 --- a/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/logic_expect.go @@ -8,5 +8,6 @@ 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/base" _ "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/pointer" _ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/user" ) diff --git a/cmd/gf/internal/cmd/testdata/genservice/logic/pointer/pointer.go b/cmd/gf/internal/cmd/testdata/genservice/logic/pointer/pointer.go new file mode 100644 index 000000000..bd11cf228 --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/genservice/logic/pointer/pointer.go @@ -0,0 +1,13 @@ +package pointer + +import ( + "context" + + "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service" +) + +type sPointer struct{} + +func (s *sPointer) TestPointer(ctx context.Context, opts *service.PointerOptions) error { + return nil +} diff --git a/cmd/gf/internal/cmd/testdata/genservice/service/pointer.go b/cmd/gf/internal/cmd/testdata/genservice/service/pointer.go new file mode 100644 index 000000000..f17bf7b48 --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/genservice/service/pointer.go @@ -0,0 +1,31 @@ +// ================================================================================ +// 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 ( + IPointer interface { + TestPointer(ctx context.Context, opts *PointerOptions) error + } +) + +var ( + localPointer IPointer +) + +func Pointer() IPointer { + if localPointer == nil { + panic("implement not found for interface IPointer, forgot register?") + } + return localPointer +} + +func RegisterPointer(i IPointer) { + localPointer = i +} diff --git a/cmd/gf/internal/cmd/testdata/genservice/service/pointer_options.go b/cmd/gf/internal/cmd/testdata/genservice/service/pointer_options.go new file mode 100644 index 000000000..bedc1b0c2 --- /dev/null +++ b/cmd/gf/internal/cmd/testdata/genservice/service/pointer_options.go @@ -0,0 +1,3 @@ +package service + +type PointerOptions struct{}