File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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+
71101pub type Result < T = ( ) , E = HirDisplayError > = std:: result:: Result < T , E > ;
72102
73103pub 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 {
Original file line number Diff line number Diff 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<'?>
You can’t perform that action at this time.
0 commit comments