@@ -402,16 +402,21 @@ class ReifyQuotes extends MacroTransformWithImplicits {
402402 def body (arg : Tree )(implicit ctx : Context ): Tree = {
403403 var i = 0
404404 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+ }
415420 }
416421 )
417422 }
@@ -423,13 +428,13 @@ class ReifyQuotes extends MacroTransformWithImplicits {
423428 }
424429
425430 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 ]
428433 val captured2 = capturer(captured)
429434 outer.enteredSyms.foreach(s => capturers.put(s, captured2))
430435 val tree2 = transform(tree)
431436 capturers --= outer.enteredSyms
432- seq(captured.result(), tree2)
437+ seq(captured.result().valuesIterator.toList , tree2)
433438 }
434439
435440 /** Returns true if this tree will be captured by `makeLambda` */
0 commit comments