From: Daniel Martí Date: Wed, 21 Feb 2018 16:33:31 +0000 (+0000) Subject: cmd/vet: use type information in isLocalType X-Git-Tag: go1.11beta1~689 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=85146fabcdc9609d4ec9ce666b1015dc83fdfcee;p=gostls13.git 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í TryBot-Result: Gobot Gobot Reviewed-by: Alan Donovan --- 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 }