@@ -5,6 +5,7 @@ import org.junit.Test
55import dotty .tools .dotc ._
66import plugins ._
77import transform .MegaPhase .MiniPhase
8+ import core .Phases .Phase
89
910class 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