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 <joshbaum@google.com>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/internal/lsp/analysis/fillstruct/fillstruct.go b/internal/lsp/analysis/fillstruct/fillstruct.go
index 8f13b8b..91d8963 100644
--- a/internal/lsp/analysis/fillstruct/fillstruct.go
+++ b/internal/lsp/analysis/fillstruct/fillstruct.go
@@ -346,9 +346,23 @@
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 8358383..bf62a2d 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 @@
}
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 2f52bf5..8ef6b9a 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 @@
},
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 ""