com.github.ghik.silencer.SuppressingReporter.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of silencer-plugin_2.13.13 Show documentation
Show all versions of silencer-plugin_2.13.13 Show documentation
Scala compiler plugin for annotation-based warning suppression
The newest version!
package com.github.ghik.silencer
import scala.collection.mutable.ArrayBuffer
import scala.reflect.internal.util.{Position, SourceFile}
import scala.reflect.io.AbstractFile
import scala.tools.nsc.reporters.{FilteringReporter, ForwardingReporter}
import scala.util.matching.Regex
class SuppressingReporter(
original: FilteringReporter,
globalFilters: List[Regex],
protected val lineContentFilters: List[Regex],
protected val pathFilters: List[Regex],
protected val sourceRoots: List[AbstractFile]
) extends ForwardingReporter(original) with SuppressingReporterBase {
//Suppressions are sorted by end offset of their suppression ranges so that nested suppressions come before
//their containing suppressions. This is ensured by FindSuppressions traverser in SilencerPlugin.
//This order is important for proper unused @silent annotation detection.
def isSuppressed(suppressions: List[Suppression], pos: Position, msg: String): Boolean =
suppressions.find(_.suppresses(pos, msg)) match {
case Some(suppression) =>
suppression.used = true
true
case _ =>
false
}
def setSuppressions(source: SourceFile, suppressions: List[Suppression]): Unit = {
fileSuppressions(source) = suppressions
for ((pos, msg) <- deferredWarnings.remove(source).getOrElse(Seq.empty))
warning(pos, msg) // will invoke `filter`
}
override def reset(): Unit = {
super.reset()
deferredWarnings.clear()
fileSuppressions.clear()
}
/** Return
* - 0: count and display
* - 1: count only, don't display
* - 2: don't count, don't display
*/
override def filter(pos: Position, msg: String, severity: Severity): Int = {
def globallySuppressed: Boolean =
matchesPathFilter(pos) || anyMatches(globalFilters, msg) || matchesLineContentFilter(pos)
def locallySuppressed: Boolean = fileSuppressions.get(pos.source) match {
case Some(suppressions) => isSuppressed(suppressions, pos, msg)
case None =>
deferredWarnings.getOrElseUpdate(pos.source, new ArrayBuffer) += ((pos, msg))
true
}
if (severity == WARNING && (globallySuppressed || locallySuppressed)) 2
else super.filter(pos, msg, severity)
}
}