diff options
author | Jeremy Kolb <[email protected]> | 2019-10-28 01:26:12 +0000 |
---|---|---|
committer | Jeremy Kolb <[email protected]> | 2019-10-28 12:32:22 +0000 |
commit | 49e89772f63e10ebeb3c8720bd0b0ef8244f6c4a (patch) | |
tree | 692c35449952ec6fc3a92fb0f7fbece9ba3f5ec9 /crates/ra_ide_api/src/call_info.rs | |
parent | 55d4b06a53246c144be900877e6ac03237d6f8b4 (diff) |
Preliminary enum variant support
Diffstat (limited to 'crates/ra_ide_api/src/call_info.rs')
-rw-r--r-- | crates/ra_ide_api/src/call_info.rs | 32 |
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#" | ||
499 | enum E { | ||
500 | /// A Variant | ||
501 | A(i32), | ||
502 | /// Another | ||
503 | B, | ||
504 | /// And C | ||
505 | C(a: i32, b: i32) | ||
506 | } | ||
507 | |||
508 | fn 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 | } |