Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/lower.rs')
-rw-r--r--crates/hir-ty/src/lower.rs74
1 files changed, 56 insertions, 18 deletions
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs
index 5b0bcd2be8..df83b2abb8 100644
--- a/crates/hir-ty/src/lower.rs
+++ b/crates/hir-ty/src/lower.rs
@@ -18,9 +18,12 @@ use hir_def::{
TypeAliasId, TypeOrConstParamId, TypeParamId, UnionId, VariantId,
builtin_type::BuiltinType,
expr_store::{ExpressionStore, path::Path},
- hir::generics::{
- GenericParamDataRef, GenericParams, LocalTypeOrConstParamId, TypeOrConstParamData,
- TypeParamProvenance, WherePredicate,
+ hir::{
+ ExprId, PatId,
+ generics::{
+ GenericParamDataRef, GenericParams, LocalTypeOrConstParamId, TypeOrConstParamData,
+ TypeParamProvenance, WherePredicate,
+ },
},
item_tree::FieldsShape,
lang_item::LangItems,
@@ -60,10 +63,10 @@ use crate::{
next_solver::{
AliasTy, Binder, BoundExistentialPredicates, Clause, ClauseKind, Clauses, Const, ConstKind,
DbInterner, DefaultAny, EarlyBinder, EarlyParamRegion, ErrorGuaranteed, FnSigKind,
- FxIndexMap, GenericArg, GenericArgs, ParamConst, ParamEnv, PolyFnSig, Predicate, Region,
- StoredClauses, StoredEarlyBinder, StoredGenericArg, StoredGenericArgs, StoredPolyFnSig,
- StoredTraitRef, StoredTy, TraitPredicate, TraitRef, Ty, Tys, Unnormalized, abi::Safety,
- util::BottomUpFolder,
+ 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,
},
};
@@ -198,7 +201,7 @@ pub trait TyLoweringInferVarsCtx<'db> {
pub struct TyLoweringContext<'db, 'a> {
pub db: &'db dyn HirDatabase,
- interner: DbInterner<'db>,
+ pub(crate) interner: DbInterner<'db>,
types: &'db crate::next_solver::DefaultAny<'db>,
lang_items: &'db LangItems,
resolver: &'a Resolver<'db>,
@@ -357,6 +360,14 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
}
pub(crate) fn lower_const(&mut self, const_ref: ConstRef, const_type: Ty<'db>) -> Const<'db> {
+ self.lower_expr_as_const(const_ref.expr, const_type)
+ }
+
+ pub(crate) fn lower_expr_as_const(
+ &mut self,
+ expr_id: ExprId,
+ const_type: Ty<'db>,
+ ) -> Const<'db> {
#[expect(clippy::manual_map, reason = "a `map()` here generates a borrowck error")]
let create_var = match &mut self.infer_vars {
Some(infer_vars) => Some(
@@ -368,7 +379,7 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
self.interner,
self.def,
self.store,
- const_ref.expr,
+ expr_id,
self.resolver,
const_type,
&|| self.generics.get_or_init(|| generics(self.db, self.generic_def)),
@@ -528,11 +539,43 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
}
}
}
+ &TypeRef::PatternType(ty, pat) => {
+ let ty = self.lower_ty(ty);
+ let Some(pat) = self.lower_pattern_type(pat, ty) else {
+ return (self.types.types.error, res);
+ };
+ Ty::new_pat(self.interner, ty, pat)
+ }
TypeRef::Error => self.types.types.error,
};
(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()?,
+ ),
+ hir_def::hir::Pat::Missing => return None,
+ _ => {
+ never!("pattern type can only be Range, NotNull or Or");
+ 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();
@@ -2072,12 +2115,12 @@ impl<'db> GenericPredicates {
/// A cycle can occur from malformed code.
fn generic_predicates_cycle_result(
- _db: &dyn HirDatabase,
+ db: &dyn HirDatabase,
_: salsa::Id,
_def: GenericDefId,
) -> TyLoweringResult<GenericPredicates> {
TyLoweringResult::empty(GenericPredicates::from_explicit_own_predicates(
- StoredEarlyBinder::bind(Clauses::default().store()),
+ StoredEarlyBinder::bind(Clauses::empty(DbInterner::new_no_crate(db)).store()),
))
}
@@ -2086,7 +2129,7 @@ impl GenericPredicates {
pub fn empty() -> &'static GenericPredicates {
static EMPTY: OnceLock<GenericPredicates> = OnceLock::new();
EMPTY.get_or_init(|| GenericPredicates {
- predicates: StoredEarlyBinder::bind(Clauses::default().store()),
+ predicates: StoredEarlyBinder::bind(Clauses::new_from_slice(&[]).store()),
has_trait_implied_predicate: false,
parent_explicit_self_predicates_start: 0,
own_predicates_start: 0,
@@ -2197,12 +2240,7 @@ pub(crate) fn param_env_from_predicates<'db>(
ParamEnv { clauses }
}
-pub(crate) fn trait_environment<'db>(
- db: &'db dyn HirDatabase,
- def: ExpressionStoreOwnerId,
-) -> ParamEnv<'db> {
- let def = def.generic_def(db);
-
+pub(crate) fn trait_environment<'db>(db: &'db dyn HirDatabase, def: GenericDefId) -> ParamEnv<'db> {
return ParamEnv { clauses: trait_environment_query(db, def).as_ref() };
#[salsa::tracked(returns(ref))]