From 727c06e3f111405bd52063f6120c7d72c3ba896e Mon Sep 17 00:00:00 2001 From: Josh Baum Date: Thu, 25 Jun 2020 12:06:28 -0400 Subject: [PATCH] internal/lsp/analysis/fillstruct: correct pointer to builtin values The current implementation correctly calls 'new' when filling a pointer to a builtin type. Fixes: golang/go#39854 Change-Id: I0c2b27bb57fd865c4376279059ad060608d48ba3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/239978 Run-TryBot: Josh Baum Reviewed-by: Rebecca Stambler TryBot-Result: Gobot Gobot --- .../lsp/analysis/fillstruct/fillstruct.go | 20 ++++++++++++++++--- .../analysis/fillstruct/testdata/src/a/a.go | 8 ++++++++ .../fillstruct/testdata/src/a/a.go.golden | 12 +++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/internal/lsp/analysis/fillstruct/fillstruct.go b/internal/lsp/analysis/fillstruct/fillstruct.go index 8f13b8b8686..91d8963b25f 100644 --- a/internal/lsp/analysis/fillstruct/fillstruct.go +++ b/internal/lsp/analysis/fillstruct/fillstruct.go @@ -346,9 +346,23 @@ func populateValue(fset *token.FileSet, f *ast.File, pkg *types.Package, typ typ Body: &ast.BlockStmt{}, } case *types.Pointer: - return &ast.UnaryExpr{ - Op: token.AND, - X: populateValue(fset, f, pkg, u.Elem()), + switch u.Elem().(type) { + case *types.Basic: + return &ast.CallExpr{ + Fun: &ast.Ident{ + Name: "new", + }, + Args: []ast.Expr{ + &ast.Ident{ + Name: u.Elem().String(), + }, + }, + } + default: + return &ast.UnaryExpr{ + Op: token.AND, + X: populateValue(fset, f, pkg, u.Elem()), + } } case *types.Interface: return ast.NewIdent("nil") diff --git a/internal/lsp/analysis/fillstruct/testdata/src/a/a.go b/internal/lsp/analysis/fillstruct/testdata/src/a/a.go index 835838302e6..bf62a2da642 100644 --- a/internal/lsp/analysis/fillstruct/testdata/src/a/a.go +++ b/internal/lsp/analysis/fillstruct/testdata/src/a/a.go @@ -89,3 +89,11 @@ type importedStruct struct { } var _ = importedStruct{} // want "" + +type pointerBuiltinStruct struct { + b *bool + s *string + i *int +} + +var _ = pointerBuiltinStruct{} // want "" diff --git a/internal/lsp/analysis/fillstruct/testdata/src/a/a.go.golden b/internal/lsp/analysis/fillstruct/testdata/src/a/a.go.golden index 2f52bf5e4f3..8ef6b9a0679 100644 --- a/internal/lsp/analysis/fillstruct/testdata/src/a/a.go.golden +++ b/internal/lsp/analysis/fillstruct/testdata/src/a/a.go.golden @@ -125,3 +125,15 @@ var _ = importedStruct{ }, st: ast.CompositeLit{}, } // want "" + +type pointerBuiltinStruct struct { + b *bool + s *string + i *int +} + +var _ = pointerBuiltinStruct{ + b: new(bool), + s: new(string), + i: new(int), +} // want ""