1
0
mirror of https://github.com/golang/go synced 2024-10-01 12:28:37 -06:00
go/internal/lsp/source
Muir Manders b29f5f60c3 internal/lsp: limit deep completion search scope
Deep completions can take a long time (500ms+) if there are many
large, deeply nested structs in scope. To make sure we return
completion results in a timely manner we now notice if we have spent
"too long" searching for deep completions and reduce the search scope.

In particular, our overall completion budget is 100ms. This value is
often cited as the longest latency that still feels instantaneous to
most people. As we spend 25%, 50%, and 75% of our budget we limit our
deep completion candidate search depth to 4, 3, and 2,
respectively. If we hit 90% of our budget, we disable deep completions
entirely.

In my testing, limiting the search scope to 4 normally makes even
enormous searches finish in a few milliseconds. Of course, you can
have arbitrarily many objects in scope with arbitrarily many fields,
so to cover our bases we continue to dial down the search depth as
needed.

I replaced the "enabled" field with a "maxDepth" field that disables
deep search when set to 0.

Change-Id: I9b5a07de70709895c065503ae6082d1ea615d1af
Reviewed-on: https://go-review.googlesource.com/c/tools/+/190978
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Cottrell <iancottrell@google.com>
2019-08-27 20:50:25 +00:00
..
analysis.go go/analysis: handle common nil pointers 2019-08-24 21:01:00 +00:00
completion_format.go internal/lsp: use protocol.Range in completion items 2019-08-20 20:57:17 +00:00
completion_snippet.go internal/lsp: provide deep completion candidates 2019-06-27 18:58:03 +00:00
completion.go internal/lsp: limit deep completion search scope 2019-08-27 20:50:25 +00:00
deep_completion.go internal/lsp: limit deep completion search scope 2019-08-27 20:50:25 +00:00
diagnostics_test.go internal/span: change URI.Filename so it just returns the filename 2019-06-10 21:39:43 +00:00
diagnostics.go internal/lsp: abstract the diff library so it can be substituted 2019-08-20 03:37:07 +00:00
enums.go internal/lsp: switch completion item tests to using the enum strings 2019-04-17 17:57:43 +00:00
format.go internal/lsp: use protocol.Range in completion items 2019-08-20 20:57:17 +00:00
highlight.go internal/lsp: split the telemetry library out 2019-08-15 21:28:02 +00:00
hover.go internal/lsp: split the telemetry library out 2019-08-15 21:28:02 +00:00
identifier.go internal/lsp: use the explicit import spec name as ident 2019-08-22 17:46:33 +00:00
imports_test.go internal/lsp: abstract the diff library so it can be substituted 2019-08-20 03:37:07 +00:00
imports.go internal/lsp: abstract the diff library so it can be substituted 2019-08-20 03:37:07 +00:00
references.go internal/lsp: split the telemetry library out 2019-08-15 21:28:02 +00:00
rename_check.go internal/lsp: use memoize package to cache source.Packages 2019-08-13 21:41:43 +00:00
rename.go internal/lsp: support renaming of import spec 2019-08-23 17:09:09 +00:00
signature_help.go internal/lsp: split the telemetry library out 2019-08-15 21:28:02 +00:00
source_test.go internal/lsp: use protocol.Range in completion items 2019-08-20 20:57:17 +00:00
suggested_fix.go internal/lsp: abstract the diff library so it can be substituted 2019-08-20 03:37:07 +00:00
symbols.go internal/lsp: split the telemetry library out 2019-08-15 21:28:02 +00:00
util.go internal/lsp: use protocol.Range in completion items 2019-08-20 20:57:17 +00:00
view.go internal/lsp: start handling watched file change events 2019-08-26 19:00:32 +00:00