1
0
mirror of https://github.com/golang/go synced 2024-11-06 00:16:10 -07:00
go/internal/imports
Heschi Kreinick 5d34a75004 internal/imports: don't block completions on walks
Filesystem walks of large GOPATHs/module caches can take seconds,
especially on systems with slow filesystems like MacOS and WSL. We don't
want to block completion requests on walks finishing. At the same time,
cancelling a walk midway through results in an unusable cache, where we
don't know which parts have been scanned so far.

The best option is to run the walks in a separate goroutine. Then we can
detach and let them finish. On the other side, we need to be able to
reattach for the next completion request.

Introduce a new method on caches, ScanAndListen, which first processes
all the items in the cache, then notifies of any new items. This allows
us to reattach to an existing scan without missing anything.

The background scan introduces concurrency to the resolvers where there
wasn't any before. We can't use mutexes, because there's no way to stop
Lock() when a context expires. Use a 1-element semaphore channel to
accomplish the same effect.

Along the way: Only rescan GOPATH if the resolver has been cleared. None
of this makes sense for GOPATH without that. Fix a bug where we were
scanning the main module twice in module mode. Stop loading exports in
module tests, it slows them down a ton.

Change-Id: I978efae733ccba0c0cdc8e8fe6892bf5f15feac8
Reviewed-on: https://go-review.googlesource.com/c/tools/+/213217
Run-TryBot: Heschi Kreinick <heschi@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
2020-01-09 22:24:46 +00:00
..
testdata/mod imports: rename to internal/imports 2019-05-20 21:49:35 +00:00
fix_test.go internal/imports: filter out self-import completions 2019-12-30 21:44:38 +00:00
fix.go internal/imports: don't block completions on walks 2020-01-09 22:24:46 +00:00
imports_test.go internal/lsp/source: optimize computeFixEdits 2019-12-06 20:21:26 +00:00
imports.go internal/imports: filter out self-import completions 2019-12-30 21:44:38 +00:00
mkindex.go imports: rename to internal/imports 2019-05-20 21:49:35 +00:00
mkstdlib.go internal/imports: cache GOPATH, exports 2019-11-04 21:31:17 +00:00
mod_112_test.go imports: rename to internal/imports 2019-05-20 21:49:35 +00:00
mod_114_test.go internal/imports: support vendoring in module mode 2019-10-24 21:04:39 +00:00
mod_cache_test.go internal/imports: clean up dead code 2019-12-30 21:21:44 +00:00
mod_cache.go internal/imports: don't block completions on walks 2020-01-09 22:24:46 +00:00
mod_pre114_test.go internal/imports: support vendoring in module mode 2019-10-24 21:04:39 +00:00
mod_test.go internal/imports: don't block completions on walks 2020-01-09 22:24:46 +00:00
mod.go internal/imports: don't block completions on walks 2020-01-09 22:24:46 +00:00
proxy_112_test.go imports: rename to internal/imports 2019-05-20 21:49:35 +00:00
proxy_113_test.go imports: rename to internal/imports 2019-05-20 21:49:35 +00:00
sortimports.go internal/imports: merge import declarations 2019-08-14 23:54:02 +00:00
zstdlib.go internal/imports: cache GOPATH, exports 2019-11-04 21:31:17 +00:00