@@ -304,11 +304,11 @@ impl Template {
304304 }
305305 Template :: Splice ( block) => {
306306 let block = rust_block ( block) ;
307- quote ! {
307+ isolated_interpolation ( quote ! {
308308 let __value = :: std:: iter:: IntoIterator :: into_iter( #block)
309309 . collect:: <Vec <_>>( ) ;
310310 ctx. extend_field_ids( __value, & mut __nodes) ;
311- }
311+ } )
312312 }
313313 } )
314314 . collect :: < Vec < _ > > ( ) ;
@@ -327,7 +327,9 @@ impl Template {
327327 Template :: Node ( node) => node. lower ( context) ,
328328 Template :: Splice ( block) => {
329329 let block = rust_block ( block) ;
330- quote ! { :: std:: convert:: Into :: <yeast:: OutputId >:: into( #block) }
330+ isolated_interpolation ( quote ! {
331+ :: std:: convert:: Into :: <yeast:: OutputId >:: into( #block)
332+ } )
331333 }
332334 }
333335 }
@@ -344,40 +346,36 @@ impl Node {
344346 Content :: Computed ( block) => {
345347 let block = rust_block ( block) ;
346348 if let Some ( label) = context. fallible_scope {
347- quote ! {
348- {
349- let __expr = #block;
350- let :: std:: option:: Option :: Some ( __value_ref) =
351- yeast:: MaybeYeastValue :: maybe_yeast_value( & __expr)
352- else {
353- break #label :: std:: option:: Option :: None ;
354- } ;
355- let __value =
356- yeast:: YeastDisplay :: yeast_to_string( __value_ref, & #ctx) ;
357- let __source_range =
358- yeast:: YeastSourceRange :: yeast_source_range( __value_ref, & #ctx) ;
359- #ctx. literal_with_source_range(
360- #kind_str,
361- & __value,
362- __source_range,
363- )
364- }
365- }
349+ isolated_interpolation ( quote ! {
350+ let __expr = #block;
351+ let :: std:: option:: Option :: Some ( __value_ref) =
352+ yeast:: MaybeYeastValue :: maybe_yeast_value( & __expr)
353+ else {
354+ break #label :: std:: option:: Option :: None ;
355+ } ;
356+ let __value =
357+ yeast:: YeastDisplay :: yeast_to_string( __value_ref, & #ctx) ;
358+ let __source_range =
359+ yeast:: YeastSourceRange :: yeast_source_range( __value_ref, & #ctx) ;
360+ #ctx. literal_with_source_range(
361+ #kind_str,
362+ & __value,
363+ __source_range,
364+ )
365+ } )
366366 } else {
367- quote ! {
368- {
369- let __expr = #block;
370- let __value =
371- yeast:: YeastDisplay :: yeast_to_string( & __expr, & #ctx) ;
372- let __source_range =
373- yeast:: YeastSourceRange :: yeast_source_range( & __expr, & #ctx) ;
374- #ctx. literal_with_source_range(
375- #kind_str,
376- & __value,
377- __source_range,
378- )
379- }
380- }
367+ isolated_interpolation ( quote ! {
368+ let __expr = #block;
369+ let __value =
370+ yeast:: YeastDisplay :: yeast_to_string( & __expr, & #ctx) ;
371+ let __source_range =
372+ yeast:: YeastSourceRange :: yeast_source_range( & __expr, & #ctx) ;
373+ #ctx. literal_with_source_range(
374+ #kind_str,
375+ & __value,
376+ __source_range,
377+ )
378+ } )
381379 }
382380 }
383381 } ;
@@ -393,11 +391,11 @@ impl Node {
393391 match field {
394392 Field :: Location { block } => {
395393 let block = rust_block ( block) ;
396- stmts. push ( quote ! {
394+ stmts. push ( isolated_interpolation ( quote ! {
397395 let __value = :: std:: iter:: IntoIterator :: into_iter( #block)
398396 . collect:: <Vec <_>>( ) ;
399397 #ctx. extend_location_ranges( __value, & mut __location_ranges) ;
400- } ) ;
398+ } ) ) ;
401399 }
402400 Field :: Named {
403401 name,
@@ -418,12 +416,15 @@ impl Node {
418416 Template :: Splice ( block) => {
419417 debug_assert ! ( !optional) ;
420418 let block = rust_block ( block) ;
421- stmts. push ( quote ! {
422- let mut #temp: Vec <yeast:: OutputId > = Vec :: new( ) ;
419+ let interpolation = isolated_interpolation ( quote ! {
423420 let __value = :: std:: iter:: IntoIterator :: into_iter( #block)
424421 . collect:: <Vec <_>>( ) ;
425422 #ctx. extend_field_ids( __value, & mut #temp) ;
426423 } ) ;
424+ stmts. push ( quote ! {
425+ let mut #temp: Vec <yeast:: OutputId > = Vec :: new( ) ;
426+ #interpolation
427+ } ) ;
427428 field_args. push ( quote ! {
428429 if !#temp. is_empty( ) {
429430 __fields. push( ( #field_str, #temp) ) ;
@@ -486,3 +487,10 @@ fn rust_block(block: &syn::Block) -> TokenStream {
486487 let statements = & block. stmts ;
487488 quote ! ( { #( #statements) * } )
488489}
490+
491+ fn isolated_interpolation ( body : TokenStream ) -> TokenStream {
492+ quote ! { {
493+ let mut ctx = ctx. cloned_user_ctx( ) ;
494+ #body
495+ } }
496+ }
0 commit comments