fix(cmd/gf): missing pointer in generated service file (#4741) (#4742)

This commit is contained in:
UncleChair
2026-07-08 10:20:43 +08:00
committed by GitHub
parent 035fa3b6a5
commit b325e50277
6 changed files with 103 additions and 2 deletions

View File

@ -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)
})
}

View File

@ -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)

View File

@ -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"
)

View File

@ -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
}

View File

@ -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
}

View File

@ -0,0 +1,3 @@
package service
type PointerOptions struct{}