mirror of
https://github.com/atom/atom.git
synced 2026-02-15 17:15:24 -05:00
Clip to next boundary when seeking iterator to the middle of a text tag
Previously, when calling `TokenizedBufferIterator.seek` with a position that lied within a text tag, we advanced the iterator by the extent of that tag without, however, consuming it. Hence, when calling `moveToSuccessor` afterward, we would consume that tag and advance the iterator again, thus effectively moving it twice and making its position inaccurate. An option could be to clip to the left of the textual tag without consuming it. However, this would be a little odd with respect to the current contract between (`DisplayLayer` and) `seek`, whose promise is to move the iterator to a position that is greater or equal than the one asked by the caller. Therefore, with this commit, we are changing the behavior of `seek` in this particular scenario to consume the tag in question and process all its siblings until a tag boundary is finally found. This ensures that the above contract is always respected, while still preserving the "seek to leftmost tag boundary" semantics (i.e. notice how in the changed test case, calling `seek` with `Point(0, 1)` is the same as calling it with `Point(0, 3)`).
This commit is contained in:
@@ -21,21 +21,18 @@ class TokenizedBufferIterator
|
||||
|
||||
for tag, index in @currentTags
|
||||
if tag >= 0
|
||||
if currentColumn is position.column
|
||||
if currentColumn >= position.column
|
||||
@tagIndex = index
|
||||
break
|
||||
else
|
||||
currentColumn += tag
|
||||
@containingTags.pop() while @closeTags.shift()
|
||||
@containingTags.push(openTag) while openTag = @openTags.shift()
|
||||
if currentColumn > position.column
|
||||
@tagIndex = index
|
||||
break
|
||||
else
|
||||
scopeName = @tokenizedBuffer.grammar.scopeForId(tag)
|
||||
if tag % 2 is 0 # close tag
|
||||
if @openTags.length > 0
|
||||
if currentColumn is position.column
|
||||
if currentColumn >= position.column
|
||||
@tagIndex = index
|
||||
break
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user