@@ -268,18 +268,38 @@ trait SilFrontend extends DefaultFrontend {
268
268
_verificationResult = _verificationResult.map(plugins.mapVerificationResult(_program.get, _))
269
269
}
270
270
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
+ */
271
275
def finish (): Unit = {
272
276
val tRes = result.transformedResult()
273
277
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 {
276
286
case Success =>
277
287
reporter report OverallSuccessMessage (verifier.name, getTime)
278
288
case f : Failure =>
279
289
reporter report OverallFailureMessage (verifier.name, getTime, f)
280
290
}
281
291
}
282
292
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
+
283
303
protected def parseCommandLine (args : Seq [String ]): Unit = {
284
304
_config = configureVerifier(args)
285
305
}
0 commit comments