From 5ed30f910c788077621bc193eea334c3c6a5af90 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 21 Apr 2016 10:43:21 -0600 Subject: [PATCH] Create synthetic iterator boundaries between open and close tags If no non-negative integer exists between an open and close tag code, we still need to report a boundary there, since close tags always have to come first at any given iterator position. :pear:ed with @as-cii --- spec/tokenized-buffer-iterator-spec.js | 40 ++++++++++++++++++++++++++ src/tokenized-buffer-iterator.coffee | 11 +++++-- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 spec/tokenized-buffer-iterator-spec.js diff --git a/spec/tokenized-buffer-iterator-spec.js b/spec/tokenized-buffer-iterator-spec.js new file mode 100644 index 000000000..639714136 --- /dev/null +++ b/spec/tokenized-buffer-iterator-spec.js @@ -0,0 +1,40 @@ +/** @babel */ + +import TokenizedBufferIterator from '../src/tokenized-buffer-iterator' +import {Point} from 'text-buffer' + +describe('TokenizedBufferIterator', () => { + it('reports two boundaries at the same position when tags close, open, then close again without a non-negative integer separating them (regression)', () => { + const tokenizedBuffer = { + tokenizedLineForRow () { + return { + tags: [-1, -2, -1, -2], + text: '', + openScopes: [] + } + } + } + + const grammarRegistry = { + scopeForId () { + return 'foo' + } + } + + const iterator = new TokenizedBufferIterator(tokenizedBuffer, grammarRegistry) + + iterator.seek(Point(0, 0)) + expect(iterator.getPosition()).toEqual(Point(0, 0)) + expect(iterator.getCloseTags()).toEqual([]) + expect(iterator.getOpenTags()).toEqual(['foo']) + + iterator.moveToSuccessor() + expect(iterator.getPosition()).toEqual(Point(0, 0)) + expect(iterator.getCloseTags()).toEqual(['foo']) + expect(iterator.getOpenTags()).toEqual(['foo']) + + iterator.moveToSuccessor() + expect(iterator.getCloseTags()).toEqual(['foo']) + expect(iterator.getOpenTags()).toEqual([]) + }) +}) diff --git a/src/tokenized-buffer-iterator.coffee b/src/tokenized-buffer-iterator.coffee index e6e129d7a..725041def 100644 --- a/src/tokenized-buffer-iterator.coffee +++ b/src/tokenized-buffer-iterator.coffee @@ -28,7 +28,11 @@ class TokenizedBufferIterator else scopeName = @grammarRegistry.scopeForId(tag) if tag % 2 is 0 - @closeTags.push(scopeName) + if @openTags.length > 0 + @tagIndex = index + break + else + @closeTags.push(scopeName) else @openTags.push(scopeName) @@ -56,7 +60,10 @@ class TokenizedBufferIterator else scopeName = @grammarRegistry.scopeForId(tag) if tag % 2 is 0 - @closeTags.push(scopeName) + if @openTags.length > 0 + break + else + @closeTags.push(scopeName) else @openTags.push(scopeName) @tagIndex++