diff --git a/internal/lsp/cmd/definition_test.go b/internal/lsp/cmd/definition_test.go index 06951a50..f16948d9 100644 --- a/internal/lsp/cmd/definition_test.go +++ b/internal/lsp/cmd/definition_test.go @@ -24,7 +24,7 @@ import ( ) const ( - expectedDefinitionsCount = 25 + expectedDefinitionsCount = 26 expectedTypeDefinitionsCount = 2 ) diff --git a/internal/lsp/lsp_test.go b/internal/lsp/lsp_test.go index 22a502b3..ef87e798 100644 --- a/internal/lsp/lsp_test.go +++ b/internal/lsp/lsp_test.go @@ -40,7 +40,7 @@ func testLSP(t *testing.T, exporter packagestest.Exporter) { const expectedCompletionsCount = 64 const expectedDiagnosticsCount = 16 const expectedFormatCount = 4 - const expectedDefinitionsCount = 16 + const expectedDefinitionsCount = 17 const expectedTypeDefinitionsCount = 2 const expectedHighlightsCount = 2 const expectedSymbolsCount = 1 diff --git a/internal/lsp/source/definition.go b/internal/lsp/source/definition.go index 64da3983..2ee7592c 100644 --- a/internal/lsp/source/definition.go +++ b/internal/lsp/source/definition.go @@ -111,6 +111,10 @@ func identifier(ctx context.Context, v View, f File, pos token.Pos) (*Identifier } result.Type.Object = typeToObject(typ) if result.Type.Object != nil { + // Identifiers with the type "error" are a special case with no position. + if types.IsInterface(result.Type.Object.Type()) && result.Type.Object.Pkg() == nil && result.Type.Object.Name() == "error" { + return result, nil + } if result.Type.Range, err = objToRange(ctx, v, result.Type.Object); err != nil { return nil, err } diff --git a/internal/lsp/testdata/godef/a/a.go b/internal/lsp/testdata/godef/a/a.go index e9c96744..a927333e 100644 --- a/internal/lsp/testdata/godef/a/a.go +++ b/internal/lsp/testdata/godef/a/a.go @@ -2,10 +2,15 @@ package a +import "fmt" + type A string //@A func Stuff() { //@Stuff x := 5 Random2(x) //@godef("dom2", Random2) Random() //@godef("()", Random) + + var err error //@err + fmt.Printf("%v", err) //@godef("err", err) }