internal/lsp: use ranges instead of positions in completion items

Fixes golang/go#32078

Change-Id: If33cc6f7a914e6ef17d06a34c39dceb61cfa16d4
Reviewed-on: https://go-review.googlesource.com/c/tools/+/177657
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
Reviewed-by: Ian Cottrell <iancottrell@google.com>
This commit is contained in:
Rebecca Stambler 2019-05-16 15:57:51 -04:00
parent b9584148ef
commit 1a8f2608bd
1 changed files with 8 additions and 8 deletions

View File

@ -35,25 +35,28 @@ func (s *Server) completion(ctx context.Context, params *protocol.CompletionPara
s.session.Logger().Infof(ctx, "no completions found for %s:%v:%v: %v", uri, int(params.Position.Line), int(params.Position.Character), err) s.session.Logger().Infof(ctx, "no completions found for %s:%v:%v: %v", uri, int(params.Position.Line), int(params.Position.Character), err)
} }
// We might need to adjust the position to account for the prefix. // We might need to adjust the position to account for the prefix.
pos := params.Position prefixRng := protocol.Range{
Start: params.Position,
End: params.Position,
}
if prefix.Pos().IsValid() { if prefix.Pos().IsValid() {
spn, err := span.NewRange(view.FileSet(), prefix.Pos(), 0).Span() spn, err := span.NewRange(view.FileSet(), prefix.Pos(), 0).Span()
if err != nil { if err != nil {
s.session.Logger().Infof(ctx, "failed to get span for prefix position: %s:%v:%v: %v", uri, int(params.Position.Line), int(params.Position.Character), err) s.session.Logger().Infof(ctx, "failed to get span for prefix position: %s:%v:%v: %v", uri, int(params.Position.Line), int(params.Position.Character), err)
} }
if prefixPos, err := m.Position(spn.Start()); err == nil { if prefixPos, err := m.Position(spn.Start()); err == nil {
pos = prefixPos prefixRng.End = prefixPos
} else { } else {
s.session.Logger().Infof(ctx, "failed to convert prefix position: %s:%v:%v: %v", uri, int(params.Position.Line), int(params.Position.Character), err) s.session.Logger().Infof(ctx, "failed to convert prefix position: %s:%v:%v: %v", uri, int(params.Position.Line), int(params.Position.Character), err)
} }
} }
return &protocol.CompletionList{ return &protocol.CompletionList{
IsIncomplete: false, IsIncomplete: false,
Items: toProtocolCompletionItems(items, prefix.Content(), pos, s.insertTextFormat, s.usePlaceholders), Items: toProtocolCompletionItems(items, prefix.Content(), prefixRng, s.insertTextFormat, s.usePlaceholders),
}, nil }, nil
} }
func toProtocolCompletionItems(candidates []source.CompletionItem, prefix string, pos protocol.Position, insertTextFormat protocol.InsertTextFormat, usePlaceholders bool) []protocol.CompletionItem { func toProtocolCompletionItems(candidates []source.CompletionItem, prefix string, rng protocol.Range, insertTextFormat protocol.InsertTextFormat, usePlaceholders bool) []protocol.CompletionItem {
sort.SliceStable(candidates, func(i, j int) bool { sort.SliceStable(candidates, func(i, j int) bool {
return candidates[i].Score > candidates[j].Score return candidates[i].Score > candidates[j].Score
}) })
@ -73,10 +76,7 @@ func toProtocolCompletionItems(candidates []source.CompletionItem, prefix string
Kind: toProtocolCompletionItemKind(candidate.Kind), Kind: toProtocolCompletionItemKind(candidate.Kind),
TextEdit: &protocol.TextEdit{ TextEdit: &protocol.TextEdit{
NewText: insertText, NewText: insertText,
Range: protocol.Range{ Range: rng,
Start: pos,
End: pos,
},
}, },
InsertTextFormat: insertTextFormat, InsertTextFormat: insertTextFormat,
// This is a hack so that the client sorts completion results in the order // This is a hack so that the client sorts completion results in the order