mirror of
https://github.com/golang/go
synced 2024-11-18 21:05:02 -07:00
ab391d50b5
source.Identifier previously was used for references and rename, so it needed to take a package policy. Now, it's only used for definition and hover, so it should always be the narrowest package handle. We can use this fact to determine if the identifier is located in its declaring package, and if that package is a test variant, we don't link to the documentation on pkg.go.dev, since it doesn't exist. Change-Id: I5686828858a3feafb8ff2e4c5964b562f66db9fa Reviewed-on: https://go-review.googlesource.com/c/tools/+/217137 Run-TryBot: Rebecca Stambler <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Heschi Kreinick <heschi@google.com>
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package lsp
|
|
|
|
import (
|
|
"context"
|
|
|
|
"golang.org/x/tools/internal/lsp/protocol"
|
|
"golang.org/x/tools/internal/lsp/source"
|
|
"golang.org/x/tools/internal/span"
|
|
)
|
|
|
|
func (s *Server) definition(ctx context.Context, params *protocol.DefinitionParams) ([]protocol.Location, error) {
|
|
uri := span.NewURI(params.TextDocument.URI)
|
|
view, err := s.session.ViewOf(uri)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
snapshot := view.Snapshot()
|
|
fh, err := snapshot.GetFile(uri)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if fh.Identity().Kind != source.Go {
|
|
return nil, nil
|
|
}
|
|
ident, err := source.Identifier(ctx, snapshot, fh, params.Position)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
decRange, err := ident.Declaration.Range()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return []protocol.Location{
|
|
{
|
|
URI: protocol.NewURI(ident.Declaration.URI()),
|
|
Range: decRange,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (s *Server) typeDefinition(ctx context.Context, params *protocol.TypeDefinitionParams) ([]protocol.Location, error) {
|
|
uri := span.NewURI(params.TextDocument.URI)
|
|
view, err := s.session.ViewOf(uri)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
snapshot := view.Snapshot()
|
|
fh, err := snapshot.GetFile(uri)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if fh.Identity().Kind != source.Go {
|
|
return nil, nil
|
|
}
|
|
ident, err := source.Identifier(ctx, snapshot, fh, params.Position)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
identRange, err := ident.Type.Range()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return []protocol.Location{
|
|
{
|
|
URI: protocol.NewURI(ident.Type.URI()),
|
|
Range: identRange,
|
|
},
|
|
}, nil
|
|
}
|