From 85146fabcdc9609d4ec9ce666b1015dc83fdfcee Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Wed, 21 Feb 2018 16:33:31 +0000 Subject: [PATCH] cmd/vet: use type information in isLocalType MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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í TryBot-Result: Gobot Gobot Reviewed-by: Alan Donovan --- src/cmd/vet/composite.go | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/cmd/vet/composite.go b/src/cmd/vet/composite.go index fc48033182..965d73753a 100644 --- a/src/cmd/vet/composite.go +++ b/src/cmd/vet/composite.go @@ -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 } -- 2.50.0