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.rs72
1 files changed, 36 insertions, 36 deletions
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs
index e371e42761..f66b584e3b 100644
--- a/crates/hir-ty/src/lower.rs
+++ b/crates/hir-ty/src/lower.rs
@@ -762,7 +762,7 @@ impl<'a> TyLoweringContext<'a> {
Some(segment) if segment.args_and_bindings.is_some() => Some(segment),
_ => last,
};
- (segment, Some(var.parent.into()))
+ (segment, Some(var.lookup(self.db.upcast()).parent.into()))
}
};
if let Some(segment) = segment {
@@ -1375,11 +1375,13 @@ pub(crate) fn field_types_query(
let (resolver, def): (_, GenericDefId) = match variant_id {
VariantId::StructId(it) => (it.resolver(db.upcast()), it.into()),
VariantId::UnionId(it) => (it.resolver(db.upcast()), it.into()),
- VariantId::EnumVariantId(it) => (it.parent.resolver(db.upcast()), it.parent.into()),
+ VariantId::EnumVariantId(it) => {
+ (it.resolver(db.upcast()), it.lookup(db.upcast()).parent.into())
+ }
};
let generics = generics(db.upcast(), def);
let mut res = ArenaMap::default();
- let ctx = TyLoweringContext::new(db, &resolver, GenericDefId::from(variant_id.adt_id()).into())
+ let ctx = TyLoweringContext::new(db, &resolver, def.into())
.with_type_param_mode(ParamLoweringMode::Variable);
for (field_id, field_data) in var_data.fields().iter() {
res.insert(field_id, make_binders(db, &generics, ctx.lower_ty(&field_data.type_ref)));
@@ -1727,44 +1729,50 @@ fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnS
/// Build the type of a tuple struct constructor.
fn type_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> Binders<Ty> {
let struct_data = db.struct_data(def);
- if let StructKind::Unit = struct_data.variant_data.kind() {
- return type_for_adt(db, def.into());
+ match struct_data.variant_data.kind() {
+ StructKind::Record => unreachable!("callers check for valueness of variant"),
+ StructKind::Unit => return type_for_adt(db, def.into()),
+ StructKind::Tuple => {
+ let generics = generics(db.upcast(), AdtId::from(def).into());
+ let substs = generics.bound_vars_subst(db, DebruijnIndex::INNERMOST);
+ make_binders(
+ db,
+ &generics,
+ TyKind::FnDef(CallableDefId::StructId(def).to_chalk(db), substs).intern(Interner),
+ )
+ }
}
- let generics = generics(db.upcast(), AdtId::from(def).into());
- let substs = generics.bound_vars_subst(db, DebruijnIndex::INNERMOST);
- make_binders(
- db,
- &generics,
- TyKind::FnDef(CallableDefId::StructId(def).to_chalk(db), substs).intern(Interner),
- )
}
fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) -> PolyFnSig {
- let enum_data = db.enum_data(def.parent);
- let var_data = &enum_data.variants[def.local_id];
+ let var_data = db.enum_variant_data(def);
let fields = var_data.variant_data.fields();
- let resolver = def.parent.resolver(db.upcast());
+ let resolver = def.resolver(db.upcast());
let ctx = TyLoweringContext::new(db, &resolver, DefWithBodyId::VariantId(def).into())
.with_type_param_mode(ParamLoweringMode::Variable);
let params = fields.iter().map(|(_, field)| ctx.lower_ty(&field.type_ref)).collect::<Vec<_>>();
- let (ret, binders) = type_for_adt(db, def.parent.into()).into_value_and_skipped_binders();
+ let (ret, binders) =
+ type_for_adt(db, def.lookup(db.upcast()).parent.into()).into_value_and_skipped_binders();
Binders::new(binders, CallableSig::from_params_and_return(params, ret, false, Safety::Safe))
}
/// Build the type of a tuple enum variant constructor.
fn type_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) -> Binders<Ty> {
- let enum_data = db.enum_data(def.parent);
- let var_data = &enum_data.variants[def.local_id].variant_data;
- if let StructKind::Unit = var_data.kind() {
- return type_for_adt(db, def.parent.into());
+ let e = def.lookup(db.upcast()).parent;
+ match db.enum_variant_data(def).variant_data.kind() {
+ StructKind::Record => unreachable!("callers check for valueness of variant"),
+ StructKind::Unit => return type_for_adt(db, e.into()),
+ StructKind::Tuple => {
+ let generics = generics(db.upcast(), e.into());
+ let substs = generics.bound_vars_subst(db, DebruijnIndex::INNERMOST);
+ make_binders(
+ db,
+ &generics,
+ TyKind::FnDef(CallableDefId::EnumVariantId(def).to_chalk(db), substs)
+ .intern(Interner),
+ )
+ }
}
- let generics = generics(db.upcast(), def.parent.into());
- let substs = generics.bound_vars_subst(db, DebruijnIndex::INNERMOST);
- make_binders(
- db,
- &generics,
- TyKind::FnDef(CallableDefId::EnumVariantId(def).to_chalk(db), substs).intern(Interner),
- )
}
fn type_for_adt(db: &dyn HirDatabase, adt: AdtId) -> Binders<Ty> {
@@ -1812,7 +1820,7 @@ impl CallableDefId {
match self {
CallableDefId::FunctionId(f) => f.lookup(db).module(db),
CallableDefId::StructId(s) => s.lookup(db).container,
- CallableDefId::EnumVariantId(e) => e.parent.lookup(db).container,
+ CallableDefId::EnumVariantId(e) => e.module(db),
}
.krate()
}
@@ -1893,12 +1901,8 @@ pub(crate) fn value_ty_query(db: &dyn HirDatabase, def: ValueTyDefId) -> Binders
}
pub(crate) fn impl_self_ty_query(db: &dyn HirDatabase, impl_id: ImplId) -> Binders<Ty> {
- let impl_loc = impl_id.lookup(db.upcast());
let impl_data = db.impl_data(impl_id);
let resolver = impl_id.resolver(db.upcast());
- let _cx = stdx::panic_context::enter(format!(
- "impl_self_ty_query({impl_id:?} -> {impl_loc:?} -> {impl_data:?})"
- ));
let generics = generics(db.upcast(), impl_id.into());
let ctx = TyLoweringContext::new(db, &resolver, impl_id.into())
.with_type_param_mode(ParamLoweringMode::Variable);
@@ -1930,12 +1934,8 @@ pub(crate) fn impl_self_ty_recover(
}
pub(crate) fn impl_trait_query(db: &dyn HirDatabase, impl_id: ImplId) -> Option<Binders<TraitRef>> {
- let impl_loc = impl_id.lookup(db.upcast());
let impl_data = db.impl_data(impl_id);
let resolver = impl_id.resolver(db.upcast());
- let _cx = stdx::panic_context::enter(format!(
- "impl_trait_query({impl_id:?} -> {impl_loc:?} -> {impl_data:?})"
- ));
let ctx = TyLoweringContext::new(db, &resolver, impl_id.into())
.with_type_param_mode(ParamLoweringMode::Variable);
let (self_ty, binders) = db.impl_self_ty(impl_id).into_value_and_skipped_binders();