diff --git a/spec/tree-sitter-language-mode-spec.js b/spec/tree-sitter-language-mode-spec.js index 7beb6a5e4..014d8122e 100644 --- a/spec/tree-sitter-language-mode-spec.js +++ b/spec/tree-sitter-language-mode-spec.js @@ -10,6 +10,7 @@ const TreeSitterLanguageMode = require('../src/tree-sitter-language-mode') const cGrammarPath = require.resolve('language-c/grammars/tree-sitter-c.cson') const pythonGrammarPath = require.resolve('language-python/grammars/tree-sitter-python.cson') const jsGrammarPath = require.resolve('language-javascript/grammars/tree-sitter-javascript.cson') +const htmlGrammarPath = require.resolve('language-html/grammars/tree-sitter-html.cson') describe('TreeSitterLanguageMode', () => { let editor, buffer @@ -575,6 +576,40 @@ describe('TreeSitterLanguageMode', () => { `) }) + it('does not fold when the start and end parameters match the same child', async () => { + const grammar = new TreeSitterGrammar(atom.grammars, htmlGrammarPath, { + parser: 'tree-sitter-html', + folds: [ + { + type: 'element', + start: {index: 0}, + end: {index: -1} + } + ] + }) + + const languageMode = new TreeSitterLanguageMode({buffer, grammar}) + buffer.setLanguageMode(languageMode) + buffer.setText(dedent ` +
+ + + + `) + + await languageMode.reparsePromise + + // Void elements have only one child + expect(editor.isFoldableAtBufferRow(1)).toBe(false) + expect(editor.isFoldableAtBufferRow(2)).toBe(false) + + editor.foldBufferRow(0) + expect(getDisplayText(editor)).toBe(dedent ` + … + + `) + }) + describe('when folding a node that ends with a line break', () => { it('ends the fold at the end of the previous line', () => { const grammar = new TreeSitterGrammar(atom.grammars, pythonGrammarPath, { diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index c11b0390a..5d8e743ed 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -304,6 +304,7 @@ class TreeSitterLanguageMode { foldEnd = new Point(foldEndNode.startPosition.row - 1, Infinity) } else { foldEnd = foldEndNode.startPosition + if (!pointIsGreater(foldEnd, foldStart)) continue } } else { const {endPosition} = node @@ -561,6 +562,10 @@ class TreeSitterHighlightIterator { } } +function pointIsGreater (left, right) { + return left.row > right.row || left.row === right.row && left.column > right.column +} + function last (array) { return array[array.length - 1] }