This commit is contained in:
Ashi Krishnan
2018-07-24 13:34:41 -04:00
parent 97ae903cab
commit f2e54a70f0
3 changed files with 46 additions and 18 deletions

View File

@@ -313,6 +313,39 @@ describe('TreeSitterLanguageMode', () => {
])
})
it('applies rules when specified', async () => {
const grammar = new TreeSitterGrammar(atom.grammars, jsGrammarPath, {
parser: 'tree-sitter-javascript',
scopes: {
'identifier': [
{match: '^(exports|document|window|global)$', scopes: 'global'},
{match: '^[A-Z_]+$', scopes: 'constant'},
{match: '^[A-Z]', scopes: 'constructor'},
'variable'
],
}
})
buffer.setText(`exports.object = Class(SOME_CONSTANT, x)`)
const languageMode = new TreeSitterLanguageMode({buffer, grammar})
buffer.setLanguageMode(languageMode)
await nextHighlightingUpdate(languageMode)
expectTokensToEqual(editor, [
[
{text: 'exports', scopes: ['global']},
{text: '.object = ', scopes: []},
{text: 'Class', scopes: ['constructor']},
{text: '(', scopes: []},
{text: 'SOME_CONSTANT', scopes: ['constant']},
{text: ', ', scopes: []},
{text: 'x', scopes: ['variable']},
{text: ')', scopes: []},
]
])
})
describe('when the buffer changes during a parse', () => {
it('immediately parses again when the current parse completes', async () => {
const grammar = new TreeSitterGrammar(atom.grammars, jsGrammarPath, {

View File

@@ -2,23 +2,6 @@ const path = require('path')
const SyntaxScopeMap = require('./syntax-scope-map')
const Module = require('module')
tap = x => (console.log(x), x)
const toSyntaxClasses = scopes =>
typeof scopes == 'string'
? scopes
.split('.')
.map(s => `syntax--${s}`)
.join(' ')
:
Array.isArray(scopes)
? scopes.map(toSyntaxClasses)
:
scopes.match
? tap({match: new RegExp(scopes.match), scopes: toSyntaxClasses(scopes.scopes)})
:
Object.assign({}, scopes, {scopes: toSyntaxClasses(scopes.scopes)})
module.exports =
class TreeSitterGrammar {
constructor (registry, filePath, params) {
@@ -86,3 +69,15 @@ class TreeSitterGrammar {
if (this.registration) this.registration.dispose()
}
}
const toSyntaxClasses = scopes =>
typeof scopes === 'string'
? scopes
.split('.')
.map(s => `syntax--${s}`)
.join(' ')
: Array.isArray(scopes)
? scopes.map(toSyntaxClasses)
: scopes.match
? {match: new RegExp(scopes.match), scopes: toSyntaxClasses(scopes.scopes)}
: Object.assign({}, scopes, {scopes: toSyntaxClasses(scopes.scopes)})

View File

@@ -919,7 +919,7 @@ class LayerHighlightIterator {
const applyLeafRules = (rules, cursor) => {
if (!rules || typeof rules === 'string') return rules
if (Array.isArray(rules)) {
for (let i = 0, {length} = rules; i != length; ++i) {
for (let i = 0, {length} = rules; i !== length; ++i) {
const result = applyLeafRules(rules[i], cursor)
if (result) return result
}