From d42c92b46538aa5d0393fef49f0d335c91168e8f Mon Sep 17 00:00:00 2001 From: Rebecca Stambler Date: Tue, 28 Sep 2021 18:46:53 -0400 Subject: [PATCH] internal/lsp/analysis/fillreturns: skip any parameterized functions Type parameters don't have default values, so for now, we just skip them in fillreturns. I think we should still be able to handle functions whose return values are all concrete types though. Change-Id: I1fe4c0d46cd564ff71647294d6cc935762bbd9d3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/352910 Trust: Rebecca Stambler Run-TryBot: Rebecca Stambler gopls-CI: kokoro TryBot-Result: Go Bot Reviewed-by: Robert Findley --- internal/lsp/analysis/fillreturns/fillreturns.go | 9 +++++++++ .../lsp/analysis/fillreturns/testdata/src/a/a_118.go | 10 ++++++++++ .../fillreturns/testdata/src/a/a_118.go.golden | 10 ++++++++++ 3 files changed, 29 insertions(+) create mode 100644 internal/lsp/analysis/fillreturns/testdata/src/a/a_118.go create mode 100644 internal/lsp/analysis/fillreturns/testdata/src/a/a_118.go.golden diff --git a/internal/lsp/analysis/fillreturns/fillreturns.go b/internal/lsp/analysis/fillreturns/fillreturns.go index 94accef62a..d34baf5cb1 100644 --- a/internal/lsp/analysis/fillreturns/fillreturns.go +++ b/internal/lsp/analysis/fillreturns/fillreturns.go @@ -20,6 +20,7 @@ import ( "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/internal/analysisinternal" + "golang.org/x/tools/internal/typeparams" ) const Doc = `suggested fixes for "wrong number of return values (want %d, got %d)" @@ -106,6 +107,14 @@ outer: continue } + // Skip any generic enclosing functions, since type parameters don't + // have 0 values. + // TODO(rstambler): We should be able to handle this if the return + // values are all concrete types. + if tparams := typeparams.ForFuncType(enclosingFunc); tparams != nil && tparams.NumFields() > 0 { + return nil, nil + } + // Find the function declaration that encloses the ReturnStmt. var outer *ast.FuncDecl for _, p := range path { diff --git a/internal/lsp/analysis/fillreturns/testdata/src/a/a_118.go b/internal/lsp/analysis/fillreturns/testdata/src/a/a_118.go new file mode 100644 index 0000000000..8c371eaef5 --- /dev/null +++ b/internal/lsp/analysis/fillreturns/testdata/src/a/a_118.go @@ -0,0 +1,10 @@ +//go:build go1.18 +// +build go1.18 + +package fillreturns + +type Any interface{} + +func hello[T any]() int { + return +} diff --git a/internal/lsp/analysis/fillreturns/testdata/src/a/a_118.go.golden b/internal/lsp/analysis/fillreturns/testdata/src/a/a_118.go.golden new file mode 100644 index 0000000000..8c371eaef5 --- /dev/null +++ b/internal/lsp/analysis/fillreturns/testdata/src/a/a_118.go.golden @@ -0,0 +1,10 @@ +//go:build go1.18 +// +build go1.18 + +package fillreturns + +type Any interface{} + +func hello[T any]() int { + return +}