From 8463f397d07cfd2b3f1442fb1daa5e6bc2178a6e Mon Sep 17 00:00:00 2001 From: Muir Manders Date: Fri, 24 Apr 2020 21:19:15 -0700 Subject: [PATCH] internal/lsp/source: fix false positive "..." in completions In cases like: var v interface{} fmt.Println(<>) Completing to "v" would insert "v..." instead of "v". This was due to a mixup where we were checking if the variadic type "[]interface{}" was assignable to the candidate type "interface{}" instead of the other way around. Fixes golang/go#38652. Change-Id: I27c0b50bbf4b895924c8ed2c0c9dd6785e98cbe1 Reviewed-on: https://go-review.googlesource.com/c/tools/+/229921 Run-TryBot: Muir Manders TryBot-Result: Gobot Gobot Reviewed-by: Rebecca Stambler --- internal/lsp/source/completion.go | 3 +-- .../testdata/lsp/primarymod/variadic/variadic.go.in | 10 +++++++--- internal/lsp/testdata/lsp/summary.txt.golden | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/internal/lsp/source/completion.go b/internal/lsp/source/completion.go index 96db89bcb0..33dcaab9e1 100644 --- a/internal/lsp/source/completion.go +++ b/internal/lsp/source/completion.go @@ -1734,8 +1734,7 @@ func (ci candidateInference) applyTypeNameModifiers(typ types.Type) types.Type { // matchesVariadic returns true if we are completing a variadic // parameter and candType is a compatible slice type. func (ci candidateInference) matchesVariadic(candType types.Type) bool { - return ci.variadicType != nil && types.AssignableTo(ci.objType, candType) - + return ci.variadicType != nil && types.AssignableTo(candType, ci.objType) } // findSwitchStmt returns an *ast.CaseClause's corresponding *ast.SwitchStmt or diff --git a/internal/lsp/testdata/lsp/primarymod/variadic/variadic.go.in b/internal/lsp/testdata/lsp/primarymod/variadic/variadic.go.in index 5ce4703c82..4787498ce7 100644 --- a/internal/lsp/testdata/lsp/primarymod/variadic/variadic.go.in +++ b/internal/lsp/testdata/lsp/primarymod/variadic/variadic.go.in @@ -8,9 +8,10 @@ func bar() []string { //@item(vFunc, "bar", "func() []string", "func") func _() { var ( - i int //@item(vInt, "i", "int", "var") - s string //@item(vStr, "s", "string", "var") - ss []string //@item(vStrSlice, "ss", "[]string", "var") + i int //@item(vInt, "i", "int", "var") + s string //@item(vStr, "s", "string", "var") + ss []string //@item(vStrSlice, "ss", "[]string", "var") + v interface{} //@item(vIntf, "v", "interface{}", "var") ) foo() //@rank(")", vInt, vStr),rank(")", vInt, vStrSlice) @@ -20,6 +21,9 @@ func _() { // snippet will add the "..." for you foo(123, ) //@snippet(")", vStrSlice, "ss...", "ss..."),snippet(")", vFunc, "bar()...", "bar()..."),snippet(")", vStr, "s", "s") + + // don't add "..." for interface{} + foo(123, ) //@snippet(")", vIntf, "v", "v") } func qux(...func()) {} diff --git a/internal/lsp/testdata/lsp/summary.txt.golden b/internal/lsp/testdata/lsp/summary.txt.golden index f1575fef85..871fc2fb4d 100644 --- a/internal/lsp/testdata/lsp/summary.txt.golden +++ b/internal/lsp/testdata/lsp/summary.txt.golden @@ -1,7 +1,7 @@ -- summary -- CodeLensCount = 2 CompletionsCount = 237 -CompletionSnippetCount = 75 +CompletionSnippetCount = 76 UnimportedCompletionsCount = 6 DeepCompletionsCount = 5 FuzzyCompletionsCount = 8