aboutsummaryrefslogblamecommitdiff
path: root/compiler/src/dotty/tools/dotc/reporting/UniqueMessagePositions.scala
blob: 6fd971c2a4c064145b40d29300c6afa9f9576f82 (plain) (tree)
1
2
3
4
5
6
7
8
9




                               
                                        
                            
                                  
 

                                                                           

                                               
                                                                     



                                                                                            
                                                                              

                          





                                                                     
         
                  

       
 
package dotty.tools
package dotc
package reporting

import scala.collection.mutable
import util.{SourcePosition, SourceFile}
import core.Contexts.Context
import diagnostic.MessageContainer

/** This trait implements `isHidden` so that multiple messages per position
  * are suppressed, unless they are of increasing severity. */
trait UniqueMessagePositions extends Reporter {

  private val positions = new mutable.HashMap[(SourceFile, Int), Int]

  /** Logs a position and returns true if it was already logged.
   *  @note  Two positions are considered identical for logging if they have the same point.
   */
  override def isHidden(m: MessageContainer)(implicit ctx: Context): Boolean =
    super.isHidden(m) || {
      m.pos.exists && {
        var shouldHide = false
        for (pos <- m.pos.start to m.pos.end) {
          positions get (ctx.source, pos) match {
            case Some(level) if level >= m.level => shouldHide = true
            case _ => positions((ctx.source, pos)) = m.level
          }
        }
        shouldHide
      }
    }
}