Skip to content

Commit a6c8cbf

Browse files
committed
update Generics iter methods to return GenericParamId
1 parent d6e3929 commit a6c8cbf

File tree

7 files changed

+181
-111
lines changed

7 files changed

+181
-111
lines changed

crates/hir-def/src/generics.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,46 @@ impl TypeOrConstParamData {
102102

103103
impl_from!(TypeParamData, ConstParamData for TypeOrConstParamData);
104104

105+
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
106+
pub enum GenericParamData {
107+
TypeParamData(TypeParamData),
108+
ConstParamData(ConstParamData),
109+
LifetimeParamData(LifetimeParamData),
110+
}
111+
112+
impl GenericParamData {
113+
pub fn name(&self) -> Option<&Name> {
114+
match self {
115+
GenericParamData::TypeParamData(it) => it.name.as_ref(),
116+
GenericParamData::ConstParamData(it) => Some(&it.name),
117+
GenericParamData::LifetimeParamData(it) => Some(&it.name),
118+
}
119+
}
120+
121+
pub fn type_param(&self) -> Option<&TypeParamData> {
122+
match self {
123+
GenericParamData::TypeParamData(it) => Some(it),
124+
_ => None,
125+
}
126+
}
127+
128+
pub fn const_param(&self) -> Option<&ConstParamData> {
129+
match self {
130+
GenericParamData::ConstParamData(it) => Some(it),
131+
_ => None,
132+
}
133+
}
134+
135+
pub fn lifetime_param(&self) -> Option<&LifetimeParamData> {
136+
match self {
137+
GenericParamData::LifetimeParamData(it) => Some(it),
138+
_ => None,
139+
}
140+
}
141+
}
142+
143+
impl_from!(TypeParamData, ConstParamData, LifetimeParamData for GenericParamData);
144+
105145
/// Data about the generic parameters of a function, struct, impl, etc.
106146
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
107147
pub struct GenericParams {

crates/hir-ty/src/builder.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ use chalk_ir::{
99
AdtId, DebruijnIndex, Scalar,
1010
};
1111
use hir_def::{
12-
builtin_type::BuiltinType, generics::TypeOrConstParamData, ConstParamId, DefWithBodyId,
13-
GenericDefId, TraitId, TypeAliasId,
12+
builtin_type::BuiltinType, DefWithBodyId, GenericDefId, GenericParamId, TraitId, TypeAliasId,
1413
};
1514
use smallvec::SmallVec;
1615

@@ -209,10 +208,11 @@ impl TyBuilder<()> {
209208
Substitution::from_iter(
210209
Interner,
211210
params.iter_id().map(|id| match id {
212-
either::Either::Left(_) => TyKind::Error.intern(Interner).cast(Interner),
213-
either::Either::Right(id) => {
211+
GenericParamId::TypeParamId(_) => TyKind::Error.intern(Interner).cast(Interner),
212+
GenericParamId::ConstParamId(id) => {
214213
unknown_const_as_generic(db.const_param_ty(id)).cast(Interner)
215214
}
215+
GenericParamId::LifetimeParamId(_) => error_lifetime().cast(Interner),
216216
}),
217217
)
218218
}
@@ -225,16 +225,13 @@ impl TyBuilder<()> {
225225
) -> TyBuilder<()> {
226226
let generics = generics(db.upcast(), def.into());
227227
assert!(generics.parent_generics().is_some() == parent_subst.is_some());
228-
let lt_iter = generics.iter_lt_self().map(|_| ParamKind::Lifetime);
229228
let params = generics
230229
.iter_self()
231-
.map(|(id, data)| match data {
232-
TypeOrConstParamData::TypeParamData(_) => ParamKind::Type,
233-
TypeOrConstParamData::ConstParamData(_) => {
234-
ParamKind::Const(db.const_param_ty(ConstParamId::from_unchecked(id)))
235-
}
230+
.map(|(id, _data)| match id {
231+
GenericParamId::TypeParamId(_) => ParamKind::Type,
232+
GenericParamId::ConstParamId(id) => ParamKind::Const(db.const_param_ty(id)),
233+
GenericParamId::LifetimeParamId(_) => ParamKind::Lifetime,
236234
})
237-
.chain(lt_iter)
238235
.collect();
239236
TyBuilder::new((), params, parent_subst)
240237
}

crates/hir-ty/src/infer/expr.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ use std::{
88
use chalk_ir::{cast::Cast, fold::Shift, DebruijnIndex, Mutability, TyVariableKind};
99
use either::Either;
1010
use hir_def::{
11-
generics::TypeOrConstParamData,
1211
hir::{
1312
ArithOp, Array, BinaryOp, ClosureKind, Expr, ExprId, LabelId, Literal, Statement, UnaryOp,
1413
},
1514
lang_item::{LangItem, LangItemTarget},
1615
path::{GenericArgs, Path},
17-
BlockId, ConstParamId, FieldId, ItemContainerId, Lookup, TupleFieldId, TupleId,
16+
BlockId, FieldId, GenericParamId, ItemContainerId, Lookup, TupleFieldId, TupleId,
1817
};
1918
use hir_expand::name::{name, Name};
2019
use stdx::always;
@@ -1836,7 +1835,7 @@ impl InferenceContext<'_> {
18361835
.args
18371836
.iter()
18381837
.take(type_params + const_params + lifetime_params)
1839-
.zip(def_generics.iter_id_with_lt())
1838+
.zip(def_generics.iter_id())
18401839
{
18411840
if let Some(g) = generic_arg_to_chalk(
18421841
self.db,
@@ -1866,16 +1865,16 @@ impl InferenceContext<'_> {
18661865

18671866
// Handle everything else as unknown. This also handles generic arguments for the method's
18681867
// parent (impl or trait), which should come after those for the method.
1869-
for (id, data) in def_generics.iter().skip(substs.len()) {
1870-
match data {
1871-
TypeOrConstParamData::TypeParamData(_) => {
1868+
for (id, _data) in def_generics.iter().skip(substs.len()) {
1869+
match id {
1870+
GenericParamId::TypeParamId(_) => {
18721871
substs.push(self.table.new_type_var().cast(Interner))
18731872
}
1874-
TypeOrConstParamData::ConstParamData(_) => substs.push(
1875-
self.table
1876-
.new_const_var(self.db.const_param_ty(ConstParamId::from_unchecked(id)))
1877-
.cast(Interner),
1878-
),
1873+
GenericParamId::ConstParamId(id) => {
1874+
substs.push(self.table.new_const_var(self.db.const_param_ty(id)).cast(Interner))
1875+
}
1876+
// FIXME: create `new_lifetime_var` in infer
1877+
GenericParamId::LifetimeParamId(_) => substs.push(static_lifetime().cast(Interner)),
18791878
}
18801879
}
18811880
assert_eq!(substs.len(), total_len);

crates/hir-ty/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ pub(crate) fn make_binders_with_count<T: HasInterner<Interner = Interner>>(
337337
generics: &Generics,
338338
value: T,
339339
) -> Binders<T> {
340-
let it = generics.iter_id_with_lt().take(count);
340+
let it = generics.iter_id().take(count);
341341

342342
Binders::new(
343343
VariableKinds::from_iter(

crates/hir-ty/src/lower.rs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ use chalk_ir::{
1818
cast::Cast, fold::Shift, fold::TypeFoldable, interner::HasInterner, Mutability, Safety,
1919
};
2020

21-
use either::Either;
2221
use hir_def::{
2322
builtin_type::BuiltinType,
2423
data::adt::StructKind,
2524
expander::Expander,
2625
generics::{
27-
TypeOrConstParamData, TypeParamProvenance, WherePredicate, WherePredicateTypeTarget,
26+
GenericParamData, TypeOrConstParamData, TypeParamProvenance, WherePredicate,
27+
WherePredicateTypeTarget,
2828
},
2929
lang_item::LangItem,
3030
nameres::MacroSubNs,
@@ -354,13 +354,18 @@ impl<'a> TyLoweringContext<'a> {
354354
.filter(|(_, data)| {
355355
matches!(
356356
data,
357-
TypeOrConstParamData::TypeParamData(data)
357+
GenericParamData::TypeParamData(data)
358358
if data.provenance == TypeParamProvenance::ArgumentImplTrait
359359
)
360360
})
361361
.nth(idx as usize)
362362
.map_or(TyKind::Error, |(id, _)| {
363-
TyKind::Placeholder(to_placeholder_idx(self.db, id))
363+
if let GenericParamId::TypeParamId(id) = id {
364+
TyKind::Placeholder(to_placeholder_idx(self.db, id.into()))
365+
} else {
366+
// we just filtered them out
367+
unreachable!("Unexpected lifetime or const argument");
368+
}
364369
});
365370
param.intern(Interner)
366371
} else {
@@ -837,7 +842,7 @@ impl<'a> TyLoweringContext<'a> {
837842

838843
let ty_error = TyKind::Error.intern(Interner).cast(Interner);
839844

840-
let mut def_generic_iter = def_generics.iter_id_with_lt();
845+
let mut def_generic_iter = def_generics.iter_id();
841846

842847
let fill_self_params = || {
843848
for x in explicit_self_ty
@@ -1732,9 +1737,9 @@ pub(crate) fn generic_defaults_query(
17321737
let generic_params = generics(db.upcast(), def);
17331738
let parent_start_idx = generic_params.len_self();
17341739

1735-
let toc_iter = generic_params.iter().enumerate().map(|(idx, (id, p))| {
1740+
let defaults = Arc::from_iter(generic_params.iter().enumerate().map(|(idx, (id, p))| {
17361741
match p {
1737-
TypeOrConstParamData::TypeParamData(p) => {
1742+
GenericParamData::TypeParamData(p) => {
17381743
let mut ty =
17391744
p.default.as_ref().map_or(TyKind::Error.intern(Interner), |t| ctx.lower_ty(t));
17401745
// Each default can only refer to previous parameters.
@@ -1743,13 +1748,13 @@ pub(crate) fn generic_defaults_query(
17431748
ty = fallback_bound_vars(ty, idx, parent_start_idx);
17441749
crate::make_binders(db, &generic_params, ty.cast(Interner))
17451750
}
1746-
TypeOrConstParamData::ConstParamData(p) => {
1751+
GenericParamData::ConstParamData(p) => {
1752+
let GenericParamId::ConstParamId(id) = id else {
1753+
unreachable!("Unexpected lifetime or type argument")
1754+
};
1755+
17471756
let mut val = p.default.as_ref().map_or_else(
1748-
|| {
1749-
unknown_const_as_generic(
1750-
db.const_param_ty(ConstParamId::from_unchecked(id)),
1751-
)
1752-
},
1757+
|| unknown_const_as_generic(db.const_param_ty(id.into())),
17531758
|c| {
17541759
let c = ctx.lower_const(c, ctx.lower_ty(&p.ty));
17551760
c.cast(Interner)
@@ -1759,15 +1764,12 @@ pub(crate) fn generic_defaults_query(
17591764
val = fallback_bound_vars(val, idx, parent_start_idx);
17601765
make_binders(db, &generic_params, val)
17611766
}
1767+
GenericParamData::LifetimeParamData(_) => {
1768+
// using static because it requires defaults
1769+
make_binders(db, &generic_params, static_lifetime().cast(Interner))
1770+
}
17621771
}
1763-
});
1764-
1765-
let lt_iter = generic_params
1766-
.iter_lt()
1767-
.enumerate()
1768-
.map(|_| make_binders(db, &generic_params, static_lifetime().cast(Interner)));
1769-
1770-
let defaults = Arc::from_iter(toc_iter.chain(lt_iter));
1772+
}));
17711773

17721774
defaults
17731775
}
@@ -1782,8 +1784,9 @@ pub(crate) fn generic_defaults_recover(
17821784
// we still need one default per parameter
17831785
let defaults = Arc::from_iter(generic_params.iter_id().map(|id| {
17841786
let val = match id {
1785-
Either::Left(_) => TyKind::Error.intern(Interner).cast(Interner),
1786-
Either::Right(id) => unknown_const_as_generic(db.const_param_ty(id)),
1787+
GenericParamId::TypeParamId(_) => TyKind::Error.intern(Interner).cast(Interner),
1788+
GenericParamId::ConstParamId(id) => unknown_const_as_generic(db.const_param_ty(id)),
1789+
GenericParamId::LifetimeParamId(_) => static_lifetime().cast(Interner),
17871790
};
17881791
crate::make_binders(db, &generic_params, val)
17891792
}));

crates/hir-ty/src/mir/monomorphization.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,16 @@ impl Filler<'_> {
184184
self.generics
185185
.as_ref()
186186
.and_then(|it| it.iter().nth(b.index))
187-
.unwrap()
188-
.0,
187+
.and_then(|(id, _)| match id {
188+
hir_def::GenericParamId::ConstParamId(id) => {
189+
Some(hir_def::TypeOrConstParamId::from(id))
190+
}
191+
hir_def::GenericParamId::TypeParamId(id) => {
192+
Some(hir_def::TypeOrConstParamId::from(id))
193+
}
194+
_ => None,
195+
})
196+
.unwrap(),
189197
self.subst.clone(),
190198
)
191199
})?

0 commit comments

Comments
 (0)