@@ -245,9 +245,13 @@ pub trait Macro: Trace + DowncastArc + Send + Sync {
245245 None
246246 }
247247
248- fn expand < ' r , ' a : ' r , ' b : ' r , ' ast : ' r > (
248+ /// Creating a symbol in `symbols` will put it in the same scope as the code surrounding the
249+ /// expansion. If you want to create a unique symbol then call `Symbol::from` or create a new
250+ /// `Symbols` table
251+ fn expand < ' r , ' a : ' r , ' b : ' r , ' c : ' r , ' ast : ' r > (
249252 & self ,
250253 env : & ' b mut MacroExpander < ' a > ,
254+ symbols : & ' c mut Symbols ,
251255 arena : & ' b mut ast:: OwnedArena < ' ast , Symbol > ,
252256 args : & ' b mut [ SpannedExpr < ' ast , Symbol > ] ,
253257 ) -> MacroFuture < ' r , ' ast > ;
@@ -283,13 +287,14 @@ where
283287 ( * * self ) . get_capability_impl ( thread, arc_self, id)
284288 }
285289
286- fn expand < ' r , ' a : ' r , ' b : ' r , ' ast : ' r > (
290+ fn expand < ' r , ' a : ' r , ' b : ' r , ' c : ' r , ' ast : ' r > (
287291 & self ,
288292 env : & ' b mut MacroExpander < ' a > ,
293+ symbols : & ' c mut Symbols ,
289294 arena : & ' b mut ast:: OwnedArena < ' ast , Symbol > ,
290295 args : & ' b mut [ SpannedExpr < ' ast , Symbol > ] ,
291296 ) -> MacroFuture < ' r , ' ast > {
292- ( * * self ) . expand ( env, arena, args)
297+ ( * * self ) . expand ( env, symbols , arena, args)
293298 }
294299}
295300
@@ -307,13 +312,14 @@ where
307312 ( * * self ) . get_capability_impl ( thread, arc_self, id)
308313 }
309314
310- fn expand < ' r , ' a : ' r , ' b : ' r , ' ast : ' r > (
315+ fn expand < ' r , ' a : ' r , ' b : ' r , ' c : ' r , ' ast : ' r > (
311316 & self ,
312317 env : & ' b mut MacroExpander < ' a > ,
318+ symbols : & ' c mut Symbols ,
313319 arena : & ' b mut ast:: OwnedArena < ' ast , Symbol > ,
314320 args : & ' b mut [ SpannedExpr < ' ast , Symbol > ] ,
315321 ) -> MacroFuture < ' r , ' ast > {
316- ( * * self ) . expand ( env, arena, args)
322+ ( * * self ) . expand ( env, symbols , arena, args)
317323 }
318324}
319325
@@ -457,19 +463,20 @@ impl<'a> MacroExpander<'a> {
457463 exprs : Vec :: new ( ) ,
458464 } ;
459465 visitor. visit_expr ( expr) ;
460- let MacroVisitor { exprs, .. } = visitor;
461- self . expand ( arena, exprs) . await
466+ let MacroVisitor { exprs, symbols , .. } = visitor;
467+ self . expand ( symbols , arena, exprs) . await
462468 }
463469
464470 async fn expand < ' ast > (
465471 & mut self ,
472+ symbols : & mut Symbols ,
466473 arena : & mut ast:: OwnedArena < ' ast , Symbol > ,
467474 mut exprs : Vec < ( & ' _ mut SpannedExpr < ' ast , Symbol > , Arc < dyn Macro > ) > ,
468475 ) {
469476 let mut futures = Vec :: with_capacity ( exprs. len ( ) ) ;
470477 for ( expr, mac) in exprs. drain ( ..) {
471478 let result = match & mut expr. value {
472- Expr :: App { args, .. } => mac. expand ( self , arena, args) . await ,
479+ Expr :: App { args, .. } => mac. expand ( self , symbols , arena, args) . await ,
473480 _ => unreachable ! ( "{:?}" , expr) ,
474481 } ;
475482 match result {
0 commit comments