Skip to content

Commit e8521cb

Browse files
authored
Deterministic Plugin Execution Order (#853)
* makes plugin order deterministic * makes sure that the refute plugin is executed whenever the smoke detection plugin is used * adds a warning if a plugin will be executed multiple times * fixes check for duplicate plugins * implements CR suggestion by Marco
1 parent 036ae3f commit e8521cb

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

Diff for: src/main/scala/viper/silver/frontend/SilFrontend.scala

+14-5
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,23 @@ trait SilFrontend extends DefaultFrontend {
6262
def resetPlugins(): Unit = {
6363
val pluginsArg: Option[String] = if (_config != null) {
6464
// concat defined plugins and default plugins
65-
val list = (if (_config.enableSmokeDetection()) Set(smokeDetectionPlugin, refutePlugin) else Set()) ++
66-
(if (_config.disableDefaultPlugins()) Set() else defaultPlugins) ++
67-
_config.plugin.toOption.toSet
65+
// we do not use sets here as the order of plugins matters!
66+
// note that the smoke detection plugin requires the refute plugin
67+
val smokeDetectionAndDependencies = if (_config.enableSmokeDetection()) Seq(smokeDetectionPlugin, refutePlugin) else Seq.empty
68+
val pluginClasses = smokeDetectionAndDependencies ++
69+
// filter `defaultPlugins` to avoid duplicates
70+
(if (_config.disableDefaultPlugins()) Seq.empty else defaultPlugins.filterNot(p => smokeDetectionAndDependencies.contains(p))) ++
71+
_config.plugin.toOption.map(_.split(":").toSeq).getOrElse(Seq.empty)
72+
73+
val duplicatePluginClasses = pluginClasses.groupBy(identity).collect { case (x, instances) if instances.length > 1 => x }
74+
if (duplicatePluginClasses.nonEmpty) {
75+
reporter report ConfigurationWarning(s"The following plugins will be executed multiple times, which is most likely a configuration mistake: ${duplicatePluginClasses.mkString(", ")}.")
76+
}
6877

69-
if (list.isEmpty) {
78+
if (pluginClasses.isEmpty) {
7079
None
7180
} else {
72-
Some(list.mkString(":"))
81+
Some(pluginClasses.mkString(":"))
7382
}
7483
} else {
7584
None

Diff for: src/main/scala/viper/silver/reporter/Message.scala

+4
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,10 @@ case class ConfigurationConfirmation(override val text: String) extends SimpleMe
283283
override val name: String = "configuration_confirmation"
284284
}
285285

286+
case class ConfigurationWarning(override val text: String) extends SimpleMessage(text) {
287+
override val name: String = "configuration_warning"
288+
}
289+
286290
case class AnnotationWarning(override val text: String) extends SimpleMessage(text) {
287291
override val name: String = "annotation_warning"
288292
}

0 commit comments

Comments
 (0)