Skip to content
Snippets Groups Projects
Commit eba994a1 authored by Marijn Haverbeke's avatar Marijn Haverbeke
Browse files

Use an ES6 class for StringStream

parent 7dad9d59
No related branches found
No related tags found
No related merge requests found
......@@ -5,57 +5,57 @@ import { countColumn } from "./misc"
// Fed to the mode parsers, provides helper functions to make
// parsers more succinct.
let StringStream = function(string, tabSize) {
this.pos = this.start = 0
this.string = string
this.tabSize = tabSize || 8
this.lastColumnPos = this.lastColumnValue = 0
this.lineStart = 0
}
class StringStream {
constructor(string, tabSize) {
this.pos = this.start = 0
this.string = string
this.tabSize = tabSize || 8
this.lastColumnPos = this.lastColumnValue = 0
this.lineStart = 0
}
StringStream.prototype = {
eol: function() {return this.pos >= this.string.length},
sol: function() {return this.pos == this.lineStart},
peek: function() {return this.string.charAt(this.pos) || undefined},
next: function() {
eol() {return this.pos >= this.string.length}
sol() {return this.pos == this.lineStart}
peek() {return this.string.charAt(this.pos) || undefined}
next() {
if (this.pos < this.string.length)
return this.string.charAt(this.pos++)
},
eat: function(match) {
}
eat(match) {
let ch = this.string.charAt(this.pos)
let ok
if (typeof match == "string") ok = ch == match
else ok = ch && (match.test ? match.test(ch) : match(ch))
if (ok) {++this.pos; return ch}
},
eatWhile: function(match) {
}
eatWhile(match) {
let start = this.pos
while (this.eat(match)){}
return this.pos > start
},
eatSpace: function() {
}
eatSpace() {
let start = this.pos
while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos
return this.pos > start
},
skipToEnd: function() {this.pos = this.string.length},
skipTo: function(ch) {
}
skipToEnd() {this.pos = this.string.length}
skipTo(ch) {
let found = this.string.indexOf(ch, this.pos)
if (found > -1) {this.pos = found; return true}
},
backUp: function(n) {this.pos -= n},
column: function() {
}
backUp(n) {this.pos -= n}
column() {
if (this.lastColumnPos < this.start) {
this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue)
this.lastColumnPos = this.start
}
return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
},
indentation: function() {
}
indentation() {
return countColumn(this.string, null, this.tabSize) -
(this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
},
match: function(pattern, consume, caseInsensitive) {
}
match(pattern, consume, caseInsensitive) {
if (typeof pattern == "string") {
let cased = str => caseInsensitive ? str.toLowerCase() : str
let substr = this.string.substr(this.pos, pattern.length)
......@@ -69,9 +69,9 @@ StringStream.prototype = {
if (match && consume !== false) this.pos += match[0].length
return match
}
},
current: function(){return this.string.slice(this.start, this.pos)},
hideFirstChars: function(n, inner) {
}
current(){return this.string.slice(this.start, this.pos)}
hideFirstChars(n, inner) {
this.lineStart += n
try { return inner() }
finally { this.lineStart -= n }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment