@@ -45,27 +45,29 @@ object StreamReader {
45
45
* @author Miles Sabin
46
46
* @author Martin Odersky
47
47
*/
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
50
52
51
53
override def rest : StreamReader =
52
- if (off == seq.length ) this
54
+ if (! seq.isDefinedAt(off) ) this
53
55
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 )
56
58
57
- private def nextEol = {
59
+ private def nextEol = if (nextEol0 == - 1 ) {
58
60
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
60
62
i
61
- }
63
+ } else nextEol0
62
64
63
65
override def drop (n : Int ): StreamReader = {
64
66
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 ))
67
69
else
68
- new StreamReader (seq, off + n, lnum)
70
+ new StreamReader (seq, off + n, lnum, eolPos )
69
71
}
70
72
71
73
override def pos : Position = new Position {
0 commit comments