mirror of https://github.com/golang/go.git
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:
parent
234df48a20
commit
fd66c7521c
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue