Skip to content

Commit 990bf88

Browse files
committed
Create single argument for each capture
1 parent b294b6c commit 990bf88

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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` */
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
1
2+
{
3+
val x: Int = 1
4+
println(x.+(x))
5+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import quoted._
2+
import dotty.tools.dotc.quoted.Toolbox._
3+
4+
object Test {
5+
def main(args: Array[String]): Unit = {
6+
val q = '{
7+
val x = 1
8+
println(~{
9+
println(1)
10+
val a = '(x)
11+
val b = '(x)
12+
'{ ~a + ~b }
13+
})
14+
}
15+
16+
println(q.show)
17+
}
18+
}

0 commit comments

Comments
 (0)