@@ -20,6 +20,7 @@ use hir_def::{
20
20
} ;
21
21
use hir_expand:: { hygiene:: Hygiene , name:: Name } ;
22
22
use itertools:: Itertools ;
23
+ use smallvec:: SmallVec ;
23
24
use syntax:: SmolStr ;
24
25
25
26
use crate :: {
@@ -221,6 +222,7 @@ pub enum DisplaySourceCodeError {
221
222
PathNotFound ,
222
223
UnknownType ,
223
224
Closure ,
225
+ Generator ,
224
226
}
225
227
226
228
pub enum HirDisplayError {
@@ -782,7 +784,34 @@ impl HirDisplay for Ty {
782
784
write ! ( f, "{{unknown}}" ) ?;
783
785
}
784
786
TyKind :: InferenceVar ( ..) => write ! ( f, "_" ) ?,
785
- TyKind :: Generator ( ..) => write ! ( f, "{{generator}}" ) ?,
787
+ TyKind :: Generator ( _, subst) => {
788
+ if f. display_target . is_source_code ( ) {
789
+ return Err ( HirDisplayError :: DisplaySourceCodeError (
790
+ DisplaySourceCodeError :: Generator ,
791
+ ) ) ;
792
+ }
793
+
794
+ let subst = subst. as_slice ( Interner ) ;
795
+ let a: Option < SmallVec < [ & Ty ; 3 ] > > = subst
796
+ . get ( subst. len ( ) - 3 ..)
797
+ . map ( |args| args. iter ( ) . map ( |arg| arg. ty ( Interner ) ) . collect ( ) )
798
+ . flatten ( ) ;
799
+
800
+ if let Some ( [ resume_ty, yield_ty, ret_ty] ) = a. as_deref ( ) {
801
+ write ! ( f, "|" ) ?;
802
+ resume_ty. hir_fmt ( f) ?;
803
+ write ! ( f, "|" ) ?;
804
+
805
+ write ! ( f, " yields " ) ?;
806
+ yield_ty. hir_fmt ( f) ?;
807
+
808
+ write ! ( f, " -> " ) ?;
809
+ ret_ty. hir_fmt ( f) ?;
810
+ } else {
811
+ // This *should* be unreachable, but fallback just in case.
812
+ write ! ( f, "{{generator}}" ) ?;
813
+ }
814
+ }
786
815
TyKind :: GeneratorWitness ( ..) => write ! ( f, "{{generator witness}}" ) ?,
787
816
}
788
817
Ok ( ( ) )
0 commit comments