Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/tests/simple.rs')
| -rw-r--r-- | crates/hir-ty/src/tests/simple.rs | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/crates/hir-ty/src/tests/simple.rs b/crates/hir-ty/src/tests/simple.rs index fb46e4b58b..1e75c31fa1 100644 --- a/crates/hir-ty/src/tests/simple.rs +++ b/crates/hir-ty/src/tests/simple.rs @@ -2066,6 +2066,138 @@ fn test() { } #[test] +fn gen_block_types_inferred() { + check_infer( + r#" +//- minicore: iterator, deref +use core::iter::Iterator; + +fn test() { + let mut generator = gen { + yield 1i8; + }; + let result = generator.next(); +} + "#, + expect![[r#" + 37..131 '{ ...t(); }': () + 47..60 'mut generator': impl Iterator<Item = i8> + 63..93 'gen { ... }': impl Iterator<Item = i8> + 77..86 'yield 1i8': () + 83..86 '1i8': i8 + 103..109 'result': Option<i8> + 112..121 'generator': impl Iterator<Item = i8> + 112..128 'genera...next()': Option<i8> + "#]], + ); +} + +#[test] +fn async_gen_block_types_inferred() { + check_infer( + r#" +//- minicore: async_iterator, option, future, deref, pin +use core::async_iter::AsyncIterator; +use core::pin::Pin; +use core::task::Context; + +fn test(mut cx: Context<'_>) { + let mut generator = async gen { + yield 1i8; + }; + let result = Pin::new(&mut generator).poll_next(&mut cx); +} + "#, + expect![[r#" + 91..97 'mut cx': Context<'?> + 112..239 '{ ...cx); }': () + 122..135 'mut generator': impl AsyncIterator<Item = {unknown}> + 138..174 'async ... }': impl AsyncIterator<Item = {unknown}> + 158..167 'yield 1i8': () + 164..167 '1i8': i8 + 184..190 'result': Poll<Option<{unknown}>> + 193..201 'Pin::new': fn new<&'? mut impl AsyncIterator<Item = {unknown}>>(&'? mut impl AsyncIterator<Item = {unknown}>) -> Pin<&'? mut impl AsyncIterator<Item = {unknown}>> + 193..217 'Pin::n...rator)': Pin<&'? mut impl AsyncIterator<Item = {unknown}>> + 193..236 'Pin::n...ut cx)': Poll<Option<{unknown}>> + 202..216 '&mut generator': &'? mut impl AsyncIterator<Item = {unknown}> + 207..216 'generator': impl AsyncIterator<Item = {unknown}> + 228..235 '&mut cx': &'? mut Context<'?> + 233..235 'cx': Context<'?> + "#]], + ); +} + +#[test] +fn gen_fn_types_inferred() { + check_infer( + r#" +//- minicore: iterator, deref +use core::iter::Iterator; + +gen fn html() { + yield (); +} + +fn test() { + let mut generator = html(); + let result = generator.next(); +} + "#, + expect![[r#" + 41..58 '{ ... (); }': () + 47..55 'yield ()': () + 53..55 '()': () + 70..140 '{ ...t(); }': () + 80..93 'mut generator': impl Iterator<Item = ()> + 96..100 'html': fn html() -> impl Iterator<Item = ()> + 96..102 'html()': impl Iterator<Item = ()> + 112..118 'result': Option<()> + 121..130 'generator': impl Iterator<Item = ()> + 121..137 'genera...next()': Option<()> + "#]], + ); +} + +#[test] +fn async_gen_fn_types_inferred() { + check_infer( + r#" +//- minicore: async_iterator, option, future, deref, pin +use core::async_iter::AsyncIterator; +use core::pin::Pin; +use core::task::Context; + +async gen fn html() { + yield (); +} + +fn test(mut cx: Context<'_>) { + let mut generator = html(); + let result = Pin::new(&mut generator).poll_next(&mut cx); +} + "#, + expect![[r#" + 103..120 '{ ... (); }': () + 109..117 'yield ()': () + 115..117 '()': () + 130..136 'mut cx': Context<'?> + 151..248 '{ ...cx); }': () + 161..174 'mut generator': impl AsyncIterator<Item = ()> + 177..181 'html': fn html() -> impl AsyncIterator<Item = ()> + 177..183 'html()': impl AsyncIterator<Item = ()> + 193..199 'result': Poll<Option<()>> + 202..210 'Pin::new': fn new<&'? mut impl AsyncIterator<Item = ()>>(&'? mut impl AsyncIterator<Item = ()>) -> Pin<&'? mut impl AsyncIterator<Item = ()>> + 202..226 'Pin::n...rator)': Pin<&'? mut impl AsyncIterator<Item = ()>> + 202..245 'Pin::n...ut cx)': Poll<Option<()>> + 211..225 '&mut generator': &'? mut impl AsyncIterator<Item = ()> + 216..225 'generator': impl AsyncIterator<Item = ()> + 237..244 '&mut cx': &'? mut Context<'?> + 242..244 'cx': Context<'?> + "#]], + ); +} + +#[test] fn tuple_pattern_nested_match_ergonomics() { check_no_mismatches( r#" |