@@ -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