385: Implement DocumentHighlight r=matklad a=DJMcNab

Fixes #80.

Co-authored-by: DJMcNab <36049421+djmcnab@users.noreply.github.com>
This commit is contained in:
bors[bot] 2018-12-31 12:37:05 +00:00
commit 2746dacac0
3 changed files with 25 additions and 4 deletions

View file

@ -28,7 +28,7 @@ pub fn server_capabilities() -> ServerCapabilities {
type_definition_provider: None,
implementation_provider: None,
references_provider: Some(true),
document_highlight_provider: None,
document_highlight_provider: Some(true),
document_symbol_provider: Some(true),
workspace_symbol_provider: Some(true),
code_action_provider: Some(CodeActionProviderCapability::Simple(true)),

View file

@ -300,6 +300,7 @@ fn on_request(
.on::<req::Rename>(handlers::handle_rename)?
.on::<req::References>(handlers::handle_references)?
.on::<req::Formatting>(handlers::handle_formatting)?
.on::<req::DocumentHighlightRequest>(handlers::handle_document_highlight)?
.finish();
match req {
Ok(id) => {

View file

@ -6,9 +6,8 @@ use languageserver_types::{
DiagnosticSeverity, DocumentSymbol, Documentation, FoldingRange, FoldingRangeKind,
FoldingRangeParams, Location, MarkupContent, MarkupKind, MarkedString, Position,
PrepareRenameResponse, RenameParams, SymbolInformation, TextDocumentIdentifier, TextEdit,
Range,
WorkspaceEdit, ParameterInformation, ParameterLabel, SignatureInformation, Hover, HoverContents,
DocumentFormattingParams,
Range, WorkspaceEdit, ParameterInformation, ParameterLabel, SignatureInformation, Hover,
HoverContents, DocumentFormattingParams, DocumentHighlight,
};
use ra_analysis::{FileId, FoldKind, Query, RunnableKind, FileRange, FilePosition, Severity};
use ra_syntax::{TextUnit, text_utils::intersect};
@ -668,6 +667,27 @@ pub fn handle_code_action(
Ok(Some(CodeActionResponse::Commands(res)))
}
pub fn handle_document_highlight(
world: ServerWorld,
params: req::TextDocumentPositionParams,
) -> Result<Option<Vec<DocumentHighlight>>> {
let file_id = params.text_document.try_conv_with(&world)?;
let line_index = world.analysis().file_line_index(file_id);
let refs = world
.analysis()
.find_all_refs(params.try_conv_with(&world)?)?;
Ok(Some(
refs.into_iter()
.map(|r| DocumentHighlight {
range: r.1.conv_with(&line_index),
kind: None,
})
.collect(),
))
}
pub fn publish_diagnostics(
world: &ServerWorld,
file_id: FileId,