@@ -74,12 +74,24 @@ object Phases {
74
74
*/
75
75
private def squashPhases (phasess : List [List [Phase ]]): Array [Phase ] = {
76
76
val squashedPhases = ListBuffer [Phase ]()
77
+ var prevPhases : Set [String ] = Set .empty
77
78
var postTyperEmmited = false
78
79
var i = 0
79
80
while (i < phasess.length) {
80
81
if (phasess(i).length > 1 ) {
81
- assert(phasess(i).forall(x => x.isInstanceOf [TreeTransform ]), " Only tree transforms can be squashed" )
82
+ val phasesInBlock : Set [String ] = phasess(i).map(_.name).toSet
83
+ for (phase<- phasess(i)) {
84
+ phase match {
85
+ case p : TreeTransform =>
82
86
87
+ val unmetRequirements = p.runsAfterGroupsOf &~ prevPhases
88
+ assert(unmetRequirements.isEmpty,
89
+ s " ${phase.name} requires ${unmetRequirements.mkString(" , " )} to be in different TreeTransformer " )
90
+
91
+ case _ =>
92
+ assert(false , s " Only tree transforms can be squashed, ${phase.name} can not be squashed " )
93
+ }
94
+ }
83
95
val transforms = phasess(i).asInstanceOf [List [TreeTransform ]]
84
96
val block =
85
97
if (! postTyperEmmited) {
@@ -93,6 +105,7 @@ object Phases {
93
105
override def transformations : Array [TreeTransform ] = transforms.toArray
94
106
}
95
107
squashedPhases += block
108
+ prevPhases ++= phasess(i).map(_.name)
96
109
block.init(this , phasess(i).head.id, phasess(i).last.id)
97
110
} else squashedPhases += phasess(i).head
98
111
i += 1
@@ -106,11 +119,16 @@ object Phases {
106
119
*/
107
120
def usePhases (phasess : List [List [Phase ]], squash : Boolean = true ) = {
108
121
phases = (NoPhase :: phasess.flatten ::: new TerminalPhase :: Nil ).toArray
122
+ var phasesAfter : Set [String ] = Set .empty
109
123
nextDenotTransformerId = new Array [Int ](phases.length)
110
124
denotTransformers = new Array [DenotTransformer ](phases.length)
111
125
var i = 0
112
126
while (i < phases.length) {
113
127
phases(i).init(this , i)
128
+ val unmetPreceedeRequirements = phases(i).runsAfter -- phasesAfter
129
+ assert(unmetPreceedeRequirements.isEmpty,
130
+ s " phase ${phases(i)} has unmet requirement: ${unmetPreceedeRequirements.mkString(" , " )} should precede this phase " )
131
+ phasesAfter += phases(i).name
114
132
i += 1
115
133
}
116
134
var lastTransformerId = i
@@ -170,6 +188,9 @@ object Phases {
170
188
171
189
def name : String
172
190
191
+ /** List of names of phases that should precede this phase */
192
+ def runsAfter : Set [String ] = Set .empty
193
+
173
194
def run (implicit ctx : Context ): Unit
174
195
175
196
def runOn (units : List [CompilationUnit ])(implicit ctx : Context ): Unit =
0 commit comments