Skip to content

Commit 4981f00

Browse files
committed
Auto merge of #17530 - Veykril:lifetime-order, r=Veykril
Move lifetimes in front of type and const params but after self
2 parents 73c97e3 + baa959f commit 4981f00

File tree

12 files changed

+333
-329
lines changed

12 files changed

+333
-329
lines changed

crates/hir-def/src/child_by_source.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,8 @@ impl ChildBySource for GenericDefId {
214214
}
215215

216216
let generic_params = db.generic_params(*self);
217-
let mut toc_idx_iter = generic_params.type_or_consts.iter().map(|(idx, _)| idx);
218-
let lts_idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx);
217+
let mut toc_idx_iter = generic_params.iter_type_or_consts().map(|(idx, _)| idx);
218+
let lts_idx_iter = generic_params.iter_lt().map(|(idx, _)| idx);
219219

220220
// For traits the first type index is `Self`, skip it.
221221
if let GenericDefId::TraitId(_) = *self {

crates/hir-def/src/generics.rs

Lines changed: 217 additions & 200 deletions
Large diffs are not rendered by default.

crates/hir-def/src/item_tree/pretty.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -532,15 +532,15 @@ impl Printer<'_> {
532532

533533
w!(self, "<");
534534
let mut first = true;
535-
for (idx, lt) in params.lifetimes.iter() {
535+
for (idx, lt) in params.iter_lt() {
536536
if !first {
537537
w!(self, ", ");
538538
}
539539
first = false;
540540
self.print_attrs_of(AttrOwner::LifetimeParamData(parent, idx), " ");
541541
w!(self, "{}", lt.name.display(self.db.upcast()));
542542
}
543-
for (idx, x) in params.type_or_consts.iter() {
543+
for (idx, x) in params.iter_type_or_consts() {
544544
if !first {
545545
w!(self, ", ");
546546
}
@@ -570,13 +570,13 @@ impl Printer<'_> {
570570
}
571571

572572
fn print_where_clause(&mut self, params: &GenericParams) -> bool {
573-
if params.where_predicates.is_empty() {
573+
if params.where_predicates().next().is_none() {
574574
return false;
575575
}
576576

577577
w!(self, "\nwhere");
578578
self.indented(|this| {
579-
for (i, pred) in params.where_predicates.iter().enumerate() {
579+
for (i, pred) in params.where_predicates().enumerate() {
580580
if i != 0 {
581581
wln!(this, ",");
582582
}
@@ -607,12 +607,10 @@ impl Printer<'_> {
607607

608608
match target {
609609
WherePredicateTypeTarget::TypeRef(ty) => this.print_type_ref(ty),
610-
WherePredicateTypeTarget::TypeOrConstParam(id) => {
611-
match &params.type_or_consts[*id].name() {
612-
Some(name) => w!(this, "{}", name.display(self.db.upcast())),
613-
None => w!(this, "_anon_{}", id.into_raw()),
614-
}
615-
}
610+
WherePredicateTypeTarget::TypeOrConstParam(id) => match params[*id].name() {
611+
Some(name) => w!(this, "{}", name.display(self.db.upcast())),
612+
None => w!(this, "_anon_{}", id.into_raw()),
613+
},
616614
}
617615
w!(this, ": ");
618616
this.print_type_bounds(std::slice::from_ref(bound));

crates/hir-def/src/resolver.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,7 @@ impl Resolver {
596596
Scope::GenericParams { params, def } => Some((params, def)),
597597
_ => None,
598598
})
599-
.flat_map(|(params, def)| params.where_predicates.iter().zip(iter::repeat(def)))
599+
.flat_map(|(params, def)| params.where_predicates().zip(iter::repeat(def)))
600600
}
601601

602602
pub fn generic_def(&self) -> Option<GenericDefId> {
@@ -758,10 +758,10 @@ impl Scope {
758758
}
759759
Scope::GenericParams { params, def: parent } => {
760760
let parent = *parent;
761-
for (local_id, param) in params.type_or_consts.iter() {
761+
for (local_id, param) in params.iter_type_or_consts() {
762762
if let Some(name) = &param.name() {
763763
let id = TypeOrConstParamId { parent, local_id };
764-
let data = &db.generic_params(parent).type_or_consts[local_id];
764+
let data = &db.generic_params(parent)[local_id];
765765
acc.add(
766766
name,
767767
ScopeDef::GenericParam(match data {
@@ -775,7 +775,7 @@ impl Scope {
775775
);
776776
}
777777
}
778-
for (local_id, param) in params.lifetimes.iter() {
778+
for (local_id, param) in params.iter_lt() {
779779
let id = LifetimeParamId { parent, local_id };
780780
acc.add(&param.name, ScopeDef::GenericParam(id.into()))
781781
}

crates/hir-def/src/src.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ impl HasChildSource<LocalTypeOrConstParamId> for GenericDefId {
6464
db: &dyn DefDatabase,
6565
) -> InFile<ArenaMap<LocalTypeOrConstParamId, Self::Value>> {
6666
let generic_params = db.generic_params(*self);
67-
let mut idx_iter = generic_params.type_or_consts.iter().map(|(idx, _)| idx);
67+
let mut idx_iter = generic_params.iter_type_or_consts().map(|(idx, _)| idx);
6868

6969
let (file_id, generic_params_list) = self.file_id_and_params_of(db);
7070

@@ -103,7 +103,7 @@ impl HasChildSource<LocalLifetimeParamId> for GenericDefId {
103103
db: &dyn DefDatabase,
104104
) -> InFile<ArenaMap<LocalLifetimeParamId, Self::Value>> {
105105
let generic_params = db.generic_params(*self);
106-
let idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx);
106+
let idx_iter = generic_params.iter_lt().map(|(idx, _)| idx);
107107

108108
let (file_id, generic_params_list) = self.file_id_and_params_of(db);
109109

crates/hir-ty/src/chalk_ext.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ impl TyExt for Ty {
309309
TyKind::Placeholder(idx) => {
310310
let id = from_placeholder_idx(db, *idx);
311311
let generic_params = db.generic_params(id.parent);
312-
let param_data = &generic_params.type_or_consts[id.local_id];
312+
let param_data = &generic_params[id.local_id];
313313
match param_data {
314314
TypeOrConstParamData::TypeParamData(p) => match p.provenance {
315315
hir_def::generics::TypeParamProvenance::ArgumentImplTrait => {

crates/hir-ty/src/generics.rs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
//!
33
//! The layout for generics as expected by chalk are as follows:
44
//! - Optional Self parameter
5-
//! - Type or Const parameters
65
//! - Lifetime parameters
6+
//! - Type or Const parameters
77
//! - Parent parameters
88
//!
99
//! where parent follows the same scheme.
@@ -20,19 +20,23 @@ use hir_def::{
2020
LocalLifetimeParamId, LocalTypeOrConstParamId, Lookup, TypeOrConstParamId, TypeParamId,
2121
};
2222
use intern::Interned;
23+
use itertools::chain;
2324
use stdx::TupleExt;
2425

2526
use crate::{db::HirDatabase, lt_to_placeholder_idx, to_placeholder_idx, Interner, Substitution};
2627

2728
pub(crate) fn generics(db: &dyn DefDatabase, def: GenericDefId) -> Generics {
2829
let parent_generics = parent_generic_def(db, def).map(|def| Box::new(generics(db, def)));
29-
Generics { def, params: db.generic_params(def), parent_generics }
30+
let params = db.generic_params(def);
31+
let has_trait_self_param = params.trait_self_param().is_some();
32+
Generics { def, params, parent_generics, has_trait_self_param }
3033
}
3134
#[derive(Clone, Debug)]
3235
pub(crate) struct Generics {
3336
def: GenericDefId,
3437
params: Interned<GenericParams>,
3538
parent_generics: Option<Box<Generics>>,
39+
has_trait_self_param: bool,
3640
}
3741

3842
impl<T> ops::Index<T> for Generics
@@ -74,10 +78,6 @@ impl Generics {
7478
self.params.iter_type_or_consts().map(from_toc_id(self)).map(TupleExt::head)
7579
}
7680

77-
pub(crate) fn iter_self_lt_id(&self) -> impl DoubleEndedIterator<Item = GenericParamId> + '_ {
78-
self.params.iter_lt().map(from_lt_id(self)).map(TupleExt::head)
79-
}
80-
8181
/// Iterate over the params followed by the parent params.
8282
pub(crate) fn iter(
8383
&self,
@@ -89,19 +89,19 @@ impl Generics {
8989
pub(crate) fn iter_self(
9090
&self,
9191
) -> impl DoubleEndedIterator<Item = (GenericParamId, GenericParamDataRef<'_>)> + '_ {
92-
self.params
93-
.iter_type_or_consts()
94-
.map(from_toc_id(self))
95-
.chain(self.params.iter_lt().map(from_lt_id(self)))
92+
let mut toc = self.params.iter_type_or_consts().map(from_toc_id(self));
93+
let trait_self_param = self.has_trait_self_param.then(|| toc.next()).flatten();
94+
chain!(trait_self_param, self.params.iter_lt().map(from_lt_id(self)), toc)
9695
}
9796

9897
/// Iterator over types and const params of parent.
9998
fn iter_parent(
10099
&self,
101100
) -> impl DoubleEndedIterator<Item = (GenericParamId, GenericParamDataRef<'_>)> + '_ {
102101
self.parent_generics().into_iter().flat_map(|it| {
103-
let lt_iter = it.params.iter_lt().map(from_lt_id(it));
104-
it.params.iter_type_or_consts().map(from_toc_id(it)).chain(lt_iter)
102+
let mut toc = it.params.iter_type_or_consts().map(from_toc_id(it));
103+
let trait_self_param = it.has_trait_self_param.then(|| toc.next()).flatten();
104+
chain!(trait_self_param, it.params.iter_lt().map(from_lt_id(it)), toc)
105105
})
106106
}
107107

@@ -145,8 +145,11 @@ impl Generics {
145145
fn find_type_or_const_param(&self, param: TypeOrConstParamId) -> Option<usize> {
146146
if param.parent == self.def {
147147
let idx = param.local_id.into_raw().into_u32() as usize;
148-
debug_assert!(idx <= self.params.type_or_consts.len());
149-
Some(idx)
148+
debug_assert!(idx <= self.params.len_type_or_consts());
149+
if self.params.trait_self_param() == Some(param.local_id) {
150+
return Some(idx);
151+
}
152+
Some(self.params.len_lifetimes() + idx)
150153
} else {
151154
debug_assert_eq!(self.parent_generics().map(|it| it.def), Some(param.parent));
152155
self.parent_generics()
@@ -163,8 +166,8 @@ impl Generics {
163166
fn find_lifetime(&self, lifetime: LifetimeParamId) -> Option<usize> {
164167
if lifetime.parent == self.def {
165168
let idx = lifetime.local_id.into_raw().into_u32() as usize;
166-
debug_assert!(idx <= self.params.lifetimes.len());
167-
Some(self.params.type_or_consts.len() + idx)
169+
debug_assert!(idx <= self.params.len_lifetimes());
170+
Some(self.params.trait_self_param().is_some() as usize + idx)
168171
} else {
169172
debug_assert_eq!(self.parent_generics().map(|it| it.def), Some(lifetime.parent));
170173
self.parent_generics()

0 commit comments

Comments
 (0)