1
0
mirror of https://github.com/golang/go synced 2024-11-18 23:05:06 -07:00
go/internal/lsp
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
..
browser
cache internal/lsp: start handling watched file change events 2019-08-26 19:00:32 +00:00
cmd internal/telemetry: pass the http.Client to the ocagent 2019-08-21 16:29:14 +00:00
debug internal/telemetry: add the ability to flush telemetry data 2019-08-21 16:29:56 +00:00
diff internal/lsp: add tests at the diff hook layer 2019-08-26 23:40:50 +00:00
fuzzy internal/lsp: add fuzzy completion matching 2019-08-14 16:13:50 +00:00
protocol internal/telemetry: add the ability to flush telemetry data 2019-08-21 16:29:56 +00:00
snippet
source internal/lsp: limit deep completion search scope 2019-08-27 20:50:25 +00:00
telemetry internal/telemetry: extract units to their own package 2019-08-15 21:28:32 +00:00
testdata internal/lsp: support renaming of import spec 2019-08-23 17:09:09 +00:00
tests internal/lsp: support renaming of import spec 2019-08-23 17:09:09 +00:00
code_action.go internal/lsp: use protocol.Range in completion items 2019-08-20 20:57:17 +00:00
completion.go internal/lsp: use protocol.Range in completion items 2019-08-20 20:57:17 +00:00
definition.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
diagnostics.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
format.go internal/lsp: use protocol.Range in completion items 2019-08-20 20:57:17 +00:00
general.go internal/lsp: start handling watched file change events 2019-08-26 19:00:32 +00:00
highlight.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
hover.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
link.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
lsp_test.go internal/lsp: abstract the diff library so it can be substituted 2019-08-20 03:37:07 +00:00
references.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
rename.go internal/lsp: use protocol.Range in completion items 2019-08-20 20:57:17 +00:00
reset_golden.sh
server.go internal/lsp: start handling watched file change events 2019-08-26 19:00:32 +00:00
signature_help.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
symbols.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
text_synchronization.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
util.go internal/lsp: separate out getMapper function 2019-08-16 20:05:58 +00:00
watched_files.go internal/lsp: start handling watched file change events 2019-08-26 19:00:32 +00:00
workspace.go internal/lsp: use x/xerrors to create new errors 2019-08-06 19:46:56 +00:00