@@ -35,7 +35,7 @@ trait PhaseAssembly {
35
35
val graph = DependencyGraph (phasesSet)
36
36
for (n <- settings.genPhaseGraph.valueSetByUser; d <- settings.outputDirs.getSingleOutput if ! d.isVirtual)
37
37
DependencyGraph .graphToDotFile(graph, Path (d.file) / File (s " $n.dot " ))
38
- graph.compilerPhaseList()
38
+ graph.compilerPhaseList().tap(_ => graph.warnings.foreach(msg => reporter.warning( NoPosition , msg)))
39
39
}
40
40
}
41
41
@@ -48,6 +48,10 @@ class DependencyGraph(order: Int, start: String, val components: Map[String, Sub
48
48
49
49
// private final val debugging = false
50
50
51
+ private var messages : List [String ] = Nil
52
+ def warning (message : String ): Unit = messages ::= message
53
+ def warnings : List [String ] = messages.reverse.tap(_ => messages = Nil )
54
+
51
55
/** For ith vertex, its outgoing edges. */
52
56
private val adjacency : Array [List [Edge ]] = Array .fill(order)(Nil )
53
57
@@ -231,20 +235,21 @@ object DependencyGraph {
231
235
.getOrElse(throw new AssertionError (" Missing terminal component" ))
232
236
new DependencyGraph (phases.size, start.phaseName, phases.map(p => p.phaseName -> p).toMap).tap { graph =>
233
237
for (p <- phases) {
234
- val name = p.phaseName
235
- require(! name.isEmpty, " Phase name must be non-empty." )
236
- for (after <- p.runsRightAfter if ! after.isEmpty)
237
- graph.addEdge(after, name, FollowsNow )
238
- for (after <- p.runsAfter.filterNot(p.runsRightAfter.contains) if ! after.isEmpty)
239
- graph.addEdge(after, name, Follows )
240
- for (before <- p.runsBefore if ! before.isEmpty)
241
- graph.addEdge(name, before, Follows )
238
+ require(p.phaseName.nonEmpty, " Phase name must be non-empty." )
239
+ def checkConstraint (name : String , constraint : String ): Boolean =
240
+ phases.exists(_.phaseName == name).tap(ok => if (! ok) graph.warning(s " No phase ` $name` for ${p.phaseName}. $constraint" ))
241
+ for (after <- p.runsRightAfter if after.nonEmpty && checkConstraint(after, " runsRightAfter" ))
242
+ graph.addEdge(after, p.phaseName, FollowsNow )
243
+ for (after <- p.runsAfter if after.nonEmpty && ! p.runsRightAfter.contains(after) && checkConstraint(after, " runsAfter" ))
244
+ graph.addEdge(after, p.phaseName, Follows )
245
+ for (before <- p.runsBefore if before.nonEmpty && checkConstraint(before, " runsBefore" ))
246
+ graph.addEdge(p.phaseName, before, Follows )
242
247
if (p != start && p != end)
243
248
if (p.runsRightAfter.find(! _.isEmpty).isEmpty && p.runsAfter.find(! _.isEmpty).isEmpty)
244
- graph.addEdge(start.phaseName, name , Follows )
249
+ graph.addEdge(start.phaseName, p.phaseName , Follows )
245
250
if (p != end || p == end && p == start)
246
251
if (! p.runsBefore.contains(end.phaseName))
247
- graph.addEdge(name , end.phaseName, Follows )
252
+ graph.addEdge(p.phaseName , end.phaseName, Follows )
248
253
}
249
254
}
250
255
}
0 commit comments