sbtで指定した特定のScalaコンパイラの警告を表示しないようにする方法

https://github.com/ermine-language/ermine-legacy/blob/d576a7b97/build.sbt#L39-L59
https://github.com/ermine-language/ermine-legacy/blob/d576a7b97/project/Build.scala#L42-L61


自分が発明したものではなく、たまたま見つけたもの。残念ながら、sbtに直接そういう仕組みが存在するわけではなく、色々頑張る感じです。
試してないけれど、応用すれば別にコンパイラの警告以外でもなんでも制御できそう?logManagerというKeyに対して、独自に作ったLogManagerを設定すればいいらしい。実装は、AtomicInteger使ってたり、文字列比較してたり、結構頑張ってて大変そうだった。
こういうの、頑張ろうとすればいくらでも制御できて色々とsbtは奥が深い?けど、ドキュメントには*1何も書いてないし、そんなに手軽でもないので、色々あれですね。
コンパイラの警告抑制」ということに目的特化をすれば、ある程度汎用的で便利な感じにできるのだろうか?



念のため(?)、該当箇所そのまま引用もしておく。

// We're still using scala-iterv; we know, so stop telling us.
logManager in Compile ~= {coreLogMgr =>
  filterLogs(coreLogMgr){coreLog =>
    val suppWarnTails = Seq("in package scalaz is deprecated: Scalaz 6 compatibility. Migrate to scalaz.iteratee.",
                            // -unchecked always on in 2.10.2 compiler I think
                            "is unchecked since it is eliminated by erasure")
    val suppress = new java.util.concurrent.atomic.AtomicInteger(0)
    def zero(n:Int) = suppress.compareAndSet(n, 0)
    (level, message) => {
      suppress.decrementAndGet() match {
        case n if suppWarnTails exists message.endsWith =>
          suppress.compareAndSet(n, 2)
        case 1 if level == Level.Warn => ()
        case 0 if level == Level.Warn && (message endsWith "^") => ()
        case n if coreLog atLevel level =>
          zero(n)
          coreLog.log(level, message)
        case n => zero(n)
      }
    }
  }
}
  /** Filter messages sent through loggers produced by `coreLogMgr`.
    *
    * @param logf Invoke for each acquired logger; invoke its result
    *             for each log message that comes in.
    */
  def filterLogs(coreLogMgr: LogManager
               )(logf: AbstractLogger => (Level.Value, => String) => Unit): LogManager =
    new LogManager {
      def apply(data: Settings[Scope], state: State,
                task: ScopedKey[_], writer: java.io.PrintWriter): Logger = {
        coreLogMgr(data, state, task, writer) match {
          case coreLog: AbstractLogger => new MultiLogger(List(coreLog)) {
            private val logfn = logf(coreLog)
            override def log(level: Level.Value, message: => String) =
              logfn(level, message)
          }
          case log => log
        }
      }
    }

*1:少なくとも sbt/website のリポジトリをLogManagerでgrepした限り