Skip to content

Commit d02542d

Browse files
fill in todo
fmt
1 parent 7e91c31 commit d02542d

2 files changed

Lines changed: 35 additions & 3 deletions

File tree

crates/hir-ty/src/display.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,36 @@ use crate::{
6868
utils::{detect_variant_from_bytes, fn_traits},
6969
};
7070

71+
fn async_gen_item_ty_from_yield_ty<'db>(
72+
lang_items: &LangItems,
73+
yield_ty: Ty<'db>,
74+
) -> Option<Ty<'db>> {
75+
let poll_id = lang_items.Poll.map(hir_def::AdtId::EnumId)?;
76+
let option_id = lang_items.Option.map(hir_def::AdtId::EnumId)?;
77+
78+
let TyKind::Adt(poll_def, poll_args) = yield_ty.kind() else {
79+
return None;
80+
};
81+
if poll_def.inner().id != poll_id {
82+
return None;
83+
}
84+
let [poll_inner] = poll_args.as_slice() else {
85+
return None;
86+
};
87+
let poll_inner = poll_inner.ty()?;
88+
89+
let TyKind::Adt(option_def, option_args) = poll_inner.kind() else {
90+
return None;
91+
};
92+
if option_def.inner().id != option_id {
93+
return None;
94+
}
95+
let [item] = option_args.as_slice() else {
96+
return None;
97+
};
98+
item.ty()
99+
}
100+
71101
pub type Result<T = (), E = HirDisplayError> = std::result::Result<T, E>;
72102

73103
pub trait HirWrite: fmt::Write {
@@ -1787,7 +1817,9 @@ impl<'db> HirDisplay<'db> for Ty<'db> {
17871817
f.end_location_link();
17881818
}
17891819
write!(f, " = ")?;
1790-
yield_ty.hir_fmt(f)?;
1820+
let item_ty = async_gen_item_ty_from_yield_ty(f.lang_items(), yield_ty)
1821+
.unwrap_or(yield_ty);
1822+
item_ty.hir_fmt(f)?;
17911823
write!(f, ">")?;
17921824
}
17931825
hir_def::hir::Expr::Closure {

crates/hir-ty/src/tests/simple.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2115,10 +2115,10 @@ fn test(mut cx: Context<'_>) {
21152115
138..174 'async ... }': impl AsyncIterator<Item = i8>
21162116
158..167 'yield 1i8': ()
21172117
164..167 '1i8': i8
2118-
184..190 'result': {unknown}
2118+
184..190 'result': Poll<Option<i8>>
21192119
193..201 'Pin::new': fn new<&'? mut impl AsyncIterator<Item = i8>>(&'? mut impl AsyncIterator<Item = i8>) -> Pin<&'? mut impl AsyncIterator<Item = i8>>
21202120
193..217 'Pin::n...rator)': Pin<&'? mut impl AsyncIterator<Item = i8>>
2121-
193..236 'Pin::n...ut cx)': Poll<Option<<impl AsyncIterator<Item = i8> as AsyncIterator>::Item>>
2121+
193..236 'Pin::n...ut cx)': Poll<Option<i8>>
21222122
202..216 '&mut generator': &'? mut impl AsyncIterator<Item = i8>
21232123
207..216 'generator': impl AsyncIterator<Item = i8>
21242124
228..235 '&mut cx': &'? mut Context<'?>

0 commit comments

Comments
 (0)