mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-14 14:13:58 +00:00
infer: update resolver when descending into block
This commit is contained in:
parent
82a1b91f20
commit
e837df8479
2 changed files with 39 additions and 16 deletions
|
@ -137,7 +137,9 @@ impl<'a> InferenceContext<'a> {
|
||||||
|
|
||||||
self.coerce_merge_branch(&then_ty, &else_ty)
|
self.coerce_merge_branch(&then_ty, &else_ty)
|
||||||
}
|
}
|
||||||
Expr::Block { statements, tail, label, id: _ } => match label {
|
Expr::Block { statements, tail, label, id: _ } => {
|
||||||
|
self.resolver = resolver_for_expr(self.db.upcast(), self.owner, tgt_expr);
|
||||||
|
match label {
|
||||||
Some(_) => {
|
Some(_) => {
|
||||||
let break_ty = self.table.new_type_var();
|
let break_ty = self.table.new_type_var();
|
||||||
self.breakables.push(BreakableContext {
|
self.breakables.push(BreakableContext {
|
||||||
|
@ -145,7 +147,8 @@ impl<'a> InferenceContext<'a> {
|
||||||
break_ty: break_ty.clone(),
|
break_ty: break_ty.clone(),
|
||||||
label: label.map(|label| self.body[label].name.clone()),
|
label: label.map(|label| self.body[label].name.clone()),
|
||||||
});
|
});
|
||||||
let ty = self.infer_block(statements, *tail, &Expectation::has_type(break_ty));
|
let ty =
|
||||||
|
self.infer_block(statements, *tail, &Expectation::has_type(break_ty));
|
||||||
let ctxt = self.breakables.pop().expect("breakable stack broken");
|
let ctxt = self.breakables.pop().expect("breakable stack broken");
|
||||||
if ctxt.may_break {
|
if ctxt.may_break {
|
||||||
ctxt.break_ty
|
ctxt.break_ty
|
||||||
|
@ -154,7 +157,8 @@ impl<'a> InferenceContext<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => self.infer_block(statements, *tail, expected),
|
None => self.infer_block(statements, *tail, expected),
|
||||||
},
|
}
|
||||||
|
}
|
||||||
Expr::Unsafe { body } | Expr::Const { body } => self.infer_expr(*body, expected),
|
Expr::Unsafe { body } | Expr::Const { body } => self.infer_expr(*body, expected),
|
||||||
Expr::TryBlock { body } => {
|
Expr::TryBlock { body } => {
|
||||||
let _inner = self.infer_expr(*body, expected);
|
let _inner = self.infer_expr(*body, expected);
|
||||||
|
|
|
@ -2415,3 +2415,22 @@ fn infer_const_params() {
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn infer_inner_type() {
|
||||||
|
check_infer(r#"
|
||||||
|
fn foo() {
|
||||||
|
struct S { field: u32 }
|
||||||
|
let s = S { field: 0 };
|
||||||
|
let f = s.field;
|
||||||
|
}
|
||||||
|
"#, expect![[r#"
|
||||||
|
9..89 '{ ...eld; }': ()
|
||||||
|
47..48 's': S
|
||||||
|
51..65 'S { field: 0 }': S
|
||||||
|
62..63 '0': u32
|
||||||
|
75..76 'f': u32
|
||||||
|
79..80 's': S
|
||||||
|
79..86 's.field': u32
|
||||||
|
"#]]);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue