Unnamed repository; edit this file 'description' to name the repository.
Merge #10988
10988: Fix expected type calculation in struct literal if followed by comma r=flodiebold a=flodiebold Co-authored-by: Florian Diebold <[email protected]>
bors[bot] 2021-12-12
parent 0eb6039 · parent d599f81 · commit 36a7c0e
-rw-r--r--crates/ide_completion/src/context.rs34
1 files changed, 29 insertions, 5 deletions
diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs
index e8566b80b6..d459e51161 100644
--- a/crates/ide_completion/src/context.rs
+++ b/crates/ide_completion/src/context.rs
@@ -561,11 +561,21 @@ impl<'a> CompletionContext<'a> {
})().unwrap_or((None, None))
},
ast::RecordExprField(it) => {
- cov_mark::hit!(expected_type_struct_field_with_leading_char);
- (
- it.expr().as_ref().and_then(|e| self.sema.type_of_expr(e)).map(TypeInfo::original),
- it.field_name().map(NameOrNameRef::NameRef),
- )
+ if let Some(expr) = it.expr() {
+ cov_mark::hit!(expected_type_struct_field_with_leading_char);
+ (
+ self.sema.type_of_expr(&expr).map(TypeInfo::original),
+ it.field_name().map(NameOrNameRef::NameRef),
+ )
+ } else {
+ cov_mark::hit!(expected_type_struct_field_followed_by_comma);
+ let ty = self.sema.resolve_record_field(&it)
+ .map(|(_, _, ty)| ty);
+ (
+ ty,
+ it.field_name().map(NameOrNameRef::NameRef),
+ )
+ }
},
ast::MatchExpr(it) => {
cov_mark::hit!(expected_type_match_arm_without_leading_char);
@@ -1009,6 +1019,20 @@ fn foo() {
}
#[test]
+ fn expected_type_struct_field_followed_by_comma() {
+ cov_mark::check!(expected_type_struct_field_followed_by_comma);
+ check_expected_type_and_name(
+ r#"
+struct Foo { a: u32 }
+fn foo() {
+ Foo { a: $0, };
+}
+"#,
+ expect![[r#"ty: u32, name: a"#]],
+ )
+ }
+
+ #[test]
fn expected_type_generic_struct_field() {
check_expected_type_and_name(
r#"