From 5f9356bf8fd8e33553e26ed8bd7edf1e2c83a512 Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Tue, 8 Mar 2016 11:43:02 +0100
Subject: [PATCH] Fix ugly mess with reports in Main

---
 src/main/scala/leon/Main.scala                | 31 ++++++-------------
 .../leon/termination/TerminationReport.scala  |  3 +-
 .../scala/leon/utils/PrintReportPhase.scala   | 16 ++++++++++
 src/main/scala/leon/utils/Report.scala        |  8 +++++
 .../verification/VerificationReport.scala     |  3 +-
 5 files changed, 38 insertions(+), 23 deletions(-)
 create mode 100644 src/main/scala/leon/utils/PrintReportPhase.scala
 create mode 100644 src/main/scala/leon/utils/Report.scala

diff --git a/src/main/scala/leon/Main.scala b/src/main/scala/leon/Main.scala
index 90e222933..db23f2a6a 100644
--- a/src/main/scala/leon/Main.scala
+++ b/src/main/scala/leon/Main.scala
@@ -3,6 +3,7 @@
 package leon
 
 import leon.utils._
+import leon.verification.VerificationReport
 
 object Main {
 
@@ -11,7 +12,7 @@ object Main {
       frontends.scalac.ExtractionPhase,
       frontends.scalac.ClassgenPhase,
       utils.TypingPhase,
-      FileOutputPhase,
+      utils.FileOutputPhase,
       purescala.RestoreMethods,
       xlang.ArrayTransformation,
       xlang.EpsilonElimination,
@@ -192,14 +193,18 @@ object Main {
           ExtractionPhase andThen
           new PreprocessingPhase(xlangF)
 
-      val verification = if (xlangF) VerificationPhase andThen FixReportLabels else VerificationPhase
+      val verification =
+        VerificationPhase andThen
+        (if (xlangF) FixReportLabels else NoopPhase[VerificationReport]()) andThen
+        PrintReportPhase
+      val termination  = TerminationPhase andThen PrintReportPhase
 
       val pipeProcess: Pipeline[Program, Any] = {
         if (noopF) RestoreMethods andThen FileOutputPhase
         else if (synthesisF) SynthesisPhase
         else if (repairF) RepairPhase
-        else if (analysisF) Pipeline.both(verification, TerminationPhase)
-        else if (terminationF) TerminationPhase
+        else if (analysisF) Pipeline.both(verification, termination)
+        else if (terminationF) termination
         else if (isabelleF) IsabellePhase
         else if (evalF) EvaluationPhase
         else if (inferInvF) InferInvariantsPhase
@@ -264,23 +269,7 @@ object Main {
       val timer = ctx.timers.total.start()
 
       // Run pipeline
-      val ctx2 = pipeline.run(ctx, args.toList) match {
-        case (ctx2, (vReport: verification.VerificationReport, tReport: termination.TerminationReport)) =>
-          ctx2.reporter.info(vReport.summaryString)
-          ctx2.reporter.info(tReport.summaryString)
-          ctx2
-
-        case (ctx2, report: verification.VerificationReport) =>
-          ctx2.reporter.info(report.summaryString)
-          ctx2
-
-        case (ctx2, report: termination.TerminationReport) =>
-          ctx2.reporter.info(report.summaryString)
-          ctx2
-
-        case (ctx2, _) =>
-          ctx2
-      }
+      val (ctx2, _) = pipeline.run(ctx, args.toList)
 
       timer.stop()
 
diff --git a/src/main/scala/leon/termination/TerminationReport.scala b/src/main/scala/leon/termination/TerminationReport.scala
index 7a10fe411..c7fc3a0b3 100644
--- a/src/main/scala/leon/termination/TerminationReport.scala
+++ b/src/main/scala/leon/termination/TerminationReport.scala
@@ -4,9 +4,10 @@ package leon
 package termination
 
 import purescala.Definitions._
+import utils.Report
 import utils.ASCIIHelpers._
 
-case class TerminationReport(ctx: LeonContext, results : Seq[(FunDef,TerminationGuarantee)], time : Double) {
+case class TerminationReport(ctx: LeonContext, results : Seq[(FunDef,TerminationGuarantee)], time : Double) extends Report {
 
   def summaryString : String = {
     var t = Table("Termination summary")
diff --git a/src/main/scala/leon/utils/PrintReportPhase.scala b/src/main/scala/leon/utils/PrintReportPhase.scala
new file mode 100644
index 000000000..cf19df757
--- /dev/null
+++ b/src/main/scala/leon/utils/PrintReportPhase.scala
@@ -0,0 +1,16 @@
+/* Copyright 2009-2016 EPFL, Lausanne */
+
+package leon
+package utils
+
+/** Pretty-prints a [[Report]] */
+case object PrintReportPhase extends UnitPhase[Report] {
+
+  override val description: String = "Print a Leon report"
+  override val name: String = "PrintReport"
+
+  override def apply(ctx: LeonContext, rep: Report): Unit = {
+    ctx.reporter.info(rep.summaryString)
+  }
+
+}
diff --git a/src/main/scala/leon/utils/Report.scala b/src/main/scala/leon/utils/Report.scala
new file mode 100644
index 000000000..4e4a64dbe
--- /dev/null
+++ b/src/main/scala/leon/utils/Report.scala
@@ -0,0 +1,8 @@
+/* Copyright 2009-2016 EPFL, Lausanne */
+
+package leon.utils
+
+/** Represents a pretty-printable report */
+abstract class Report {
+  def summaryString: String
+}
diff --git a/src/main/scala/leon/verification/VerificationReport.scala b/src/main/scala/leon/verification/VerificationReport.scala
index 847a23a2a..374122f72 100644
--- a/src/main/scala/leon/verification/VerificationReport.scala
+++ b/src/main/scala/leon/verification/VerificationReport.scala
@@ -4,8 +4,9 @@ package leon
 package verification
 
 import purescala.Definitions.Program
+import utils.Report
 
-case class VerificationReport(program: Program, results: Map[VC, Option[VCResult]]) {
+case class VerificationReport(program: Program, results: Map[VC, Option[VCResult]]) extends Report {
   val vrs: Seq[(VC, VCResult)] = results.toSeq.sortBy { case (vc, _) => (vc.fd.id.name, vc.kind.toString) }.map {
     case (vc, or) => (vc, or.getOrElse(VCResult.unknown))
   }
-- 
GitLab