aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/hover.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src/hover.rs')
-rw-r--r--crates/ra_ide_api/src/hover.rs21
1 files changed, 14 insertions, 7 deletions
diff --git a/crates/ra_ide_api/src/hover.rs b/crates/ra_ide_api/src/hover.rs
index 397b56786..6545a2581 100644
--- a/crates/ra_ide_api/src/hover.rs
+++ b/crates/ra_ide_api/src/hover.rs
@@ -1,7 +1,7 @@
1use ra_db::SourceDatabase; 1use ra_db::SourceDatabase;
2use ra_syntax::{ 2use ra_syntax::{
3 AstNode, ast, 3 AstNode, ast,
4 algo::{find_covering_element, find_node_at_offset, find_token_at_offset}, 4 algo::{find_covering_element, find_node_at_offset, ancestors_at_offset},
5}; 5};
6use hir::HirDisplay; 6use hir::HirDisplay;
7 7
@@ -104,12 +104,8 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option<RangeIn
104 } 104 }
105 105
106 if range.is_none() { 106 if range.is_none() {
107 let node = find_token_at_offset(file.syntax(), position.offset).find_map(|token| { 107 let node = ancestors_at_offset(file.syntax(), position.offset)
108 token 108 .find(|n| ast::Expr::cast(*n).is_some() || ast::Pat::cast(*n).is_some())?;
109 .parent()
110 .ancestors()
111 .find(|n| ast::Expr::cast(*n).is_some() || ast::Pat::cast(*n).is_some())
112 })?;
113 let frange = FileRange { file_id: position.file_id, range: node.range() }; 109 let frange = FileRange { file_id: position.file_id, range: node.range() };
114 res.extend(type_of(db, frange).map(rust_code_markup)); 110 res.extend(type_of(db, frange).map(rust_code_markup));
115 range = Some(node.range()); 111 range = Some(node.range());
@@ -398,6 +394,17 @@ The Some variant
398 } 394 }
399 395
400 #[test] 396 #[test]
397 fn hover_local_var_edge() {
398 let (analysis, position) = single_file_with_position(
399 "
400fn func(foo: i32) { if true { <|>foo; }; }
401",
402 );
403 let hover = analysis.hover(position).unwrap().unwrap();
404 assert_eq!(trim_markup_opt(hover.info.first()), Some("i32"));
405 }
406
407 #[test]
401 fn test_type_of_for_function() { 408 fn test_type_of_for_function() {
402 let (analysis, range) = single_file_with_range( 409 let (analysis, range) = single_file_with_range(
403 " 410 "