@@ -17,7 +17,7 @@ use crate::{
17
17
// =================================================================================================
18
18
// async_stream
19
19
20
- pub ( super ) fn async_stream ( args : TokenStream , input : TokenStream ) -> Result < TokenStream > {
20
+ pub ( super ) fn attribute ( args : TokenStream , input : TokenStream ) -> Result < TokenStream > {
21
21
parse_async_stream_fn ( args, input)
22
22
}
23
23
@@ -38,9 +38,8 @@ impl Parse for Item {
38
38
}
39
39
}
40
40
41
- // TODO: rename to `ReturnType`
42
41
#[ derive( Clone , Copy ) ]
43
- enum ReturnTypeKind {
42
+ pub ( super ) enum ReturnTypeKind {
44
43
// impl Stream<Item = ..> $(+ $lifetime)?
45
44
Default ,
46
45
// Pin<Box<dyn Stream<Item = ..> (+ Send)? $(+ $lifetime)?>>
@@ -122,16 +121,16 @@ impl Parse for Args {
122
121
}
123
122
}
124
123
125
- struct FnSig {
126
- attrs : Vec < Attribute > ,
127
- vis : Visibility ,
128
- sig : Signature ,
129
- block : Block ,
130
- semi : Option < Token ! [ ; ] > ,
124
+ pub ( super ) struct FnSig {
125
+ pub ( super ) attrs : Vec < Attribute > ,
126
+ pub ( super ) vis : Visibility ,
127
+ pub ( super ) sig : Signature ,
128
+ pub ( super ) block : Block ,
129
+ pub ( super ) semi : Option < Token ! [ ; ] > ,
131
130
}
132
131
133
132
impl FnSig {
134
- fn parse ( input : TokenStream , boxed : ReturnTypeKind ) -> Result < Self > {
133
+ pub ( super ) fn parse ( input : TokenStream , boxed : ReturnTypeKind ) -> Result < Self > {
135
134
match boxed {
136
135
ReturnTypeKind :: Default => syn:: parse2 ( input) . map ( ItemFn :: into) ,
137
136
ReturnTypeKind :: Boxed { .. } => {
@@ -167,7 +166,7 @@ impl From<TraitItemMethod> for FnSig {
167
166
}
168
167
}
169
168
170
- fn validate_async_stream_fn ( item : & FnSig ) -> Result < ( ) > {
169
+ pub ( super ) fn validate_async_stream_fn ( item : & FnSig ) -> Result < ( ) > {
171
170
if item. sig . asyncness . is_none ( ) {
172
171
return Err ( error ! ( item. sig. fn_token, "async stream must be declared as async" ) ) ;
173
172
}
@@ -193,15 +192,7 @@ fn validate_async_stream_fn(item: &FnSig) -> Result<()> {
193
192
Ok ( ( ) )
194
193
}
195
194
196
- fn parse_async_stream_fn ( args : TokenStream , input : TokenStream ) -> Result < TokenStream > {
197
- let args: Args = syn:: parse2 ( args) ?;
198
- let item = FnSig :: parse ( input, args. boxed ) ?;
199
-
200
- validate_async_stream_fn ( & item) ?;
201
- Ok ( expand_async_stream_fn ( item, & args) )
202
- }
203
-
204
- fn expand_async_body ( inputs : Punctuated < FnArg , Comma > ) -> ( Vec < FnArg > , Vec < Local > ) {
195
+ pub ( super ) fn expand_async_body ( inputs : Punctuated < FnArg , Comma > ) -> ( Vec < FnArg > , Vec < Local > ) {
205
196
let mut arguments: Vec < FnArg > = Vec :: new ( ) ;
206
197
let mut statements: Vec < Local > = Vec :: new ( ) ;
207
198
@@ -274,7 +265,13 @@ fn expand_async_body(inputs: Punctuated<FnArg, Comma>) -> (Vec<FnArg>, Vec<Local
274
265
( arguments, statements)
275
266
}
276
267
277
- fn make_gen_body ( statements : & [ Local ] , block : & Block , gen_function : & TokenStream ) -> TokenStream {
268
+ pub ( super ) fn make_gen_body (
269
+ statements : & [ Local ] ,
270
+ block : & Block ,
271
+ gen_function : & TokenStream ,
272
+ ret_value : & TokenStream ,
273
+ ret_ty : & TokenStream ,
274
+ ) -> TokenStream {
278
275
let block_inner = quote ! {
279
276
#( #statements) *
280
277
#block
@@ -292,7 +289,7 @@ fn make_gen_body(statements: &[Local], block: &Block, gen_function: &TokenStream
292
289
// have any `yield` statements.
293
290
#[ allow( unreachable_code) ]
294
291
{
295
- return ;
292
+ return #ret_value ;
296
293
loop { yield :: futures_async_stream:: reexport:: task:: Poll :: Pending }
297
294
}
298
295
} ;
@@ -302,10 +299,18 @@ fn make_gen_body(statements: &[Local], block: &Block, gen_function: &TokenStream
302
299
} ) ;
303
300
304
301
quote ! {
305
- #gen_function ( static move || -> ( ) #gen_body)
302
+ #gen_function( static move || -> #ret_ty #gen_body)
306
303
}
307
304
}
308
305
306
+ fn parse_async_stream_fn ( args : TokenStream , input : TokenStream ) -> Result < TokenStream > {
307
+ let args: Args = syn:: parse2 ( args) ?;
308
+ let item = FnSig :: parse ( input, args. boxed ) ?;
309
+
310
+ validate_async_stream_fn ( & item) ?;
311
+ Ok ( expand_async_stream_fn ( item, & args) )
312
+ }
313
+
309
314
fn expand_async_stream_fn ( item : FnSig , args : & Args ) -> TokenStream {
310
315
let FnSig { attrs, vis, sig, mut block, semi } = item;
311
316
let Signature { unsafety, abi, fn_token, ident, mut generics, inputs, .. } = sig;
@@ -324,7 +329,7 @@ fn expand_async_stream_fn(item: FnSig, args: &Args) -> TokenStream {
324
329
let output_span = first_last ( item) ;
325
330
let gen_function = quote ! ( :: futures_async_stream:: stream:: from_generator) ;
326
331
let gen_function = respan ( gen_function, output_span) ;
327
- let mut body_inner = make_gen_body ( & statements, & block, & gen_function) ;
332
+ let mut body_inner = make_gen_body ( & statements, & block, & gen_function, & quote ! ( ) , & quote ! ( ( ) ) ) ;
328
333
329
334
if let ReturnTypeKind :: Boxed { .. } = args. boxed {
330
335
let body = quote ! { :: futures_async_stream:: reexport:: boxed:: Box :: pin( #body_inner) } ;
@@ -344,15 +349,15 @@ fn expand_async_stream_fn(item: FnSig, args: &Args) -> TokenStream {
344
349
// Raw `impl` breaks syntax highlighting in some editors.
345
350
let impl_token = token:: Impl :: default ( ) ;
346
351
quote ! {
347
- #impl_token :: futures_async_stream:: stream :: Stream <Item = #item> + #( #lifetimes +) *
352
+ #impl_token :: futures_async_stream:: reexport :: Stream <Item = #item> + #( #lifetimes +) *
348
353
}
349
354
}
350
355
ReturnTypeKind :: Boxed { send } => {
351
356
let send = if send { Some ( quote ! ( + Send ) ) } else { None } ;
352
357
quote ! {
353
358
:: futures_async_stream:: reexport:: pin:: Pin <
354
359
:: futures_async_stream:: reexport:: boxed:: Box <
355
- dyn :: futures_async_stream:: stream :: Stream <Item = #item> #send + #( #lifetimes +) *
360
+ dyn :: futures_async_stream:: reexport :: Stream <Item = #item> #send + #( #lifetimes +) *
356
361
>
357
362
>
358
363
}
@@ -375,13 +380,13 @@ fn expand_async_stream_fn(item: FnSig, args: &Args) -> TokenStream {
375
380
// =================================================================================================
376
381
// async_stream_block
377
382
378
- pub ( super ) fn async_stream_block ( input : TokenStream ) -> Result < TokenStream > {
383
+ pub ( super ) fn block_macro ( input : TokenStream ) -> Result < TokenStream > {
379
384
syn:: parse2 ( input) . map ( expand_async_stream_block)
380
385
}
381
386
382
387
fn expand_async_stream_block ( mut expr : Expr ) -> TokenStream {
383
388
Visitor :: new ( Stream ) . visit_expr_mut ( & mut expr) ;
384
389
385
390
let gen_function = quote ! ( :: futures_async_stream:: stream:: from_generator) ;
386
- make_gen_body ( & [ ] , & block ( vec ! [ Stmt :: Expr ( expr) ] ) , & gen_function)
391
+ make_gen_body ( & [ ] , & block ( vec ! [ Stmt :: Expr ( expr) ] ) , & gen_function, & quote ! ( ) , & quote ! ( ( ) ) )
387
392
}
0 commit comments