x/tools/gopls: FindFileInPackage nil pointer dereference
Closed this issue · 12 comments
What version of Go are you using (go version)?
$ go version
go version go1.14 linux/amd64
$ gopls version
golang.org/x/tools/gopls master
golang.org/x/tools/gopls@v0.1.8-0.20200326210457-5d86d385bf88 h1:VHwe8L5z49UodPQ00s8OuYq5xk8LjagpydtFF7m+JCo=
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (go env)?
go env Output
$ go env GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/sean/.cache/go-build" GOENV="/home/sean/.config/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/sean/.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" GCCGO="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/tmp/vimtest/go.mod" 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-build567811365=/tmp/go-build -gno-record-gcc-switches"
What did you do?
https://play.golang.org/p/SrULcmi-Xbb
Hovering over b.Baz in test.go will cause gopls to panic and crash.
bar.pb.go was generated with
#!/bin/bash
service="./pkg/bar/pb"
protoc \
-I="${service}" \
-I=. \
-I="$GOPATH/src" \
-I="$GOPATH/src/github.com/gogo/protobuf/types" \
-I="$GOPATH/src/github.com/gogo/protobuf/gogoproto" \
-I="$GOPATH/src/github.com/gogo/protobuf/protobuf" \
--gogoslick_out=paths=source_relative,\
Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/duration.proto=github.com/gogo/protobuf/types,\
Mgoogle/protobuf/empty.proto=github.com/gogo/protobuf/types,\
Mgoogle/api/annotations.proto=github.com/gogo/googleapis/google/api,\
Mgoogle/protobuf/field_mask.proto=github.com/gogo/protobuf/types:\
"${service}/" \
./"${service}"/*.proto
===== sent =====
Content-Length: 216
{"method": "textDocument/references", "jsonrpc": "2.0", "id": 5, "params": {"context": {"includeDeclaration": true}, "textDocument": {"uri": "file:///tmp/vimtest/test.go"}, "position": {"character": 10, "line": 11}}}
===== received =====
Content-Length: 162
{"jsonrpc":"2.0","result":[{"uri":"file:///tmp/vimtest/pkg/bar/pb/bar.pb.go","range":{"start":{"line":35,"character":1},"end":{"line":35,"character":4}}}],"id":4}
===== sent =====
Content-Length: 182
{"method": "textDocument/hover", "jsonrpc": "2.0", "id": 6, "params": {"textDocument": {"uri": "file:///tmp/vimtest/pkg/bar/pb/bar.pb.go"}, "position": {"character": 1, "line": 35}}}
===== received =====
Content-Length: 121
{"jsonrpc":"2.0","error":{"code":-32603,"message":"method \"textDocument/references\" did not reply","data":null},"id":5}
===== stderr =====
panic: runtime error: invalid memory address or nil pointer dereference
===== stderr =====
[signal SIGSEGV: segmentation violation code=0x1 addr=0x60 pc=0x7d4518]
===== stderr =====
===== stderr =====
goroutine 2409 [running]:
===== stderr =====
golang.org/x/tools/internal/lsp/source.FindFileInPackage(0x0, 0x0, 0xc003b65140, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:715 +0x108
===== stderr =====
golang.org/x/tools/internal/lsp/source.findMapperInPackage(0xe49ce0, 0xc00039c000, 0x0, 0x0, 0xc003b65140, 0x28, 0x24, 0x2, 0xc00166b320)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:687 +0x15e
===== stderr =====
golang.org/x/tools/internal/lsp/source.posToMappedRange(0xe49ce0, 0xc00039c000, 0x0, 0x0, 0x483, 0x486, 0x0, 0x0, 0x0, 0x0, ...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:205 +0x15b
===== stderr =====
golang.org/x/tools/internal/lsp/source.nameToMappedRange(...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:200
===== stderr =====
golang.org/x/tools/internal/lsp/source.objToMappedRange(0xe49ce0, 0xc00039c000, 0x0, 0x0, 0xe4a280, 0xc003465bd0, 0x0, 0x0, 0x0, 0x0, ...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:196 +0x11a
===== stderr =====
golang.org/x/tools/internal/lsp/source.References(0xe382e0, 0xc00313f5f0, 0xe49c40, 0xc000474150, 0xe36b60, 0xc000ac49c0, 0x4026000000000000, 0x4024000000000000, 0xc00065fb01, 0x0, ...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/references.go:50 +0xe3b
===== stderr =====
golang.org/x/tools/internal/lsp.(*Server).references(0xc00011e780, 0xe382e0, 0xc00329f140, 0xc0044f60f0, 0xc0044f60f0, 0x0, 0x0, 0x0, 0xc002907290)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/references.go:19 +0xe7
===== stderr =====
golang.org/x/tools/internal/lsp.(*Server).References(0xc00011e780, 0xe382e0, 0xc00329f140, 0xc0044f60f0, 0xc0044f60f0, 0x0, 0x0, 0x0, 0x0)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/server_gen.go:144 +0x4d
===== stderr =====
golang.org/x/tools/internal/lsp/protocol.serverHandler.Deliver(0xe52160, 0xc00011e780, 0xe382e0, 0xc00329f140, 0xc002df8c80, 0x1372900, 0x1370000)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/protocol/tsserver.go:377 +0x251f
===== stderr =====
golang.org/x/tools/internal/jsonrpc2.(*Conn).Run.func1(0xc0032174a0, 0xc002df8c80, 0xc000120550, 0xe382e0, 0xc00329f140, 0x0, 0x0, 0xc003540860)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/jsonrpc2/jsonrpc2.go:371 +0x160
===== stderr =====
created by golang.org/x/tools/internal/jsonrpc2.(*Conn).Run
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/jsonrpc2/jsonrpc2.go:355 +0x850
What did you expect to see?
gopls not to panic. Vim-go to highlight all references to the same variable.
What did you see instead?
gopls panic
Thank you for filing a gopls issue! Please take a look at the Troubleshooting guide, and make sure that you have provided all of the relevant information here.
Can you please share your full gopls logs for this? I am not able to reproduce the crash, and it implies that we are calling FindFileInPkg on a nil package, which should be impossible. gopls -rpc.trace -v check path/to/file.go may also provide some useful information.
Directory structure:
.
├── gen-proto.sh
├── go.mod
├── pkg
│ └── bar
│ ├── bar.go
│ └── pb
│ ├── bar.pb.go
│ └── bar.proto
└── test.go
3 directories, 6 files
$ gopls -rpc.trace -v check ./test.go
2020/03/27 11:41:18 Info:2020/03/27 11:41:18 Build info
----------
golang.org/x/tools/gopls master
golang.org/x/tools/gopls@v0.1.8-0.20200326210457-5d86d385bf88 h1:VHwe8L5z49UodPQ00s8OuYq5xk8LjagpydtFF7m+JCo=
github.com/BurntSushi/toml@v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/sergi/go-diff@v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
golang.org/x/mod@v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
golang.org/x/sync@v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=
golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88 h1:F7fM2kxXfuWw820fa+MMCCLH6hmYe+jtLnZpwoiLK4Q=
golang.org/x/xerrors@v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
honnef.co/go/tools@v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
mvdan.cc/xurls/v2@v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=
Go info
-------
go version go1.14 linux/amd64
2020/03/27 11:41:18 Info:2020/03/27 11:41:18 go env for /tmp/vimtest
(valid build configuration = true)
(build flags: [-modfile=/tmp/go.vimtest.650432255.mod])
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/sean/.cache/go-build"
GOENV="/home/sean/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/sean/.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"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/tmp/vimtest/go.mod"
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-build677954172=/tmp/go-build -gno-record-gcc-switches"
2020/03/27 11:41:18 Info:2020/03/27 11:41:18 go/packages.Load
snapshot=0
directory="/tmp/vimtest"
query=["./..." "builtin"]
packages=5
gopls logs
===== sent =====
Content-Length: 455
{"method": "initialize", "jsonrpc": "2.0", "id": 1, "params": {"rootUri": "file:///tmp/vimtest", "capabilities": {"workspace": {"workspaceFolders": true, "configuration": true, "didChangeConfiguration": {"dynamicRegistration": true}}, "textDocument": {"completion": {"completionItem": {"snippetSupport": false}}, "hover": {"contentFormat": ["plaintext"]}}}, "processId": 1018, "workspaceFolders": [{"uri": "file:///tmp/vimtest", "name": "/tmp/vimtest"}]}}
===== stderr =====
2020/03/27 11:40:07 debug server listening on port 37009
===== received =====
Content-Length: 881
{"jsonrpc":"2.0","result":{"capabilities":{"textDocumentSync":{"openClose":true,"change":2,"save":{}},"completionProvider":{"triggerCharacters":["."]},"hoverProvider":true,"signatureHelpProvider":{"triggerCharacters":["(",","]},"definitionProvider":true,"typeDefinitionProvider":true,"implementationProvider":true,"referencesProvider":true,"documentHighlightProvider":true,"documentSymbolProvider":true,"codeActionProvider":true,"codeLensProvider":{},"documentLinkProvider":{},"workspaceSymbolProvider":true,"documentFormattingProvider":true,"documentOnTypeFormattingProvider":{"firstTriggerCharacter":""},"renameProvider":true,"foldingRangeProvider":true,"executeCommandProvider":{"commands":["tidy","upgrade.dependency","generate"]},"workspace":{"workspaceFolders":{"supported":true,"changeNotifications":"workspace/didChangeWorkspaceFolders"}}},"serverInfo":{"name":""}},"id":1}
===== sent =====
Content-Length: 57
{"method": "initialized", "jsonrpc": "2.0", "params": {}}
===== sent =====
Content-Length: 368
{"method": "textDocument/didOpen", "jsonrpc": "2.0", "params": {"textDocument": {"uri": "file:///tmp/vimtest/test.go", "version": 1, "languageId": "go", "text": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/minight/vimtest/pkg/bar\"\n)\n\nfunc main() {\n\tfmt.Println(\"vim-go\")\n\tbars := bar.GetBars()\n\tfor _, b := range bars {\n\t\t_ = b.Baz\n\t}\n}\n"}}}
===== received =====
Content-Length: 268
{"jsonrpc":"2.0","method":"client/registerCapability","params":{"registrations":[{"id":"workspace/didChangeConfiguration","method":"workspace/didChangeConfiguration"},{"id":"workspace/didChangeWorkspaceFolders","method":"workspace/didChangeWorkspaceFolders"}]},"id":1}
===== sent =====
Content-Length: 43
{"id": 1, "jsonrpc": "2.0", "result": null}
===== received =====
Content-Length: 199
{"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"scopeUri":"file:///tmp/vimtest","section":"gopls"},{"scopeUri":"file:///tmp/vimtest","section":"gopls-/tmp/vimtest"}]},"id":2}
===== sent =====
Content-Length: 143
{"id": 2, "jsonrpc": "2.0", "result": [{"buildFlags": [], "hoverKind": "NoDocumentation"}, {"buildFlags": [], "hoverKind": "NoDocumentation"}]}
===== received =====
Content-Length: 1061
{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":3,"message":"2020/03/27 11:40:07 Build info\n----------\ngolang.org/x/tools/gopls master\n golang.org/x/tools/gopls@v0.1.8-0.20200326210457-5d86d385bf88 h1:VHwe8L5z49UodPQ00s8OuYq5xk8LjagpydtFF7m+JCo=\n github.com/BurntSushi/toml@v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\n github.com/sergi/go-diff@v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=\n golang.org/x/mod@v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=\n golang.org/x/sync@v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=\n golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88 h1:F7fM2kxXfuWw820fa+MMCCLH6hmYe+jtLnZpwoiLK4Q=\n golang.org/x/xerrors@v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=\n honnef.co/go/tools@v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=\n mvdan.cc/xurls/v2@v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=\n\nGo info\n-------\ngo version go1.14 linux/amd64\n\n"}}
===== received =====
Content-Length: 1062
{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":3,"message":"2020/03/27 11:40:08 go env for /tmp/vimtest\n(valid build configuration = true)\n(build flags: [-modfile=/tmp/go.vimtest.261704618.mod])\nGO111MODULE=\"\"\nGOARCH=\"amd64\"\nGOBIN=\"\"\nGOCACHE=\"/home/sean/.cache/go-build\"\nGOENV=\"/home/sean/.config/go/env\"\nGOEXE=\"\"\nGOFLAGS=\"\"\nGOHOSTARCH=\"amd64\"\nGOHOSTOS=\"linux\"\nGOINSECURE=\"\"\nGONOPROXY=\"\"\nGONOSUMDB=\"\"\nGOOS=\"linux\"\nGOPATH=\"/home/sean/.go\"\nGOPRIVATE=\"\"\nGOPROXY=\"https://proxy.golang.org,direct\"\nGOROOT=\"/usr/local/go\"\nGOSUMDB=\"sum.golang.org\"\nGOTMPDIR=\"\"\nGOTOOLDIR=\"/usr/local/go/pkg/tool/linux_amd64\"\nGCCGO=\"gccgo\"\nAR=\"ar\"\nCC=\"gcc\"\nCXX=\"g++\"\nCGO_ENABLED=\"1\"\nGOMOD=\"/tmp/vimtest/go.mod\"\nCGO_CFLAGS=\"-g -O2\"\nCGO_CPPFLAGS=\"\"\nCGO_CXXFLAGS=\"-g -O2\"\nCGO_FFLAGS=\"-g -O2\"\nCGO_LDFLAGS=\"-g -O2\"\nPKG_CONFIG=\"pkg-config\"\nGOGCCFLAGS=\"-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build705483024=/tmp/go-build -gno-record-gcc-switches\"\n"}}
===== received =====
Content-Length: 206
{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":3,"message":"2020/03/27 11:40:08 go/packages.Load\n\tsnapshot=0\n\tdirectory=\"/tmp/vimtest\"\n\tquery=[\"./...\" \"builtin\"]\n\tpackages=5"}}
===== received =====
Content-Length: 673
{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/vimtest/pkg/bar/pb/bar.pb.go","diagnostics":[{"range":{"start":{"line":7,"character":3},"end":{"line":7,"character":39}},"severity":2,"source":"go mod tidy","message":"github.com/gogo/protobuf is not in your go.mod file."},{"range":{"start":{"line":8,"character":7},"end":{"line":8,"character":39}},"severity":2,"source":"go mod tidy","message":"github.com/gogo/protobuf is not in your go.mod file."},{"range":{"start":{"line":10,"character":32},"end":{"line":10,"character":64}},"severity":2,"source":"go mod tidy","message":"github.com/gogo/protobuf is not in your go.mod file."}]}}
===== sent =====
Content-Length: 372
{"method": "textDocument/didChange", "jsonrpc": "2.0", "params": {"contentChanges": [{"text": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/minight/vimtest/pkg/bar\"\n)\n\nfunc main() {\n\tfmt.Println(\"vim-go\")\n\tbars := bar.GetBars()\n\tfor _, b := range bars {\n\t\t_ = b.Baz\n\t}\n}\n"}], "textDocument": {"uri": "file:///tmp/vimtest/test.go", "version": 2}}}
===== sent =====
Content-Length: 174
{"method": "textDocument/definition", "jsonrpc": "2.0", "id": 2, "params": {"textDocument": {"uri": "file:///tmp/vimtest/test.go"}, "position": {"character": 9, "line": 11}}}
===== sent =====
Content-Length: 372
{"method": "textDocument/didChange", "jsonrpc": "2.0", "params": {"contentChanges": [{"text": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/minight/vimtest/pkg/bar\"\n)\n\nfunc main() {\n\tfmt.Println(\"vim-go\")\n\tbars := bar.GetBars()\n\tfor _, b := range bars {\n\t\t_ = b.Baz\n\t}\n}\n"}], "textDocument": {"uri": "file:///tmp/vimtest/test.go", "version": 3}}}
===== sent =====
Content-Length: 215
{"method": "textDocument/references", "jsonrpc": "2.0", "id": 3, "params": {"context": {"includeDeclaration": true}, "textDocument": {"uri": "file:///tmp/vimtest/test.go"}, "position": {"character": 9, "line": 11}}}
===== received =====
Content-Length: 162
{"jsonrpc":"2.0","result":[{"uri":"file:///tmp/vimtest/pkg/bar/pb/bar.pb.go","range":{"start":{"line":35,"character":1},"end":{"line":35,"character":4}}}],"id":2}
===== sent =====
Content-Length: 182
{"method": "textDocument/hover", "jsonrpc": "2.0", "id": 4, "params": {"textDocument": {"uri": "file:///tmp/vimtest/pkg/bar/pb/bar.pb.go"}, "position": {"character": 1, "line": 35}}}
===== received =====
Content-Length: 121
{"jsonrpc":"2.0","error":{"code":-32603,"message":"method \"textDocument/references\" did not reply","data":null},"id":3}
===== stderr =====
panic: runtime error: invalid memory address or nil pointer dereference
===== stderr =====
[signal SIGSEGV: segmentation violation code=0x1 addr=0x60 pc=0x7d4518]
===== stderr =====
===== stderr =====
goroutine 2309 [running]:
===== stderr =====
golang.org/x/tools/internal/lsp/source.FindFileInPackage(0x0, 0x0, 0xc003d68cf0, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:715 +0x108
===== stderr =====
golang.org/x/tools/internal/lsp/source.findMapperInPackage(0xe49ce0, 0xc0000ca000, 0x0, 0x0, 0xc003d68cf0, 0x28, 0x24, 0x2, 0xc003860a80)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:687 +0x15e
===== stderr =====
golang.org/x/tools/internal/lsp/source.posToMappedRange(0xe49ce0, 0xc0000ca000, 0x0, 0x0, 0xe8016, 0xe8019, 0x0, 0x0, 0x0, 0x0, ...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:205 +0x15b
===== stderr =====
golang.org/x/tools/internal/lsp/source.nameToMappedRange(...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:200
===== stderr =====
golang.org/x/tools/internal/lsp/source.objToMappedRange(0xe49ce0, 0xc0000ca000, 0x0, 0x0, 0xe4a280, 0xc0006a3d10, 0x0, 0x0, 0x0, 0x0, ...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:196 +0x11a
===== stderr =====
golang.org/x/tools/internal/lsp/source.References(0xe382e0, 0xc00354cf30, 0xe49c40, 0xc0000f2150, 0xe36b60, 0xc003f00360, 0x4026000000000000, 0x4022000000000000, 0xc0003ebb01, 0x0, ...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/references.go:50 +0xe3b
===== stderr =====
golang.org/x/tools/internal/lsp.(*Server).references(0xc0001d9600, 0xe382e0, 0xc0013055c0, 0xc002ef3360, 0xc002ef3360, 0x0, 0x0, 0x0, 0xc001637760)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/references.go:19 +0xe7
===== stderr =====
golang.org/x/tools/internal/lsp.(*Server).References(0xc0001d9600, 0xe382e0, 0xc0013055c0, 0xc002ef3360, 0xc002ef3360, 0x0, 0x0, 0x0, 0x0)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/server_gen.go:144 +0x4d
===== stderr =====
golang.org/x/tools/internal/lsp/protocol.serverHandler.Deliver(0xe52160, 0xc0001d9600, 0xe382e0, 0xc0013055c0, 0xc0037d43c0, 0x1375800, 0xc000730000)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/protocol/tsserver.go:377 +0x251f
===== stderr =====
golang.org/x/tools/internal/jsonrpc2.(*Conn).Run.func1(0xc00296ac00, 0xc0037d43c0, 0xc000273590, 0xe382e0, 0xc0013055c0, 0x0, 0x0, 0xc003540270)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/jsonrpc2/jsonrpc2.go:371 +0x160
===== stderr =====
created by golang.org/x/tools/internal/jsonrpc2.(*Conn).Run
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/jsonrpc2/jsonrpc2.go:355 +0x850
===== sent =====
Content-Length: 372
{"method": "textDocument/didChange", "jsonrpc": "2.0", "params": {"contentChanges": [{"text": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/minight/vimtest/pkg/bar\"\n)\n\nfunc main() {\n\tfmt.Println(\"vim-go\")\n\tbars := bar.GetBars()\n\tfor _, b := range bars {\n\t\t_ = b.Baz\n\t}\n}\n"}], "textDocument": {"uri": "file:///tmp/vimtest/test.go", "version": 4}}}
===== sent =====
Content-Length: 174
{"method": "textDocument/definition", "jsonrpc": "2.0", "id": 5, "params": {"textDocument": {"uri": "file:///tmp/vimtest/test.go"}, "position": {"character": 7, "line": 11}}}
===== sent =====
Content-Length: 372
{"method": "textDocument/didChange", "jsonrpc": "2.0", "params": {"contentChanges": [{"text": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/minight/vimtest/pkg/bar\"\n)\n\nfunc main() {\n\tfmt.Println(\"vim-go\")\n\tbars := bar.GetBars()\n\tfor _, b := range bars {\n\t\t_ = b.Baz\n\t}\n}\n"}], "textDocument": {"uri": "file:///tmp/vimtest/test.go", "version": 5}}}
Does the test.go file exist on disk when you open it?
My guess is that this might be an issue with vim-go, which is causing gopls to get into an invalid state. We should still never call that function with an invalid package, so I will make sure to get that fix in. One thing I noticed from your log is that vim-go sends 4 identical textDocument/didChange requests (the only difference is the version numbers), which might be something that @bhcleek wants to take a look at. You can confirm that this isn't a gopls issue by running gopls -rpc.trace -v query definition ./test.go:13:15.
Does the test.go file exist on disk when you open it?
the entire directory tree exists on disk.
My guess is that this might be an issue with vim-go, which is causing gopls to get into an invalid state
I've filed fatih/vim-go#2787 with the full config.vim used to repro and a gif.
You can confirm that this isn't a gopls issue by running gopls -rpc.trace -v query definition ./test.go:13:15.
I can confirm gopls doesn't crash when running
$ gopls -rpc.trace -v query definition ./test.go:12:16
2020/03/27 12:46:52 Info:2020/03/27 12:46:52 Build info
----------
golang.org/x/tools/gopls master
golang.org/x/tools/gopls@v0.1.8-0.20200326210457-5d86d385bf88 h1:VHwe8L5z49UodPQ00s8OuYq5xk8LjagpydtFF7m+JCo=
github.com/BurntSushi/toml@v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/sergi/go-diff@v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
golang.org/x/mod@v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
golang.org/x/sync@v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=
golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88 h1:F7fM2kxXfuWw820fa+MMCCLH6hmYe+jtLnZpwoiLK4Q=
golang.org/x/xerrors@v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
honnef.co/go/tools@v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
mvdan.cc/xurls/v2@v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=
Go info
-------
go version go1.14 linux/amd64
2020/03/27 12:46:52 Info:2020/03/27 12:46:52 go env for /tmp/vimtest
(valid build configuration = true)
(build flags: [-modfile=/tmp/go.vimtest.345813191.mod])
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/sean/.cache/go-build"
GOENV="/home/sean/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/sean/.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"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/tmp/vimtest/go.mod"
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-build533600123=/tmp/go-build -gno-record-gcc-switches"
2020/03/27 12:46:53 Info:2020/03/27 12:46:53 go/packages.Load
snapshot=0
directory="/tmp/vimtest"
query=["./..." "builtin"]
packages=4
/tmp/vimtest/pkg/bar/pb/bar.pb.go:36:2-5: defined here as field Baz int64%
oh for reference, I'm also using neovim instead of vim
NVIM v0.3.8
Build type: Release
LuaJIT 2.1.0-beta3
More reliably, I am able to trigger the bug upon opening vim with
vim -u config.vim "+12 normal $" test.go
<press b to navigate to the beginning of the word 'Baz'>
===== sent =====
Content-Length: 456
{"method": "initialize", "jsonrpc": "2.0", "id": 1, "params": {"rootUri": "file:///tmp/vimtest", "capabilities": {"workspace": {"workspaceFolders": true, "configuration": true, "didChangeConfiguration": {"dynamicRegistration": true}}, "textDocument": {"completion": {"completionItem": {"snippetSupport": false}}, "hover": {"contentFormat": ["plaintext"]}}}, "processId": 24504, "workspaceFolders": [{"uri": "file:///tmp/vimtest", "name": "/tmp/vimtest"}]}}
===== stderr =====
2020/03/27 13:01:21 debug server listening on port 35559
===== received =====
Content-Length: 881
{"jsonrpc":"2.0","result":{"capabilities":{"textDocumentSync":{"openClose":true,"change":2,"save":{}},"completionProvider":{"triggerCharacters":["."]},"hoverProvider":true,"signatureHelpProvider":{"triggerCharacters":["(",","]},"definitionProvider":true,"typeDefinitionProvider":true,"implementationProvider":true,"referencesProvider":true,"documentHighlightProvider":true,"documentSymbolProvider":true,"codeActionProvider":true,"codeLensProvider":{},"documentLinkProvider":{},"workspaceSymbolProvider":true,"documentFormattingProvider":true,"documentOnTypeFormattingProvider":{"firstTriggerCharacter":""},"renameProvider":true,"foldingRangeProvider":true,"executeCommandProvider":{"commands":["tidy","upgrade.dependency","generate"]},"workspace":{"workspaceFolders":{"supported":true,"changeNotifications":"workspace/didChangeWorkspaceFolders"}}},"serverInfo":{"name":""}},"id":1}
===== sent =====
Content-Length: 57
{"method": "initialized", "jsonrpc": "2.0", "params": {}}
===== sent =====
Content-Length: 368
{"method": "textDocument/didOpen", "jsonrpc": "2.0", "params": {"textDocument": {"uri": "file:///tmp/vimtest/test.go", "version": 1, "languageId": "go", "text": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/minight/vimtest/pkg/bar\"\n)\n\nfunc main() {\n\tfmt.Println(\"vim-go\")\n\tbars := bar.GetBars()\n\tfor _, b := range bars {\n\t\t_ = b.Baz\n\t}\n}\n"}}}
===== received =====
Content-Length: 268
{"jsonrpc":"2.0","method":"client/registerCapability","params":{"registrations":[{"id":"workspace/didChangeConfiguration","method":"workspace/didChangeConfiguration"},{"id":"workspace/didChangeWorkspaceFolders","method":"workspace/didChangeWorkspaceFolders"}]},"id":1}
===== sent =====
Content-Length: 43
{"id": 1, "jsonrpc": "2.0", "result": null}
===== received =====
Content-Length: 199
{"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"scopeUri":"file:///tmp/vimtest","section":"gopls"},{"scopeUri":"file:///tmp/vimtest","section":"gopls-/tmp/vimtest"}]},"id":2}
===== sent =====
Content-Length: 143
{"id": 2, "jsonrpc": "2.0", "result": [{"buildFlags": [], "hoverKind": "NoDocumentation"}, {"buildFlags": [], "hoverKind": "NoDocumentation"}]}
===== received =====
Content-Length: 1061
{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":3,"message":"2020/03/27 13:01:21 Build info\n----------\ngolang.org/x/tools/gopls master\n golang.org/x/tools/gopls@v0.1.8-0.20200326210457-5d86d385bf88 h1:VHwe8L5z49UodPQ00s8OuYq5xk8LjagpydtFF7m+JCo=\n github.com/BurntSushi/toml@v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\n github.com/sergi/go-diff@v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=\n golang.org/x/mod@v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=\n golang.org/x/sync@v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=\n golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88 h1:F7fM2kxXfuWw820fa+MMCCLH6hmYe+jtLnZpwoiLK4Q=\n golang.org/x/xerrors@v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=\n honnef.co/go/tools@v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=\n mvdan.cc/xurls/v2@v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=\n\nGo info\n-------\ngo version go1.14 linux/amd64\n\n"}}
===== received =====
Content-Length: 1062
{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":3,"message":"2020/03/27 13:01:21 go env for /tmp/vimtest\n(valid build configuration = true)\n(build flags: [-modfile=/tmp/go.vimtest.647729188.mod])\nGO111MODULE=\"\"\nGOARCH=\"amd64\"\nGOBIN=\"\"\nGOCACHE=\"/home/sean/.cache/go-build\"\nGOENV=\"/home/sean/.config/go/env\"\nGOEXE=\"\"\nGOFLAGS=\"\"\nGOHOSTARCH=\"amd64\"\nGOHOSTOS=\"linux\"\nGOINSECURE=\"\"\nGONOPROXY=\"\"\nGONOSUMDB=\"\"\nGOOS=\"linux\"\nGOPATH=\"/home/sean/.go\"\nGOPRIVATE=\"\"\nGOPROXY=\"https://proxy.golang.org,direct\"\nGOROOT=\"/usr/local/go\"\nGOSUMDB=\"sum.golang.org\"\nGOTMPDIR=\"\"\nGOTOOLDIR=\"/usr/local/go/pkg/tool/linux_amd64\"\nGCCGO=\"gccgo\"\nAR=\"ar\"\nCC=\"gcc\"\nCXX=\"g++\"\nCGO_ENABLED=\"1\"\nGOMOD=\"/tmp/vimtest/go.mod\"\nCGO_CFLAGS=\"-g -O2\"\nCGO_CPPFLAGS=\"\"\nCGO_CXXFLAGS=\"-g -O2\"\nCGO_FFLAGS=\"-g -O2\"\nCGO_LDFLAGS=\"-g -O2\"\nPKG_CONFIG=\"pkg-config\"\nGOGCCFLAGS=\"-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build569866965=/tmp/go-build -gno-record-gcc-switches\"\n"}}
===== received =====
Content-Length: 206
{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":3,"message":"2020/03/27 13:01:21 go/packages.Load\n\tsnapshot=0\n\tdirectory=\"/tmp/vimtest\"\n\tquery=[\"./...\" \"builtin\"]\n\tpackages=4"}}
===== received =====
Content-Length: 673
{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/vimtest/pkg/bar/pb/bar.pb.go","diagnostics":[{"range":{"start":{"line":7,"character":3},"end":{"line":7,"character":39}},"severity":2,"source":"go mod tidy","message":"github.com/gogo/protobuf is not in your go.mod file."},{"range":{"start":{"line":8,"character":7},"end":{"line":8,"character":39}},"severity":2,"source":"go mod tidy","message":"github.com/gogo/protobuf is not in your go.mod file."},{"range":{"start":{"line":10,"character":32},"end":{"line":10,"character":64}},"severity":2,"source":"go mod tidy","message":"github.com/gogo/protobuf is not in your go.mod file."}]}}
===== sent =====
Content-Length: 372
{"method": "textDocument/didChange", "jsonrpc": "2.0", "params": {"contentChanges": [{"text": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/minight/vimtest/pkg/bar\"\n)\n\nfunc main() {\n\tfmt.Println(\"vim-go\")\n\tbars := bar.GetBars()\n\tfor _, b := range bars {\n\t\t_ = b.Baz\n\t}\n}\n"}], "textDocument": {"uri": "file:///tmp/vimtest/test.go", "version": 2}}}
===== sent =====
Content-Length: 174
{"method": "textDocument/definition", "jsonrpc": "2.0", "id": 2, "params": {"textDocument": {"uri": "file:///tmp/vimtest/test.go"}, "position": {"character": 8, "line": 11}}}
===== sent =====
Content-Length: 372
{"method": "textDocument/didChange", "jsonrpc": "2.0", "params": {"contentChanges": [{"text": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/minight/vimtest/pkg/bar\"\n)\n\nfunc main() {\n\tfmt.Println(\"vim-go\")\n\tbars := bar.GetBars()\n\tfor _, b := range bars {\n\t\t_ = b.Baz\n\t}\n}\n"}], "textDocument": {"uri": "file:///tmp/vimtest/test.go", "version": 3}}}
===== sent =====
Content-Length: 215
{"method": "textDocument/references", "jsonrpc": "2.0", "id": 3, "params": {"context": {"includeDeclaration": true}, "textDocument": {"uri": "file:///tmp/vimtest/test.go"}, "position": {"character": 8, "line": 11}}}
===== received =====
Content-Length: 162
{"jsonrpc":"2.0","result":[{"uri":"file:///tmp/vimtest/pkg/bar/pb/bar.pb.go","range":{"start":{"line":35,"character":1},"end":{"line":35,"character":4}}}],"id":2}
===== sent =====
Content-Length: 182
{"method": "textDocument/hover", "jsonrpc": "2.0", "id": 4, "params": {"textDocument": {"uri": "file:///tmp/vimtest/pkg/bar/pb/bar.pb.go"}, "position": {"character": 1, "line": 35}}}
===== received =====
Content-Length: 121
{"jsonrpc":"2.0","error":{"code":-32603,"message":"method \"textDocument/references\" did not reply","data":null},"id":3}
===== stderr =====
panic: runtime error: invalid memory address or nil pointer dereference
===== stderr =====
[signal SIGSEGV: segmentation violation code=0x1 addr=0x60 pc=0x7d4518]
===== stderr =====
===== stderr =====
goroutine 2339 [running]:
===== stderr =====
golang.org/x/tools/internal/lsp/source.FindFileInPackage(0x0, 0x0, 0xc003b33380, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:715 +0x108
===== stderr =====
golang.org/x/tools/internal/lsp/source.findMapperInPackage(0xe49ce0, 0xc000394000, 0x0, 0x0, 0xc003b33380, 0x28, 0x24, 0x2, 0xc003939320)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:687 +0x15e
===== stderr =====
golang.org/x/tools/internal/lsp/source.posToMappedRange(0xe49ce0, 0xc000394000, 0x0, 0x0, 0x25de1d, 0x25de20, 0x0, 0x0, 0x0, 0x0, ...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:205 +0x15b
===== stderr =====
golang.org/x/tools/internal/lsp/source.nameToMappedRange(...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:200
===== stderr =====
golang.org/x/tools/internal/lsp/source.objToMappedRange(0xe49ce0, 0xc000394000, 0x0, 0x0, 0xe4a280, 0xc002f51e00, 0x0, 0x0, 0x0, 0x0, ...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/util.go:196 +0x11a
===== stderr =====
golang.org/x/tools/internal/lsp/source.References(0xe382e0, 0xc0037f4960, 0xe49c40, 0xc0002a0000, 0xe36b60, 0xc002e1d380, 0x4026000000000000, 0x4020000000000000, 0xc0006a7b01, 0x0, ...)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/source/references.go:50 +0xe3b
===== stderr =====
golang.org/x/tools/internal/lsp.(*Server).references(0xc000319f80, 0xe382e0, 0xc003917680, 0xc0036d6b40, 0xc0036d6b40, 0x0, 0x0, 0x0, 0xc0022718c0)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/references.go:19 +0xe7
===== stderr =====
golang.org/x/tools/internal/lsp.(*Server).References(0xc000319f80, 0xe382e0, 0xc003917680, 0xc0036d6b40, 0xc0036d6b40, 0x0, 0x0, 0x0, 0x0)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/server_gen.go:144 +0x4d
===== stderr =====
golang.org/x/tools/internal/lsp/protocol.serverHandler.Deliver(0xe52160, 0xc000319f80, 0xe382e0, 0xc003917680, 0xc003579d40, 0xc000ad6f00, 0x400000)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/lsp/protocol/tsserver.go:377 +0x251f
===== stderr =====
golang.org/x/tools/internal/jsonrpc2.(*Conn).Run.func1(0xc00045dd40, 0xc003579d40, 0xc000322aa0, 0xe382e0, 0xc003917680, 0x0, 0x0, 0xc002e22ed0)
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/jsonrpc2/jsonrpc2.go:371 +0x160
===== stderr =====
created by golang.org/x/tools/internal/jsonrpc2.(*Conn).Run
===== stderr =====
/home/sean/.go/pkg/mod/golang.org/x/tools@v0.0.0-20200326210457-5d86d385bf88/internal/jsonrpc2/jsonrpc2.go:355 +0x850
Change https://golang.org/cl/225777 mentions this issue: internal/lsp: refactor references/rename/implementations
One thing I noticed from your log is that vim-go sends 4 identical textDocument/didChange requests (the only difference is the version numbers), which might be something that @bhcleek wants to take a look at.
Vim-go sends textDocument/didChange before other requests to make sure that gopls has the current version. There are a number of events that can be hooked into in Vim to know when files changes, but it's difficult to cover all the cases well.
You can confirm that this isn't a gopls issue by running gopls -rpc.trace -v query definition ./test.go:13:15
I can duplicate the issue, but I don't see how this is a vim-go issue. Running gopls references test.go:12:12 causes gopls to panic:
❯❯❯ gopls -rpc.trace -v references ./test.go:12:12
2020/03/28 15:35:20 Info:2020/03/28 15:35:20 Build info
----------
golang.org/x/tools/gopls v0.3.4
golang.org/x/tools/gopls@v0.3.4 h1:4GC7q/pXQ/tsxHBGVdsMdlB4gCxVC06m/7rIXg1Px4E=
github.com/BurntSushi/toml@v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/sergi/go-diff@v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
golang.org/x/mod@v0.1.1-0.20191105210325-c90efee705ee h1:WG0RUwxtNT4qqaXX3DPA8zHFNm/D9xaBpxzHt1WcA/E=
golang.org/x/sync@v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/tools@v0.0.0-20200316194252-fafb6e2e8a4a h1:hKrQy/q8/Xivoqgw6nGiz1jqpn1WGBLDcWLZwW0983E=
golang.org/x/xerrors@v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
honnef.co/go/tools@v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
mvdan.cc/xurls/v2@v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=
Go info
-------
go version go1.14 darwin/amd64
GO111MODULE=""
GOARCH="amd64"
GOBIN="/Users/bhcleek/go/bin"
GOCACHE="/Users/bhcleek/Library/Caches/go-build"
GOENV="/Users/bhcleek/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GONOPROXY="*.internal.digitalocean.com,github.com/digitalocean"
GONOSUMDB="*.internal.digitalocean.com,github.com/digitalocean"
GOOS="darwin"
GOPATH="/Users/bhcleek/go"
GOPRIVATE="*.internal.digitalocean.com,github.com/digitalocean"
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/bhcleek/src/vim-go/issues/2787/go.mod"
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 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/f9/d6g779t53gq_20w0zm2f_1zm0000gn/T/go-build098065432=/tmp/go-build -gno-record-gcc-switches -fno-common"
2020/03/28 15:35:20 Info:2020/03/28 15:35:20 go/packages.Load
snapshot = 0
query = [./... builtin]
packages = 4
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x60 pc=0x13be46b]
goroutine 1 [running]:
golang.org/x/tools/internal/lsp/source.References(0x1a12540, 0xc0002ff7d0, 0x1a24740, 0xc000208000, 0x1a10c00, 0xc000308300, 0x4026000000000000, 0x4026000000000000, 0xc00003bd00, 0x0, ...)
/Users/bhcleek/go/pkg/mod/golang.org/x/tools@v0.0.0-20200316194252-fafb6e2e8a4a/internal/lsp/source/references.go:71 +0xb4b
golang.org/x/tools/internal/lsp.(*Server).references(0xc00034c980, 0x1a124c0, 0xc0000a2000, 0xc0000af770, 0x100ea48, 0x50, 0x1835120, 0x1, 0xc0000af770)
/Users/bhcleek/go/pkg/mod/golang.org/x/tools@v0.0.0-20200316194252-fafb6e2e8a4a/internal/lsp/references.go:19 +0xe7
golang.org/x/tools/internal/lsp.(*Server).References(0xc00034c980, 0x1a124c0, 0xc0000a2000, 0xc0000af770, 0xc, 0xffffffffffffffff, 0xc, 0xc, 0xffffffffffffffff)
/Users/bhcleek/go/pkg/mod/golang.org/x/tools@v0.0.0-20200316194252-fafb6e2e8a4a/internal/lsp/server_gen.go:148 +0x4d
golang.org/x/tools/internal/lsp/cmd.(*references).Run(0xc000305980, 0x1a124c0, 0xc0000a2000, 0xc0000ae040, 0x1, 0x1, 0x0, 0x0)
/Users/bhcleek/go/pkg/mod/golang.org/x/tools@v0.0.0-20200316194252-fafb6e2e8a4a/internal/lsp/cmd/references.go:70 +0x373
golang.org/x/tools/internal/tool.Run(0x1a124c0, 0xc0000a2000, 0x1a16600, 0xc000305980, 0xc0000ae040, 0x1, 0x1, 0x0, 0x0)
/Users/bhcleek/go/pkg/mod/golang.org/x/tools@v0.0.0-20200316194252-fafb6e2e8a4a/internal/tool/tool.go:152 +0x29d
golang.org/x/tools/internal/lsp/cmd.(*Application).Run(0xc000356120, 0x1a124c0, 0xc0000a2000, 0xc0000ae040, 0x2, 0x2, 0x0, 0x0)
/Users/bhcleek/go/pkg/mod/golang.org/x/tools@v0.0.0-20200316194252-fafb6e2e8a4a/internal/lsp/cmd/cmd.go:142 +0x2a4
golang.org/x/tools/internal/tool.Run(0x1a124c0, 0xc0000a2000, 0x1a162c0, 0xc000356120, 0xc0000ae010, 0x4, 0x4, 0x0, 0x0)
/Users/bhcleek/go/pkg/mod/golang.org/x/tools@v0.0.0-20200316194252-fafb6e2e8a4a/internal/tool/tool.go:152 +0x29d
golang.org/x/tools/internal/tool.Main(0x1a124c0, 0xc0000a2000, 0x1a162c0, 0xc000356120, 0xc0000ae010, 0x4, 0x4)
/Users/bhcleek/go/pkg/mod/golang.org/x/tools@v0.0.0-20200316194252-fafb6e2e8a4a/internal/tool/tool.go:91 +0x12f
main.main()
/Users/bhcleek/go/pkg/mod/golang.org/x/tools/gopls@v0.3.4/main.go:25 +0xdb
At current master, gopls does not panic
sean at pop-os in ~/vimtest
$ cat test.go
package main
import (
"fmt"
"github.com/minight/vimtest/pkg/bar"
)
func main() {
fmt.Println("vim-go")
bars := bar.GetBars()
for _, b := range bars {
_ = b.Baz
}
}
sean at pop-os in ~/vimtest
$ md5sum test.go
1b6b8c7b050c847d540c47f2077abb29 test.go
sean at pop-os in ~/vimtest
$ gopls version
golang.org/x/tools/gopls master
golang.org/x/tools/gopls@v0.1.8-0.20200331025713-a30bf2db82d4 h1:5Ve4Z+UFE8eEmEgLnk6KGM7oelFrC+NOCWtAAZ3G+7I=
sean at pop-os in ~/vimtest
$ gopls -rpc.trace -v references ./test.go:12:12
2020/03/31 16:16:19 Info:2020/03/31 16:16:19 Build info
----------
golang.org/x/tools/gopls master
golang.org/x/tools/gopls@v0.1.8-0.20200331025713-a30bf2db82d4 h1:5Ve4Z+UFE8eEmEgLnk6KGM7oelFrC+NOCWtAAZ3G+7I=
github.com/BurntSushi/toml@v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/sergi/go-diff@v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
golang.org/x/mod@v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
golang.org/x/sync@v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=
golang.org/x/tools@v0.0.0-20200331025713-a30bf2db82d4 h1:kDtqNkeBrZb8B+atrj50B5XLHpzXXqcCdZPP/ApQ5NY=
golang.org/x/xerrors@v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
honnef.co/go/tools@v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
mvdan.cc/xurls/v2@v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=
Go info
-------
go version go1.14 linux/amd64
message="Build info\n----------\ngolang.org/x/tools/gopls master\n golang.org/x/tools/gopls@v0.1.8-0.20200331025713-a30bf2db82d4 h1:5Ve4Z+UFE8eEmEgLnk6KGM7oelFrC+NOCWtAAZ3G+7I=\n github.com/BurntSushi/toml@v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\n github.com/sergi/go-diff@v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=\n golang.org/x/mod@v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=\n golang.org/x/sync@v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=\n golang.org/x/tools@v0.0.0-20200331025713-a30bf2db82d4 h1:kDtqNkeBrZb8B+atrj50B5XLHpzXXqcCdZPP/ApQ5NY=\n golang.org/x/xerrors@v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=\n honnef.co/go/tools@v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=\n mvdan.cc/xurls/v2@v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=\n\nGo info\n-------\ngo version go1.14 linux/amd64\n\n"
2020/03/31 16:16:19 Info:2020/03/31 16:16:19 go env for /home/sean/vimtest
(valid build configuration = true)
(build flags: [-modfile=/tmp/go.vimtest.766439690.mod])
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/sean/.cache/go-build"
GOENV="/home/sean/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GONOPROXY="github.com/assetnote"
GONOSUMDB="github.com/assetnote"
GOOS="linux"
GOPATH="/home/sean/.go"
GOPRIVATE="github.com/assetnote"
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/sean/vimtest/go.mod"
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-build869507472=/tmp/go-build -gno-record-gcc-switches"
message="go env for /home/sean/vimtest\n(valid build configuration = true)\n(build flags: [-modfile=/tmp/go.vimtest.766439690.mod])\nGO111MODULE=\"\"\nGOARCH=\"amd64\"\nGOBIN=\"\"\nGOCACHE=\"/home/sean/.cache/go-build\"\nGOENV=\"/home/sean/.config/go/env\"\nGOEXE=\"\"\nGOFLAGS=\"\"\nGOHOSTARCH=\"amd64\"\nGOHOSTOS=\"linux\"\nGOINSECURE=\"\"\nGONOPROXY=\"github.com/assetnote\"\nGONOSUMDB=\"github.com/assetnote\"\nGOOS=\"linux\"\nGOPATH=\"/home/sean/.go\"\nGOPRIVATE=\"github.com/assetnote\"\nGOPROXY=\"https://proxy.golang.org,direct\"\nGOROOT=\"/usr/local/go\"\nGOSUMDB=\"sum.golang.org\"\nGOTMPDIR=\"\"\nGOTOOLDIR=\"/usr/local/go/pkg/tool/linux_amd64\"\nGCCGO=\"gccgo\"\nAR=\"ar\"\nCC=\"gcc\"\nCXX=\"g++\"\nCGO_ENABLED=\"1\"\nGOMOD=\"/home/sean/vimtest/go.mod\"\nCGO_CFLAGS=\"-g -O2\"\nCGO_CPPFLAGS=\"\"\nCGO_CXXFLAGS=\"-g -O2\"\nCGO_FFLAGS=\"-g -O2\"\nCGO_LDFLAGS=\"-g -O2\"\nPKG_CONFIG=\"pkg-config\"\nGOGCCFLAGS=\"-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build869507472=/tmp/go-build -gno-record-gcc-switches\"\n"
2020/03/31 16:16:23 Info:2020/03/31 16:16:23 go/packages.Load
message="go/packages.Load"
snapshot=0
directory="/home/sean/vimtest"
query=["./..." "builtin"]
packages=4
2020/03/31 16:16:23 : no package for obj field Baz int64: package pb ("github.com/minight/vimtest/pkg/bar/pb")
message=""
error="no package for obj field Baz int64: package pb (\"github.com/minight/vimtest/pkg/bar/pb\")"
gopls: no object found
Change https://golang.org/cl/227030 mentions this issue: internal/lsp: fix references for transitive dependencies
Thanks for bearing with me! I've figured out the cause of this issue, and it should be fixed by the CL linked above.
Not sure why gopherbot didn't close this.
