Skip to content

Commit f57ab64

Browse files
committed
WIP
1 parent d730815 commit f57ab64

File tree

3 files changed

+39
-13
lines changed

3 files changed

+39
-13
lines changed

compiler/src/dotty/tools/dotc/core/quoted/PickledQuotes.scala

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ object PickledQuotes {
6161
val unpickled = unpickle(tastyBytes, expr.args)
6262
unpickled match {
6363
case PackageDef(_, (vdef: ValDef) :: Nil) =>
64-
changeQuoteOwners(vdef.rhs, nested)
64+
changeQuoteOwners(vdef.rhs, vdef.symbol, nested)
6565
}
6666
}
6767

@@ -71,23 +71,18 @@ object PickledQuotes {
7171
val unpickled = unpickle(tastyBytes, ttpe.args)
7272
unpickled match {
7373
case PackageDef(_, (vdef: ValDef) :: Nil) =>
74-
changeQuoteOwners(vdef.rhs.asInstanceOf[TypeApply].args.head, nested)
74+
changeQuoteOwners(vdef.rhs.asInstanceOf[TypeApply].args.head, vdef.symbol, nested)
7575
}
7676
}
7777

78-
private def changeQuoteOwners(tree: Tree, nested: Boolean)(implicit ctx: Context): Tree = {
78+
private[this] val ownerMapping = scala.collection.mutable.LinkedHashMap.empty[Symbol, Symbol]
79+
private def changeQuoteOwners(tree: Tree, owner: Symbol, nested: Boolean)(implicit ctx: Context): Tree = {
80+
ownerMapping.put(owner, ctx.owner)
7981
if (nested) tree
8082
else {
81-
val set = mutable.HashSet.empty[Symbol]
82-
new TreeTraverser {
83-
override def traverse(tree: tpd.Tree)(implicit ctx: Context): Unit = {
84-
if (tree.symbol.exists && tree.symbol.owner.name == "$quote".toTermName)
85-
set += tree.symbol.owner
86-
traverseChildren(tree)
87-
}
88-
}.traverse(tree)
89-
val owners = set.toList
90-
new TreeTypeMap(oldOwners = owners, newOwners = owners.map(_ => ctx.owner)).apply(tree)
83+
val (oldOwners, newOwners) = ownerMapping.iterator.toList.unzip
84+
ownerMapping.clear()
85+
new TreeTypeMap(oldOwners = oldOwners, newOwners = newOwners).apply(tree)
9186
}
9287
}
9388

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
9
2+
{
3+
def ff: Int =
4+
{
5+
val a: Int = 9
6+
a.+(0)
7+
}
8+
ff: Int
9+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import quoted._
2+
import dotty.tools.dotc.quoted.Toolbox._
3+
4+
object Test {
5+
def main(args: Array[String]): Unit = {
6+
val q = f
7+
println(q.run)
8+
println(q.show)
9+
}
10+
11+
def f: Expr[Int] = '{
12+
def ff : Int = {
13+
~g
14+
}
15+
ff
16+
}
17+
18+
def g: Expr[Int] = '{
19+
val a = 9
20+
a + 0
21+
}
22+
}

0 commit comments

Comments
 (0)