@@ -8,14 +8,18 @@ import transform.SymUtils._
8
8
import scala .collection .mutable
9
9
import config .Printers .simplify
10
10
11
- /** Inlines LabelDef which are used exactly once. */
12
- class InlineLabelsCalledOnce (implicit val ctx : Context ) extends Optimisation {
11
+ /** Inlines LabelDef which are used exactly once.
12
+ *
13
+ * @author DarkDimius, OlivierBlanvillain
14
+ *
15
+ * */
16
+ class InlineLabelsCalledOnce extends Optimisation {
13
17
import ast .tpd ._
14
18
15
19
val timesUsed = mutable.HashMap [Symbol , Int ]()
16
20
val defined = mutable.HashMap [Symbol , DefDef ]()
17
21
18
- val visitor : Tree => Unit = {
22
+ def visitor ( implicit ctx : Context ) : Tree => Unit = {
19
23
case d : DefDef if d.symbol.is(Label ) =>
20
24
var isRecursive = false
21
25
d.rhs.foreachSubTree { x =>
@@ -32,12 +36,12 @@ class InlineLabelsCalledOnce(implicit val ctx: Context) extends Optimisation {
32
36
case _ =>
33
37
}
34
38
35
- def transformer (localCtx : Context ): Tree => Tree = {
39
+ def transformer (implicit ctx : Context ): Tree => Tree = {
36
40
case a : Apply =>
37
41
defined.get(a.symbol) match {
38
42
case Some (defDef) if usedOnce(a) && a.symbol.info.paramInfoss == List (Nil ) =>
39
43
simplify.println(s " Inlining labeldef ${defDef.name}" )
40
- defDef.rhs.changeOwner(defDef.symbol, localCtx .owner)
44
+ defDef.rhs.changeOwner(defDef.symbol, ctx .owner)
41
45
42
46
case Some (defDef) if defDef.rhs.isInstanceOf [Literal ] =>
43
47
defDef.rhs
@@ -57,11 +61,11 @@ class InlineLabelsCalledOnce(implicit val ctx: Context) extends Optimisation {
57
61
case t => t
58
62
}
59
63
60
- def usedN (t : Tree , n : Int ): Boolean =
64
+ def usedN (t : Tree , n : Int )( implicit ctx : Context ) : Boolean =
61
65
t.symbol.is(Label ) &&
62
66
timesUsed.getOrElse(t.symbol, 0 ) == n &&
63
67
defined.contains(t.symbol)
64
68
65
- def usedOnce (t : Tree ): Boolean = usedN(t, 1 )
66
- def neverUsed (t : Tree ): Boolean = usedN(t, 0 )
69
+ def usedOnce (t : Tree )( implicit ctx : Context ) : Boolean = usedN(t, 1 )
70
+ def neverUsed (t : Tree )( implicit ctx : Context ) : Boolean = usedN(t, 0 )
67
71
}
0 commit comments