module.exports = class TokenIterator { constructor (languageMode) { this.languageMode = languageMode } reset (line) { this.line = line this.index = null this.startColumn = 0 this.endColumn = 0 this.scopes = this.line.openScopes.map(id => this.languageMode.grammar.scopeForId(id)) this.scopeStarts = this.scopes.slice() this.scopeEnds = [] return this } next () { const {tags} = this.line if (this.index != null) { this.startColumn = this.endColumn this.scopeEnds.length = 0 this.scopeStarts.length = 0 this.index++ } else { this.index = 0 } while (this.index < tags.length) { const tag = tags[this.index] if (tag < 0) { const scope = this.languageMode.grammar.scopeForId(tag) if ((tag % 2) === 0) { if (this.scopeStarts[this.scopeStarts.length - 1] === scope) { this.scopeStarts.pop() } else { this.scopeEnds.push(scope) } this.scopes.pop() } else { this.scopeStarts.push(scope) this.scopes.push(scope) } this.index++ } else { this.endColumn += tag this.text = this.line.text.substring(this.startColumn, this.endColumn) return true } } return false } getScopes () { return this.scopes } getScopeStarts () { return this.scopeStarts } getScopeEnds () { return this.scopeEnds } getText () { return this.text } getBufferStart () { return this.startColumn } getBufferEnd () { return this.endColumn } }