diff options
Diffstat (limited to 'crates/ra_ide_api/src/call_info.rs')
-rw-r--r-- | crates/ra_ide_api/src/call_info.rs | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/crates/ra_ide_api/src/call_info.rs b/crates/ra_ide_api/src/call_info.rs index 25363a1d9..d947ac50c 100644 --- a/crates/ra_ide_api/src/call_info.rs +++ b/crates/ra_ide_api/src/call_info.rs | |||
@@ -28,8 +28,8 @@ pub(crate) fn call_info(db: &RootDatabase, position: FilePosition) -> Option<Cal | |||
28 | hir::CallableDef::Function(it) => { | 28 | hir::CallableDef::Function(it) => { |
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) => (CallInfo::with_enum_variant(db, it), false), | 32 | hir::CallableDef::EnumVariant(it) => (CallInfo::with_enum_variant(db, it)?, false), |
33 | } | 33 | } |
34 | } | 34 | } |
35 | FnCallNode::MethodCallExpr(expr) => { | 35 | FnCallNode::MethodCallExpr(expr) => { |
@@ -123,16 +123,16 @@ impl CallInfo { | |||
123 | CallInfo { signature, active_parameter: None } | 123 | CallInfo { signature, active_parameter: None } |
124 | } | 124 | } |
125 | 125 | ||
126 | fn with_struct(db: &RootDatabase, st: hir::Struct) -> Self { | 126 | fn with_struct(db: &RootDatabase, st: hir::Struct) -> Option<Self> { |
127 | let signature = FunctionSignature::from_struct(db, st); | 127 | let signature = FunctionSignature::from_struct(db, st)?; |
128 | 128 | ||
129 | CallInfo { signature, active_parameter: None } | 129 | Some(CallInfo { signature, active_parameter: None }) |
130 | } | 130 | } |
131 | 131 | ||
132 | fn with_enum_variant(db: &RootDatabase, variant: hir::EnumVariant) -> Self { | 132 | fn with_enum_variant(db: &RootDatabase, variant: hir::EnumVariant) -> Option<Self> { |
133 | let signature = FunctionSignature::from_enum_variant(db, variant); | 133 | let signature = FunctionSignature::from_enum_variant(db, variant)?; |
134 | 134 | ||
135 | CallInfo { signature, active_parameter: None } | 135 | Some(CallInfo { signature, active_parameter: None }) |
136 | } | 136 | } |
137 | 137 | ||
138 | fn parameters(&self) -> &[String] { | 138 | fn parameters(&self) -> &[String] { |
@@ -477,6 +477,7 @@ fn main() { | |||
477 | assert_eq!(info.label(), "fn bar(&self, _: u32)"); | 477 | assert_eq!(info.label(), "fn bar(&self, _: u32)"); |
478 | } | 478 | } |
479 | 479 | ||
480 | #[test] | ||
480 | fn works_for_tuple_structs() { | 481 | fn works_for_tuple_structs() { |
481 | let info = call_info( | 482 | let info = call_info( |
482 | r#" | 483 | r#" |
@@ -487,12 +488,24 @@ fn main() { | |||
487 | }"#, | 488 | }"#, |
488 | ); | 489 | ); |
489 | 490 | ||
490 | assert_eq!(info.label(), "struct TS(0: u32, 1: i32) -> TS"); | 491 | assert_eq!(info.label(), "struct TS(u32, i32) -> TS"); |
491 | assert_eq!(info.doc().map(|it| it.into()), Some("A cool tuple struct".to_string())); | 492 | assert_eq!(info.doc().map(|it| it.into()), Some("A cool tuple struct".to_string())); |
492 | assert_eq!(info.active_parameter, Some(1)); | 493 | assert_eq!(info.active_parameter, Some(1)); |
493 | } | 494 | } |
494 | 495 | ||
495 | #[test] | 496 | #[test] |
497 | #[should_panic] | ||
498 | fn cant_call_named_structs() { | ||
499 | let _ = call_info( | ||
500 | r#" | ||
501 | struct TS { x: u32, y: i32 } | ||
502 | fn main() { | ||
503 | let s = TS(<|>); | ||
504 | }"#, | ||
505 | ); | ||
506 | } | ||
507 | |||
508 | #[test] | ||
496 | fn works_for_enum_variants() { | 509 | fn works_for_enum_variants() { |
497 | let info = call_info( | 510 | let info = call_info( |
498 | r#" | 511 | r#" |
@@ -515,4 +528,25 @@ fn main() { | |||
515 | assert_eq!(info.doc().map(|it| it.into()), Some("A Variant".to_string())); | 528 | assert_eq!(info.doc().map(|it| it.into()), Some("A Variant".to_string())); |
516 | assert_eq!(info.active_parameter, Some(0)); | 529 | assert_eq!(info.active_parameter, Some(0)); |
517 | } | 530 | } |
531 | |||
532 | #[test] | ||
533 | #[should_panic] | ||
534 | fn cant_call_enum_records() { | ||
535 | let _ = call_info( | ||
536 | r#" | ||
537 | enum E { | ||
538 | /// A Variant | ||
539 | A(i32), | ||
540 | /// Another | ||
541 | B, | ||
542 | /// And C | ||
543 | C { a: i32, b: i32 } | ||
544 | } | ||
545 | |||
546 | fn main() { | ||
547 | let a = E::C(<|>); | ||
548 | } | ||
549 | "#, | ||
550 | ); | ||
551 | } | ||
518 | } | 552 | } |