aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-03-07 19:03:09 +0000
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-03-07 19:03:09 +0000
commiteaa809037ff17b389da9f015349b24941cb3c06e (patch)
tree10bfff78a34a476ca62fdc56af90fd77ffe2aba7
parent4ce962f64e219a9e65f080fe98ebaba2008ae64e (diff)
parentb168104d95d112d254512090db3bc35ebf0fd5c2 (diff)
Merge #951
951: Fix EnumVariants not showing properly when hovering r=matklad a=vipentti This fixes #950 This also fixes hovering over the name of an EnumVariant. Additionally this changes the way enum variants are shown, now instead of the `Some<T>... -> Option` you just get `Some`. I'm not sure what would be the optimal display for enum variants in this case. Co-authored-by: Ville Penttinen <[email protected]>
-rw-r--r--crates/ra_ide_api/src/hover.rs60
1 files changed, 57 insertions, 3 deletions
diff --git a/crates/ra_ide_api/src/hover.rs b/crates/ra_ide_api/src/hover.rs
index f14001e84..bf08f5203 100644
--- a/crates/ra_ide_api/src/hover.rs
+++ b/crates/ra_ide_api/src/hover.rs
@@ -195,6 +195,7 @@ impl NavigationTarget {
195 .visit(doc_comments::<ast::ConstDef>) 195 .visit(doc_comments::<ast::ConstDef>)
196 .visit(doc_comments::<ast::StaticDef>) 196 .visit(doc_comments::<ast::StaticDef>)
197 .visit(doc_comments::<ast::NamedFieldDef>) 197 .visit(doc_comments::<ast::NamedFieldDef>)
198 .visit(doc_comments::<ast::EnumVariant>)
198 .accept(&node)? 199 .accept(&node)?
199 } 200 }
200 201
@@ -226,7 +227,7 @@ impl NavigationTarget {
226 let mut string = 227 let mut string =
227 node.visibility().map(|v| format!("{} ", v.syntax().text())).unwrap_or_default(); 228 node.visibility().map(|v| format!("{} ", v.syntax().text())).unwrap_or_default();
228 string.push_str(label); 229 string.push_str(label);
229 node.name()?.syntax().text().push_to(&mut string); 230 string.push_str(node.name()?.text().as_str());
230 Some(string) 231 Some(string)
231 } 232 }
232 233
@@ -240,6 +241,7 @@ impl NavigationTarget {
240 .visit(|node: &ast::ConstDef| visit_ascribed_node(node, "const ")) 241 .visit(|node: &ast::ConstDef| visit_ascribed_node(node, "const "))
241 .visit(|node: &ast::StaticDef| visit_ascribed_node(node, "static ")) 242 .visit(|node: &ast::StaticDef| visit_ascribed_node(node, "static "))
242 .visit(|node: &ast::NamedFieldDef| visit_ascribed_node(node, "")) 243 .visit(|node: &ast::NamedFieldDef| visit_ascribed_node(node, ""))
244 .visit(|node: &ast::EnumVariant| Some(node.name()?.text().to_string()))
243 .accept(&node)? 245 .accept(&node)?
244 } 246 }
245} 247}
@@ -428,8 +430,60 @@ mod tests {
428 ", 430 ",
429 ); 431 );
430 let hover = analysis.hover(position).unwrap().unwrap(); 432 let hover = analysis.hover(position).unwrap().unwrap();
431 // not the nicest way to show it currently 433 assert_eq!(trim_markup_opt(hover.info.first()), Some("Some"));
432 assert_eq!(trim_markup_opt(hover.info.first()), Some("Some<i32>(T) -> Option<T>")); 434
435 let (analysis, position) = single_file_with_position(
436 "
437 enum Option<T> { Some(T) }
438 use Option::Some;
439
440 fn main() {
441 let b<|>ar = Some(12);
442 }
443 ",
444 );
445 let hover = analysis.hover(position).unwrap().unwrap();
446 assert_eq!(trim_markup_opt(hover.info.first()), Some("Option<i32>"));
447 }
448
449 #[test]
450 fn hover_enum_variant() {
451 check_hover_result(
452 r#"
453 //- /main.rs
454 enum Option<T> {
455 /// The None variant
456 Non<|>e
457 }
458 "#,
459 &["
460None
461```
462
463The None variant
464 "
465 .trim()],
466 );
467
468 check_hover_result(
469 r#"
470 //- /main.rs
471 enum Option<T> {
472 /// The Some variant
473 Some(T)
474 }
475 fn main() {
476 let s = Option::Som<|>e(12);
477 }
478 "#,
479 &["
480Some
481```
482
483The Some variant
484 "
485 .trim()],
486 );
433 } 487 }
434 488
435 #[test] 489 #[test]