Skip to content

Commit deb9cf9

Browse files
committed
insert dummy values for const generics in subst
1 parent 4924072 commit deb9cf9

File tree

12 files changed

+127
-61
lines changed

12 files changed

+127
-61
lines changed

crates/hir/src/display.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ fn write_generic_params(def: GenericDefId, f: &mut HirFormatter) -> Result<(), H
293293
let params = f.db.generic_params(def);
294294
if params.lifetimes.is_empty()
295295
&& params
296-
.types
296+
.tocs
297297
.iter()
298298
.filter_map(|x| x.1.type_param())
299299
.all(|param| !matches!(param.provenance, TypeParamProvenance::TypeParamList))
@@ -315,7 +315,7 @@ fn write_generic_params(def: GenericDefId, f: &mut HirFormatter) -> Result<(), H
315315
delim(f)?;
316316
write!(f, "{}", lifetime.name)?;
317317
}
318-
for (_, ty) in params.types.iter() {
318+
for (_, ty) in params.tocs.iter() {
319319
if let Some(name) = &ty.name() {
320320
match ty {
321321
TypeOrConstParamData::TypeParamData(ty) => {
@@ -348,7 +348,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter) -> Result<(), Hir
348348
// unnamed type targets are displayed inline with the argument itself, e.g. `f: impl Y`.
349349
let is_unnamed_type_target = |target: &WherePredicateTypeTarget| match target {
350350
WherePredicateTypeTarget::TypeRef(_) => false,
351-
WherePredicateTypeTarget::TypeOrConstParam(id) => params.types[*id].name().is_none(),
351+
WherePredicateTypeTarget::TypeOrConstParam(id) => params.tocs[*id].name().is_none(),
352352
};
353353

354354
let has_displayable_predicate = params
@@ -364,7 +364,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter) -> Result<(), Hir
364364

365365
let write_target = |target: &WherePredicateTypeTarget, f: &mut HirFormatter| match target {
366366
WherePredicateTypeTarget::TypeRef(ty) => ty.hir_fmt(f),
367-
WherePredicateTypeTarget::TypeOrConstParam(id) => match &params.types[*id].name() {
367+
WherePredicateTypeTarget::TypeOrConstParam(id) => match &params.tocs[*id].name() {
368368
Some(name) => write!(f, "{}", name),
369369
None => write!(f, "{{unnamed}}"),
370370
},

crates/hir/src/lib.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -2007,7 +2007,7 @@ impl_from!(
20072007
impl GenericDef {
20082008
pub fn params(self, db: &dyn HirDatabase) -> Vec<GenericParam> {
20092009
let generics = db.generic_params(self.into());
2010-
let ty_params = generics.types.iter().map(|(local_id, _)| {
2010+
let ty_params = generics.tocs.iter().map(|(local_id, _)| {
20112011
let toc = TypeOrConstParam { id: TypeOrConstParamId { parent: self.into(), local_id } };
20122012
match toc.split(db) {
20132013
Either::Left(x) => GenericParam::ConstParam(x),
@@ -2027,7 +2027,7 @@ impl GenericDef {
20272027
pub fn type_params(self, db: &dyn HirDatabase) -> Vec<TypeOrConstParam> {
20282028
let generics = db.generic_params(self.into());
20292029
generics
2030-
.types
2030+
.tocs
20312031
.iter()
20322032
.map(|(local_id, _)| TypeOrConstParam {
20332033
id: TypeOrConstParamId { parent: self.into(), local_id },
@@ -2349,7 +2349,7 @@ impl ConstParam {
23492349

23502350
pub fn name(self, db: &dyn HirDatabase) -> Name {
23512351
let params = db.generic_params(self.id.parent());
2352-
match params.types[self.id.local_id()].name() {
2352+
match params.tocs[self.id.local_id()].name() {
23532353
Some(x) => x.clone(),
23542354
None => {
23552355
never!();
@@ -2381,7 +2381,7 @@ pub struct TypeOrConstParam {
23812381
impl TypeOrConstParam {
23822382
pub fn name(self, db: &dyn HirDatabase) -> Name {
23832383
let params = db.generic_params(self.id.parent);
2384-
match params.types[self.id.local_id].name() {
2384+
match params.tocs[self.id.local_id].name() {
23852385
Some(n) => n.clone(),
23862386
_ => Name::missing(),
23872387
}
@@ -2397,7 +2397,7 @@ impl TypeOrConstParam {
23972397

23982398
pub fn split(self, db: &dyn HirDatabase) -> Either<ConstParam, TypeParam> {
23992399
let params = db.generic_params(self.id.parent);
2400-
match &params.types[self.id.local_id] {
2400+
match &params.tocs[self.id.local_id] {
24012401
hir_def::generics::TypeOrConstParamData::TypeParamData(_) => {
24022402
Either::Right(TypeParam { id: self.id.into() })
24032403
}

crates/hir_def/src/generics.rs

+24-11
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ impl TypeOrConstParamData {
7777
}
7878
}
7979

80+
pub fn const_param(&self) -> Option<&ConstParamData> {
81+
match self {
82+
TypeOrConstParamData::TypeParamData(_) => None,
83+
TypeOrConstParamData::ConstParamData(x) => Some(x),
84+
}
85+
}
86+
8087
pub fn is_trait_self(&self) -> bool {
8188
match self {
8289
TypeOrConstParamData::TypeParamData(x) => {
@@ -92,7 +99,7 @@ impl_from!(TypeParamData, ConstParamData for TypeOrConstParamData);
9299
/// Data about the generic parameters of a function, struct, impl, etc.
93100
#[derive(Clone, PartialEq, Eq, Debug, Default, Hash)]
94101
pub struct GenericParams {
95-
pub types: Arena<TypeOrConstParamData>,
102+
pub tocs: Arena<TypeOrConstParamData>,
96103
pub lifetimes: Arena<LifetimeParamData>,
97104
pub where_predicates: Vec<WherePredicate>,
98105
}
@@ -131,7 +138,13 @@ impl GenericParams {
131138
pub fn type_iter<'a>(
132139
&'a self,
133140
) -> impl Iterator<Item = (Idx<TypeOrConstParamData>, &TypeParamData)> {
134-
self.types.iter().filter_map(|x| x.1.type_param().map(|y| (x.0, y)))
141+
self.tocs.iter().filter_map(|x| x.1.type_param().map(|y| (x.0, y)))
142+
}
143+
144+
pub fn toc_iter<'a>(
145+
&'a self,
146+
) -> impl Iterator<Item = (Idx<TypeOrConstParamData>, &TypeOrConstParamData)> {
147+
self.tocs.iter()
135148
}
136149

137150
pub(crate) fn generic_params_query(
@@ -238,7 +251,7 @@ impl GenericParams {
238251
default,
239252
provenance: TypeParamProvenance::TypeParamList,
240253
};
241-
self.types.alloc(param.into());
254+
self.tocs.alloc(param.into());
242255
let type_ref = TypeRef::Path(name.into());
243256
self.fill_bounds(lower_ctx, &type_param, Either::Left(type_ref));
244257
}
@@ -248,7 +261,7 @@ impl GenericParams {
248261
.ty()
249262
.map_or(TypeRef::Error, |it| TypeRef::from_ast(lower_ctx, it));
250263
let param = ConstParamData { name, ty: Interned::new(ty) };
251-
self.types.alloc(param.into());
264+
self.tocs.alloc(param.into());
252265
}
253266
}
254267
}
@@ -335,7 +348,7 @@ impl GenericParams {
335348
default: None,
336349
provenance: TypeParamProvenance::ArgumentImplTrait,
337350
};
338-
let param_id = self.types.alloc(param.into());
351+
let param_id = self.tocs.alloc(param.into());
339352
for bound in bounds {
340353
self.where_predicates.push(WherePredicate::TypeBound {
341354
target: WherePredicateTypeTarget::TypeOrConstParam(param_id),
@@ -359,27 +372,27 @@ impl GenericParams {
359372
}
360373

361374
pub(crate) fn shrink_to_fit(&mut self) {
362-
let Self { lifetimes, types, where_predicates } = self;
375+
let Self { lifetimes, tocs: types, where_predicates } = self;
363376
lifetimes.shrink_to_fit();
364377
types.shrink_to_fit();
365378
where_predicates.shrink_to_fit();
366379
}
367380

368381
pub fn find_type_by_name(&self, name: &Name) -> Option<LocalTypeOrConstParamId> {
369-
self.types
382+
self.tocs
370383
.iter()
371384
.filter(|x| matches!(x.1, TypeOrConstParamData::TypeParamData(_)))
372385
.find_map(|(id, p)| if p.name().as_ref() == Some(&name) { Some(id) } else { None })
373386
}
374387

375388
pub fn find_type_or_const_by_name(&self, name: &Name) -> Option<LocalTypeOrConstParamId> {
376-
self.types
389+
self.tocs
377390
.iter()
378391
.find_map(|(id, p)| if p.name().as_ref() == Some(&name) { Some(id) } else { None })
379392
}
380393

381394
pub fn find_trait_self_param(&self) -> Option<LocalTypeOrConstParamId> {
382-
self.types.iter().find_map(|(id, p)| {
395+
self.tocs.iter().find_map(|(id, p)| {
383396
if let TypeOrConstParamData::TypeParamData(p) = p {
384397
if p.provenance == TypeParamProvenance::TraitSelf {
385398
Some(id)
@@ -438,7 +451,7 @@ impl HasChildSource<LocalTypeOrConstParamId> for GenericDefId {
438451
db: &dyn DefDatabase,
439452
) -> InFile<ArenaMap<LocalTypeOrConstParamId, Self::Value>> {
440453
let generic_params = db.generic_params(*self);
441-
let mut idx_iter = generic_params.types.iter().map(|(idx, _)| idx);
454+
let mut idx_iter = generic_params.tocs.iter().map(|(idx, _)| idx);
442455

443456
let (file_id, generic_params_list) = file_id_and_params_of(*self, db);
444457

@@ -492,7 +505,7 @@ impl ChildBySource for GenericDefId {
492505
}
493506

494507
let generic_params = db.generic_params(*self);
495-
let mut toc_idx_iter = generic_params.types.iter().map(|(idx, _)| idx);
508+
let mut toc_idx_iter = generic_params.tocs.iter().map(|(idx, _)| idx);
496509
let lts_idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx);
497510

498511
// For traits the first type index is `Self`, skip it.

crates/hir_def/src/item_tree/lower.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ impl<'a> Ctx<'a> {
582582
}
583583
GenericsOwner::Trait(trait_def) => {
584584
// traits get the Self type as an implicit first type parameter
585-
generics.types.alloc(
585+
generics.tocs.alloc(
586586
TypeParamData {
587587
name: Some(name![Self]),
588588
default: None,

crates/hir_def/src/item_tree/pretty.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ impl<'a> Printer<'a> {
626626
}
627627

628628
fn print_generic_params(&mut self, params: &GenericParams) {
629-
if params.types.is_empty() && params.lifetimes.is_empty() {
629+
if params.tocs.is_empty() && params.lifetimes.is_empty() {
630630
return;
631631
}
632632

@@ -639,7 +639,7 @@ impl<'a> Printer<'a> {
639639
first = false;
640640
w!(self, "{}", lt.name);
641641
}
642-
for (idx, x) in params.types.iter() {
642+
for (idx, x) in params.tocs.iter() {
643643
if !first {
644644
w!(self, ", ");
645645
}
@@ -701,7 +701,7 @@ impl<'a> Printer<'a> {
701701
match target {
702702
WherePredicateTypeTarget::TypeRef(ty) => this.print_type_ref(ty),
703703
WherePredicateTypeTarget::TypeOrConstParam(id) => {
704-
match &params.types[*id].name() {
704+
match &params.tocs[*id].name() {
705705
Some(name) => w!(this, "{}", name),
706706
None => w!(this, "_anon_{}", id.into_raw()),
707707
}

crates/hir_def/src/resolver.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -526,10 +526,10 @@ impl Scope {
526526
}
527527
Scope::GenericParams { params, def: parent } => {
528528
let parent = *parent;
529-
for (local_id, param) in params.types.iter() {
529+
for (local_id, param) in params.tocs.iter() {
530530
if let Some(name) = &param.name() {
531531
let id = TypeOrConstParamId { parent, local_id };
532-
let data = &db.generic_params(parent).types[local_id];
532+
let data = &db.generic_params(parent).tocs[local_id];
533533
acc.add(
534534
name,
535535
ScopeDef::GenericParam(match data {

crates/hir_ty/src/chalk_ext.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ impl TyExt for Ty {
237237
TyKind::Placeholder(idx) => {
238238
let id = from_placeholder_idx(db, *idx);
239239
let generic_params = db.generic_params(id.parent);
240-
let param_data = &generic_params.types[id.local_id];
240+
let param_data = &generic_params.tocs[id.local_id];
241241
match param_data {
242242
TypeOrConstParamData::TypeParamData(p) => match p.provenance {
243243
hir_def::generics::TypeParamProvenance::ArgumentImplTrait => {

crates/hir_ty/src/display.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ impl HirDisplay for Const {
320320
ConstValue::Placeholder(idx) => {
321321
let id = from_placeholder_idx(f.db, idx);
322322
let generics = generics(f.db.upcast(), id.parent);
323-
let param_data = &generics.params.types[id.local_id];
323+
let param_data = &generics.params.tocs[id.local_id];
324324
write!(f, "{}", param_data.name().unwrap())
325325
}
326326
ConstValue::Concrete(c) => write!(f, "{}", c.interned),
@@ -489,9 +489,9 @@ impl HirDisplay for Ty {
489489
};
490490
if parameters.len(Interner) > 0 {
491491
let generics = generics(f.db.upcast(), def.into());
492-
let (parent_params, self_param, type_params, _impl_trait_params) =
492+
let (parent_params, self_param, type_params, const_params, _impl_trait_params) =
493493
generics.provenance_split();
494-
let total_len = parent_params + self_param + type_params;
494+
let total_len = parent_params + self_param + type_params + const_params;
495495
// We print all params except implicit impl Trait params. Still a bit weird; should we leave out parent and self?
496496
if total_len > 0 {
497497
write!(f, "<")?;
@@ -680,7 +680,7 @@ impl HirDisplay for Ty {
680680
TyKind::Placeholder(idx) => {
681681
let id = from_placeholder_idx(f.db, *idx);
682682
let generics = generics(f.db.upcast(), id.parent);
683-
let param_data = &generics.params.types[id.local_id];
683+
let param_data = &generics.params.tocs[id.local_id];
684684
match param_data {
685685
TypeOrConstParamData::TypeParamData(p) => match p.provenance {
686686
TypeParamProvenance::TypeParamList | TypeParamProvenance::TraitSelf => {

crates/hir_ty/src/infer/expr.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1032,10 +1032,10 @@ impl<'a> InferenceContext<'a> {
10321032
def_generics: Generics,
10331033
generic_args: Option<&GenericArgs>,
10341034
) -> Substitution {
1035-
let (parent_params, self_params, type_params, impl_trait_params) =
1035+
let (parent_params, self_params, type_params, const_params, impl_trait_params) =
10361036
def_generics.provenance_split();
10371037
assert_eq!(self_params, 0); // method shouldn't have another Self param
1038-
let total_len = parent_params + type_params + impl_trait_params;
1038+
let total_len = parent_params + type_params + const_params + impl_trait_params;
10391039
let mut substs = Vec::with_capacity(total_len);
10401040
// Parent arguments are unknown
10411041
for (_id, param) in def_generics.iter_parent() {
@@ -1044,7 +1044,8 @@ impl<'a> InferenceContext<'a> {
10441044
substs.push(self.table.new_type_var());
10451045
}
10461046
TypeOrConstParamData::ConstParamData(_) => {
1047-
// FIXME: here we should do something
1047+
// FIXME: here we should do something else
1048+
substs.push(self.table.new_type_var());
10481049
}
10491050
}
10501051
}

crates/hir_ty/src/lower.rs

+28-14
Original file line numberDiff line numberDiff line change
@@ -286,16 +286,21 @@ impl<'a> TyLoweringContext<'a> {
286286
let idx = self.impl_trait_counter.get();
287287
// FIXME we're probably doing something wrong here
288288
self.impl_trait_counter.set(idx + count_impl_traits(type_ref) as u16);
289-
let (parent_params, self_params, list_params, _impl_trait_params) =
290-
if let Some(def) = self.resolver.generic_def() {
291-
let generics = generics(self.db.upcast(), def);
292-
generics.provenance_split()
293-
} else {
294-
(0, 0, 0, 0)
295-
};
289+
let (
290+
parent_params,
291+
self_params,
292+
list_params,
293+
const_params,
294+
_impl_trait_params,
295+
) = if let Some(def) = self.resolver.generic_def() {
296+
let generics = generics(self.db.upcast(), def);
297+
generics.provenance_split()
298+
} else {
299+
(0, 0, 0, 0, 0)
300+
};
296301
TyKind::BoundVar(BoundVar::new(
297302
self.in_binders,
298-
idx as usize + parent_params + self_params + list_params,
303+
idx as usize + parent_params + self_params + list_params + const_params,
299304
))
300305
.intern(Interner)
301306
}
@@ -639,9 +644,10 @@ impl<'a> TyLoweringContext<'a> {
639644
let mut substs = Vec::new();
640645
let def_generics = def_generic.map(|def| generics(self.db.upcast(), def));
641646

642-
let (parent_params, self_params, type_params, impl_trait_params) =
643-
def_generics.map_or((0, 0, 0, 0), |g| g.provenance_split());
644-
let total_len = parent_params + self_params + type_params + impl_trait_params;
647+
let (parent_params, self_params, type_params, const_params, impl_trait_params) =
648+
def_generics.map_or((0, 0, 0, 0, 0), |g| g.provenance_split());
649+
let total_len =
650+
parent_params + self_params + type_params + const_params + impl_trait_params;
645651

646652
substs.extend(iter::repeat(TyKind::Error.intern(Interner)).take(parent_params));
647653

@@ -993,7 +999,7 @@ fn named_associated_type_shorthand_candidates<R>(
993999
// Handle `Self::Type` referring to own associated type in trait definitions
9941000
if let GenericDefId::TraitId(trait_id) = param_id.parent() {
9951001
let generics = generics(db.upcast(), trait_id.into());
996-
if generics.params.types[param_id.local_id()].is_trait_self() {
1002+
if generics.params.tocs[param_id.local_id()].is_trait_self() {
9971003
let trait_ref = TyBuilder::trait_ref(db, trait_id)
9981004
.fill_with_bound_vars(DebruijnIndex::INNERMOST, 0)
9991005
.build();
@@ -1235,9 +1241,17 @@ pub(crate) fn generic_defaults_query(
12351241
let generic_params = generics(db.upcast(), def);
12361242

12371243
let defaults = generic_params
1238-
.type_iter()
1244+
.toc_iter()
12391245
.enumerate()
12401246
.map(|(idx, (_, p))| {
1247+
let p = match p {
1248+
TypeOrConstParamData::TypeParamData(p) => p,
1249+
TypeOrConstParamData::ConstParamData(_) => {
1250+
// FIXME: here we should add const generic parameters
1251+
let ty = TyKind::Error.intern(Interner);
1252+
return crate::make_only_type_binders(idx, ty);
1253+
}
1254+
};
12411255
let mut ty =
12421256
p.default.as_ref().map_or(TyKind::Error.intern(Interner), |t| ctx.lower_ty(t));
12431257

@@ -1502,7 +1516,7 @@ pub(crate) fn impl_self_ty_query(db: &dyn HirDatabase, impl_id: ImplId) -> Binde
15021516
// returns None if def is a type arg
15031517
pub(crate) fn const_param_ty_query(db: &dyn HirDatabase, def: ConstParamId) -> Ty {
15041518
let parent_data = db.generic_params(def.parent());
1505-
let data = &parent_data.types[def.local_id()];
1519+
let data = &parent_data.tocs[def.local_id()];
15061520
let resolver = def.parent().resolver(db.upcast());
15071521
let ctx = TyLoweringContext::new(db, &resolver);
15081522
match data {

0 commit comments

Comments
 (0)