diff --git a/internal/lsp/source/completion/completion.go b/internal/lsp/source/completion/completion.go index 2c9a8262cd..6d4bef93e0 100644 --- a/internal/lsp/source/completion/completion.go +++ b/internal/lsp/source/completion/completion.go @@ -2702,6 +2702,12 @@ func (ci *candidateInference) assigneesMatch(cand *candidate, sig *types.Signatu return false } + // Don't prefer completing into func(...interface{}) calls since all + // functions wouuld match. + if ci.variadicAssignees && len(ci.assignees) == 1 && isEmptyInterface(deslice(ci.assignees[0])) { + return false + } + var numberOfResultsCouldMatch bool if ci.variadicAssignees { numberOfResultsCouldMatch = sig.Results().Len() >= len(ci.assignees)-1 diff --git a/internal/lsp/testdata/multireturn/multi_return.go.in b/internal/lsp/testdata/multireturn/multi_return.go.in index 712070b2e6..c302f3815f 100644 --- a/internal/lsp/testdata/multireturn/multi_return.go.in +++ b/internal/lsp/testdata/multireturn/multi_return.go.in @@ -37,3 +37,12 @@ func _() { var variadic func(int, ...int) variadic() //@rank(")", multiF1, multiF0),rank(")", multiF2, multiF0),rank(")", multiF3, multiF0) } + +func _() { + var baz func(...interface{}) + + var otterNap func() (int, int) //@item(multiTwo, "otterNap", "func() (int, int)", "var") + var one int //@item(multiOne, "one", "int", "var") + + baz(on) //@rank(")", multiOne, multiTwo) +} diff --git a/internal/lsp/testdata/summary.txt.golden b/internal/lsp/testdata/summary.txt.golden index 91dd9ada1a..d783d792b6 100644 --- a/internal/lsp/testdata/summary.txt.golden +++ b/internal/lsp/testdata/summary.txt.golden @@ -6,7 +6,7 @@ CompletionSnippetCount = 95 UnimportedCompletionsCount = 5 DeepCompletionsCount = 5 FuzzyCompletionsCount = 8 -RankedCompletionsCount = 165 +RankedCompletionsCount = 166 CaseSensitiveCompletionsCount = 4 DiagnosticsCount = 37 FoldingRangesCount = 2