Skip to content

Commit 6c6dc77

Browse files
committed
Handle top-level class insertion using a MutableSymbolMap
1 parent 41a46fc commit 6c6dc77

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import dotty.tools.dotc.inlines.Inlines
1414
import dotty.tools.dotc.ast.TreeMapWithImplicits
1515
import dotty.tools.dotc.core.DenotTransformers.IdentityDenotTransformer
1616

17+
import scala.collection.mutable.ListBuffer
1718

1819
/** Inlines all calls to inline methods that are not in an inline method or a quote */
1920
class Inlining extends MacroTransform {
@@ -66,7 +67,7 @@ class Inlining extends MacroTransform {
6667
/** List of top level classes added by macro annotation in a package object.
6768
* These are added to the PackageDef that owns this particular package object.
6869
*/
69-
private val topClasses = new collection.mutable.ListBuffer[Tree]
70+
private val newTopClasses = MutableSymbolMap[ListBuffer[Tree]]()
7071

7172
override def transform(tree: Tree)(using Context): Tree = {
7273
tree match
@@ -82,10 +83,11 @@ class Inlining extends MacroTransform {
8283
val trees1 = trees.map(super.transform)
8384

8485
// Find classes added to the top level from a package object
85-
val (topClasses0, trees2) =
86+
val (topClasses, trees2) =
8687
if ctx.owner.isPackageObject then trees1.partition(_.symbol.owner == ctx.owner.owner)
8788
else (Nil, trees1)
88-
topClasses ++= topClasses0
89+
if topClasses.nonEmpty then
90+
newTopClasses.getOrElseUpdate(ctx.owner.owner, new ListBuffer) ++= topClasses
8991

9092
flatTree(trees2)
9193
else super.transform(tree)
@@ -101,10 +103,13 @@ class Inlining extends MacroTransform {
101103
super.transform(tree)(using StagingContext.spliceContext)
102104
case _: PackageDef =>
103105
super.transform(tree) match
104-
case tree1: PackageDef if !topClasses.isEmpty =>
105-
val newStats = tree1.stats ::: topClasses.result()
106-
topClasses.clear()
107-
cpy.PackageDef(tree1)(tree1.pid, newStats)
106+
case tree1: PackageDef =>
107+
newTopClasses.get(tree.symbol.moduleClass) match
108+
case Some(topClasses) =>
109+
newTopClasses.remove(tree.symbol.moduleClass)
110+
val newStats = tree1.stats ::: topClasses.result()
111+
cpy.PackageDef(tree1)(tree1.pid, newStats)
112+
case _ => tree1
108113
case tree1 => tree1
109114
case _ =>
110115
super.transform(tree)

0 commit comments

Comments
 (0)