aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/lower.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-04-20 11:34:36 +0100
committerFlorian Diebold <[email protected]>2019-05-04 17:18:30 +0100
commitb9c0c2abb79769852119dc9a595e63ee74eeba03 (patch)
tree39bf8f14438771f20337eaf57c421aebe3e7dfdb /crates/ra_hir/src/ty/lower.rs
parent6269791d3626b9a9e5ea6a11c15e14470c0809a0 (diff)
Chalk integration
- add proper canonicalization logic - add conversions from/to Chalk IR
Diffstat (limited to 'crates/ra_hir/src/ty/lower.rs')
-rw-r--r--crates/ra_hir/src/ty/lower.rs30
1 files changed, 12 insertions, 18 deletions
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs
index 7fac084ce..2bbd17068 100644
--- a/crates/ra_hir/src/ty/lower.rs
+++ b/crates/ra_hir/src/ty/lower.rs
@@ -238,6 +238,11 @@ impl TraitRef {
238 let segment = path.segments.last().expect("path should have at least one segment"); 238 let segment = path.segments.last().expect("path should have at least one segment");
239 substs_from_path_segment(db, resolver, segment, &resolved.generic_params(db), true) 239 substs_from_path_segment(db, resolver, segment, &resolved.generic_params(db), true)
240 } 240 }
241
242 pub(crate) fn for_trait(db: &impl HirDatabase, trait_: Trait) -> TraitRef {
243 let substs = Substs::identity(&trait_.generic_params(db));
244 TraitRef { trait_, substs }
245 }
241} 246}
242 247
243/// Build the declared type of an item. This depends on the namespace; e.g. for 248/// Build the declared type of an item. This depends on the namespace; e.g. for
@@ -299,7 +304,7 @@ fn fn_sig_for_fn(db: &impl HirDatabase, def: Function) -> FnSig {
299/// function body. 304/// function body.
300fn type_for_fn(db: &impl HirDatabase, def: Function) -> Ty { 305fn type_for_fn(db: &impl HirDatabase, def: Function) -> Ty {
301 let generics = def.generic_params(db); 306 let generics = def.generic_params(db);
302 let substs = make_substs(&generics); 307 let substs = Substs::identity(&generics);
303 Ty::apply(TypeCtor::FnDef(def.into()), substs) 308 Ty::apply(TypeCtor::FnDef(def.into()), substs)
304} 309}
305 310
@@ -341,7 +346,7 @@ fn type_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> Ty {
341 return type_for_struct(db, def); // Unit struct 346 return type_for_struct(db, def); // Unit struct
342 } 347 }
343 let generics = def.generic_params(db); 348 let generics = def.generic_params(db);
344 let substs = make_substs(&generics); 349 let substs = Substs::identity(&generics);
345 Ty::apply(TypeCtor::FnDef(def.into()), substs) 350 Ty::apply(TypeCtor::FnDef(def.into()), substs)
346} 351}
347 352
@@ -357,7 +362,7 @@ fn fn_sig_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariant)
357 .map(|(_, field)| Ty::from_hir(db, &resolver, &field.type_ref)) 362 .map(|(_, field)| Ty::from_hir(db, &resolver, &field.type_ref))
358 .collect::<Vec<_>>(); 363 .collect::<Vec<_>>();
359 let generics = def.parent_enum(db).generic_params(db); 364 let generics = def.parent_enum(db).generic_params(db);
360 let substs = make_substs(&generics); 365 let substs = Substs::identity(&generics);
361 let ret = type_for_enum(db, def.parent_enum(db)).subst(&substs); 366 let ret = type_for_enum(db, def.parent_enum(db)).subst(&substs);
362 FnSig::from_params_and_return(params, ret) 367 FnSig::from_params_and_return(params, ret)
363} 368}
@@ -369,36 +374,25 @@ fn type_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariant) ->
369 return type_for_enum(db, def.parent_enum(db)); // Unit variant 374 return type_for_enum(db, def.parent_enum(db)); // Unit variant
370 } 375 }
371 let generics = def.parent_enum(db).generic_params(db); 376 let generics = def.parent_enum(db).generic_params(db);
372 let substs = make_substs(&generics); 377 let substs = Substs::identity(&generics);
373 Ty::apply(TypeCtor::FnDef(def.into()), substs) 378 Ty::apply(TypeCtor::FnDef(def.into()), substs)
374} 379}
375 380
376fn make_substs(generics: &GenericParams) -> Substs {
377 Substs(
378 generics
379 .params_including_parent()
380 .into_iter()
381 .map(|p| Ty::Param { idx: p.idx, name: p.name.clone() })
382 .collect::<Vec<_>>()
383 .into(),
384 )
385}
386
387fn type_for_struct(db: &impl HirDatabase, s: Struct) -> Ty { 381fn type_for_struct(db: &impl HirDatabase, s: Struct) -> Ty {
388 let generics = s.generic_params(db); 382 let generics = s.generic_params(db);
389 Ty::apply(TypeCtor::Adt(s.into()), make_substs(&generics)) 383 Ty::apply(TypeCtor::Adt(s.into()), Substs::identity(&generics))
390} 384}
391 385
392fn type_for_enum(db: &impl HirDatabase, s: Enum) -> Ty { 386fn type_for_enum(db: &impl HirDatabase, s: Enum) -> Ty {
393 let generics = s.generic_params(db); 387 let generics = s.generic_params(db);
394 Ty::apply(TypeCtor::Adt(s.into()), make_substs(&generics)) 388 Ty::apply(TypeCtor::Adt(s.into()), Substs::identity(&generics))
395} 389}
396 390
397fn type_for_type_alias(db: &impl HirDatabase, t: TypeAlias) -> Ty { 391fn type_for_type_alias(db: &impl HirDatabase, t: TypeAlias) -> Ty {
398 let generics = t.generic_params(db); 392 let generics = t.generic_params(db);
399 let resolver = t.resolver(db); 393 let resolver = t.resolver(db);
400 let type_ref = t.type_ref(db); 394 let type_ref = t.type_ref(db);
401 let substs = make_substs(&generics); 395 let substs = Substs::identity(&generics);
402 let inner = Ty::from_hir(db, &resolver, &type_ref); 396 let inner = Ty::from_hir(db, &resolver, &type_ref);
403 inner.subst(&substs) 397 inner.subst(&substs)
404} 398}