Skip to content
This repository has been archived by the owner on Mar 27, 2023. It is now read-only.

Commit

Permalink
Merge pull request #33 from kciesielski/restore-reporter
Browse files Browse the repository at this point in the history
Restore original reporter after compilation
  • Loading branch information
adamw committed Jan 13, 2017
2 parents 701ea95 + 0eb9728 commit f322a4c
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
Expand Up @@ -54,7 +54,7 @@ class ClippyPlugin(val global: Global) extends Plugin {
}
}

override val components: List[PluginComponent] = List(new InjectReporter(handleError, global))
override val components: List[PluginComponent] = List(new InjectReporter(handleError, global), new RestoreReporter(global))

private def prettyPrintTypeMismatchError(tme: TypeMismatchError[ExactT], msg: String): String = {
val plain = new StringDiff(tme.required.toString, tme.found.toString)
Expand Down
Expand Up @@ -4,6 +4,9 @@ import scala.reflect.internal.util.Position
import scala.tools.nsc.plugins.PluginComponent
import scala.tools.nsc.{Global, Phase}

/**
* Responsible for replacing the global reporter with our custom Clippy reporter after the first phase of compilation.
*/
class InjectReporter(handleError: (Position, String) => String, superGlobal: Global) extends PluginComponent {

override val global = superGlobal
Expand Down
@@ -0,0 +1,30 @@
package com.softwaremill.clippy

import scala.tools.nsc.plugins.PluginComponent
import scala.tools.nsc.{Global, Phase}

/**
* Replaces global reporter back with the original global reporter. Sbt uses its own xsbt.DelegatingReporter
* which we cannot replace outside of Scala compilation phases. This component makes sure that before the compilation
* is over, original reporter gets reassigned to the global field.
*/
class RestoreReporter(val global: Global) extends PluginComponent {

val originalReporter = global.reporter

override val runsAfter = List[String]("jvm")
override val runsBefore = List[String]("terminal")
override val phaseName = "restore-original-reporter"

override def newPhase(prev: Phase) = new Phase(prev) {

override def name = phaseName

override def description = "Switches the reporter from Clippy's DelegatingReporter back to original one"

override def run(): Unit = {
global.reporter = originalReporter
}
}

}

0 comments on commit f322a4c

Please sign in to comment.