mirror of
https://github.com/golang/go
synced 2024-11-18 21:05:02 -07:00
e33b02e766
This change adds support for returning versions along with file URIs, so that the client can know when to apply changes. The version is not yet propagated along to the internal/lsp/cache package, so this change will have no effect (VS Code ignores a version of 0 and still applies the changes). A few minor changes made in the rename code (to remove the view parameter). Some minor staticcheck fixes. Updates golang/go#35243 Change-Id: Icc26bd9d9e5703c699f555424b94034c97b01d6f Reviewed-on: https://go-review.googlesource.com/c/tools/+/206882 Run-TryBot: Rebecca Stambler <rstambler@golang.org> Reviewed-by: Ian Cottrell <iancottrell@google.com>
64 lines
1.7 KiB
Go
64 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) rename(ctx context.Context, params *protocol.RenameParams) (*protocol.WorkspaceEdit, error) {
|
|
uri := span.NewURI(params.TextDocument.URI)
|
|
view := s.session.ViewOf(uri)
|
|
f, err := view.GetFile(ctx, uri)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ident, err := source.Identifier(ctx, view, f, params.Position)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
edits, err := ident.Rename(ctx, params.NewName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var docChanges []protocol.TextDocumentEdit
|
|
for uri, e := range edits {
|
|
f, err := view.GetFile(ctx, uri)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
fh := ident.Snapshot.Handle(ctx, f)
|
|
docChanges = append(docChanges, documentChanges(fh, e)...)
|
|
}
|
|
return &protocol.WorkspaceEdit{
|
|
DocumentChanges: docChanges,
|
|
}, nil
|
|
}
|
|
|
|
func (s *Server) prepareRename(ctx context.Context, params *protocol.PrepareRenameParams) (*protocol.Range, error) {
|
|
uri := span.NewURI(params.TextDocument.URI)
|
|
view := s.session.ViewOf(uri)
|
|
f, err := view.GetFile(ctx, uri)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ident, err := source.Identifier(ctx, view, f, params.Position)
|
|
if err != nil {
|
|
return nil, nil // ignore errors
|
|
}
|
|
// Do not return errors here, as it adds clutter.
|
|
// Returning a nil result means there is not a valid rename.
|
|
item, err := ident.PrepareRename(ctx)
|
|
if err != nil {
|
|
return nil, nil // ignore errors
|
|
}
|
|
// TODO(suzmue): return ident.Name as the placeholder text.
|
|
return &item.Range, nil
|
|
}
|