Skip to content

Commit 9ede5f0

Browse files
committed
Implement HirDisplay for TyKind::Generator
1 parent 4b5a66e commit 9ede5f0

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

crates/hir-ty/src/display.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use hir_def::{
2020
};
2121
use hir_expand::{hygiene::Hygiene, name::Name};
2222
use itertools::Itertools;
23+
use smallvec::SmallVec;
2324
use syntax::SmolStr;
2425

2526
use crate::{
@@ -221,6 +222,7 @@ pub enum DisplaySourceCodeError {
221222
PathNotFound,
222223
UnknownType,
223224
Closure,
225+
Generator,
224226
}
225227

226228
pub 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(())

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,8 +1944,8 @@ fn test() {
19441944
70..71 'v': i64
19451945
78..80 '{}': ()
19461946
91..362 '{ ... } }': ()
1947-
101..106 'mut g': {generator}
1948-
109..218 '|r| { ... }': {generator}
1947+
101..106 'mut g': |usize| yields i64 -> &str
1948+
109..218 '|r| { ... }': |usize| yields i64 -> &str
19491949
110..111 'r': usize
19501950
113..218 '{ ... }': &str
19511951
127..128 'a': usize
@@ -1959,11 +1959,11 @@ fn test() {
19591959
187..188 '2': i64
19601960
198..212 '"return value"': &str
19611961
225..360 'match ... }': ()
1962-
231..239 'Pin::new': fn new<&mut {generator}>(&mut {generator}) -> Pin<&mut {generator}>
1963-
231..247 'Pin::n...mut g)': Pin<&mut {generator}>
1962+
231..239 'Pin::new': fn new<&mut |usize| yields i64 -> &str>(&mut |usize| yields i64 -> &str) -> Pin<&mut |usize| yields i64 -> &str>
1963+
231..247 'Pin::n...mut g)': Pin<&mut |usize| yields i64 -> &str>
19641964
231..262 'Pin::n...usize)': GeneratorState<i64, &str>
1965-
240..246 '&mut g': &mut {generator}
1966-
245..246 'g': {generator}
1965+
240..246 '&mut g': &mut |usize| yields i64 -> &str
1966+
245..246 'g': |usize| yields i64 -> &str
19671967
255..261 '0usize': usize
19681968
273..299 'Genera...ded(y)': GeneratorState<i64, &str>
19691969
297..298 'y': i64

0 commit comments

Comments
 (0)