aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server/src')
-rw-r--r--crates/ra_lsp_server/src/main_loop/handlers.rs50
1 files changed, 9 insertions, 41 deletions
diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs
index 2fc4d3649..ffca3f51c 100644
--- a/crates/ra_lsp_server/src/main_loop/handlers.rs
+++ b/crates/ra_lsp_server/src/main_loop/handlers.rs
@@ -9,7 +9,7 @@ use languageserver_types::{
9 Range, WorkspaceEdit, ParameterInformation, ParameterLabel, SignatureInformation, Hover, 9 Range, WorkspaceEdit, ParameterInformation, ParameterLabel, SignatureInformation, Hover,
10 HoverContents, DocumentFormattingParams, DocumentHighlight, 10 HoverContents, DocumentFormattingParams, DocumentHighlight,
11}; 11};
12use ra_analysis::{FileId, FoldKind, Query, RunnableKind, FileRange, FilePosition, Severity, NavigationTarget}; 12use ra_analysis::{FileId, FoldKind, Query, RunnableKind, FileRange, FilePosition, Severity};
13use ra_syntax::{TextUnit, text_utils::intersect}; 13use ra_syntax::{TextUnit, text_utils::intersect};
14use ra_text_edit::text_utils::contains_offset_nonstrict; 14use ra_text_edit::text_utils::contains_offset_nonstrict;
15use rustc_hash::FxHashMap; 15use rustc_hash::FxHashMap;
@@ -509,36 +509,18 @@ pub fn handle_hover(
509 world: ServerWorld, 509 world: ServerWorld,
510 params: req::TextDocumentPositionParams, 510 params: req::TextDocumentPositionParams,
511) -> Result<Option<Hover>> { 511) -> Result<Option<Hover>> {
512 // TODO: Cut down on number of allocations
513 let position = params.try_conv_with(&world)?; 512 let position = params.try_conv_with(&world)?;
514 let line_index = world.analysis().file_line_index(position.file_id); 513 let info = match world.analysis().hover(position)? {
515 let rr = match world.analysis().approximately_resolve_symbol(position)? {
516 None => return Ok(None), 514 None => return Ok(None),
517 Some(it) => it, 515 Some(info) => info,
518 }; 516 };
519 let mut result = Vec::new(); 517 let line_index = world.analysis.file_line_index(position.file_id);
520 let file_id = params.text_document.try_conv_with(&world)?; 518 let range = info.range.conv_with(&line_index);
521 let file_range = FileRange { 519 let res = Hover {
522 file_id, 520 contents: HoverContents::Scalar(MarkedString::String(info.info)),
523 range: rr.reference_range, 521 range: Some(range),
524 }; 522 };
525 if let Some(type_name) = get_type(&world, file_range) { 523 Ok(Some(res))
526 result.push(type_name);
527 }
528 for nav in rr.resolves_to {
529 if let Some(docs) = get_doc_text(&world, nav) {
530 result.push(docs);
531 }
532 }
533
534 let range = rr.reference_range.conv_with(&line_index);
535 if result.len() > 0 {
536 return Ok(Some(Hover {
537 contents: HoverContents::Scalar(MarkedString::String(result.join("\n\n---\n"))),
538 range: Some(range),
539 }));
540 }
541 Ok(None)
542} 524}
543 525
544/// Test doc comment 526/// Test doc comment
@@ -762,17 +744,3 @@ fn to_diagnostic_severity(severity: Severity) -> DiagnosticSeverity {
762 WeakWarning => DiagnosticSeverity::Hint, 744 WeakWarning => DiagnosticSeverity::Hint,
763 } 745 }
764} 746}
765
766fn get_type(world: &ServerWorld, file_range: FileRange) -> Option<String> {
767 match world.analysis().type_of(file_range) {
768 Ok(result) => result,
769 _ => None,
770 }
771}
772
773fn get_doc_text(world: &ServerWorld, nav: NavigationTarget) -> Option<String> {
774 match world.analysis().doc_text_for(nav) {
775 Ok(result) => result,
776 _ => None,
777 }
778}