@@ -14,46 +14,44 @@ import scala.reflect.internal.util.{Position, StringOps}
14
14
import Position .formatMessage
15
15
import StringOps .{countElementsAsString => countAs , trimAllTrailingSpace => trimTrailing }
16
16
17
- /** This class implements a Reporter that displays messages on a text console.
18
- */
19
- class DisplayReporter (settings : Settings , reader : BufferedReader , writer : PrintWriter , echoWriter : PrintWriter ) extends InternalReporter {
17
+ /** Facility for outputting messages, with optional user intervention. */
18
+ trait PrintReporter extends InternalReporter {
19
+
20
+ def settings : Settings
21
+ def reader : BufferedReader
22
+ def writer : PrintWriter
23
+ def echoWriter : PrintWriter
20
24
21
25
/** Whether a short file name should be displayed before errors */
22
26
var shortname : Boolean = false
23
27
24
- private def label (severity : Severity ): String = severity match {
25
- case ERROR => " error"
26
- case WARNING => " warning"
27
- case _ => " "
28
- }
29
-
30
28
private def clabel (severity : Severity ): String = severity match {
31
29
case ERROR => " error: "
32
30
case WARNING => " warning: "
33
31
case _ => " "
34
32
}
35
33
36
- /** Prints the message. */
37
- def printMessage (msg : String ): Unit = {
34
+ /** Prints the warning or error message. */
35
+ private def printMessage (msg : String ): Unit = {
38
36
writer.println(trimTrailing(msg))
39
37
writer.flush()
38
+ if (settings.prompt) displayPrompt()
40
39
}
41
40
42
41
/** Prints the message to the echoWriter, which is usually stdout. */
43
- override def echo (msg : String ): Unit = {
42
+ private def echoMessage (msg : String ): Unit = {
44
43
echoWriter.println(trimTrailing(msg))
45
44
echoWriter.flush()
46
45
}
47
46
48
- /** Prints the message with the given position indication. */
49
- def printMessage (posIn : Position , msg : String ): Unit = printMessage(formatMessage(posIn, msg, shortname))
50
-
51
- def print (pos : Position , msg : String , severity : Severity ): Unit = printMessage(pos, s " ${clabel(severity)}${msg}" )
52
-
53
- /** Prints the column marker of the given position. */
54
- def printColumnMarker (pos : Position ): Unit = if (pos.isDefined) printMessage(" " * (pos.column - 1 ) + " ^" )
55
-
56
- def info0 (pos : Position , msg : String , severity : Severity , force : Boolean ): Unit = print(pos, msg, severity)
47
+ /** Format a message and emit it. */
48
+ def display (pos : Position , msg : String , severity : Severity ): Unit = {
49
+ val text = formatMessage(pos, s " ${clabel(severity)}${msg}" , shortname)
50
+ severity match {
51
+ case INFO => echoMessage(text)
52
+ case _ => printMessage(text)
53
+ }
54
+ }
57
55
58
56
def displayPrompt (): Unit = {
59
57
writer.println()
@@ -76,14 +74,22 @@ class DisplayReporter(settings: Settings, reader: BufferedReader, writer: PrintW
76
74
override def flush () = {
77
75
writer.flush()
78
76
if (writer ne echoWriter) echoWriter.flush()
77
+ super .flush()
79
78
}
80
79
81
- override def finish () = {
80
+ def close () = {
82
81
writer.close()
83
82
if (writer ne echoWriter) echoWriter.close()
84
83
}
85
84
}
86
85
86
+ /** This class implements a Reporter that displays messages on a text console.
87
+ */
88
+ class DisplayReporter (val settings : Settings , val reader : BufferedReader , val writer : PrintWriter , val echoWriter : PrintWriter ) extends InternalReporter with PrintReporter {
89
+
90
+ def info0 (pos : Position , msg : String , severity : Severity , force : Boolean ): Unit = display(pos, msg, severity)
91
+ }
92
+
87
93
object DisplayReporter {
88
94
def apply (
89
95
settings : Settings = new Settings ,
@@ -97,46 +103,59 @@ object DisplayReporter {
97
103
class DefaultReporter (settings : Settings , writer : PrintWriter , echo : PrintWriter )
98
104
extends PositionFilter (settings, DisplayReporter (settings, Console .in, writer, echo))
99
105
with CountingReporter
106
+ with SummaryReporter
100
107
with LimitFilter {
101
108
// required constructor for -Xreporter
102
109
def this (settings : Settings ) = this (settings, new PrintWriter (Console .err, true ), new PrintWriter (Console .out, true ))
103
- def shortname_= (flag : Boolean ): Unit = delegate.asInstanceOf [DisplayReporter ].shortname = flag
104
- def shortname : Boolean = delegate.asInstanceOf [DisplayReporter ].shortname
110
+ private def displayReporter = delegate.asInstanceOf [DisplayReporter ]
111
+ def shortname_= (flag : Boolean ): Unit = displayReporter.shortname = flag
112
+ def shortname : Boolean = displayReporter.shortname
105
113
def maxerrs = settings.maxerrs.value
106
114
def maxwarns = settings.maxwarns.value
115
+ // closes output writers; reporter will go silent
116
+ def close (): Unit = displayReporter.close()
107
117
}
108
118
object DefaultReporter {
109
119
def apply (settings : Settings ) = new DefaultReporter (settings)
110
120
def apply (settings : Settings , out : PrintWriter ) = new DefaultReporter (settings, out, out)
111
121
}
112
122
123
+ /** A `Reporter` that echos a summary in `finish`. */
124
+ trait SummaryReporter extends InternalReporter {
125
+ /** Prints the number of warnings and errors if there are any. */
126
+ override def finish (): Unit = {
127
+ import reflect .internal .util .StringOps .{countElementsAsString => countAs }
128
+ if (hasWarnings) echo(s " ${countAs(WARNING .count, WARNING .toString.toLowerCase)} found " )
129
+ if (hasErrors) echo(s " ${countAs(ERROR .count, ERROR .toString.toLowerCase)} found " )
130
+ super .finish()
131
+ }
132
+ }
133
+
134
+ /** Common abstraction for filtering reporter messages. */
135
+ trait Filtering { _ : InternalReporter =>
136
+ /* True to permit the message. */
137
+ protected def filter (pos : Position , msg : String , severity : Severity ): Boolean
138
+ }
139
+
113
140
/** A `ForwardingReporter` that filters events before delegating.
114
141
*
115
142
* Concrete subclasses should implement just the abstract `filter` method.
116
143
*/
117
- trait FilteringReporter extends ForwardingReporter {
118
- /* True to permit the message. */
119
- protected def filter (pos : Position , msg : String , severity : Severity ): Boolean
120
-
144
+ trait FilteringReporter extends ForwardingReporter with Filtering {
121
145
override def echo (pos : Position , msg : String ) = if (filter(pos, msg, INFO )) delegate.echo(pos, msg)
122
146
override def warning (pos : Position , msg : String ) = if (filter(pos, msg, WARNING )) delegate.warning(pos, msg)
123
147
override def error (pos : Position , msg : String ) = if (filter(pos, msg, ERROR )) delegate.error(pos, msg)
124
148
}
125
149
126
- /** A `Reporter` that counts messages that are passed by the filter and echos a summary in `finish` . */
150
+ /** A `Reporter` that counts messages that are passed by the filter. */
127
151
trait CountingReporter extends FilteringReporter {
128
152
abstract override protected def filter (pos : Position , msg : String , severity : Severity ): Boolean =
129
153
super .filter(pos, msg, severity) && { severity.count += 1 ; true }
130
- /** Prints the number of warnings and errors if there are any. */
131
- override def finish (): Unit = {
132
- import reflect .internal .util .StringOps .{countElementsAsString => countAs }
133
- if (hasWarnings) echo(s " ${countAs(WARNING .count, WARNING .toString.toLowerCase)} found " )
134
- if (hasErrors) echo(s " ${countAs(ERROR .count, ERROR .toString.toLowerCase)} found " )
135
- super .finish()
136
- }
137
154
}
138
155
139
- /** Disable a message when super.filter has passed the message but max limit has been reached. */
156
+ /** Disable a message when super.filter has passed the message but max limit has been reached.
157
+ * `hasErrors` is implemented as a flag to defer initializing ERROR object.
158
+ */
140
159
trait LimitFilter extends FilteringReporter {
141
160
def maxerrs : Int
142
161
def maxwarns : Int
@@ -153,4 +172,10 @@ trait LimitFilter extends FilteringReporter {
153
172
case WARNING => warned = true ; WARNING .count <= maxwarns
154
173
case _ => true
155
174
}}
175
+
176
+ override def reset (): Unit = {
177
+ super .reset()
178
+ warned = false
179
+ erred = false
180
+ }
156
181
}
0 commit comments