go/internal/lsp/source
Alan Donovan b230791f2d internal/lsp/cache: move PosTo{Decl,Field} out of cache
Before, these methods of the Source interface used to use
a cache of buildASTCache, which built a Pos-keyed map for
a whole file, but the necessary algorithm is essentially
a binary search which is plenty fast enough to avoid the
need for cache.

This change implements that algorithm and moves
both methods out of the interface into a single function,
source.FindDeclAndField.

--

I measured the duration of all calls to astCacheData (before)
and FindDeclAndField (after) occurring within this command:

  $ go test -bench=TestBenchmarkConfiguredCompletion -v ./gopls/internal/regtest/bench -completion_workdir=$HOME/w/kubernetes -completion_file=../kubernetes/pkg/generated/openapi/zz_generated.openapi.go -completion_regexp=Get

(The numbers reported by this benchmark are problematic,
which is why I measured call times directly; see
https://github.com/golang/go/issues/53798.)

Results:
before (n=4727) max =  21ms, 90% = 4.4ms, median = 19us
after  (n=6282) max = 2.3ms, 90% = 25us,  median = 14us

The increased number of calls to the function after the change
is due to a longstanding bug in the benchmark: each iteration of
the b.N loop doesn't do a fixed amount of work, it does as much
as it can in 10s. Thus making the code faster simply causes
the benchmark to spend the same amount of time on other parts of
the program--such as the loop that calls FindDeclAndField.

See https://go-review.googlesource.com/c/tools/+/221021 for
background on the previous implementation.

Change-Id: I745ecc4e65378fbe97f456228cafba84105b7e49
Reviewed-on: https://go-review.googlesource.com/c/tools/+/416880
Auto-Submit: Alan Donovan <adonovan@google.com>
Run-TryBot: Alan Donovan <adonovan@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
gopls-CI: kokoro <noreply+kokoro@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
2022-07-13 14:49:57 +00:00
..
completion internal/lsp/cache: move PosTo{Decl,Field} out of cache 2022-07-13 14:49:57 +00:00
add_import.go internal/lsp: add list_known_packages and add_import commands 2021-05-23 03:57:00 +00:00
api_json.go gopls/doc: regenerate documentation 2022-06-29 17:54:53 +00:00
call_hierarchy.go internal/span: make NewRange accept File, not FileSet 2022-07-06 19:40:50 +00:00
code_lens.go internal/span: make NewRange accept File, not FileSet 2022-07-06 19:40:50 +00:00
comment.go gopls, internal/lsp: gofmt 2022-04-12 17:41:31 +00:00
comment_test.go internal/lsp/source: refactor commentToMarkdown function 2021-05-19 23:19:09 +00:00
diagnostics.go internal/lsp: remove unused code 2022-03-17 13:53:41 +00:00
extract.go internal/span: make NewRange accept File, not FileSet 2022-07-06 19:40:50 +00:00
fix.go internal/span: make NewRange accept File, not FileSet 2022-07-06 19:40:50 +00:00
folding_range.go internal/span: make NewRange accept File, not FileSet 2022-07-06 19:40:50 +00:00
format.go internal/span: eliminate TokenConverter 2022-06-01 19:19:15 +00:00
format_test.go internal/lsp: use source.Offset instead of tok.Offset 2021-10-12 22:12:04 +00:00
gc_annotations.go internal/lsp: key GC details off package ID 2021-03-02 22:01:38 +00:00
highlight.go internal/lsp/source: eliminate ColumnMapper.PointSpan in favor of Pos 2022-06-01 19:19:59 +00:00
hover.go internal/lsp/cache: move PosTo{Decl,Field} out of cache 2022-07-13 14:49:57 +00:00
identifier.go internal/lsp/cache: move PosTo{Decl,Field} out of cache 2022-07-13 14:49:57 +00:00
identifier_test.go internal/span: eliminate TokenConverter 2022-06-01 19:19:15 +00:00
implementation.go internal/lsp/source: use token.File-agnostic positions to dedupe refs 2022-07-12 14:39:04 +00:00
inlay_hint.go internal/lsp: add text edits for unkeyed literals 2022-06-30 17:08:31 +00:00
known_packages.go gopls: remove usage of golang.org/x/xerrors 2022-04-20 15:33:22 +00:00
options.go internal/lsp: add settings for inlay hints and enable 2022-06-22 17:08:41 +00:00
options_test.go gopls: upgrade staticcheck to v0.3.0 2022-04-07 14:59:24 +00:00
references.go internal/lsp/source: use token.File-agnostic positions to dedupe refs 2022-07-12 14:39:04 +00:00
rename.go internal/span: make NewRange accept File, not FileSet 2022-07-06 19:40:50 +00:00
rename_check.go internal/span: make NewRange accept File, not FileSet 2022-07-06 19:40:50 +00:00
signature_help.go internal/lsp/cache: move PosTo{Decl,Field} out of cache 2022-07-13 14:49:57 +00:00
source_test.go internal/lsp/cache: make snapshot reference counting uniform 2022-07-11 18:57:05 +00:00
stub.go internal: remove unneeded FileSets 2022-06-06 20:47:10 +00:00
symbols.go gopls: remove usage of golang.org/x/xerrors 2022-04-20 15:33:22 +00:00
types_format.go internal/lsp/cache: move PosTo{Decl,Field} out of cache 2022-07-13 14:49:57 +00:00
util.go internal/lsp/cache: use GetHandle not Bind in astCacheData 2022-07-07 02:48:48 +00:00
util_test.go internal/span: make NewRange accept File, not FileSet 2022-07-06 19:40:50 +00:00
view.go internal/lsp/cache: move PosTo{Decl,Field} out of cache 2022-07-13 14:49:57 +00:00
workspace_symbol.go internal/lsp/source: reduce allocation in workspace-symbols 2022-07-01 16:22:00 +00:00
workspace_symbol_test.go internal/lsp/source: parse symbol queries when using fastfuzzy 2022-01-19 15:06:07 +00:00