Skip to content

Commit 58a3b3b

Browse files
bors[bot]matklad
andauthored
Merge #2404
2404: Use TypeAliasId in Ty, pt 2 r=matklad a=matklad Co-authored-by: Aleksey Kladov <[email protected]>
2 parents ecd1204 + 1a0da6d commit 58a3b3b

File tree

7 files changed

+70
-62
lines changed

7 files changed

+70
-62
lines changed

crates/ra_hir/src/code_model.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -538,14 +538,6 @@ pub enum DefWithBody {
538538
impl_froms!(DefWithBody: Function, Const, Static);
539539

540540
impl DefWithBody {
541-
pub(crate) fn krate(self, db: &impl HirDatabase) -> Option<Crate> {
542-
match self {
543-
DefWithBody::Const(c) => c.krate(db),
544-
DefWithBody::Function(f) => f.krate(db),
545-
DefWithBody::Static(s) => s.krate(db),
546-
}
547-
}
548-
549541
pub fn module(self, db: &impl HirDatabase) -> Module {
550542
match self {
551543
DefWithBody::Const(c) => c.module(db),

crates/ra_hir/src/ty.rs

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ use std::ops::Deref;
1717
use std::sync::Arc;
1818
use std::{fmt, iter, mem};
1919

20-
use hir_def::{generics::GenericParams, AdtId, GenericDefId};
20+
use hir_def::{
21+
generics::GenericParams, AdtId, ContainerId, DefWithBodyId, GenericDefId, HasModule, Lookup,
22+
TraitId, TypeAliasId,
23+
};
2124
use ra_db::{impl_intern_key, salsa};
2225

2326
use crate::{
24-
db::HirDatabase, expr::ExprId, util::make_mut_slice, Adt, Crate, DefWithBody, FloatTy, IntTy,
25-
Mutability, Name, Trait, TypeAlias, Uncertain,
27+
db::HirDatabase, expr::ExprId, util::make_mut_slice, Adt, Crate, FloatTy, IntTy, Mutability,
28+
Name, Trait, Uncertain,
2629
};
2730
use display::{HirDisplay, HirFormatter};
2831

@@ -107,13 +110,13 @@ pub enum TypeCtor {
107110
/// when we have tried to normalize a projection like `T::Item` but
108111
/// couldn't find a better representation. In that case, we generate
109112
/// an **application type** like `(Iterator::Item)<T>`.
110-
AssociatedType(TypeAlias),
113+
AssociatedType(TypeAliasId),
111114

112115
/// The type of a specific closure.
113116
///
114117
/// The closure signature is stored in a `FnPtr` type in the first type
115118
/// parameter.
116-
Closure { def: DefWithBody, expr: ExprId },
119+
Closure { def: DefWithBodyId, expr: ExprId },
117120
}
118121

119122
/// This exists just for Chalk, because Chalk just has a single `StructId` where
@@ -147,7 +150,7 @@ impl TypeCtor {
147150
generic_params.count_params_including_parent()
148151
}
149152
TypeCtor::AssociatedType(type_alias) => {
150-
let generic_params = db.generic_params(type_alias.id.into());
153+
let generic_params = db.generic_params(type_alias.into());
151154
generic_params.count_params_including_parent()
152155
}
153156
TypeCtor::FnPtr { num_args } => num_args as usize + 1,
@@ -169,10 +172,13 @@ impl TypeCtor {
169172
| TypeCtor::Ref(_)
170173
| TypeCtor::FnPtr { .. }
171174
| TypeCtor::Tuple { .. } => None,
172-
TypeCtor::Closure { def, .. } => def.krate(db),
175+
// Closure's krate is irrelevant for coherence I would think?
176+
TypeCtor::Closure { .. } => None,
173177
TypeCtor::Adt(adt) => adt.krate(db),
174178
TypeCtor::FnDef(callable) => Some(callable.krate(db).into()),
175-
TypeCtor::AssociatedType(type_alias) => type_alias.krate(db),
179+
TypeCtor::AssociatedType(type_alias) => {
180+
Some(type_alias.lookup(db).module(db).krate.into())
181+
}
176182
}
177183
}
178184

@@ -193,7 +199,7 @@ impl TypeCtor {
193199
| TypeCtor::Closure { .. } => None,
194200
TypeCtor::Adt(adt) => Some(adt.into()),
195201
TypeCtor::FnDef(callable) => Some(callable.into()),
196-
TypeCtor::AssociatedType(type_alias) => Some(type_alias.id.into()),
202+
TypeCtor::AssociatedType(type_alias) => Some(type_alias.into()),
197203
}
198204
}
199205
}
@@ -212,18 +218,19 @@ pub struct ApplicationTy {
212218
/// trait and all its parameters are fully known.
213219
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
214220
pub struct ProjectionTy {
215-
pub associated_ty: TypeAlias,
221+
pub associated_ty: TypeAliasId,
216222
pub parameters: Substs,
217223
}
218224

219225
impl ProjectionTy {
220226
pub fn trait_ref(&self, db: &impl HirDatabase) -> TraitRef {
221-
TraitRef {
222-
trait_: self
223-
.associated_ty
224-
.parent_trait(db)
225-
.expect("projection ty without parent trait"),
226-
substs: self.parameters.clone(),
227+
TraitRef { trait_: self.trait_(db).into(), substs: self.parameters.clone() }
228+
}
229+
230+
fn trait_(&self, db: &impl HirDatabase) -> TraitId {
231+
match self.associated_ty.lookup(db).container {
232+
ContainerId::TraitId(it) => it,
233+
_ => panic!("projection ty without parent trait"),
227234
}
228235
}
229236
}
@@ -895,11 +902,12 @@ impl HirDisplay for ApplicationTy {
895902
}
896903
}
897904
TypeCtor::AssociatedType(type_alias) => {
898-
let trait_name = type_alias
899-
.parent_trait(f.db)
900-
.and_then(|t| t.name(f.db))
901-
.unwrap_or_else(Name::missing);
902-
let name = type_alias.name(f.db);
905+
let trait_ = match type_alias.lookup(f.db).container {
906+
ContainerId::TraitId(it) => it,
907+
_ => panic!("not an associated type"),
908+
};
909+
let trait_name = f.db.trait_data(trait_).name.clone().unwrap_or_else(Name::missing);
910+
let name = f.db.type_alias_data(type_alias).name.clone();
903911
write!(f, "{}::{}", trait_name, name)?;
904912
if self.parameters.len() > 0 {
905913
write!(f, "<")?;
@@ -926,18 +934,15 @@ impl HirDisplay for ProjectionTy {
926934
return write!(f, "…");
927935
}
928936

929-
let trait_name = self
930-
.associated_ty
931-
.parent_trait(f.db)
932-
.and_then(|t| t.name(f.db))
933-
.unwrap_or_else(Name::missing);
937+
let trait_name =
938+
f.db.trait_data(self.trait_(f.db)).name.clone().unwrap_or_else(Name::missing);
934939
write!(f, "<{} as {}", self.parameters[0].display(f.db), trait_name,)?;
935940
if self.parameters.len() > 1 {
936941
write!(f, "<")?;
937942
f.write_joined(&self.parameters[1..], ", ")?;
938943
write!(f, ">")?;
939944
}
940-
write!(f, ">::{}", self.associated_ty.name(f.db))?;
945+
write!(f, ">::{}", f.db.type_alias_data(self.associated_ty).name)?;
941946
Ok(())
942947
}
943948
}
@@ -1000,7 +1005,10 @@ impl HirDisplay for Ty {
10001005
write!(f, "<")?;
10011006
angle_open = true;
10021007
}
1003-
let name = projection_pred.projection_ty.associated_ty.name(f.db);
1008+
let name =
1009+
f.db.type_alias_data(projection_pred.projection_ty.associated_ty)
1010+
.name
1011+
.clone();
10041012
write!(f, "{} = ", name)?;
10051013
projection_pred.ty.hir_fmt(f)?;
10061014
}
@@ -1076,7 +1084,7 @@ impl HirDisplay for GenericPredicate {
10761084
write!(
10771085
f,
10781086
">::{} = {}",
1079-
projection_pred.projection_ty.associated_ty.name(f.db),
1087+
f.db.type_alias_data(projection_pred.projection_ty.associated_ty).name,
10801088
projection_pred.ty.display(f.db)
10811089
)?;
10821090
}

crates/ra_hir/src/ty/autoderef.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ fn deref_by_trait(
6969

7070
let projection = super::traits::ProjectionPredicate {
7171
ty: Ty::Bound(0),
72-
projection_ty: super::ProjectionTy { associated_ty: target, parameters },
72+
projection_ty: super::ProjectionTy { associated_ty: target.id, parameters },
7373
};
7474

7575
let obligation = super::Obligation::Projection(projection);

crates/ra_hir/src/ty/infer/expr.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
101101
let projection = ProjectionPredicate {
102102
ty: pat_ty.clone(),
103103
projection_ty: ProjectionTy {
104-
associated_ty: into_iter_item_alias,
104+
associated_ty: into_iter_item_alias.id,
105105
parameters: Substs::single(iterable_ty),
106106
},
107107
};
@@ -137,8 +137,10 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
137137
TypeCtor::FnPtr { num_args: sig_tys.len() as u16 - 1 },
138138
Substs(sig_tys.into()),
139139
);
140-
let closure_ty =
141-
Ty::apply_one(TypeCtor::Closure { def: self.owner, expr: tgt_expr }, sig_ty);
140+
let closure_ty = Ty::apply_one(
141+
TypeCtor::Closure { def: self.owner.into(), expr: tgt_expr },
142+
sig_ty,
143+
);
142144

143145
// Eagerly try to relate the closure type with the expected
144146
// type, otherwise we often won't have enough information to
@@ -281,7 +283,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
281283
let projection = ProjectionPredicate {
282284
ty: ty.clone(),
283285
projection_ty: ProjectionTy {
284-
associated_ty: future_future_output_alias,
286+
associated_ty: future_future_output_alias.id,
285287
parameters: Substs::single(inner_ty),
286288
},
287289
};
@@ -300,7 +302,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
300302
let projection = ProjectionPredicate {
301303
ty: ty.clone(),
302304
projection_ty: ProjectionTy {
303-
associated_ty: ops_try_ok_alias,
305+
associated_ty: ops_try_ok_alias.id,
304306
parameters: Substs::single(inner_ty),
305307
},
306308
};

crates/ra_hir/src/ty/lower.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ impl Ty {
176176
Some(associated_ty) => {
177177
// FIXME handle type parameters on the segment
178178
Ty::Projection(ProjectionTy {
179-
associated_ty,
179+
associated_ty: associated_ty.id,
180180
parameters: trait_ref.substs,
181181
})
182182
}
@@ -268,7 +268,10 @@ impl Ty {
268268
.fill_with_unknown()
269269
.build();
270270
// FIXME handle type parameters on the segment
271-
return Ty::Projection(ProjectionTy { associated_ty, parameters: substs });
271+
return Ty::Projection(ProjectionTy {
272+
associated_ty: associated_ty.id,
273+
parameters: substs,
274+
});
272275
}
273276
}
274277
Ty::Unknown
@@ -508,7 +511,7 @@ fn assoc_type_bindings_from_type_bound<'a>(
508511
let associated_ty =
509512
match trait_ref.trait_.associated_type_by_name_including_super_traits(db, &name) {
510513
None => return GenericPredicate::Error,
511-
Some(t) => t,
514+
Some(t) => t.id,
512515
};
513516
let projection_ty =
514517
ProjectionTy { associated_ty, parameters: trait_ref.substs.clone() };

crates/ra_hir/src/ty/traits.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
use std::sync::{Arc, Mutex};
33

44
use chalk_ir::{cast::Cast, family::ChalkIr};
5+
use hir_def::DefWithBodyId;
56
use log::debug;
67
use ra_db::{impl_intern_key, salsa};
78
use ra_prof::profile;
89
use rustc_hash::FxHashSet;
910

1011
use super::{Canonical, GenericPredicate, HirDisplay, ProjectionTy, TraitRef, Ty, TypeWalk};
11-
use crate::{db::HirDatabase, expr::ExprId, Crate, DefWithBody, ImplBlock, Trait, TypeAlias};
12+
use crate::{db::HirDatabase, expr::ExprId, Crate, ImplBlock, Trait, TypeAlias};
1213

1314
use self::chalk::{from_chalk, ToChalk};
1415

@@ -290,7 +291,7 @@ impl FnTrait {
290291

291292
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
292293
pub struct ClosureFnTraitImplData {
293-
def: DefWithBody,
294+
def: DefWithBodyId,
294295
expr: ExprId,
295296
fn_trait: FnTrait,
296297
}

crates/ra_hir/src/ty/traits/chalk.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use chalk_ir::{
99
};
1010
use chalk_rust_ir::{AssociatedTyDatum, AssociatedTyValue, ImplDatum, StructDatum, TraitDatum};
1111

12-
use hir_def::{lang_item::LangItemTarget, GenericDefId};
12+
use hir_def::{lang_item::LangItemTarget, ContainerId, GenericDefId, Lookup, TypeAliasId};
1313
use hir_expand::name;
1414

1515
use ra_db::salsa::{InternId, InternKey};
@@ -203,15 +203,15 @@ impl ToChalk for Impl {
203203
}
204204
}
205205

206-
impl ToChalk for TypeAlias {
206+
impl ToChalk for TypeAliasId {
207207
type Chalk = chalk_ir::TypeId;
208208

209209
fn to_chalk(self, _db: &impl HirDatabase) -> chalk_ir::TypeId {
210-
chalk_ir::TypeId(id_to_chalk(self.id))
210+
chalk_ir::TypeId(id_to_chalk(self))
211211
}
212212

213-
fn from_chalk(_db: &impl HirDatabase, type_alias_id: chalk_ir::TypeId) -> TypeAlias {
214-
TypeAlias { id: id_from_chalk(type_alias_id.0) }
213+
fn from_chalk(_db: &impl HirDatabase, type_alias_id: chalk_ir::TypeId) -> TypeAliasId {
214+
id_from_chalk(type_alias_id.0)
215215
}
216216
}
217217

@@ -504,21 +504,21 @@ pub(crate) fn associated_ty_data_query(
504504
id: TypeId,
505505
) -> Arc<AssociatedTyDatum<ChalkIr>> {
506506
debug!("associated_ty_data {:?}", id);
507-
let type_alias: TypeAlias = from_chalk(db, id);
508-
let trait_ = match type_alias.container(db) {
509-
Some(crate::Container::Trait(t)) => t,
507+
let type_alias: TypeAliasId = from_chalk(db, id);
508+
let trait_ = match type_alias.lookup(db).container {
509+
ContainerId::TraitId(t) => t,
510510
_ => panic!("associated type not in trait"),
511511
};
512-
let generic_params = db.generic_params(type_alias.id.into());
512+
let generic_params = db.generic_params(type_alias.into());
513513
let bound_data = chalk_rust_ir::AssociatedTyDatumBound {
514514
// FIXME add bounds and where clauses
515515
bounds: vec![],
516516
where_clauses: vec![],
517517
};
518518
let datum = AssociatedTyDatum {
519-
trait_id: trait_.to_chalk(db),
519+
trait_id: Trait::from(trait_).to_chalk(db),
520520
id,
521-
name: lalrpop_intern::intern(&type_alias.name(db).to_string()),
521+
name: lalrpop_intern::intern(&db.type_alias_data(type_alias).name.to_string()),
522522
binders: make_binders(bound_data, generic_params.count_params_including_parent()),
523523
};
524524
Arc::new(datum)
@@ -566,7 +566,7 @@ pub(crate) fn trait_datum_query(
566566
.items(db)
567567
.into_iter()
568568
.filter_map(|trait_item| match trait_item {
569-
crate::AssocItem::TypeAlias(type_alias) => Some(type_alias),
569+
crate::AssocItem::TypeAlias(type_alias) => Some(type_alias.id),
570570
_ => None,
571571
})
572572
.map(|type_alias| type_alias.to_chalk(db))
@@ -785,7 +785,8 @@ fn type_alias_associated_ty_value(
785785
.trait_;
786786
let assoc_ty = trait_
787787
.associated_type_by_name(db, &type_alias.name(db))
788-
.expect("assoc ty value should not exist"); // validated when building the impl data as well
788+
.expect("assoc ty value should not exist") // validated when building the impl data as well
789+
.id;
789790
let generic_params = db.generic_params(impl_block.id.into());
790791
let bound_vars = Substs::bound_vars(&generic_params);
791792
let ty = db.type_for_def(type_alias.into(), crate::ty::Namespace::Types).subst(&bound_vars);
@@ -820,7 +821,8 @@ fn closure_fn_trait_output_assoc_ty_value(
820821

821822
let output_ty_id = fn_once_trait
822823
.associated_type_by_name(db, &name::OUTPUT_TYPE)
823-
.expect("assoc ty value should not exist");
824+
.expect("assoc ty value should not exist")
825+
.id;
824826

825827
let value_bound = chalk_rust_ir::AssociatedTyValueBound { ty: output_ty.to_chalk(db) };
826828

0 commit comments

Comments
 (0)