x/tools/gopls: autocomplete returns packages within excluded directories (per build.directoryFilters)
Related to https://github.com/golang/go/issues/48939 and reproduced in a repository.

What version of Go are you using (go version)?
$ go version
Does this issue reproduce with the latest release?
Yes:
~/git/go-tools$ git log -n 1
commit fe932b4680bd8878524bfea7a12f7cf30e1e0438
What operating system and processor architecture are you using (go env)?
go env Output
$ $ go env GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/red/.cache/go-build" GOENV="/home/red/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/red/go/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/red/go" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.18" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/home/red/git/gopls-bug-workspace-filters/go.mod" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2678705596=/tmp/go-build -gno-record-gcc-switches"
What did you do?
- Check out https://github.com/gonzojive/gopls-bug-workspace-filters
- Open internal/activework/activework.go
- Try to tab complete
mylwithin a function. The autocomplete list will include a library in thegenerated_stuffdir, which is included in thebuild.directoryFiltersexclusion list:
{
"gopls": {
"build.directoryFilters": [
"-generated_stuff",
],
"formatting.local": "github.com/api-definitions/keyval",
},
}
What did you expect to see?
Packages in generated_stuff shouldn't be included in autocomplete list?
I can't tell if this is working as intended. It came up before in https://github.com/golang/go/issues/37697, but I interpret the build.directoryFilters to mean that the generated_stuff folder should be ignored in this context as well: https://github.com/golang/vscode-go/blob/master/docs/settings.md#builddirectoryfilters.
What did you see instead?
mylib is included in the autocomplete list.
I came across a related issue: https://github.com/golang/go/issues/42965
From browsing the source, I wonder if the call to imports.GetAllCandidates from completions.go could be altered to pass in a filter derived from the directoryFilters that gets used in the dirFound callback that imports.GetAllCandidates uses to limit what packages it scans.
This bug may also be a duplicate of https://github.com/golang/go/issues/51265, not totally sure.
I just implemented something similar to this in https://go.dev/cl/531417.
Notes on how to implement this:
- Thread through directory filters to where we do 'metadata'-based unimported completion
- Apply directory filters for each compiled go file in the package; if all are excluded, ignore the package. (or just pick the first file to consider).
- For any excluded package path, also filter from module cache completion implemented via completer.completionCallbacks
May not get to this for v0.14, which we want to cut ASAP to include a completion performance fix.
Would this completely stop gopls from scanning excluded sub directories? I was getting https://github.com/golang/go/issues/42255 because a sub-sub directory has a NFS mounted to it, and gopls apparently tried to scan the entire NFS file tree..