@@ -402,16 +402,21 @@ class ReifyQuotes extends MacroTransformWithImplicits {
402
402
def body (arg : Tree )(implicit ctx : Context ): Tree = {
403
403
var i = 0
404
404
transformWithCapturer(tree)(
405
- (captured : mutable.ListBuffer [Tree ]) => (tree : RefTree ) => {
406
- val argTpe =
407
- if (tree.isTerm) defn.QuotedExprType .appliedTo(tree.tpe.widen)
408
- else defn.QuotedTypeType .appliedTo(defn.AnyType )
409
- val selectArg = arg.select(nme.apply).appliedTo(Literal (Constant (i))).asInstance(argTpe)
410
- val capturedArg = SyntheticValDef (UniqueName .fresh(tree.name.toTermName).toTermName, selectArg)
411
- i += 1
412
- embedded += tree
413
- captured += capturedArg
414
- ref(capturedArg.symbol)
405
+ (captured : mutable.Map [Symbol , Tree ]) => {
406
+ (tree : RefTree ) => {
407
+ def newCapture = {
408
+ val argTpe =
409
+ if (tree.isTerm) defn.QuotedExprType .appliedTo(tree.tpe.widen)
410
+ else defn.QuotedTypeType .appliedTo(defn.AnyType )
411
+ val selectArg = arg.select(nme.apply).appliedTo(Literal (Constant (i))).asInstance(argTpe)
412
+ val capturedArg = SyntheticValDef (UniqueName .fresh(tree.name.toTermName).toTermName, selectArg)
413
+ i += 1
414
+ embedded += tree
415
+ captured.put(tree.symbol, capturedArg)
416
+ capturedArg
417
+ }
418
+ ref(captured.getOrElseUpdate(tree.symbol, newCapture).symbol)
419
+ }
415
420
}
416
421
)
417
422
}
@@ -423,13 +428,13 @@ class ReifyQuotes extends MacroTransformWithImplicits {
423
428
}
424
429
425
430
private def transformWithCapturer (tree : Tree )(
426
- capturer : mutable.ListBuffer [ Tree ] => RefTree => Tree )(implicit ctx : Context ): Tree = {
427
- val captured = new mutable.ListBuffer [ Tree ]
431
+ capturer : mutable.Map [ Symbol , Tree ] => RefTree => Tree )(implicit ctx : Context ): Tree = {
432
+ val captured = mutable.LinkedHashMap .empty[ Symbol , Tree ]
428
433
val captured2 = capturer(captured)
429
434
outer.enteredSyms.foreach(s => capturers.put(s, captured2))
430
435
val tree2 = transform(tree)
431
436
capturers --= outer.enteredSyms
432
- seq(captured.result(), tree2)
437
+ seq(captured.result().valuesIterator.toList , tree2)
433
438
}
434
439
435
440
/** Returns true if this tree will be captured by `makeLambda` */
0 commit comments