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