This is an automated email from the ASF dual-hosted git repository.

xuetaoli pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git


The following commit(s) were added to refs/heads/develop by this push:
     new cdf278029 Fix the issue of multiple package imports when generating 
triple files. (#3052)
cdf278029 is described below

commit cdf2780291812b444d8a437ce24b94d3209f20e7
Author: hs80 <[email protected]>
AuthorDate: Sat Nov 1 13:07:27 2025 +0800

    Fix the issue of multiple package imports when generating triple files. 
(#3052)
    
    * 修复生成triple时,多包引入问题 修复proto包中引用自定义common包时,命名冲突问题
---
 .../gen/generator/genTriple.go                     | 28 ++++-----------
 .../gen/generator/tripleTpl.go                     |  5 ---
 tools/protoc-gen-go-triple/go.mod                  |  5 +--
 tools/protoc-gen-go-triple/go.sum                  |  4 +--
 tools/protoc-gen-go-triple/main.go                 | 40 +++++++++++++++++++---
 5 files changed, 45 insertions(+), 37 deletions(-)

diff --git a/tools/protoc-gen-go-triple/gen/generator/genTriple.go 
b/tools/protoc-gen-go-triple/gen/generator/genTriple.go
index fb16e2bf7..89051d4c2 100644
--- a/tools/protoc-gen-go-triple/gen/generator/genTriple.go
+++ b/tools/protoc-gen-go-triple/gen/generator/genTriple.go
@@ -18,15 +18,12 @@
 package generator
 
 import (
-       "errors"
        "os"
        "path/filepath"
        "strings"
 )
 
 import (
-       "github.com/golang/protobuf/protoc-gen-go/descriptor"
-
        "google.golang.org/protobuf/compiler/protogen"
 )
 
@@ -59,21 +56,22 @@ func (g *Generator) generateToFile(filePath string, data 
[]byte) error {
        return util.GoFmtFile(filePath)
 }
 
-func ProcessProtoFile(file *descriptor.FileDescriptorProto) (TripleGo, error) {
+func ProcessProtoFile(g *protogen.GeneratedFile, f *protogen.File) (TripleGo, 
error) {
+       file := f.Proto
        tripleGo := TripleGo{
                Source:       file.GetName(),
                ProtoPackage: file.GetPackage(),
                Services:     make([]Service, 0),
        }
-       for _, service := range file.GetService() {
+       for serviceIndex, service := range file.GetService() {
                serviceMethods := make([]Method, 0)
 
-               for _, method := range service.GetMethod() {
+               for methodIndex, method := range service.GetMethod() {
                        serviceMethods = append(serviceMethods, Method{
                                MethodName:     method.GetName(),
-                               RequestType:    
util.ToUpper(strings.Split(method.GetInputType(), 
".")[len(strings.Split(method.GetInputType(), "."))-1]),
+                               RequestType:    
g.QualifiedGoIdent(f.Services[serviceIndex].Methods[methodIndex].Input.GoIdent),
                                StreamsRequest: method.GetClientStreaming(),
-                               ReturnType:     
util.ToUpper(strings.Split(method.GetOutputType(), 
".")[len(strings.Split(method.GetOutputType(), "."))-1]),
+                               ReturnType:     
g.QualifiedGoIdent(f.Services[serviceIndex].Methods[methodIndex].Output.GoIdent),
                                StreamsReturn:  method.GetServerStreaming(),
                        })
                        if method.GetClientStreaming() || 
method.GetServerStreaming() {
@@ -86,20 +84,6 @@ func ProcessProtoFile(file *descriptor.FileDescriptorProto) 
(TripleGo, error) {
                        Methods:     serviceMethods,
                })
        }
-       var goPkg string
-       pkgs := strings.Split(file.Options.GetGoPackage(), ";")
-       switch len(pkgs) {
-       case 2:
-               tripleGo.Package = pkgs[1]
-               goPkg = pkgs[0]
-       case 1:
-               tripleGo.Package = file.GetPackage()
-               goPkg = file.GetPackage()
-       default:
-               return tripleGo, errors.New("need to set the package name in 
go_package")
-       }
-
-       goPkg = strings.ReplaceAll(goPkg, "/", "_")
        _, fileName := filepath.Split(file.GetName())
        tripleGo.FileName = strings.Split(fileName, ".")[0]
        return tripleGo, nil
diff --git a/tools/protoc-gen-go-triple/gen/generator/tripleTpl.go 
b/tools/protoc-gen-go-triple/gen/generator/tripleTpl.go
index 643f2d54d..18ca04b2a 100644
--- a/tools/protoc-gen-go-triple/gen/generator/tripleTpl.go
+++ b/tools/protoc-gen-go-triple/gen/generator/tripleTpl.go
@@ -145,11 +145,6 @@ import (
 
 import (
        "dubbo.apache.org/dubbo-go/v3"
-       "dubbo.apache.org/dubbo-go/v3/client"
-       "dubbo.apache.org/dubbo-go/v3/common"
-       "dubbo.apache.org/dubbo-go/v3/common/constant"
-       "dubbo.apache.org/dubbo-go/v3/protocol/triple/triple_protocol"
-       "dubbo.apache.org/dubbo-go/v3/server"
 )
 
 `
diff --git a/tools/protoc-gen-go-triple/go.mod 
b/tools/protoc-gen-go-triple/go.mod
index c5e831eeb..4750061ec 100644
--- a/tools/protoc-gen-go-triple/go.mod
+++ b/tools/protoc-gen-go-triple/go.mod
@@ -2,7 +2,4 @@ module dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-go-triple
 
 go 1.23
 
-require (
-       github.com/golang/protobuf v1.5.4
-       google.golang.org/protobuf v1.34.2
-)
+require google.golang.org/protobuf v1.36.10
diff --git a/tools/protoc-gen-go-triple/go.sum 
b/tools/protoc-gen-go-triple/go.sum
index 9e46e8c15..837ddd1ee 100644
--- a/tools/protoc-gen-go-triple/go.sum
+++ b/tools/protoc-gen-go-triple/go.sum
@@ -1,8 +1,8 @@
-github.com/golang/protobuf v1.5.4 
h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
-github.com/golang/protobuf v1.5.4/go.mod 
h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
 github.com/google/go-cmp v0.5.5/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 
h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/protobuf v1.34.2 
h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
 google.golang.org/protobuf v1.34.2/go.mod 
h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+google.golang.org/protobuf v1.36.10 
h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
+google.golang.org/protobuf v1.36.10/go.mod 
h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
diff --git a/tools/protoc-gen-go-triple/main.go 
b/tools/protoc-gen-go-triple/main.go
index 2ac907a3c..1dee399c0 100644
--- a/tools/protoc-gen-go-triple/main.go
+++ b/tools/protoc-gen-go-triple/main.go
@@ -25,6 +25,7 @@ import (
        "flag"
        "fmt"
        "os"
+       "strings"
 )
 
 import (
@@ -75,17 +76,48 @@ func main() {
 }
 
 func genTriple(plugin *protogen.Plugin) error {
+       var errors []error
+
        for _, file := range plugin.Files {
                if !file.Generate {
                        continue
                }
-               tripleGo, err := generator.ProcessProtoFile(file.Proto)
-               if err != nil {
-                       return err
+
+               // Skip proto files without services.
+               if len(file.Proto.GetService()) == 0 {
+                       continue
                }
+
                filename := file.GeneratedFilenamePrefix + ".triple.go"
+               // Use the same import path as the pb.go file to ensure they're 
in the same package
+               // Extract the package name from the go_package option
+               // Use the import path as parsed by protogen to avoid edge 
cases.
                g := plugin.NewGeneratedFile(filename, file.GoImportPath)
-               return generator.GenTripleFile(g, tripleGo)
+               // import Dubbo's libraries
+               
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/client").Ident("client"))
+               
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/common").Ident("common"))
+               
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/common/constant").Ident("constant"))
+               
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/protocol/triple/triple_protocol").Ident("triple_protocol"))
+               
g.QualifiedGoIdent(protogen.GoImportPath("dubbo.apache.org/dubbo-go/v3/server").Ident("server"))
+               tripleGo, err := generator.ProcessProtoFile(g, file)
+               if err != nil {
+                       errors = append(errors, fmt.Errorf("processing %s: %w", 
file.Desc.Path(), err))
+                       continue
+               }
+               // Ensure the generated file uses the exact Go package name 
computed by protoc-gen-go.
+               tripleGo.Package = string(file.GoPackageName)
+
+               err = generator.GenTripleFile(g, tripleGo)
+               if err != nil {
+                       errors = append(errors, fmt.Errorf("generating %s: %w", 
filename, err))
+               }
+       }
+       if len(errors) > 0 {
+               var errorMessages []string
+               for _, err := range errors {
+                       errorMessages = append(errorMessages, err.Error())
+               }
+               return fmt.Errorf("multiple errors occurred:\n%s", 
strings.Join(errorMessages, "\n"))
        }
        return nil
 }

Reply via email to