diff options
author | Florian Diebold <[email protected]> | 2019-04-20 11:34:36 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-05-04 17:18:30 +0100 |
commit | b9c0c2abb79769852119dc9a595e63ee74eeba03 (patch) | |
tree | 39bf8f14438771f20337eaf57c421aebe3e7dfdb /crates/ra_hir/src/ty/lower.rs | |
parent | 6269791d3626b9a9e5ea6a11c15e14470c0809a0 (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.rs | 30 |
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. |
300 | fn type_for_fn(db: &impl HirDatabase, def: Function) -> Ty { | 305 | fn 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 | ||
376 | fn 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 | |||
387 | fn type_for_struct(db: &impl HirDatabase, s: Struct) -> Ty { | 381 | fn 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 | ||
392 | fn type_for_enum(db: &impl HirDatabase, s: Enum) -> Ty { | 386 | fn 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 | ||
397 | fn type_for_type_alias(db: &impl HirDatabase, t: TypeAlias) -> Ty { | 391 | fn 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 | } |