1
0
mirror of https://github.com/golang/go synced 2024-11-26 21:21:34 -07:00

cmd/vet: use type information in isLocalType

Now that vet always has type information, there's no reason to use
string handling on type names to gather information about them, such as
whether or not they are a local type.

The semantics remain the same - the only difference should be that the
implementation is less fragile and simpler.

Change-Id: I71386b4196922e4c9f2653d90abc382efbf01b3c
Reviewed-on: https://go-review.googlesource.com/95915
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
Daniel Martí 2018-02-21 16:33:31 +00:00
parent 74f9432bea
commit 85146fabcd

View File

@ -50,7 +50,7 @@ func checkUnkeyedLiteral(f *File, node ast.Node) {
// skip non-struct composite literals
return
}
if isLocalType(f, typeName) {
if isLocalType(f, typ) {
// allow unkeyed locally defined composite literal
return
}
@ -71,24 +71,16 @@ func checkUnkeyedLiteral(f *File, node ast.Node) {
f.Badf(cl.Pos(), "%s composite literal uses unkeyed fields", typeName)
}
func isLocalType(f *File, typeName string) bool {
if strings.HasPrefix(typeName, "struct{") {
func isLocalType(f *File, typ types.Type) bool {
switch x := typ.(type) {
case *types.Struct:
// struct literals are local types
return true
case *types.Pointer:
return isLocalType(f, x.Elem())
case *types.Named:
// names in package foo are local to foo_test too
return strings.TrimSuffix(x.Obj().Pkg().Path(), "_test") == strings.TrimSuffix(f.pkg.path, "_test")
}
// make *foo.bar, **foo.bar, etc match with the "foo." prefix
// below
typeName = strings.TrimLeft(typeName, "*")
pkgname := f.pkg.path
if strings.HasPrefix(typeName, pkgname+".") {
return true
}
// treat types as local inside test packages with _test name suffix
if strings.HasSuffix(pkgname, "_test") {
pkgname = pkgname[:len(pkgname)-len("_test")]
}
return strings.HasPrefix(typeName, pkgname+".")
return false
}