Skip to content

Commit 2511e1b

Browse files
bors[bot]Veykril
andauthored
Merge #9862
9862: internal: Fill out expected type for functional update syntax completion r=Veykril a=Veykril Last part of #9839 bors r+ Co-authored-by: Lukas Wirth <[email protected]>
2 parents 6fc7689 + 73b7b34 commit 2511e1b

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

crates/ide_completion/src/context.rs

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -480,18 +480,30 @@ impl<'a> CompletionContext<'a> {
480480
})
481481
.unwrap_or((None, None))
482482
},
483-
ast::RecordExprFieldList(_it) => {
484-
cov_mark::hit!(expected_type_struct_field_without_leading_char);
483+
ast::RecordExprFieldList(it) => {
485484
// wouldn't try {} be nice...
486485
(|| {
487-
let expr_field = self.token.prev_sibling_or_token()?
488-
.into_node()
489-
.and_then(ast::RecordExprField::cast)?;
490-
let (_, _, ty) = self.sema.resolve_record_field(&expr_field)?;
491-
Some((
492-
Some(ty),
493-
expr_field.field_name().map(NameOrNameRef::NameRef),
494-
))
486+
if self.token.kind() == T![..]
487+
|| self.token.prev_token().map(|t| t.kind()) == Some(T![..])
488+
{
489+
cov_mark::hit!(expected_type_struct_func_update);
490+
let record_expr = it.syntax().parent().and_then(ast::RecordExpr::cast)?;
491+
let ty = self.sema.type_of_expr(&record_expr.into())?;
492+
Some((
493+
Some(ty.original),
494+
None
495+
))
496+
} else {
497+
cov_mark::hit!(expected_type_struct_field_without_leading_char);
498+
let expr_field = self.token.prev_sibling_or_token()?
499+
.into_node()
500+
.and_then(ast::RecordExprField::cast)?;
501+
let (_, _, ty) = self.sema.resolve_record_field(&expr_field)?;
502+
Some((
503+
Some(ty),
504+
expr_field.field_name().map(NameOrNameRef::NameRef),
505+
))
506+
}
495507
})().unwrap_or((None, None))
496508
},
497509
ast::RecordExprField(it) => {
@@ -533,6 +545,7 @@ impl<'a> CompletionContext<'a> {
533545
.unwrap_or((None, None))
534546
},
535547
ast::Stmt(_it) => (None, None),
548+
ast::Item(__) => (None, None),
536549
_ => {
537550
match node.parent() {
538551
Some(n) => {
@@ -1091,4 +1104,20 @@ impl<T> S<T> {
10911104
expect![[r#"ty: u32, name: t"#]],
10921105
);
10931106
}
1107+
1108+
#[test]
1109+
fn expected_type_functional_update() {
1110+
cov_mark::check!(expected_type_struct_func_update);
1111+
check_expected_type_and_name(
1112+
r#"
1113+
struct Foo { field: u32 }
1114+
fn foo() {
1115+
Foo {
1116+
..$0
1117+
}
1118+
}
1119+
"#,
1120+
expect![[r#"ty: Foo, name: ?"#]],
1121+
);
1122+
}
10941123
}

crates/ide_completion/src/tests/record.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ fn main() {
179179
fd ..Default::default()
180180
fd foo1 u32
181181
fd foo2 u32
182+
sn Foo {…} Foo { foo1: ${1:()}, foo2: ${2:()} }$0
182183
"#]],
183184
);
184185
}

0 commit comments

Comments
 (0)