protogen: use full path for generated file variable name
Use the full path (including the extension) for the generation of
the per-file variable name. Several reasons for this:
* The current logic is buggy in the case where pathType == pathTypeImport
since the prefix variable will be mangled with the Go import path.
* The extension is technically part of the path.
Thus, "path/to/foo.proto" and "path/to/foo.protodevel" are two
distinctly different imports.
* Style-wise, it subjectively looks better. Rather than being a mixture
of camelCase and snake_case, it is all snake_case for the common case:
before: ProtoFile_google_protobuf_any
after: File_google_protobuf_any_proto
* Since the extension is almost always ".proto", this results in a
suffix of "_proto", which provides an additional layer of protection
against possible name conflicts. The previous approach could possibly
have a conflict between "Foo.proto" and a message named ProtoFile
with a sub-message called Foo.
Also, use the per-file variable name for the raw descriptor variables
instead of the hashed version.
Change-Id: Ic91e326b7593e5985cee6ececc60539c27fe32fe
Reviewed-on: https://go-review.googlesource.com/c/164379
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/protogen/names.go b/protogen/names.go
index a1bddf7..5cf953c 100644
--- a/protogen/names.go
+++ b/protogen/names.go
@@ -48,12 +48,11 @@
// cleanPackageName converts a string to a valid Go package name.
func cleanPackageName(name string) GoPackageName {
- return GoPackageName(cleanGoName(name, false))
+ return GoPackageName(cleanGoName(name))
}
// cleanGoName converts a string to a valid Go identifier.
-// If mustExport, then the returned identifier is exported if not already.
-func cleanGoName(s string, mustExport bool) string {
+func cleanGoName(s string) string {
// Sanitize the input to the set of valid characters,
// which must be '_' or be in the Unicode L or N categories.
s = strings.Map(func(r rune) rune {
@@ -62,21 +61,10 @@
}
return '_'
}, s)
- r, n := utf8.DecodeRuneInString(s)
-
- // Export the identifier by either uppercasing the first character or by
- // prepending 'X' (to ensure name starts in the Unicode Lu category).
- if mustExport {
- // If possible, uppercase the first character. However, not all
- // characters in the Unicode L category have an Lu equivalent.
- if unicode.IsUpper(unicode.ToUpper(r)) {
- return string(unicode.ToUpper(r)) + s[n:]
- }
- return "X" + s
- }
// Prepend '_' in the event of a Go keyword conflict or if
// the identifier is invalid (does not start in the Unicode L category).
+ r, _ := utf8.DecodeRuneInString(s)
if token.Lookup(s).IsKeyword() || !unicode.IsLetter(r) {
return "_" + s
}