internal/analysisinternal: ZeroValue: support materialized aliases My previous audit of this file contained a mistake in the order in which constructors were tested; it was revealed by testing with gotypesalias=1. Updates golang/go#65294 Change-Id: I80f6f0bb24bceb2c69b9919e9c482b780c0d546a Reviewed-on: https://go-review.googlesource.com/c/tools/+/575699 Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Alan Donovan <adonovan@google.com>
diff --git a/internal/analysisinternal/analysis.go b/internal/analysisinternal/analysis.go index c3022a2..eb83088 100644 --- a/internal/analysisinternal/analysis.go +++ b/internal/analysisinternal/analysis.go
@@ -32,22 +32,22 @@ func ZeroValue(f *ast.File, pkg *types.Package, typ types.Type) ast.Expr { // TODO(adonovan): think about generics, and also generic aliases. under := aliases.Unalias(typ) - // Don't call Underlying unconditionally: although it removed + // Don't call Underlying unconditionally: although it removes // Named and Alias, it also removes TypeParam. - if n, ok := typ.(*types.Named); ok { + if n, ok := under.(*types.Named); ok { under = n.Underlying() } - switch u := under.(type) { + switch under := under.(type) { case *types.Basic: switch { - case u.Info()&types.IsNumeric != 0: + case under.Info()&types.IsNumeric != 0: return &ast.BasicLit{Kind: token.INT, Value: "0"} - case u.Info()&types.IsBoolean != 0: + case under.Info()&types.IsBoolean != 0: return &ast.Ident{Name: "false"} - case u.Info()&types.IsString != 0: + case under.Info()&types.IsString != 0: return &ast.BasicLit{Kind: token.STRING, Value: `""`} default: - panic(fmt.Sprintf("unknown basic type %v", u)) + panic(fmt.Sprintf("unknown basic type %v", under)) } case *types.Chan, *types.Interface, *types.Map, *types.Pointer, *types.Signature, *types.Slice, *types.Array: return ast.NewIdent("nil") @@ -178,7 +178,7 @@ List: returns, }, } - case *types.Named: + case interface{ Obj() *types.TypeName }: // *types.{Alias,Named,TypeParam} if t.Obj().Pkg() == nil { return ast.NewIdent(t.Obj().Name()) }