mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-01-30 12:32:36 +00:00
protogen: conflict resolve local package names against predefined idents
Avoid importing packages with a local name that conflicts with a predefined identifier (e.g., "string"). Change-Id: I51164635351895e8a060355e59d718240e26ef2e Reviewed-on: https://go-review.googlesource.com/c/140178 Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
This commit is contained in:
parent
c6b7561199
commit
872146653d
@ -50,6 +50,48 @@ func cleanPackageName(name string) GoPackageName {
|
|||||||
return GoPackageName(name)
|
return GoPackageName(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var isGoPredeclaredIdentifier = map[string]bool{
|
||||||
|
"append": true,
|
||||||
|
"bool": true,
|
||||||
|
"byte": true,
|
||||||
|
"cap": true,
|
||||||
|
"close": true,
|
||||||
|
"complex": true,
|
||||||
|
"complex128": true,
|
||||||
|
"complex64": true,
|
||||||
|
"copy": true,
|
||||||
|
"delete": true,
|
||||||
|
"error": true,
|
||||||
|
"false": true,
|
||||||
|
"float32": true,
|
||||||
|
"float64": true,
|
||||||
|
"imag": true,
|
||||||
|
"int": true,
|
||||||
|
"int16": true,
|
||||||
|
"int32": true,
|
||||||
|
"int64": true,
|
||||||
|
"int8": true,
|
||||||
|
"iota": true,
|
||||||
|
"len": true,
|
||||||
|
"make": true,
|
||||||
|
"new": true,
|
||||||
|
"nil": true,
|
||||||
|
"panic": true,
|
||||||
|
"print": true,
|
||||||
|
"println": true,
|
||||||
|
"real": true,
|
||||||
|
"recover": true,
|
||||||
|
"rune": true,
|
||||||
|
"string": true,
|
||||||
|
"true": true,
|
||||||
|
"uint": true,
|
||||||
|
"uint16": true,
|
||||||
|
"uint32": true,
|
||||||
|
"uint64": true,
|
||||||
|
"uint8": true,
|
||||||
|
"uintptr": true,
|
||||||
|
}
|
||||||
|
|
||||||
// badToUnderscore is the mapping function used to generate Go names from package names,
|
// badToUnderscore is the mapping function used to generate Go names from package names,
|
||||||
// which can be dotted in the input .proto file. It replaces non-identifier characters such as
|
// which can be dotted in the input .proto file. It replaces non-identifier characters such as
|
||||||
// dot or dash with underscore.
|
// dot or dash with underscore.
|
||||||
|
@ -833,7 +833,7 @@ func (g *GeneratedFile) QualifiedGoIdent(ident GoIdent) string {
|
|||||||
return string(packageName) + "." + ident.GoName
|
return string(packageName) + "." + ident.GoName
|
||||||
}
|
}
|
||||||
packageName := cleanPackageName(baseName(string(ident.GoImportPath)))
|
packageName := cleanPackageName(baseName(string(ident.GoImportPath)))
|
||||||
for i, orig := 1, packageName; g.usedPackageNames[packageName]; i++ {
|
for i, orig := 1, packageName; g.usedPackageNames[packageName] || isGoPredeclaredIdentifier[string(packageName)]; i++ {
|
||||||
packageName = orig + GoPackageName(strconv.Itoa(i))
|
packageName = orig + GoPackageName(strconv.Itoa(i))
|
||||||
}
|
}
|
||||||
g.packageNames[ident.GoImportPath] = packageName
|
g.packageNames[ident.GoImportPath] = packageName
|
||||||
|
@ -272,6 +272,8 @@ func TestImports(t *testing.T) {
|
|||||||
// Reference to a different package with the same basename.
|
// Reference to a different package with the same basename.
|
||||||
"golang.org/y/bar",
|
"golang.org/y/bar",
|
||||||
"golang.org/x/baz",
|
"golang.org/x/baz",
|
||||||
|
// Reference to a package conflicting with a predeclared identifier.
|
||||||
|
"golang.org/z/string",
|
||||||
} {
|
} {
|
||||||
g.P("var _ = ", GoIdent{GoName: "X", GoImportPath: importPath}, " // ", importPath)
|
g.P("var _ = ", GoIdent{GoName: "X", GoImportPath: importPath}, " // ", importPath)
|
||||||
}
|
}
|
||||||
@ -281,13 +283,15 @@ import (
|
|||||||
bar "golang.org/x/bar"
|
bar "golang.org/x/bar"
|
||||||
baz "golang.org/x/baz"
|
baz "golang.org/x/baz"
|
||||||
bar1 "golang.org/y/bar"
|
bar1 "golang.org/y/bar"
|
||||||
|
string1 "golang.org/z/string"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = X // "golang.org/x/foo"
|
var _ = X // "golang.org/x/foo"
|
||||||
var _ = bar.X // "golang.org/x/bar"
|
var _ = bar.X // "golang.org/x/bar"
|
||||||
var _ = bar.X // "golang.org/x/bar"
|
var _ = bar.X // "golang.org/x/bar"
|
||||||
var _ = bar1.X // "golang.org/y/bar"
|
var _ = bar1.X // "golang.org/y/bar"
|
||||||
var _ = baz.X // "golang.org/x/baz"
|
var _ = baz.X // "golang.org/x/baz"
|
||||||
|
var _ = string1.X // "golang.org/z/string"
|
||||||
`
|
`
|
||||||
got, err := g.Content()
|
got, err := g.Content()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user