@@ -67,6 +67,38 @@ object Phases {
67
67
override def lastPhaseId (implicit ctx : Context ) = id
68
68
}
69
69
70
+ /** Squash TreeTransform's beloning to same sublist to a single TreeTransformer
71
+ * Each TreeTransform gets own period,
72
+ * whereas a combined TreeTransformer gets period equal to union of periods of it's TreeTransforms
73
+ * first TreeTransformer emitted is PostTyperTransformer that simplifies trees, see it's documentation
74
+ */
75
+ private def squashPhases (phasess : List [List [Phase ]]): Array [Phase ] = {
76
+ val squashedPhases = ListBuffer [Phase ]()
77
+ var postTyperEmmited = false
78
+ var i = 0
79
+ while (i < phasess.length) {
80
+ if (phasess(i).length > 1 ) {
81
+ assert(phasess(i).forall(x => x.isInstanceOf [TreeTransform ]), " Only tree transforms can be squashed" )
82
+
83
+ val transforms = phasess(i).asInstanceOf [List [TreeTransform ]]
84
+ val block =
85
+ if (! postTyperEmmited) {
86
+ postTyperEmmited = true
87
+ new PostTyperTransformer {
88
+ override def name : String = transformations.map(_.name).mkString(" TreeTransform:{" , " , " , " }" )
89
+ override def transformations : Array [TreeTransform ] = transforms.toArray
90
+ }
91
+ } else new TreeTransformer {
92
+ override def name : String = transformations.map(_.name).mkString(" TreeTransform:{" , " , " , " }" )
93
+ override def transformations : Array [TreeTransform ] = transforms.toArray
94
+ }
95
+ squashedPhases += block
96
+ block.init(this , phasess(i).head.id, phasess(i).last.id)
97
+ } else squashedPhases += phasess(i).head
98
+ i += 1
99
+ }
100
+ (NoPhase :: squashedPhases.toList ::: new TerminalPhase :: Nil ).toArray
101
+ }
70
102
71
103
/** Use the following phases in the order they are given.
72
104
* The list should never contain NoPhase.
@@ -94,31 +126,7 @@ object Phases {
94
126
}
95
127
96
128
if (squash) {
97
- val squashedPhases = ListBuffer [Phase ]()
98
- var postTyperEmmited = false
99
- var i = 0
100
- while (i < phasess.length) {
101
- if (phasess(i).length > 1 ) {
102
- assert(phasess(i).forall(x => x.isInstanceOf [TreeTransform ]), " Only tree transforms can be squashed" )
103
-
104
- val transforms = phasess(i).asInstanceOf [List [TreeTransform ]]
105
- val block =
106
- if (! postTyperEmmited) {
107
- postTyperEmmited = true
108
- new PostTyperTransformer {
109
- override def name : String = transformations.map(_.name).mkString(" TreeTransform:{" , " , " , " }" )
110
- override def transformations : Array [TreeTransform ] = transforms.toArray
111
- }
112
- } else new TreeTransformer {
113
- override def name : String = transformations.map(_.name).mkString(" TreeTransform:{" , " , " , " }" )
114
- override def transformations : Array [TreeTransform ] = transforms.toArray
115
- }
116
- squashedPhases += block
117
- block.init(this , phasess(i).head.id, phasess(i).last.id)
118
- } else squashedPhases += phasess(i).head
119
- i += 1
120
- }
121
- this .squashedPhases = (NoPhase :: squashedPhases.toList ::: new TerminalPhase :: Nil ).toArray
129
+ this .squashedPhases = squashPhases(phasess)
122
130
} else {
123
131
this .squashedPhases = this .phases
124
132
}
0 commit comments