mirror of
https://github.com/atom/atom.git
synced 2026-01-22 21:38:10 -05:00
Merge pull request #17537 from atom/mb-html-folding-fix
Fix Tree-sitter folding bug affecting HTML
This commit is contained in:
@@ -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, {
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user