Expose coercions for patterns and expressions in semantics

This commit is contained in:
Lukas Wirth 2021-07-10 19:03:46 +02:00
parent 576e3a4e12
commit 7e6f40b6f1
3 changed files with 31 additions and 7 deletions

View file

@ -126,15 +126,15 @@ impl SourceAnalyzer {
&self,
db: &dyn HirDatabase,
expr: &ast::Expr,
) -> Option<Type> {
) -> Option<(Type, Option<Type>)> {
let expr_id = self.expr_id(db, expr)?;
let infer = self.infer.as_ref()?;
let ty = infer
.expr_adjustments
.get(&expr_id)
.and_then(|adjusts| adjusts.last().map(|adjust| &adjust.target))
.unwrap_or_else(|| &infer[expr_id]);
Type::new_with_resolver(db, &self.resolver, ty.clone())
.and_then(|adjusts| adjusts.last().map(|adjust| &adjust.target));
let mk_ty = |ty: &hir_ty::Ty| Type::new_with_resolver(db, &self.resolver, ty.clone());
mk_ty(&infer[expr_id]).map(|it| (it, ty.and_then(mk_ty)))
}
pub(crate) fn type_of_pat(&self, db: &dyn HirDatabase, pat: &ast::Pat) -> Option<Type> {
@ -143,6 +143,21 @@ impl SourceAnalyzer {
Type::new_with_resolver(db, &self.resolver, ty)
}
pub(crate) fn type_of_pat_with_coercion(
&self,
db: &dyn HirDatabase,
pat: &ast::Pat,
) -> Option<(Type, Option<Type>)> {
let pat_id = self.pat_id(pat)?;
let infer = self.infer.as_ref()?;
let ty = infer
.pat_adjustments
.get(&pat_id)
.and_then(|adjusts| adjusts.last().map(|adjust| &adjust.target));
let mk_ty = |ty: &hir_ty::Ty| Type::new_with_resolver(db, &self.resolver, ty.clone());
mk_ty(&infer[pat_id]).map(|it| (it, ty.and_then(mk_ty)))
}
pub(crate) fn type_of_self(
&self,
db: &dyn HirDatabase,