summaryrefslogtreecommitdiff
path: root/src/library/scala/reflect/api/FrontEnds.scala
blob: a201b83444788ff6efb3b6086e2c84997e7dc507 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package scala.reflect
package api

// [Martin to Eugene] Todo: Needs to be evicted from API
// [Eugene++ to Martin] but how? we need them for macros
trait FrontEnds {

  type Position >: Null

  trait FrontEnd {
    object severity extends Enumeration
    class Severity(val id: Int) extends severity.Value {
      var count: Int = 0
      override def toString() = this match {
        case INFO => "INFO"
        case WARNING => "WARNING"
        case ERROR => "ERROR"
        case _ => "<unknown>"
      }
    }
    val INFO    = new Severity(0)
    val WARNING = new Severity(1)
    val ERROR   = new Severity(2)

    def hasErrors   = ERROR.count > 0
    def hasWarnings = WARNING.count > 0

    case class Info(val pos: Position, val msg: String, val severity: Severity)
    val infos = new collection.mutable.LinkedHashSet[Info]

    /** Handles incoming info */
    def log(pos: Position, msg: String, severity: Severity) {
      infos += new Info(pos, msg, severity)
      severity.count += 1
      display(infos.last)
    }

    /** Displays incoming info */
    def display(info: Info): Unit

    /** Services a request to drop into interactive mode */
    def interactive(): Unit

    /** Refreshes the UI */
    def flush(): Unit = {}

    /** Resets the reporter */
    def reset(): Unit = {
      INFO.count = 0
      WARNING.count = 0
      ERROR.count = 0
      infos.clear()
    }
  }

  class SilentFrontEnd extends FrontEnd {
    def display(info: Info) {}
    def interactive() {}
  }

  /** Creates a UI-less reporter that simply accumulates all the messages
   */
  def mkSilentFrontEnd(): FrontEnd = new SilentFrontEnd()

  /** Creates a reporter that prints messages to the console according to the settings.
   *
   *  ``minSeverity'' determines minimum severity of the messages to be printed.
   *  0 stands for INFO, 1 stands for WARNING and 2 stands for ERROR.
   */
  // todo. untangle warningsAsErrors from Reporters. I don't feel like moving this flag here!
  def mkConsoleFrontEnd(minSeverity: Int = 1): FrontEnd
}