@@ -77,9 +77,17 @@ abstract class UnCurry extends InfoTransform
77
77
private var inConstructorFlag = 0L
78
78
private val byNameArgs = mutable.HashSet [Tree ]()
79
79
private val noApply = mutable.HashSet [Tree ]()
80
- private val newMembers = mutable.ArrayBuffer [ Tree ]()
80
+ private val newMembers = mutable.Map [ Symbol , mutable. Buffer [ Tree ] ]()
81
81
private val repeatedParams = mutable.Map [Symbol , List [ValDef ]]()
82
82
83
+ /** Add a new synthetic member for `currentOwner` */
84
+ private def addNewMember (t : Tree ): Unit =
85
+ newMembers.getOrElseUpdate(currentOwner, mutable.Buffer ()) += t
86
+
87
+ /** Process synthetic members for `owner`. They are removed form the `newMembers` as a side-effect. */
88
+ @ inline private def useNewMembers [T ](owner : Symbol )(f : List [Tree ] => T ): T =
89
+ f(newMembers.remove(owner).getOrElse(Nil ).toList)
90
+
83
91
@ inline private def withInPattern [T ](value : Boolean )(body : => T ): T = {
84
92
inPattern = value
85
93
try body
@@ -573,7 +581,7 @@ abstract class UnCurry extends InfoTransform
573
581
val vparamssNoRhs = dd.vparamss mapConserve (_ mapConserve {p =>
574
582
treeCopy.ValDef (p, p.mods, p.name, p.tpt, EmptyTree )
575
583
})
576
-
584
+
577
585
if (dd.symbol hasAnnotation VarargsClass ) saveRepeatedParams(dd)
578
586
579
587
withNeedLift(false ) {
@@ -680,18 +688,19 @@ abstract class UnCurry extends InfoTransform
680
688
681
689
tree match {
682
690
/* Some uncurry post transformations add members to templates.
683
- * When inside a template, the following sequence is available:
684
- * - newMembers
685
- * Any entry in this sequence will be added into the template
691
+ *
692
+ * Members registered by `addMembers` for the current template are added
686
693
* once the template transformation has finished.
687
694
*
688
695
* In particular, this case will add:
689
696
* - synthetic Java varargs forwarders for repeated parameters
690
697
*/
691
698
case Template (_, _, _) =>
692
699
localTyper = typer.atOwner(tree, currentClass)
693
- try deriveTemplate(tree)(transformTrees(newMembers.toList) ::: _)
694
- finally newMembers.clear()
700
+ useNewMembers(currentClass) {
701
+ newMembers =>
702
+ deriveTemplate(tree)(transformTrees(newMembers) ::: _)
703
+ }
695
704
696
705
case dd @ DefDef (_, _, _, vparamss0, _, rhs0) =>
697
706
val flatdd = copyDefDef(dd)(
@@ -763,7 +772,7 @@ abstract class UnCurry extends InfoTransform
763
772
764
773
/* Called during post transform, after the method argument lists have been flattened.
765
774
* It looks for the method in the `repeatedParams` map, and generates a Java-style
766
- * varargs forwarder. It then adds the forwarder to the `newMembers` sequence.
775
+ * varargs forwarder.
767
776
*/
768
777
private def addJavaVarargsForwarders (dd : DefDef , flatdd : DefDef ): DefDef = {
769
778
if (! dd.symbol.hasAnnotation(VarargsClass ) || ! repeatedParams.contains(dd.symbol))
@@ -840,8 +849,7 @@ abstract class UnCurry extends InfoTransform
840
849
case None =>
841
850
// enter symbol into scope
842
851
currentClass.info.decls enter forwsym
843
- // add the method to `newMembers`
844
- newMembers += forwtree
852
+ addNewMember(forwtree)
845
853
}
846
854
847
855
flatdd
0 commit comments