File tree Expand file tree Collapse file tree 2 files changed +44
-3
lines changed Expand file tree Collapse file tree 2 files changed +44
-3
lines changed Original file line number Diff line number Diff line change @@ -169,9 +169,20 @@ object Source {
169
169
createBufferedSource(is, reset = () => fromInputStream(is)(codec), close = () => is.close())(codec)
170
170
}
171
171
172
- /** The class `Source` implements an iterable representation of source data.
173
- * Calling method `reset` returns an identical, resetted source, where
174
- * possible.
172
+ /** An iterable representation of source data.
173
+ * It may be reset with the optional `reset` method.
174
+ *
175
+ * Subclasses must supply [[scala.io.Source@iter the underlying iterator ]].
176
+ *
177
+ * Error handling may be customized by overriding the [[scala.io.Source@report report ]] method.
178
+ *
179
+ * The [[scala.io.Source@ch current input ]] and [[scala.io.Source@pos position ]],
180
+ * as well as the [[scala.io.Source@next next character ]] methods delegate to
181
+ * [[scala.io.Source$Positioner the positioner ]].
182
+ *
183
+ * The default positioner encodes line and column numbers in the position passed to `report`.
184
+ * This behavior can be changed by supplying a
185
+ * [[scala.io.Source@withPositioning(pos:Source.this.Positioner):Source.this.type custom positioner ]].
175
186
*
176
187
* @author Burak Emir
177
188
* @version 1.0
Original file line number Diff line number Diff line change @@ -53,4 +53,34 @@ class SourceTest {
53
53
s.reportError(s.pos, " That doesn't sound right." , ps)
54
54
assertEquals(" 0030: THAT DOESN'T SOUND RIGHT." , out.toString(charSet))
55
55
}
56
+ @ Test def canAltCustomizeReporting () = {
57
+ class CapitalReporting (is : InputStream )(implicit codec : Codec ) extends Source {
58
+ override val iter = {
59
+ val r = new InputStreamReader (is, codec.decoder)
60
+ Iterator continually (codec wrap r.read()) takeWhile (_ != - 1 ) map (_.toChar)
61
+ }
62
+ override def report (pos : Int , msg : String , out : PrintStream ): Unit = {
63
+ out print f " $pos%04x: ${msg.toUpperCase}"
64
+ }
65
+ private [this ] var _pos : Int = _
66
+ override def pos = _pos
67
+ private [this ] var _ch : Char = _
68
+ override def ch = _ch
69
+ override def next = {
70
+ _ch = iter.next()
71
+ _pos += 1
72
+ _ch
73
+ }
74
+ }
75
+ val s = new CapitalReporting (in)
76
+ // skip to next line and report an error
77
+ do {
78
+ val c = s.next()
79
+ } while (s.ch != '\n ' )
80
+ s.next()
81
+ val out = new ByteArrayOutputStream
82
+ val ps = new PrintStream (out, true , charSet)
83
+ s.reportError(s.pos, " That doesn't sound right." , ps)
84
+ assertEquals(" 0030: THAT DOESN'T SOUND RIGHT." , out.toString(charSet))
85
+ }
56
86
}
You can’t perform that action at this time.
0 commit comments