Skip to content

Commit 0a52055

Browse files
author
Som Snytt
committed
Warn on bad constraint name
1 parent 441cf5b commit 0a52055

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

src/compiler/scala/tools/nsc/PhaseAssembly.scala

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ trait PhaseAssembly {
3535
val graph = DependencyGraph(phasesSet)
3636
for (n <- settings.genPhaseGraph.valueSetByUser; d <- settings.outputDirs.getSingleOutput if !d.isVirtual)
3737
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)))
3939
}
4040
}
4141

@@ -48,6 +48,10 @@ class DependencyGraph(order: Int, start: String, val components: Map[String, Sub
4848

4949
//private final val debugging = false
5050

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+
5155
/** For ith vertex, its outgoing edges. */
5256
private val adjacency: Array[List[Edge]] = Array.fill(order)(Nil)
5357

@@ -231,20 +235,21 @@ object DependencyGraph {
231235
.getOrElse(throw new AssertionError("Missing terminal component"))
232236
new DependencyGraph(phases.size, start.phaseName, phases.map(p => p.phaseName -> p).toMap).tap { graph =>
233237
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)
242247
if (p != start && p != end)
243248
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)
245250
if (p != end || p == end && p == start)
246251
if (!p.runsBefore.contains(end.phaseName))
247-
graph.addEdge(name, end.phaseName, Follows)
252+
graph.addEdge(p.phaseName, end.phaseName, Follows)
248253
}
249254
}
250255
}

0 commit comments

Comments
 (0)