aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/call_info.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src/call_info.rs')
-rw-r--r--crates/ra_ide_api/src/call_info.rs32
1 files changed, 31 insertions, 1 deletions
diff --git a/crates/ra_ide_api/src/call_info.rs b/crates/ra_ide_api/src/call_info.rs
index 29ae2f552..e6bdaae6a 100644
--- a/crates/ra_ide_api/src/call_info.rs
+++ b/crates/ra_ide_api/src/call_info.rs
@@ -29,7 +29,7 @@ pub(crate) fn call_info(db: &RootDatabase, position: FilePosition) -> Option<Cal
29 (CallInfo::with_fn(db, it), it.data(db).has_self_param()) 29 (CallInfo::with_fn(db, it), it.data(db).has_self_param())
30 } 30 }
31 hir::CallableDef::Struct(it) => (CallInfo::with_struct(db, it), false), 31 hir::CallableDef::Struct(it) => (CallInfo::with_struct(db, it), false),
32 hir::CallableDef::EnumVariant(_it) => return None, 32 hir::CallableDef::EnumVariant(it) => (CallInfo::with_enum_variant(db, it), false),
33 } 33 }
34 } 34 }
35 FnCallNode::MethodCallExpr(expr) => { 35 FnCallNode::MethodCallExpr(expr) => {
@@ -129,6 +129,12 @@ impl CallInfo {
129 CallInfo { signature, active_parameter: None } 129 CallInfo { signature, active_parameter: None }
130 } 130 }
131 131
132 fn with_enum_variant(db: &RootDatabase, variant: hir::EnumVariant) -> Self {
133 let signature = FunctionSignature::from_enum_variant(db, variant);
134
135 CallInfo { signature, active_parameter: None }
136 }
137
132 fn parameters(&self) -> &[String] { 138 fn parameters(&self) -> &[String] {
133 &self.signature.parameters 139 &self.signature.parameters
134 } 140 }
@@ -485,4 +491,28 @@ fn main() {
485 assert_eq!(info.doc().map(|it| it.into()), Some("A cool tuple struct".to_string())); 491 assert_eq!(info.doc().map(|it| it.into()), Some("A cool tuple struct".to_string()));
486 assert_eq!(info.active_parameter, Some(1)); 492 assert_eq!(info.active_parameter, Some(1));
487 } 493 }
494
495 #[test]
496 fn works_for_enum_variants() {
497 let info = call_info(
498 r#"
499enum E {
500 /// A Variant
501 A(i32),
502 /// Another
503 B,
504 /// And C
505 C(a: i32, b: i32)
506}
507
508fn main() {
509 let a = E::A(<|>);
510}
511 "#,
512 );
513
514 assert_eq!(info.label(), "E::A(0: i32)");
515 assert_eq!(info.doc().map(|it| it.into()), Some("A Variant".to_string()));
516 assert_eq!(info.active_parameter, Some(0));
517 }
488} 518}