Commit 85146fab authored by Daniel Martí's avatar Daniel Martí

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: default avatarAlan Donovan <adonovan@google.com>
parent 74f9432b
...@@ -50,7 +50,7 @@ func checkUnkeyedLiteral(f *File, node ast.Node) { ...@@ -50,7 +50,7 @@ func checkUnkeyedLiteral(f *File, node ast.Node) {
// skip non-struct composite literals // skip non-struct composite literals
return return
} }
if isLocalType(f, typeName) { if isLocalType(f, typ) {
// allow unkeyed locally defined composite literal // allow unkeyed locally defined composite literal
return return
} }
...@@ -71,24 +71,16 @@ func checkUnkeyedLiteral(f *File, node ast.Node) { ...@@ -71,24 +71,16 @@ func checkUnkeyedLiteral(f *File, node ast.Node) {
f.Badf(cl.Pos(), "%s composite literal uses unkeyed fields", typeName) f.Badf(cl.Pos(), "%s composite literal uses unkeyed fields", typeName)
} }
func isLocalType(f *File, typeName string) bool { func isLocalType(f *File, typ types.Type) bool {
if strings.HasPrefix(typeName, "struct{") { switch x := typ.(type) {
case *types.Struct:
// struct literals are local types // struct literals are local types
return true 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")
} }
return false
// 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+".")
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment