mirror of
https://github.com/golang/go
synced 2024-11-18 23:44:43 -07:00
918115ff85
This is the start of a significant refactoring to implementations, references, and rename (i.e. everything that searches across packages). The main goal of the refactoring is to push the package variant logic from internal/lsp into internal/source so that all users of source benefit, not just internal/lsp. It also makes it easier to write tests for various cases because the source tests invoke the source package directly (so previously did not include all the package variants). Currently source.Identifer() handles lots of disparate use cases. Things like definition and hover don't care about package variants but do care about other random bits of info that may not apply to implementations or references. So, I'm splitting implementations out from source.Identifier. As I work through references and rename hopefully things will end up separated into smaller chunks. I also improved implementation deduping to happen earlier. I thought I could dedupe using obj.Pos(), but mirror objects in package variants have different positions (suggesting they aren't reusing the same *ast.File). Instead I used token.Position to dedupe. Change-Id: I81c2b3ec33bf12640accb852be9ecdea4aa24d69 Reviewed-on: https://go-review.googlesource.com/c/tools/+/211718 Run-TryBot: Muir Manders <muir@mnd.rs> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
31 lines
794 B
Go
31 lines
794 B
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) implementation(ctx context.Context, params *protocol.ImplementationParams) ([]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(ctx, uri)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if fh.Identity().Kind != source.Go {
|
|
return nil, nil
|
|
}
|
|
return source.Implementation(ctx, snapshot, fh, params.Position)
|
|
}
|