internal/fieldnum: generate field numbers for the google.protobuf package
Generate field numbers for the well-known types,
so that encoding/jsonpb can benefit from them as well.
This CL fixes internal/cmd/generate-protos, which was silently failing
because the modulePath was not properly initialized. We fix this by
moving it to the start of the init function.
Change-Id: I87637176f29218cffa512b4baa49f39dae924061
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/168497
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/internal/cmd/generate-protos/main.go b/internal/cmd/generate-protos/main.go
index c2bbac3..ec358e3 100644
--- a/internal/cmd/generate-protos/main.go
+++ b/internal/cmd/generate-protos/main.go
@@ -27,6 +27,18 @@
)
func init() {
+ // Determine repository root path.
+ out, err := exec.Command("git", "rev-parse", "--show-toplevel").CombinedOutput()
+ check(err)
+ repoRoot = strings.TrimSpace(string(out))
+
+ // Determine the module path.
+ cmd := exec.Command("go", "list", "-m", "-f", "{{.Path}}")
+ cmd.Dir = repoRoot
+ out, err = cmd.CombinedOutput()
+ check(err)
+ modulePath = strings.TrimSpace(string(out))
+
// When the environment variable RUN_AS_PROTOC_PLUGIN is set,
// we skip running main and instead act as a protoc plugin.
// This allows the binary to pass itself to protoc.
@@ -42,7 +54,7 @@
switch plugin {
case "go":
gengo.GenerateFile(gen, file)
- generateDescriptorFields(gen, file)
+ generateFieldNumbers(gen, file)
case "gogrpc":
gengogrpc.GenerateFile(gen, file)
}
@@ -79,18 +91,6 @@
panic("protobuf source root is not set")
}
- // Determine repository root path.
- out, err := exec.Command("git", "rev-parse", "--show-toplevel").CombinedOutput()
- check(err)
- repoRoot = strings.TrimSpace(string(out))
-
- // Determine the module path.
- cmd := exec.Command("go", "list", "-m", "-f", "{{.Path}}")
- cmd.Dir = repoRoot
- out, err = cmd.CombinedOutput()
- check(err)
- modulePath = strings.TrimSpace(string(out))
-
generateLocalProtos()
generateRemoteProtos()
}
@@ -208,18 +208,19 @@
check(err)
}
-// generateDescriptorFields generates an internal package for descriptor.proto.
-func generateDescriptorFields(gen *protogen.Plugin, file *protogen.File) {
- if file.Desc.Path() != "google/protobuf/descriptor.proto" {
+// generateFieldNumbers generates an internal package for descriptor.proto
+// and well-known types.
+func generateFieldNumbers(gen *protogen.Plugin, file *protogen.File) {
+ if file.Desc.Package() != "google.protobuf" {
return
}
- importPath := modulePath + "/internal/descfield"
- g := gen.NewGeneratedFile(importPath+"/field_gen.go", protogen.GoImportPath(importPath))
+ importPath := modulePath + "/internal/fieldnum"
+ base := strings.TrimSuffix(path.Base(file.Desc.Path()), ".proto")
+ g := gen.NewGeneratedFile(importPath+"/"+base+"_gen.go", protogen.GoImportPath(importPath))
for _, s := range generatedPreamble {
g.P(s)
}
- g.P("// Package descfield contains constants for field numbers in descriptor.proto.")
g.P("package ", path.Base(importPath))
g.P("")