internal/lsp/source: don't get unnecessary unimported completions

Unimported completions are always low-priority. If the user already
has 100 completion options, the unimported ones are probably not useful.
There's no point in calculating any of them.

Also, only do unimported completions for package members when they're
enabled. Oops.

Change-Id: I7535a22ad56bed869dceb6cd0ffdfc6390cf8eb5
Reviewed-on: https://go-review.googlesource.com/c/tools/+/212629
Run-TryBot: Heschi Kreinick <heschi@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
This commit is contained in:
Heschi Kreinick 2019-12-23 13:19:17 -05:00
parent 234df48a20
commit fd66c7521c
1 changed files with 5 additions and 7 deletions

View File

@ -601,7 +601,7 @@ func (c *completer) wantTypeName() bool {
} }
// See https://golang.org/issue/36001. Unimported completions are expensive. // See https://golang.org/issue/36001. Unimported completions are expensive.
const maxUnimported = 20 const unimportedTarget = 100
// selector finds completions for the specified selector expression. // selector finds completions for the specified selector expression.
func (c *completer) selector(sel *ast.SelectorExpr) error { func (c *completer) selector(sel *ast.SelectorExpr) error {
@ -620,15 +620,14 @@ func (c *completer) selector(sel *ast.SelectorExpr) error {
} }
// Try unimported packages. // Try unimported packages.
if id, ok := sel.X.(*ast.Ident); ok { if id, ok := sel.X.(*ast.Ident); ok && c.opts.Unimported && len(c.items) < unimportedTarget {
pkgExports, err := PackageExports(c.ctx, c.snapshot.View(), id.Name, c.filename) pkgExports, err := PackageExports(c.ctx, c.snapshot.View(), id.Name, c.filename)
if err != nil { if err != nil {
return err return err
} }
known := c.snapshot.KnownImportPaths() known := c.snapshot.KnownImportPaths()
startingItems := len(c.items)
for _, pkgExport := range pkgExports { for _, pkgExport := range pkgExports {
if len(c.items)-startingItems >= maxUnimported { if len(c.items) >= unimportedTarget {
break break
} }
// If we've seen this import path, use the fully-typed version. // If we've seen this import path, use the fully-typed version.
@ -828,7 +827,7 @@ func (c *completer) lexical() error {
} }
} }
if c.opts.Unimported { if c.opts.Unimported && len(c.items) < unimportedTarget {
// Suggest packages that have not been imported yet. // Suggest packages that have not been imported yet.
pkgs, err := CandidateImports(c.ctx, c.snapshot.View(), c.filename) pkgs, err := CandidateImports(c.ctx, c.snapshot.View(), c.filename)
if err != nil { if err != nil {
@ -838,9 +837,8 @@ func (c *completer) lexical() error {
// Rank unimported packages significantly lower than other results. // Rank unimported packages significantly lower than other results.
score *= 0.07 score *= 0.07
startingItems := len(c.items)
for _, pkg := range pkgs { for _, pkg := range pkgs {
if len(c.items)-startingItems >= maxUnimported { if len(c.items) >= unimportedTarget {
break break
} }
if _, ok := seen[pkg.IdentName]; !ok { if _, ok := seen[pkg.IdentName]; !ok {