Fix Tree-sitter folding bug affecting HTML

This commit is contained in:
Max Brunsfeld
2018-06-18 14:27:49 -07:00
parent 0e1decb2db
commit ed48feda82
2 changed files with 40 additions and 0 deletions

View File

@@ -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 `
<head>
<meta name='key-1', content='value-1'>
<meta name='key-2', content='value-2'>
</head>
`)
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 `
<head>…
</head>
`)
})
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, {

View File

@@ -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]
}