@@ -45,27 +45,29 @@ object StreamReader {
4545 * @author Miles Sabin
4646 * @author Martin Odersky
4747 */
48- sealed class StreamReader (seq : PagedSeq [Char ], off : Int , lnum : Int ) extends PagedSeqReader (seq, off) {
49- import StreamReader ._
48+ sealed class StreamReader private (seq : PagedSeq [Char ], off : Int , lnum : Int , nextEol0 : Int ) extends PagedSeqReader (seq, off) {
49+ def this (seq : PagedSeq [Char ], off : Int , lnum : Int ) = this (seq, off, lnum, - 1 )
50+
51+ import StreamReader .EofCh
5052
5153 override def rest : StreamReader =
52- if (off == seq.length ) this
54+ if (! seq.isDefinedAt(off) ) this
5355 else if (seq(off) == '\n ' )
54- new StreamReader (seq.slice(off + 1 ), 0 , lnum + 1 )
55- else new StreamReader (seq, off + 1 , lnum)
56+ new StreamReader (seq.slice(off + 1 ), 0 , lnum + 1 , - 1 )
57+ else new StreamReader (seq, off + 1 , lnum, nextEol0 )
5658
57- private def nextEol = {
59+ private def nextEol = if (nextEol0 == - 1 ) {
5860 var i = off
59- while (i < seq.length && seq(i) != '\n ' && seq(i) != EofCh ) i += 1
61+ while (seq.isDefinedAt(i) && seq(i) != '\n ' && seq(i) != EofCh ) i += 1
6062 i
61- }
63+ } else nextEol0
6264
6365 override def drop (n : Int ): StreamReader = {
6466 val eolPos = nextEol
65- if (eolPos < off + n && eolPos < seq.length )
66- new StreamReader (seq.slice(eolPos + 1 ), 0 , lnum + 1 ).drop(off + n - (eolPos + 1 ))
67+ if (eolPos < off + n && seq.isDefinedAt(eolPos) )
68+ new StreamReader (seq.slice(eolPos + 1 ), 0 , lnum + 1 , - 1 ).drop(off + n - (eolPos + 1 ))
6769 else
68- new StreamReader (seq, off + n, lnum)
70+ new StreamReader (seq, off + n, lnum, eolPos )
6971 }
7072
7173 override def pos : Position = new Position {
0 commit comments