@@ -20,6 +20,7 @@ use hir_def::{
2020} ;
2121use hir_expand:: { hygiene:: Hygiene , name:: Name } ;
2222use itertools:: Itertools ;
23+ use smallvec:: SmallVec ;
2324use syntax:: SmolStr ;
2425
2526use crate :: {
@@ -221,6 +222,7 @@ pub enum DisplaySourceCodeError {
221222 PathNotFound ,
222223 UnknownType ,
223224 Closure ,
225+ Generator ,
224226}
225227
226228pub enum HirDisplayError {
@@ -782,7 +784,34 @@ impl HirDisplay for Ty {
782784 write ! ( f, "{{unknown}}" ) ?;
783785 }
784786 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+ }
786815 TyKind :: GeneratorWitness ( ..) => write ! ( f, "{{generator witness}}" ) ?,
787816 }
788817 Ok ( ( ) )
0 commit comments