diff options
Diffstat (limited to 'crates/hir_ty/src/display.rs')
-rw-r--r-- | crates/hir_ty/src/display.rs | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/crates/hir_ty/src/display.rs b/crates/hir_ty/src/display.rs index 0a13c8636..e6473586b 100644 --- a/crates/hir_ty/src/display.rs +++ b/crates/hir_ty/src/display.rs | |||
@@ -13,7 +13,7 @@ use hir_expand::name::Name; | |||
13 | use crate::{ | 13 | use crate::{ |
14 | db::HirDatabase, from_assoc_type_id, from_foreign_def_id, from_placeholder_idx, primitive, | 14 | db::HirDatabase, from_assoc_type_id, from_foreign_def_id, from_placeholder_idx, primitive, |
15 | to_assoc_type_id, traits::chalk::from_chalk, utils::generics, AdtId, AliasTy, CallableDefId, | 15 | to_assoc_type_id, traits::chalk::from_chalk, utils::generics, AdtId, AliasTy, CallableDefId, |
16 | CallableSig, GenericPredicate, Interner, Lifetime, Obligation, OpaqueTy, OpaqueTyId, | 16 | CallableSig, GenericPredicate, ImplTraitId, Interner, Lifetime, Obligation, OpaqueTy, |
17 | ProjectionTy, Scalar, Substs, TraitRef, Ty, TyKind, | 17 | ProjectionTy, Scalar, Substs, TraitRef, Ty, TyKind, |
18 | }; | 18 | }; |
19 | 19 | ||
@@ -313,22 +313,26 @@ impl HirDisplay for Ty { | |||
313 | )?; | 313 | )?; |
314 | } | 314 | } |
315 | 315 | ||
316 | // FIXME: all this just to decide whether to use parentheses... | ||
316 | let datas; | 317 | let datas; |
317 | let predicates = match t.interned(&Interner) { | 318 | let predicates = match t.interned(&Interner) { |
318 | TyKind::Dyn(predicates) if predicates.len() > 1 => { | 319 | TyKind::Dyn(predicates) if predicates.len() > 1 => { |
319 | Cow::Borrowed(predicates.as_ref()) | 320 | Cow::Borrowed(predicates.as_ref()) |
320 | } | 321 | } |
321 | &TyKind::Alias(AliasTy::Opaque(OpaqueTy { | 322 | &TyKind::Alias(AliasTy::Opaque(OpaqueTy { opaque_ty_id, ref parameters })) => { |
322 | opaque_ty_id: OpaqueTyId::ReturnTypeImplTrait(func, idx), | 323 | let impl_trait_id = f.db.lookup_intern_impl_trait_id(opaque_ty_id.into()); |
323 | ref parameters, | 324 | if let ImplTraitId::ReturnTypeImplTrait(func, idx) = impl_trait_id { |
324 | })) => { | 325 | datas = |
325 | datas = | 326 | f.db.return_type_impl_traits(func) |
326 | f.db.return_type_impl_traits(func).expect("impl trait id without data"); | 327 | .expect("impl trait id without data"); |
327 | let data = (*datas) | 328 | let data = (*datas) |
328 | .as_ref() | 329 | .as_ref() |
329 | .map(|rpit| rpit.impl_traits[idx as usize].bounds.clone()); | 330 | .map(|rpit| rpit.impl_traits[idx as usize].bounds.clone()); |
330 | let bounds = data.subst(parameters); | 331 | let bounds = data.subst(parameters); |
331 | Cow::Owned(bounds.value) | 332 | Cow::Owned(bounds.value) |
333 | } else { | ||
334 | Cow::Borrowed(&[][..]) | ||
335 | } | ||
332 | } | 336 | } |
333 | _ => Cow::Borrowed(&[][..]), | 337 | _ => Cow::Borrowed(&[][..]), |
334 | }; | 338 | }; |
@@ -499,8 +503,9 @@ impl HirDisplay for Ty { | |||
499 | write!(f, "{}", type_alias.name)?; | 503 | write!(f, "{}", type_alias.name)?; |
500 | } | 504 | } |
501 | TyKind::OpaqueType(opaque_ty_id, parameters) => { | 505 | TyKind::OpaqueType(opaque_ty_id, parameters) => { |
502 | match opaque_ty_id { | 506 | let impl_trait_id = f.db.lookup_intern_impl_trait_id((*opaque_ty_id).into()); |
503 | &OpaqueTyId::ReturnTypeImplTrait(func, idx) => { | 507 | match impl_trait_id { |
508 | ImplTraitId::ReturnTypeImplTrait(func, idx) => { | ||
504 | let datas = | 509 | let datas = |
505 | f.db.return_type_impl_traits(func).expect("impl trait id without data"); | 510 | f.db.return_type_impl_traits(func).expect("impl trait id without data"); |
506 | let data = (*datas) | 511 | let data = (*datas) |
@@ -510,7 +515,7 @@ impl HirDisplay for Ty { | |||
510 | write_bounds_like_dyn_trait_with_prefix("impl", &bounds.value, f)?; | 515 | write_bounds_like_dyn_trait_with_prefix("impl", &bounds.value, f)?; |
511 | // FIXME: it would maybe be good to distinguish this from the alias type (when debug printing), and to show the substitution | 516 | // FIXME: it would maybe be good to distinguish this from the alias type (when debug printing), and to show the substitution |
512 | } | 517 | } |
513 | OpaqueTyId::AsyncBlockTypeImplTrait(..) => { | 518 | ImplTraitId::AsyncBlockTypeImplTrait(..) => { |
514 | write!(f, "impl Future<Output = ")?; | 519 | write!(f, "impl Future<Output = ")?; |
515 | parameters[0].hir_fmt(f)?; | 520 | parameters[0].hir_fmt(f)?; |
516 | write!(f, ">")?; | 521 | write!(f, ">")?; |
@@ -566,8 +571,9 @@ impl HirDisplay for Ty { | |||
566 | } | 571 | } |
567 | TyKind::Alias(AliasTy::Projection(p_ty)) => p_ty.hir_fmt(f)?, | 572 | TyKind::Alias(AliasTy::Projection(p_ty)) => p_ty.hir_fmt(f)?, |
568 | TyKind::Alias(AliasTy::Opaque(opaque_ty)) => { | 573 | TyKind::Alias(AliasTy::Opaque(opaque_ty)) => { |
569 | match opaque_ty.opaque_ty_id { | 574 | let impl_trait_id = f.db.lookup_intern_impl_trait_id(opaque_ty.opaque_ty_id.into()); |
570 | OpaqueTyId::ReturnTypeImplTrait(func, idx) => { | 575 | match impl_trait_id { |
576 | ImplTraitId::ReturnTypeImplTrait(func, idx) => { | ||
571 | let datas = | 577 | let datas = |
572 | f.db.return_type_impl_traits(func).expect("impl trait id without data"); | 578 | f.db.return_type_impl_traits(func).expect("impl trait id without data"); |
573 | let data = (*datas) | 579 | let data = (*datas) |
@@ -576,7 +582,7 @@ impl HirDisplay for Ty { | |||
576 | let bounds = data.subst(&opaque_ty.parameters); | 582 | let bounds = data.subst(&opaque_ty.parameters); |
577 | write_bounds_like_dyn_trait_with_prefix("impl", &bounds.value, f)?; | 583 | write_bounds_like_dyn_trait_with_prefix("impl", &bounds.value, f)?; |
578 | } | 584 | } |
579 | OpaqueTyId::AsyncBlockTypeImplTrait(..) => { | 585 | ImplTraitId::AsyncBlockTypeImplTrait(..) => { |
580 | write!(f, "{{async block}}")?; | 586 | write!(f, "{{async block}}")?; |
581 | } | 587 | } |
582 | }; | 588 | }; |