Skip to content

Commit 76d4494

Browse files
committed
internal/lsp: fix panic in find references on Error
Our find references don't support (error).Error, but in this case, find references actually panicked. Fixes golang/go#48400 Change-Id: I68d6ea93528dc5425f59f0e952f03081c5a7847a Reviewed-on: https://go-review.googlesource.com/c/tools/+/350132 Trust: Rebecca Stambler <[email protected]> Run-TryBot: Rebecca Stambler <[email protected]> gopls-CI: kokoro <[email protected]> Reviewed-by: Robert Findley <[email protected]> TryBot-Result: Go Bot <[email protected]>
1 parent 4ba3eff commit 76d4494

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

gopls/internal/regtest/misc/references_test.go

+39
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,42 @@ func main() {
4242
}
4343
})
4444
}
45+
46+
// This reproduces and tests golang/go#48400.
47+
func TestReferencesPanicOnError(t *testing.T) {
48+
const files = `
49+
-- go.mod --
50+
module mod.com
51+
52+
go 1.12
53+
-- main.go --
54+
package main
55+
56+
type t interface {
57+
error
58+
}
59+
60+
type s struct{}
61+
62+
func (*s) Error() string {
63+
return ""
64+
}
65+
66+
func _() {
67+
var s s
68+
_ = s.Error()
69+
}
70+
`
71+
Run(t, files, func(t *testing.T, env *Env) {
72+
env.OpenFile("main.go")
73+
file, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", `Error`))
74+
refs, err := env.Editor.References(env.Ctx, file, pos)
75+
if err == nil {
76+
t.Fatalf("expected error for references, instead got %v", refs)
77+
}
78+
wantErr := "no position for func (error).Error() string"
79+
if err.Error() != wantErr {
80+
t.Fatalf("expected error with message %s, instead got %s", wantErr, err.Error())
81+
}
82+
})
83+
}

internal/lsp/source/references.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package source
66

77
import (
88
"context"
9+
"fmt"
910
"go/ast"
1011
"go/token"
1112
"go/types"
@@ -68,7 +69,11 @@ func references(ctx context.Context, snapshot Snapshot, qos []qualifiedObject, i
6869
seen = make(map[token.Pos]bool)
6970
)
7071

71-
filename := snapshot.FileSet().Position(qos[0].obj.Pos()).Filename
72+
pos := qos[0].obj.Pos()
73+
if pos == token.NoPos {
74+
return nil, fmt.Errorf("no position for %s", qos[0].obj)
75+
}
76+
filename := snapshot.FileSet().Position(pos).Filename
7277
pgf, err := qos[0].pkg.File(span.URIFromPath(filename))
7378
if err != nil {
7479
return nil, err

0 commit comments

Comments
 (0)