From 905913f7bebffded5b58ba0cccb21329d41242e7 Mon Sep 17 00:00:00 2001 From: loveyfore Date: Mon, 15 Jan 2024 20:35:14 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20gf=20gen=20service=20bug.=20Fix=20the=20i?= =?UTF-8?q?ssue=20of=20significant=20differences=20in=20the=20generated=20?= =?UTF-8?q?code=20every=20=E2=80=A6=20(#3260)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gf/internal/cmd/genservice/genservice.go | 2 +- .../cmd/genservice/genservice_calculate.go | 16 ++++++------ .../cmd/genservice/genservice_generate.go | 25 ++++++++++++------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index e1ef5dc74..c15a70433 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -174,7 +174,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe // Parse single logic package folder. var ( // StructName => FunctionDefinitions - srcPkgInterfaceMap = make(map[string]*garray.StrArray) + 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 diff --git a/cmd/gf/internal/cmd/genservice/genservice_calculate.go b/cmd/gf/internal/cmd/genservice/genservice_calculate.go index 68fe74618..089b7a93c 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -8,6 +8,7 @@ package genservice import ( "fmt" + "github.com/gogf/gf/v2/container/gmap" "go/parser" "go/token" @@ -99,10 +100,9 @@ func (c CGenService) calculateCodeCommented(in CGenServiceInput, fileContent str } func (c CGenService) calculateInterfaceFunctions( - in CGenServiceInput, fileContent string, srcPkgInterfaceMap map[string]*garray.StrArray, + in CGenServiceInput, fileContent string, srcPkgInterfaceMap *gmap.ListMap, ) (err error) { var ( - ok bool matches [][]string srcPkgInterfaceFuncArray *garray.StrArray ) @@ -142,9 +142,11 @@ func (c CGenService) calculateInterfaceFunctions( continue } structName = gstr.CaseCamel(structMatch[1]) - if srcPkgInterfaceFuncArray, ok = srcPkgInterfaceMap[structName]; !ok { - srcPkgInterfaceMap[structName] = garray.NewStrArray() - srcPkgInterfaceFuncArray = srcPkgInterfaceMap[structName] + if !srcPkgInterfaceMap.Contains(structName) { + srcPkgInterfaceFuncArray = garray.NewStrArray() + srcPkgInterfaceMap.Set(structName, srcPkgInterfaceFuncArray) + } else { + srcPkgInterfaceFuncArray = srcPkgInterfaceMap.Get(structName).(*garray.StrArray) } srcPkgInterfaceFuncArray.Append(functionHead) } @@ -165,8 +167,8 @@ func (c CGenService) calculateInterfaceFunctions( continue } structName = gstr.CaseCamel(structMatch[1]) - if srcPkgInterfaceFuncArray, ok = srcPkgInterfaceMap[structName]; !ok { - srcPkgInterfaceMap[structName] = garray.NewStrArray() + if !srcPkgInterfaceMap.Contains(structName) { + srcPkgInterfaceMap.Set(structName, garray.NewStrArray()) } } return nil diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate.go b/cmd/gf/internal/cmd/genservice/genservice_generate.go index 5b040782b..4753de7e8 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate.go @@ -10,6 +10,7 @@ import ( "fmt" "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" @@ -23,7 +24,7 @@ import ( type generateServiceFilesInput struct { CGenServiceInput DstFilePath string // Absolute file path for generated service go file. - SrcStructFunctions map[string]*garray.StrArray + SrcStructFunctions *gmap.ListMap SrcImportedPackages []string SrcPackageName string DstPackageName string @@ -46,7 +47,8 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, // Type definitions. generatedContent += "type(" generatedContent += "\n" - for structName, funcArray := range in.SrcStructFunctions { + in.SrcStructFunctions.Iterator(func(key, value interface{}) bool { + structName, funcArray := key.(string), value.(*garray.StrArray) allFuncArray.Append(funcArray.Slice()...) // Add comments to a method. for index, funcName := range funcArray.Slice() { @@ -60,7 +62,8 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, "{FuncDefinition}": funcArray.Join("\n\t"), })) generatedContent += "\n" - } + return true + }) generatedContent += ")" generatedContent += "\n" @@ -70,17 +73,19 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, generatingInterfaceCheck string ) // Variable definitions. - for structName := range in.SrcStructFunctions { + 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) { - continue + 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" @@ -89,17 +94,19 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, generatedContent += "\n" } // Variable register function definitions. - for structName := range in.SrcStructFunctions { + 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) { - continue + 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)