mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-11-13 08:44:12 +03:00
🐎 Fetch scopes only if required
This commit is contained in:
parent
3f53a72620
commit
e843c2f058
@ -293,7 +293,7 @@ class DisplayBuffer extends Model
|
||||
|
||||
getSoftWrapColumnForTokenizedLine: (tokenizedLine) ->
|
||||
lineMaxWidth = @getSoftWrapColumn() * @getDefaultCharWidth()
|
||||
iterator = tokenizedLine.getTokenIterator()
|
||||
iterator = tokenizedLine.getTokenIterator(false)
|
||||
column = 0
|
||||
currentWidth = 0
|
||||
while iterator.next()
|
||||
|
@ -40,7 +40,7 @@ class LinesYardstick
|
||||
previousColumn = 0
|
||||
previousLeft = 0
|
||||
|
||||
@tokenIterator.reset(line)
|
||||
@tokenIterator.reset(line, false)
|
||||
while @tokenIterator.next()
|
||||
text = @tokenIterator.getText()
|
||||
textIndex = 0
|
||||
@ -112,7 +112,7 @@ class LinesYardstick
|
||||
indexWithinTextNode = null
|
||||
charIndex = 0
|
||||
|
||||
@tokenIterator.reset(line)
|
||||
@tokenIterator.reset(line, false)
|
||||
while @tokenIterator.next()
|
||||
break if foundIndexWithinTextNode?
|
||||
|
||||
|
@ -3,18 +3,16 @@
|
||||
|
||||
module.exports =
|
||||
class TokenIterator
|
||||
constructor: ({@grammarRegistry}, line) ->
|
||||
@reset(line) if line?
|
||||
constructor: ({@grammarRegistry}, line, enableScopes) ->
|
||||
@reset(line, enableScopes) if line?
|
||||
|
||||
reset: (@line) ->
|
||||
reset: (@line, @enableScopes=true) ->
|
||||
@index = null
|
||||
@bufferStart = @line.startBufferColumn
|
||||
@bufferEnd = @bufferStart
|
||||
@screenStart = 0
|
||||
@screenEnd = 0
|
||||
@scopes = @line.openScopes.map (id) => @grammarRegistry.scopeForId(id)
|
||||
@scopeStarts = @scopes.slice()
|
||||
@scopeEnds = []
|
||||
@resetScopes() if @enableScopes
|
||||
this
|
||||
|
||||
next: ->
|
||||
@ -22,26 +20,16 @@ class TokenIterator
|
||||
|
||||
if @index?
|
||||
@index++
|
||||
@scopeEnds.length = 0
|
||||
@scopeStarts.length = 0
|
||||
@bufferStart = @bufferEnd
|
||||
@screenStart = @screenEnd
|
||||
@clearScopeStartsAndEnds() if @enableScopes
|
||||
else
|
||||
@index = 0
|
||||
|
||||
while @index < tags.length
|
||||
tag = tags[@index]
|
||||
if tag < 0
|
||||
scope = @grammarRegistry.scopeForId(tag)
|
||||
if tag % 2 is 0
|
||||
if @scopeStarts[@scopeStarts.length - 1] is scope
|
||||
@scopeStarts.pop()
|
||||
else
|
||||
@scopeEnds.push(scope)
|
||||
@scopes.pop()
|
||||
else
|
||||
@scopeStarts.push(scope)
|
||||
@scopes.push(scope)
|
||||
@handleScopeForTag(tag) if @enableScopes
|
||||
@index++
|
||||
else
|
||||
if @isHardTab()
|
||||
@ -59,6 +47,27 @@ class TokenIterator
|
||||
|
||||
false
|
||||
|
||||
resetScopes: ->
|
||||
@scopes = @line.openScopes.map (id) => @grammarRegistry.scopeForId(id)
|
||||
@scopeStarts = @scopes.slice()
|
||||
@scopeEnds = []
|
||||
|
||||
clearScopeStartsAndEnds: ->
|
||||
@scopeEnds.length = 0
|
||||
@scopeStarts.length = 0
|
||||
|
||||
handleScopeForTag: (tag) ->
|
||||
scope = @grammarRegistry.scopeForId(tag)
|
||||
if tag % 2 is 0
|
||||
if @scopeStarts[@scopeStarts.length - 1] is scope
|
||||
@scopeStarts.pop()
|
||||
else
|
||||
@scopeEnds.push(scope)
|
||||
@scopes.pop()
|
||||
else
|
||||
@scopeStarts.push(scope)
|
||||
@scopes.push(scope)
|
||||
|
||||
getBufferStart: -> @bufferStart
|
||||
getBufferEnd: -> @bufferEnd
|
||||
|
||||
|
@ -184,7 +184,7 @@ class TokenizedLine
|
||||
@lineIsWhitespaceOnly = true
|
||||
@firstTrailingWhitespaceIndex = 0
|
||||
|
||||
getTokenIterator: -> @tokenIterator.reset(this)
|
||||
getTokenIterator: -> @tokenIterator.reset(this, arguments...)
|
||||
|
||||
Object.defineProperty @prototype, 'tokens', get: ->
|
||||
iterator = @getTokenIterator()
|
||||
|
Loading…
Reference in New Issue
Block a user