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

Restore original reporter after compilation #33

Merged
merged 2 commits into from
Jan 13, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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 {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe a short doc on why this is necessary? :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, added some doc :)


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

}