internal/lsp/source: don't prefer bool candidates in bool exprs
Consider this example:
var foo, bar int
if foo == 123 && b<> {
}
Completing at "<>" previously preferred the unimported
"bytes.Contains()" function because it returns a bool. You often need
to compose a boolean expression from non-boolean candidates, so
preferring only bool candidates gives unhelpful results. Now we don't
infer any expected type for "&&" and "||", which allows the example to
prefer "bar" as the top candidate.
Fixes golang/go#37163.
Change-Id: Ic341da11dd626439cfb265d129288c5ca6008270
Reviewed-on: https://go-review.googlesource.com/c/tools/+/246362
Run-TryBot: Muir Manders <muir@mnd.rs>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/lsp/source/completion.go b/internal/lsp/source/completion.go
index 3797e86..e4f32bd 100644
--- a/internal/lsp/source/completion.go
+++ b/internal/lsp/source/completion.go
@@ -1596,7 +1596,14 @@
e = node.Y
}
if tv, ok := c.pkg.GetTypesInfo().Types[e]; ok {
- inf.objType = tv.Type
+ switch node.Op {
+ case token.LAND, token.LOR:
+ // Don't infer "bool" type for "&&" or "||". Often you want
+ // to compose a boolean expression from non-boolean
+ // candidates.
+ default:
+ inf.objType = tv.Type
+ }
break Nodes
}
case *ast.AssignStmt:
diff --git a/internal/lsp/testdata/lsp/primarymod/rank/boolexpr_rank.go b/internal/lsp/testdata/lsp/primarymod/rank/boolexpr_rank.go
new file mode 100644
index 0000000..fe512ee
--- /dev/null
+++ b/internal/lsp/testdata/lsp/primarymod/rank/boolexpr_rank.go
@@ -0,0 +1,11 @@
+package rank
+
+func _() {
+ someRandomBoolFunc := func() bool { //@item(boolExprFunc, "someRandomBoolFunc", "func() bool", "var")
+ return true
+ }
+
+ var foo, bar int //@item(boolExprBar, "bar", "int", "var")
+ if foo == 123 && b { //@rank(" {", boolExprBar, boolExprFunc)
+ }
+}
diff --git a/internal/lsp/testdata/lsp/summary.txt.golden b/internal/lsp/testdata/lsp/summary.txt.golden
index 3bc185f..ea87659 100644
--- a/internal/lsp/testdata/lsp/summary.txt.golden
+++ b/internal/lsp/testdata/lsp/summary.txt.golden
@@ -5,7 +5,7 @@
UnimportedCompletionsCount = 6
DeepCompletionsCount = 5
FuzzyCompletionsCount = 8
-RankedCompletionsCount = 127
+RankedCompletionsCount = 128
CaseSensitiveCompletionsCount = 4
DiagnosticsCount = 44
FoldingRangesCount = 2