Skip to content

Commit c334e92

Browse files
committed
Preserve order of generic args
1 parent 9d473a0 commit c334e92

40 files changed

+718
-428
lines changed

crates/hir/src/attrs.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,9 @@ fn resolve_doc_path(
139139
AttrDefId::ImplId(it) => it.resolver(db.upcast()),
140140
AttrDefId::ExternBlockId(it) => it.resolver(db.upcast()),
141141
AttrDefId::GenericParamId(it) => match it {
142-
GenericParamId::TypeParamId(it) => it.parent,
142+
GenericParamId::TypeParamId(it) => it.parent(),
143+
GenericParamId::ConstParamId(it) => it.parent(),
143144
GenericParamId::LifetimeParamId(it) => it.parent,
144-
GenericParamId::ConstParamId(it) => it.parent,
145145
}
146146
.resolver(db.upcast()),
147147
// FIXME

crates/hir/src/display.rs

+40-25
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
//! HirDisplay implementations for various hir types.
22
use hir_def::{
33
adt::VariantData,
4-
generics::{TypeParamProvenance, WherePredicate, WherePredicateTypeTarget},
4+
generics::{
5+
TypeOrConstParamData, TypeParamProvenance, WherePredicate, WherePredicateTypeTarget,
6+
},
57
type_ref::{TypeBound, TypeRef},
68
AdtId, GenericDefId,
79
};
@@ -16,8 +18,8 @@ use syntax::SmolStr;
1618

1719
use crate::{
1820
Adt, Const, ConstParam, Enum, Field, Function, GenericParam, HasCrate, HasVisibility,
19-
LifetimeParam, Module, Static, Struct, Trait, TyBuilder, Type, TypeAlias, TypeParam, Union,
20-
Variant,
21+
LifetimeParam, Module, Static, Struct, Trait, TyBuilder, Type, TypeAlias, TypeOrConstParam,
22+
TypeParam, Union, Variant,
2123
};
2224

2325
impl HirDisplay for Function {
@@ -226,8 +228,17 @@ impl HirDisplay for GenericParam {
226228
fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
227229
match self {
228230
GenericParam::TypeParam(it) => it.hir_fmt(f),
229-
GenericParam::LifetimeParam(it) => it.hir_fmt(f),
230231
GenericParam::ConstParam(it) => it.hir_fmt(f),
232+
GenericParam::LifetimeParam(it) => it.hir_fmt(f),
233+
}
234+
}
235+
}
236+
237+
impl HirDisplay for TypeOrConstParam {
238+
fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
239+
match self.split(f.db) {
240+
either::Either::Left(x) => x.hir_fmt(f),
241+
either::Either::Right(x) => x.hir_fmt(f),
231242
}
232243
}
233244
}
@@ -239,11 +250,11 @@ impl HirDisplay for TypeParam {
239250
return Ok(());
240251
}
241252

242-
let bounds = f.db.generic_predicates_for_param(self.id.parent, self.id, None);
243-
let substs = TyBuilder::type_params_subst(f.db, self.id.parent);
253+
let bounds = f.db.generic_predicates_for_param(self.id.parent(), self.id.into(), None);
254+
let substs = TyBuilder::type_params_subst(f.db, self.id.parent());
244255
let predicates: Vec<_> =
245256
bounds.iter().cloned().map(|b| b.substitute(Interner, &substs)).collect();
246-
let krate = self.id.parent.krate(f.db).id;
257+
let krate = self.id.parent().krate(f.db).id;
247258
let sized_trait =
248259
f.db.lang_item(krate, SmolStr::new_inline("sized"))
249260
.and_then(|lang_item| lang_item.as_trait());
@@ -276,11 +287,11 @@ impl HirDisplay for ConstParam {
276287
fn write_generic_params(def: GenericDefId, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
277288
let params = f.db.generic_params(def);
278289
if params.lifetimes.is_empty()
279-
&& params.consts.is_empty()
280290
&& params
281291
.types
282292
.iter()
283-
.all(|(_, param)| !matches!(param.provenance, TypeParamProvenance::TypeParamList))
293+
.filter_map(|x| x.1.type_param())
294+
.all(|param| !matches!(param.provenance, TypeParamProvenance::TypeParamList))
284295
{
285296
return Ok(());
286297
}
@@ -300,23 +311,27 @@ fn write_generic_params(def: GenericDefId, f: &mut HirFormatter) -> Result<(), H
300311
write!(f, "{}", lifetime.name)?;
301312
}
302313
for (_, ty) in params.types.iter() {
303-
if ty.provenance != TypeParamProvenance::TypeParamList {
304-
continue;
305-
}
306-
if let Some(name) = &ty.name {
307-
delim(f)?;
308-
write!(f, "{}", name)?;
309-
if let Some(default) = &ty.default {
310-
write!(f, " = ")?;
311-
default.hir_fmt(f)?;
314+
if let Some(name) = &ty.name() {
315+
match ty {
316+
TypeOrConstParamData::TypeParamData(ty) => {
317+
if ty.provenance != TypeParamProvenance::TypeParamList {
318+
continue;
319+
}
320+
delim(f)?;
321+
write!(f, "{}", name)?;
322+
if let Some(default) = &ty.default {
323+
write!(f, " = ")?;
324+
default.hir_fmt(f)?;
325+
}
326+
}
327+
TypeOrConstParamData::ConstParamData(c) => {
328+
delim(f)?;
329+
write!(f, "const {}: ", name)?;
330+
c.ty.hir_fmt(f)?;
331+
}
312332
}
313333
}
314334
}
315-
for (_, konst) in params.consts.iter() {
316-
delim(f)?;
317-
write!(f, "const {}: ", konst.name)?;
318-
konst.ty.hir_fmt(f)?;
319-
}
320335

321336
write!(f, ">")?;
322337
Ok(())
@@ -328,7 +343,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter) -> Result<(), Hir
328343
// unnamed type targets are displayed inline with the argument itself, e.g. `f: impl Y`.
329344
let is_unnamed_type_target = |target: &WherePredicateTypeTarget| match target {
330345
WherePredicateTypeTarget::TypeRef(_) => false,
331-
WherePredicateTypeTarget::TypeParam(id) => params.types[*id].name.is_none(),
346+
WherePredicateTypeTarget::TypeOrConstParam(id) => params.types[*id].name().is_none(),
332347
};
333348

334349
let has_displayable_predicate = params
@@ -344,7 +359,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter) -> Result<(), Hir
344359

345360
let write_target = |target: &WherePredicateTypeTarget, f: &mut HirFormatter| match target {
346361
WherePredicateTypeTarget::TypeRef(ty) => ty.hir_fmt(f),
347-
WherePredicateTypeTarget::TypeParam(id) => match &params.types[*id].name {
362+
WherePredicateTypeTarget::TypeOrConstParam(id) => match &params.types[*id].name() {
348363
Some(name) => write!(f, "{}", name),
349364
None => write!(f, "{{unnamed}}"),
350365
},

crates/hir/src/from_id.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,10 @@ from_id![
4141
(hir_def::ConstId, crate::Const),
4242
(hir_def::FunctionId, crate::Function),
4343
(hir_def::ImplId, crate::Impl),
44+
(hir_def::TypeOrConstParamId, crate::TypeOrConstParam),
4445
(hir_def::TypeParamId, crate::TypeParam),
45-
(hir_def::LifetimeParamId, crate::LifetimeParam),
4646
(hir_def::ConstParamId, crate::ConstParam),
47+
(hir_def::LifetimeParamId, crate::LifetimeParam),
4748
(hir_expand::MacroDefId, crate::MacroDef)
4849
];
4950

@@ -71,18 +72,18 @@ impl From<GenericParamId> for GenericParam {
7172
fn from(id: GenericParamId) -> Self {
7273
match id {
7374
GenericParamId::TypeParamId(it) => GenericParam::TypeParam(it.into()),
74-
GenericParamId::LifetimeParamId(it) => GenericParam::LifetimeParam(it.into()),
7575
GenericParamId::ConstParamId(it) => GenericParam::ConstParam(it.into()),
76+
GenericParamId::LifetimeParamId(it) => GenericParam::LifetimeParam(it.into()),
7677
}
7778
}
7879
}
7980

8081
impl From<GenericParam> for GenericParamId {
8182
fn from(id: GenericParam) -> Self {
8283
match id {
83-
GenericParam::TypeParam(it) => GenericParamId::TypeParamId(it.id),
8484
GenericParam::LifetimeParam(it) => GenericParamId::LifetimeParamId(it.id),
85-
GenericParam::ConstParam(it) => GenericParamId::ConstParamId(it.id),
85+
GenericParam::ConstParam(it) => GenericParamId::ConstParamId(it.id.into()),
86+
GenericParam::TypeParam(it) => GenericParamId::TypeParamId(it.id.into()),
8687
}
8788
}
8889
}

crates/hir/src/has_source.rs

+4-12
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ use hir_expand::InFile;
1010
use syntax::ast;
1111

1212
use crate::{
13-
db::HirDatabase, Adt, Const, ConstParam, Enum, Field, FieldSource, Function, Impl,
14-
LifetimeParam, MacroDef, Module, Static, Struct, Trait, TypeAlias, TypeParam, Union, Variant,
13+
db::HirDatabase, Adt, Const, Enum, Field, FieldSource, Function, Impl, LifetimeParam, MacroDef,
14+
Module, Static, Struct, Trait, TypeAlias, TypeOrConstParam, Union, Variant,
1515
};
1616

1717
pub trait HasSource {
@@ -139,8 +139,8 @@ impl HasSource for Impl {
139139
}
140140
}
141141

142-
impl HasSource for TypeParam {
143-
type Ast = Either<ast::TypeParam, ast::Trait>;
142+
impl HasSource for TypeOrConstParam {
143+
type Ast = Either<ast::TypeOrConstParam, ast::Trait>;
144144
fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
145145
let child_source = self.id.parent.child_source(db.upcast());
146146
Some(child_source.map(|it| it[self.id.local_id].clone()))
@@ -154,11 +154,3 @@ impl HasSource for LifetimeParam {
154154
Some(child_source.map(|it| it[self.id.local_id].clone()))
155155
}
156156
}
157-
158-
impl HasSource for ConstParam {
159-
type Ast = ast::ConstParam;
160-
fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
161-
let child_source = self.id.parent.child_source(db.upcast());
162-
Some(child_source.map(|it| it[self.id.local_id].clone()))
163-
}
164-
}

0 commit comments

Comments
 (0)