Unnamed repository; edit this file 'description' to name the repository.
| -rw-r--r-- | crates/hir-ty/src/lower.rs | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs index ec42b8a349..64f3cbe06a 100644 --- a/crates/hir-ty/src/lower.rs +++ b/crates/hir-ty/src/lower.rs @@ -19,7 +19,7 @@ use hir_def::{ builtin_type::BuiltinType, expr_store::{ExpressionStore, path::Path}, hir::{ - ExprId, + ExprId, PatId, generics::{ GenericParamDataRef, GenericParams, LocalTypeOrConstParamId, TypeOrConstParamData, TypeParamProvenance, WherePredicate, @@ -63,8 +63,8 @@ use crate::{ next_solver::{ AliasTy, Binder, BoundExistentialPredicates, Clause, ClauseKind, Clauses, Const, ConstKind, DbInterner, DefaultAny, EarlyBinder, EarlyParamRegion, ErrorGuaranteed, FnSigKind, - FxIndexMap, GenericArg, GenericArgs, ParamConst, ParamEnv, Pattern, PolyFnSig, Predicate, - Region, StoredClauses, StoredEarlyBinder, StoredGenericArg, StoredGenericArgs, + FxIndexMap, GenericArg, GenericArgs, ParamConst, ParamEnv, PatList, Pattern, PolyFnSig, + Predicate, Region, StoredClauses, StoredEarlyBinder, StoredGenericArg, StoredGenericArgs, StoredPolyFnSig, StoredTraitRef, StoredTy, TraitPredicate, TraitRef, Ty, Tys, Unnormalized, abi::Safety, util::BottomUpFolder, }, @@ -541,20 +541,10 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> { } &TypeRef::PatternType(ty, pat) => { let ty = self.lower_ty(ty); - // FIXME: Properly do the lowering here - let pat_kind = match self.store[pat] { - hir_def::hir::Pat::Range { - start: Some(start), - end: Some(end), - range_type: _, - } => rustc_type_ir::PatternKind::Range { - start: self.lower_expr_as_const(start, ty), - end: self.lower_expr_as_const(end, ty), - }, - hir_def::hir::Pat::NotNull => rustc_type_ir::PatternKind::NotNull, - _ => rustc_type_ir::PatternKind::NotNull, + let Some(pat) = self.lower_pattern_type(pat, ty) else { + // FIXME: Report an error. + return (self.types.types.error, res); }; - let pat = Pattern::new(self.interner, pat_kind); Ty::new_pat(self.interner, ty, pat) } TypeRef::Error => self.types.types.error, @@ -562,6 +552,27 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> { (ty, res) } + fn lower_pattern_type(&mut self, pat: PatId, ty: Ty<'db>) -> Option<Pattern<'db>> { + let pat_kind = match self.store[pat] { + hir_def::hir::Pat::Range { start: Some(start), end: Some(end), range_type: _ } => { + rustc_type_ir::PatternKind::Range { + start: self.lower_expr_as_const(start, ty), + end: self.lower_expr_as_const(end, ty), + } + } + hir_def::hir::Pat::NotNull => rustc_type_ir::PatternKind::NotNull, + hir_def::hir::Pat::Or(ref pats) => rustc_type_ir::PatternKind::Or( + PatList::new_from_iter( + self.interner, + pats.iter().map(|&pat| self.lower_pattern_type(pat, ty).ok_or(())), + ) + .ok()?, + ), + _ => return None, + }; + Some(Pattern::new(self.interner, pat_kind)) + } + fn lower_fn_ptr(&mut self, fn_: &FnType) -> Ty<'db> { let interner = self.interner; let (params, ret_ty) = fn_.split_params_and_ret(); |