Skip to content

Commit 75f414e

Browse files
authored
Merge branch 'master' into fewolf_finer_chopper
2 parents 93f9634 + bd03b3f commit 75f414e

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

src/main/scala/viper/silver/frontend/SilFrontend.scala

+22-2
Original file line numberDiff line numberDiff line change
@@ -268,18 +268,38 @@ trait SilFrontend extends DefaultFrontend {
268268
_verificationResult = _verificationResult.map(plugins.mapVerificationResult(_program.get, _))
269269
}
270270

271+
/**
272+
* Finish verification and report results via the reporter. This method is intended to be called only when
273+
* Viper is called as a standalone application (i.e., not from a frontend).
274+
*/
271275
def finish(): Unit = {
272276
val tRes = result.transformedResult()
273277
val res = plugins.beforeFinish(tRes)
274-
_verificationResult = Some(res)
275-
res match {
278+
val filteredRes = res match {
279+
case Success => res
280+
case Failure(errors) =>
281+
// Remove duplicate errors
282+
Failure(errors.distinctBy(failureFilterAndGroupingCriterion))
283+
}
284+
_verificationResult = Some(filteredRes)
285+
filteredRes match {
276286
case Success =>
277287
reporter report OverallSuccessMessage(verifier.name, getTime)
278288
case f: Failure =>
279289
reporter report OverallFailureMessage(verifier.name, getTime, f)
280290
}
281291
}
282292

293+
private def failureFilterAndGroupingCriterion(e: AbstractError): String = {
294+
// apply transformers if available:
295+
val transformedError = e match {
296+
case e: AbstractVerificationError => e.transformedError()
297+
case e => e
298+
}
299+
// create a string that identifies the given failure:
300+
transformedError.readableMessage
301+
}
302+
283303
protected def parseCommandLine(args: Seq[String]): Unit = {
284304
_config = configureVerifier(args)
285305
}

0 commit comments

Comments
 (0)