mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 22:01:37 +00:00
Implement match binding type inference and arm unification
This commit is contained in:
parent
ac216880f5
commit
06d16a18f6
2 changed files with 25 additions and 8 deletions
|
@ -36,7 +36,7 @@ use crate::{
|
||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
type_ref::{TypeRef, Mutability},
|
type_ref::{TypeRef, Mutability},
|
||||||
name::KnownName,
|
name::KnownName,
|
||||||
expr::{Body, Expr, Literal, ExprId, Pat, PatId, UnaryOp, BinaryOp, Statement, FieldPat},
|
expr::{Body, Expr, MatchArm, Literal, ExprId, Pat, PatId, UnaryOp, BinaryOp, Statement, FieldPat},
|
||||||
};
|
};
|
||||||
|
|
||||||
/// The ID of a type variable.
|
/// The ID of a type variable.
|
||||||
|
@ -1097,14 +1097,24 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
|
||||||
ret_ty
|
ret_ty
|
||||||
}
|
}
|
||||||
Expr::Match { expr, arms } => {
|
Expr::Match { expr, arms } => {
|
||||||
let _ty = self.infer_expr(*expr, &Expectation::none());
|
let mut expected = Expectation::none();
|
||||||
for arm in arms {
|
let input_ty = self.infer_expr(*expr, &Expectation::none());
|
||||||
// TODO type the bindings in pats
|
let pat_expectation = Expectation::has_type(input_ty);
|
||||||
|
|
||||||
|
for MatchArm {
|
||||||
|
pats,
|
||||||
|
expr: arm_expr,
|
||||||
|
} in arms
|
||||||
|
{
|
||||||
|
for &pat in pats {
|
||||||
|
let _pat_ty = self.infer_pat(pat, &pat_expectation);
|
||||||
|
}
|
||||||
// TODO type the guard
|
// TODO type the guard
|
||||||
let _ty = self.infer_expr(arm.expr, &Expectation::none());
|
let ty = self.infer_expr(*arm_expr, &expected);
|
||||||
|
expected = Expectation::has_type(ty);
|
||||||
}
|
}
|
||||||
// TODO unify all the match arm types
|
|
||||||
Ty::Unknown
|
expected.ty
|
||||||
}
|
}
|
||||||
Expr::Path(p) => self.infer_path_expr(expr, p).unwrap_or(Ty::Unknown),
|
Expr::Path(p) => self.infer_path_expr(expr, p).unwrap_or(Ty::Unknown),
|
||||||
Expr::Continue => Ty::Never,
|
Expr::Continue => Ty::Never,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[68; 155) '{ ...= e; }': ()
|
[68; 221) '{ ... }; }': ()
|
||||||
[78; 79) 'e': E
|
[78; 79) 'e': E
|
||||||
[82; 95) 'E::A { x: 3 }': E
|
[82; 95) 'E::A { x: 3 }': E
|
||||||
[92; 93) '3': usize
|
[92; 93) '3': usize
|
||||||
|
@ -9,3 +9,10 @@
|
||||||
[129; 148) 'E::A {..._var }': E
|
[129; 148) 'E::A {..._var }': E
|
||||||
[139; 146) 'new_var': usize
|
[139; 146) 'new_var': usize
|
||||||
[151; 152) 'e': E
|
[151; 152) 'e': E
|
||||||
|
[159; 218) 'match ... }': usize
|
||||||
|
[165; 166) 'e': E
|
||||||
|
[177; 187) 'E::A { x }': E
|
||||||
|
[184; 185) 'x': usize
|
||||||
|
[191; 192) 'x': usize
|
||||||
|
[202; 206) 'E::B': E
|
||||||
|
[210; 211) '1': usize
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue