diff --git a/cmd/gf/internal/cmd/genservice/genservice.go b/cmd/gf/internal/cmd/genservice/genservice.go index dc86e6bcc..076b61be6 100644 --- a/cmd/gf/internal/cmd/genservice/genservice.go +++ b/cmd/gf/internal/cmd/genservice/genservice.go @@ -182,11 +182,17 @@ 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 { var packageItems []packageItem 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(`/[/|\*](.+)`, "", fileContent) if err != nil { @@ -258,6 +264,7 @@ 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 f2f6cef5c..46dc33172 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_calculate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_calculate.go @@ -7,6 +7,7 @@ package genservice import ( + "fmt" "go/parser" "go/token" @@ -51,6 +52,52 @@ func (c CGenService) calculateImportedPackages(fileContent string) (packages []p 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 { + 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, fileContent string, srcPkgInterfaceMap map[string]*garray.StrArray, ) (err error) { diff --git a/cmd/gf/internal/cmd/genservice/genservice_generate.go b/cmd/gf/internal/cmd/genservice/genservice_generate.go index 8f2131038..9c169e5d4 100644 --- a/cmd/gf/internal/cmd/genservice/genservice_generate.go +++ b/cmd/gf/internal/cmd/genservice/genservice_generate.go @@ -27,6 +27,7 @@ type generateServiceFilesInput struct { SrcImportedPackages []string SrcPackageName string DstPackageName string + SrcCodeCommentedMap map[string]string } func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, err error) { @@ -47,6 +48,13 @@ func (c CGenService) generateServiceFile(in generateServiceFilesInput) (ok bool, generatedContent += "\n" for structName, funcArray := range in.SrcStructFunctions { 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) + } + } generatedContent += gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentInterface, g.MapStrStr{ "{InterfaceName}": "I" + structName, "{FuncDefinition}": funcArray.Join("\n\t"),