Skip to content

Commit 6047dc4

Browse files
committed
add transitive ordering constraint example
1 parent 5a52095 commit 6047dc4

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

compiler/src/dotty/tools/dotc/plugins/Plugins.scala

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ object Plugins {
194194
""".stripMargin
195195
)
196196

197-
// propagate transitive constraints from related phases to current phase: transitivity
197+
// propagate constraints from related phases to current phase: transitivity
198198
def propagate(phase: Phase): OrderingReq = {
199199
def propagateRunsBefore(beforePhase: Class[_]): Set[Class[_]] =
200200
if (beforePhase == phase.getClass)
@@ -221,8 +221,6 @@ object Plugins {
221221
runsAfter = runsAfter.flatMap(propagateRunsAfter)
222222
runsBefore = runsBefore.flatMap(propagateRunsBefore)
223223

224-
// orderRequirements.update(phase.getClass, (runsBefore, runsAfter) )
225-
226224
(runsAfter, runsBefore)
227225
}
228226

compiler/test/dotty/tools/dotc/plugins/PluginsTest.scala

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.junit.Test
55
import dotty.tools.dotc._
66
import plugins._
77
import transform.MegaPhase.MiniPhase
8+
import core.Phases.Phase
89

910
class PluginsTest {
1011
class TestPhase extends PluginPhase { def phaseName = this.getClass.getName }
@@ -38,6 +39,10 @@ class PluginsTest {
3839

3940
def classOfPhase(p: PluginPhase): Class[_ <: PluginPhase] = p.getClass.asInstanceOf[Class[_ <: PluginPhase]]
4041

42+
def debugPlan(plan: List[List[Phase]]): Unit = {
43+
println(plan.mkString("plan:\n- ", "\n- ", ""))
44+
}
45+
4146
@Test
4247
def insertAfter = {
4348
object M1 extends TestPhase {
@@ -172,6 +177,34 @@ class PluginsTest {
172177
assert(updatedPlan2(5)(0) eq M2)
173178
}
174179

180+
@Test
181+
def orderingTransitive = {
182+
object M1 extends TestPhase {
183+
override val runsAfter = Set(classOf[P3d])
184+
override val runsBefore = Set(classOfPhase(M2), classOf[P7])
185+
}
186+
object M2 extends TestPhase {
187+
override val runsAfter = Set(classOf[P3d])
188+
override val runsBefore = Set(classOf[P5], classOf[P8])
189+
}
190+
object M3 extends TestPhase {
191+
override val runsAfter = Set(classOfPhase(M2), classOf[P2])
192+
override val runsBefore = Set(classOf[P4], classOf[P8])
193+
}
194+
195+
// M1 inserted to plan first
196+
val updatedPlan1 = Plugins.schedule(basicPlan, M1 :: M2 :: M3 :: Nil)
197+
assert(updatedPlan1(3)(0) eq M1)
198+
assert(updatedPlan1(4)(0) eq M2)
199+
assert(updatedPlan1(5)(0) eq M3)
200+
201+
// M2 inserted to plan first
202+
val updatedPlan2 = Plugins.schedule(basicPlan, M2 :: M1 :: M3 :: Nil)
203+
assert(updatedPlan1(3)(0) eq M1)
204+
assert(updatedPlan1(4)(0) eq M2)
205+
assert(updatedPlan1(5)(0) eq M3)
206+
}
207+
175208

176209
@Test
177210
def deterministic = {

0 commit comments

Comments
 (0)