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())
}