/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; import * as assert from 'assert'; import { decodeTextMateToken, decodeTextMateTokens, DecodeMap, TMScopeRegistry, TMLanguageRegistration } from 'vs/editor/node/textMate/TMSyntax'; suite('TextMate.TMScopeRegistry', () => { test('getFilePath', () => { let registry = new TMScopeRegistry(); registry.register('source.a', './grammar/a.tmLanguage'); assert.equal(registry.getFilePath('source.a'), './grammar/a.tmLanguage'); assert.equal(registry.getFilePath('a'), null); assert.equal(registry.getFilePath('source.b'), null); assert.equal(registry.getFilePath('b'), null); registry.register('source.b', './grammar/b.tmLanguage'); assert.equal(registry.getFilePath('source.a'), './grammar/a.tmLanguage'); assert.equal(registry.getFilePath('a'), null); assert.equal(registry.getFilePath('source.b'), './grammar/b.tmLanguage'); assert.equal(registry.getFilePath('b'), null); registry.register('source.a', './grammar/ax.tmLanguage'); assert.equal(registry.getFilePath('source.a'), './grammar/ax.tmLanguage'); assert.equal(registry.getFilePath('a'), null); assert.equal(registry.getFilePath('source.b'), './grammar/b.tmLanguage'); assert.equal(registry.getFilePath('b'), null); }); test('scopeToLanguage', () => { let registry = new TMScopeRegistry(); registry.register('source.html', './grammar/html.tmLanguage', { 'source.html': 'html', 'source.c': 'c', 'source.css': 'css', 'source.js': 'javascript', 'source.python': 'python', 'source.smarty': 'smarty', 'source.baz': null, }); let languageRegistration = registry.getLanguageRegistration('source.html'); // exact matches assert.equal(languageRegistration.scopeToLanguage('source.html'), 'html'); assert.equal(languageRegistration.scopeToLanguage('source.css'), 'css'); assert.equal(languageRegistration.scopeToLanguage('source.c'), 'c'); assert.equal(languageRegistration.scopeToLanguage('source.js'), 'javascript'); assert.equal(languageRegistration.scopeToLanguage('source.python'), 'python'); assert.equal(languageRegistration.scopeToLanguage('source.smarty'), 'smarty'); // prefix matches assert.equal(languageRegistration.scopeToLanguage('source.css.embedded.html'), 'css'); assert.equal(languageRegistration.scopeToLanguage('source.js.embedded.html'), 'javascript'); assert.equal(languageRegistration.scopeToLanguage('source.python.embedded.html'), 'python'); assert.equal(languageRegistration.scopeToLanguage('source.smarty.embedded.html'), 'smarty'); // misses assert.equal(languageRegistration.scopeToLanguage('source.ts'), null); assert.equal(languageRegistration.scopeToLanguage('source.csss'), null); assert.equal(languageRegistration.scopeToLanguage('source.baz'), null); assert.equal(languageRegistration.scopeToLanguage('asource.css'), null); assert.equal(languageRegistration.scopeToLanguage('a.source.css'), null); assert.equal(languageRegistration.scopeToLanguage('source_css'), null); assert.equal(languageRegistration.scopeToLanguage('punctuation.definition.tag.html'), null); }); }); suite('TextMate.decodeTextMateTokens', () => { test('embedded modes', () => { let registry = new TMScopeRegistry(); registry.register('source.html', './grammar/html.tmLanguage', { 'source.html': 'html', 'source.c': 'c', 'source.css': 'css', 'source.js': 'javascript', 'source.python': 'python', 'source.smarty': 'smarty', 'source.baz': null, }); let languageRegistration = registry.getLanguageRegistration('source.html'); let decodeMap = new DecodeMap(languageRegistration); let actual = decodeTextMateTokens( 'html', decodeMap, 'texttext', 0, [ { startIndex: 0, endIndex: 4, scopes: ['source.html'] }, { startIndex: 4, endIndex: 11, scopes: ['source.html', 'style.tag.open'] }, { startIndex: 11, endIndex: 17, scopes: ['source.html', 'source.css'] }, { startIndex: 17, endIndex: 25, scopes: ['source.html', 'style.tag.close'] }, { startIndex: 25, endIndex: 33, scopes: ['source.html', 'script.tag.open'] }, { startIndex: 33, endIndex: 41, scopes: ['source.html', 'source.js'] }, { startIndex: 41, endIndex: 50, scopes: ['source.html', 'script.tag.close'] }, { startIndex: 50, endIndex: 54, scopes: ['source.html'] }, ], null ); assert.deepEqual(actual.tokens, [ { offset: 0, language: 'html', type: '' }, { offset: 4, language: 'html', type: 'style.tag.open' }, { offset: 11, language: 'css', type: 'source.css' }, { offset: 17, language: 'html', type: 'style.tag.close' }, { offset: 25, language: 'html', type: 'tag.open.script' }, { offset: 33, language: 'javascript', type: 'source.js' }, { offset: 41, language: 'html', type: 'tag.close.script' }, { offset: 50, language: 'html', type: '' }, ]); }); test('php and embedded', () => { var tests = [ { line: '
', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.php', 'meta.tag.any.html', 'punctuation.definition.tag.html'] }, { startIndex: 1, endIndex: 4, scopes: ['text.html.php', 'meta.tag.any.html', 'entity.name.tag.html'] }, { startIndex: 4, endIndex: 5, scopes: ['text.html.php', 'meta.tag.any.html', 'punctuation.definition.tag.html'] }, { startIndex: 5, endIndex: 6, scopes: ['text.html.php', 'meta.tag.any.html', 'punctuation.definition.tag.html', 'meta.scope.between-tag-pair.html'] }, { startIndex: 6, endIndex: 7, scopes: ['text.html.php', 'meta.tag.any.html', 'punctuation.definition.tag.html'] }, { startIndex: 7, endIndex: 10, scopes: ['text.html.php', 'meta.tag.any.html', 'entity.name.tag.html'] }, { startIndex: 10, endIndex: 11, scopes: ['text.html.php', 'meta.tag.any.html', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'meta.tag.any.html.punctuation.definition' }, { offset: 1, language: 'html', type: 'meta.tag.any.html.entity.name' }, { offset: 4, language: 'html', type: 'meta.tag.any.html.punctuation.definition' }, { offset: 5, language: 'html', type: 'meta.tag.any.html.punctuation.definition.scope.between-tag-pair' }, { offset: 6, language: 'html', type: 'meta.tag.any.html.punctuation.definition' }, { offset: 7, language: 'html', type: 'meta.tag.any.html.entity.name' }, { offset: 10, language: 'html', type: 'meta.tag.any.html.punctuation.definition' } ] }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.php', 'punctuation.definition.tag.html'] }, { startIndex: 1, endIndex: 7, scopes: ['text.html.php', 'entity.name.tag.script.html'] }, { startIndex: 7, endIndex: 8, scopes: ['text.html.php', 'source.js.embedded.html', 'punctuation.definition.tag.html'] }, { startIndex: 8, endIndex: 11, scopes: ['text.html.php', 'source.js.embedded.html', 'meta.var.expr.js', 'storage.type.js'] }, { startIndex: 11, endIndex: 12, scopes: ['text.html.php', 'source.js.embedded.html', 'meta.var.expr.js'] }, { startIndex: 12, endIndex: 13, scopes: ['text.html.php', 'source.js.embedded.html', 'meta.var.expr.js', 'meta.var-single-variable.expr.js', 'variable.other.readwrite.js'] }, { startIndex: 13, endIndex: 14, scopes: ['text.html.php', 'source.js.embedded.html', 'meta.var.expr.js', 'meta.var-single-variable.expr.js'] }, { startIndex: 14, endIndex: 15, scopes: ['text.html.php', 'source.js.embedded.html', 'meta.var.expr.js', 'keyword.operator.assignment.js'] }, { startIndex: 15, endIndex: 16, scopes: ['text.html.php', 'source.js.embedded.html', 'meta.var.expr.js'] }, { startIndex: 16, endIndex: 17, scopes: ['text.html.php', 'source.js.embedded.html', 'meta.var.expr.js', 'constant.numeric.decimal.js'] }, { startIndex: 17, endIndex: 18, scopes: ['text.html.php', 'source.js.embedded.html', 'punctuation.terminator.statement.js'] }, { startIndex: 18, endIndex: 20, scopes: ['text.html.php', 'source.js.embedded.html', 'punctuation.definition.tag.html'] }, { startIndex: 20, endIndex: 26, scopes: ['text.html.php', 'source.js.embedded.html', 'entity.name.tag.script.html'] }, { startIndex: 26, endIndex: 27, scopes: ['text.html.php', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'tag.html.punctuation.definition' }, { offset: 1, language: 'html', type: 'tag.html.entity.name.script' }, { offset: 7, language: 'javascript', type: 'tag.html.punctuation.definition.source.js.embedded' }, { offset: 8, language: 'javascript', type: 'meta.html.source.js.embedded.var.expr.storage.type' }, { offset: 11, language: 'javascript', type: 'meta.html.source.js.embedded.var.expr' }, { offset: 12, language: 'javascript', type: 'meta.html.source.js.embedded.var.expr.var-single-variable.variable.other.readwrite' }, { offset: 13, language: 'javascript', type: 'meta.html.source.js.embedded.var.expr.var-single-variable' }, { offset: 14, language: 'javascript', type: 'meta.html.source.js.embedded.var.expr.keyword.operator.assignment' }, { offset: 15, language: 'javascript', type: 'meta.html.source.js.embedded.var.expr' }, { offset: 16, language: 'javascript', type: 'meta.html.source.js.embedded.var.expr.constant.numeric.decimal' }, { offset: 17, language: 'javascript', type: 'html.punctuation.source.js.embedded.terminator.statement' }, { offset: 18, language: 'javascript', type: 'tag.html.punctuation.definition.source.js.embedded' }, { offset: 20, language: 'javascript', type: 'tag.html.entity.name.script.source.js.embedded' }, { offset: 26, language: 'html', type: 'tag.html.punctuation.definition' } ] }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.php', 'punctuation.definition.tag.html'] }, { startIndex: 1, endIndex: 6, scopes: ['text.html.php', 'entity.name.tag.style.html'] }, { startIndex: 6, endIndex: 7, scopes: ['text.html.php', 'source.css.embedded.html', 'punctuation.definition.tag.html'] }, { startIndex: 7, endIndex: 11, scopes: ['text.html.php', 'source.css.embedded.html', 'meta.selector.css', 'entity.name.tag.css'] }, { startIndex: 11, endIndex: 12, scopes: ['text.html.php', 'source.css.embedded.html', 'meta.property-list.css', 'punctuation.section.property-list.begin.css'] }, { startIndex: 12, endIndex: 28, scopes: ['text.html.php', 'source.css.embedded.html', 'meta.property-list.css', 'meta.property-name.css', 'support.type.property-name.css'] }, { startIndex: 28, endIndex: 29, scopes: ['text.html.php', 'source.css.embedded.html', 'meta.property-list.css', 'meta.property-value.css', 'punctuation.separator.key-value.css'] }, { startIndex: 29, endIndex: 32, scopes: ['text.html.php', 'source.css.embedded.html', 'meta.property-list.css', 'meta.property-value.css', 'support.constant.color.w3c-standard-color-name.css'] }, { startIndex: 32, endIndex: 33, scopes: ['text.html.php', 'source.css.embedded.html', 'meta.property-list.css', 'meta.property-value.css', 'punctuation.terminator.rule.css'] }, { startIndex: 33, endIndex: 34, scopes: ['text.html.php', 'source.css.embedded.html', 'meta.property-list.css', 'punctuation.section.property-list.end.css'] }, { startIndex: 34, endIndex: 36, scopes: ['text.html.php', 'punctuation.definition.tag.html'] }, { startIndex: 36, endIndex: 41, scopes: ['text.html.php', 'entity.name.tag.style.html'] }, { startIndex: 41, endIndex: 42, scopes: ['text.html.php', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'tag.html.punctuation.definition' }, { offset: 1, language: 'html', type: 'tag.html.entity.name.style' }, { offset: 6, language: 'css', type: 'tag.html.punctuation.definition.source.embedded.css' }, { offset: 7, language: 'css', type: 'meta.tag.html.entity.name.source.embedded.css.selector' }, { offset: 11, language: 'css', type: 'meta.html.punctuation.source.embedded.css.property-list.section.begin' }, { offset: 12, language: 'css', type: 'meta.html.source.embedded.type.css.property-list.property-name.support' }, { offset: 28, language: 'css', type: 'meta.html.punctuation.source.embedded.css.property-list.property-value.separator.key-value' }, { offset: 29, language: 'css', type: 'meta.html.source.embedded.constant.css.property-list.support.property-value.color.w3c-standard-color-name' }, { offset: 32, language: 'css', type: 'meta.html.punctuation.source.embedded.terminator.css.property-list.property-value.rule' }, { offset: 33, language: 'css', type: 'meta.html.punctuation.source.embedded.css.property-list.section.end' }, { offset: 34, language: 'html', type: 'tag.html.punctuation.definition' }, { offset: 36, language: 'html', type: 'tag.html.entity.name.style' }, { offset: 41, language: 'html', type: 'tag.html.punctuation.definition' } ] }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.php', 'meta.embedded.block.php', 'punctuation.section.embedded.metatag.end.php', 'source.php'] }, { startIndex: 1, endIndex: 2, scopes: ['text.html.php', 'meta.embedded.block.php', 'punctuation.section.embedded.metatag.end.php'] } ], tokens: [ { offset: 0, language: 'php', type: 'meta.punctuation.source.embedded.section.end.block.php.metatag' }, { offset: 1, language: 'html', type: 'meta.punctuation.embedded.section.end.block.php.metatag' } ] }, { line: '
', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.php', 'meta.tag.block.any.html', 'punctuation.definition.tag.begin.html'] }, { startIndex: 1, endIndex: 4, scopes: ['text.html.php', 'meta.tag.block.any.html', 'entity.name.tag.block.any.html'] }, { startIndex: 4, endIndex: 5, scopes: ['text.html.php', 'meta.tag.block.any.html', 'punctuation.definition.tag.end.html'] }, { startIndex: 5, endIndex: 8, scopes: ['text.html.php', 'meta.embedded.line.php', 'punctuation.section.embedded.begin.php'] }, { startIndex: 8, endIndex: 9, scopes: ['text.html.php', 'meta.embedded.line.php', 'source.php', 'string.quoted.double.php', 'punctuation.definition.string.begin.php'] }, { startIndex: 9, endIndex: 18, scopes: ['text.html.php', 'meta.embedded.line.php', 'source.php', 'string.quoted.double.php', 'meta.string-contents.quoted.double.php'] }, { startIndex: 18, endIndex: 19, scopes: ['text.html.php', 'meta.embedded.line.php', 'source.php', 'string.quoted.double.php', 'punctuation.definition.string.end.php'] }, { startIndex: 19, endIndex: 20, scopes: ['text.html.php', 'meta.embedded.line.php', 'punctuation.section.embedded.end.php', 'source.php'] }, { startIndex: 20, endIndex: 21, scopes: ['text.html.php', 'meta.embedded.line.php', 'punctuation.section.embedded.end.php'] }, { startIndex: 21, endIndex: 23, scopes: ['text.html.php', 'meta.tag.block.any.html', 'punctuation.definition.tag.begin.html'] }, { startIndex: 23, endIndex: 26, scopes: ['text.html.php', 'meta.tag.block.any.html', 'entity.name.tag.block.any.html'] }, { startIndex: 26, endIndex: 27, scopes: ['text.html.php', 'meta.tag.block.any.html', 'punctuation.definition.tag.end.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'meta.tag.any.html.punctuation.definition.begin.block' }, { offset: 1, language: 'html', type: 'meta.tag.any.html.entity.name.block' }, { offset: 4, language: 'html', type: 'meta.tag.any.html.punctuation.definition.end.block' }, { offset: 5, language: 'html', type: 'meta.punctuation.embedded.section.begin.php.line' }, { offset: 8, language: 'php', type: 'meta.punctuation.definition.source.embedded.begin.php.string.quoted.double.line' }, { offset: 9, language: 'php', type: 'meta.source.embedded.php.string.quoted.double.line.string-contents' }, { offset: 18, language: 'php', type: 'meta.punctuation.definition.source.embedded.end.php.string.quoted.double.line' }, { offset: 19, language: 'php', type: 'meta.punctuation.source.embedded.section.end.php.line' }, { offset: 20, language: 'html', type: 'meta.punctuation.embedded.section.end.php.line' }, { offset: 21, language: 'html', type: 'meta.tag.any.html.punctuation.definition.begin.block' }, { offset: 23, language: 'html', type: 'meta.tag.any.html.entity.name.block' }, { offset: 26, language: 'html', type: 'meta.tag.any.html.punctuation.definition.end.block' } ] } ]; let registry = new TMScopeRegistry(); registry.register('text.html.php', null, { 'text.html': 'html', 'source.php': 'php', 'source.sql': 'sql', 'text.xml': 'xml', 'source.js': 'javascript', 'source.json': 'json', 'source.css': 'css' }); let decodeMap = new DecodeMap(registry.getLanguageRegistration('text.html.php')); for (let i = 0, len = tests.length; i < len; i++) { let test = tests[i]; let actual = decodeTextMateTokens('html', decodeMap, test.line, 0, test.tmTokens, null); assert.deepEqual(actual.tokens, test.tokens, 'test ' + test.line); } }); test('html and embedded', () => { var tests = [ { line: '', tmTokens: [ { startIndex: 0, endIndex: 2, scopes: ['text.html.basic', 'meta.tag.sgml.html', 'punctuation.definition.tag.html'] }, { startIndex: 2, endIndex: 9, scopes: ['text.html.basic', 'meta.tag.sgml.html', 'meta.tag.sgml.doctype.html'] }, { startIndex: 9, endIndex: 14, scopes: ['text.html.basic', 'meta.tag.sgml.html', 'meta.tag.sgml.doctype.html'] }, { startIndex: 14, endIndex: 15, scopes: ['text.html.basic', 'meta.tag.sgml.html', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'meta.tag.sgml.html.punctuation.definition' }, { offset: 2, language: 'html', type: 'meta.tag.sgml.html.doctype' }, { offset: 14, language: 'html', type: 'meta.tag.sgml.html.punctuation.definition' }, ], }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 3, scopes: ['text.html.basic', 'comment.block.html', 'punctuation.definition.comment.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'html.punctuation.definition.comment.block' }, ], }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] }, { startIndex: 1, endIndex: 5, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'entity.name.tag.structure.any.html'] }, { startIndex: 5, endIndex: 6, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, { offset: 1, language: 'html', type: 'meta.tag.html.structure.any.entity.name' }, { offset: 5, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, ], }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] }, { startIndex: 1, endIndex: 5, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'entity.name.tag.structure.any.html'] }, { startIndex: 5, endIndex: 6, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, { offset: 1, language: 'html', type: 'meta.tag.html.structure.any.entity.name' }, { offset: 5, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, ], }, { line: '\tHTML Sample', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.basic'] }, { startIndex: 1, endIndex: 2, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'punctuation.definition.tag.begin.html'] }, { startIndex: 2, endIndex: 7, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'entity.name.tag.inline.any.html'] }, { startIndex: 7, endIndex: 8, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'punctuation.definition.tag.end.html'] }, { startIndex: 8, endIndex: 19, scopes: ['text.html.basic'] }, { startIndex: 19, endIndex: 21, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'punctuation.definition.tag.begin.html'] }, { startIndex: 21, endIndex: 26, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'entity.name.tag.inline.any.html'] }, { startIndex: 26, endIndex: 27, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'punctuation.definition.tag.end.html'] } ], tokens: [ { offset: 0, language: 'html', type: '' }, { offset: 1, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.begin' }, { offset: 2, language: 'html', type: 'meta.tag.html.any.entity.name.inline' }, { offset: 7, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.end' }, { offset: 8, language: 'html', type: '' }, { offset: 19, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.begin' }, { offset: 21, language: 'html', type: 'meta.tag.html.any.entity.name.inline' }, { offset: 26, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.end' }, ], }, { line: '\t', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.basic'] }, { startIndex: 1, endIndex: 2, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'punctuation.definition.tag.begin.html'] }, { startIndex: 2, endIndex: 6, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'entity.name.tag.inline.any.html'] }, { startIndex: 6, endIndex: 7, scopes: ['text.html.basic', 'meta.tag.inline.any.html'] }, { startIndex: 7, endIndex: 17, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'entity.other.attribute-name.html'] }, { startIndex: 17, endIndex: 18, scopes: ['text.html.basic', 'meta.tag.inline.any.html'] }, { startIndex: 18, endIndex: 19, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html', 'punctuation.definition.string.begin.html'] }, { startIndex: 19, endIndex: 34, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html'] }, { startIndex: 34, endIndex: 35, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html', 'punctuation.definition.string.end.html'] }, { startIndex: 35, endIndex: 36, scopes: ['text.html.basic', 'meta.tag.inline.any.html'] }, { startIndex: 36, endIndex: 43, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'entity.other.attribute-name.html'] }, { startIndex: 43, endIndex: 44, scopes: ['text.html.basic', 'meta.tag.inline.any.html'] }, { startIndex: 44, endIndex: 45, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html', 'punctuation.definition.string.begin.html'] }, { startIndex: 45, endIndex: 52, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html'] }, { startIndex: 52, endIndex: 53, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html', 'punctuation.definition.string.end.html'] }, { startIndex: 53, endIndex: 54, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'punctuation.definition.tag.end.html'] } ], tokens: [ { offset: 0, language: 'html', type: '' }, { offset: 1, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.begin' }, { offset: 2, language: 'html', type: 'meta.tag.html.any.entity.name.inline' }, { offset: 6, language: 'html', type: 'meta.tag.html.any.inline' }, { offset: 7, language: 'html', type: 'meta.tag.html.any.entity.inline.other.attribute-name' }, { offset: 17, language: 'html', type: 'meta.tag.html.any.inline' }, { offset: 18, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.begin.string.quoted.double' }, { offset: 19, language: 'html', type: 'meta.tag.html.any.inline.string.quoted.double' }, { offset: 34, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.end.string.quoted.double' }, { offset: 35, language: 'html', type: 'meta.tag.html.any.inline' }, { offset: 36, language: 'html', type: 'meta.tag.html.any.entity.inline.other.attribute-name' }, { offset: 43, language: 'html', type: 'meta.tag.html.any.inline' }, { offset: 44, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.begin.string.quoted.double' }, { offset: 45, language: 'html', type: 'meta.tag.html.any.inline.string.quoted.double' }, { offset: 52, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.end.string.quoted.double' }, { offset: 53, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.end' }, ], }, { line: '\t', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.basic', 'source.css.embedded.html'] }, { startIndex: 1, endIndex: 3, scopes: ['text.html.basic', 'source.css.embedded.html', 'punctuation.definition.tag.html'] }, { startIndex: 3, endIndex: 8, scopes: ['text.html.basic', 'source.css.embedded.html', 'entity.name.tag.style.html'] }, { startIndex: 8, endIndex: 9, scopes: ['text.html.basic', 'source.css.embedded.html', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'css', type: 'html.source.css.embedded' }, { offset: 1, language: 'css', type: 'tag.html.punctuation.definition.source.css.embedded' }, { offset: 3, language: 'css', type: 'tag.html.entity.name.source.css.embedded.style' }, { offset: 8, language: 'css', type: 'tag.html.punctuation.definition.source.css.embedded' }, ], }, { line: '\tAfter', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.basic', 'source.js.embedded.html'] }, { startIndex: 1, endIndex: 3, scopes: ['text.html.basic', 'source.js.embedded.html', 'punctuation.definition.tag.html'] }, { startIndex: 3, endIndex: 9, scopes: ['text.html.basic', 'source.js.embedded.html', 'entity.name.tag.script.html'] }, { startIndex: 9, endIndex: 10, scopes: ['text.html.basic', 'source.js.embedded.html', 'punctuation.definition.tag.html'] }, { startIndex: 10, endIndex: 15, scopes: ['text.html.basic'] } ], tokens: [ { offset: 0, language: 'javascript', type: 'html.source.embedded.js' }, { offset: 1, language: 'javascript', type: 'tag.html.punctuation.definition.source.embedded.js' }, { offset: 3, language: 'javascript', type: 'tag.html.entity.name.source.embedded.js.script' }, { offset: 9, language: 'javascript', type: 'tag.html.punctuation.definition.source.embedded.js' }, { offset: 10, language: 'html', type: '' }, ], }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 2, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] }, { startIndex: 2, endIndex: 6, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'entity.name.tag.structure.any.html'] }, { startIndex: 6, endIndex: 7, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, { offset: 2, language: 'html', type: 'meta.tag.html.structure.any.entity.name' }, { offset: 6, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, ], }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] }, { startIndex: 1, endIndex: 5, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'entity.name.tag.structure.any.html'] }, { startIndex: 5, endIndex: 6, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, { offset: 1, language: 'html', type: 'meta.tag.html.structure.any.entity.name' }, { offset: 5, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, ], }, { line: '\t

Heading No.1

', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.basic'] }, { startIndex: 1, endIndex: 2, scopes: ['text.html.basic', 'meta.tag.block.any.html', 'punctuation.definition.tag.begin.html'] }, { startIndex: 2, endIndex: 4, scopes: ['text.html.basic', 'meta.tag.block.any.html', 'entity.name.tag.block.any.html'] }, { startIndex: 4, endIndex: 5, scopes: ['text.html.basic', 'meta.tag.block.any.html', 'punctuation.definition.tag.end.html'] }, { startIndex: 5, endIndex: 17, scopes: ['text.html.basic'] }, { startIndex: 17, endIndex: 19, scopes: ['text.html.basic', 'meta.tag.block.any.html', 'punctuation.definition.tag.begin.html'] }, { startIndex: 19, endIndex: 21, scopes: ['text.html.basic', 'meta.tag.block.any.html', 'entity.name.tag.block.any.html'] }, { startIndex: 21, endIndex: 22, scopes: ['text.html.basic', 'meta.tag.block.any.html', 'punctuation.definition.tag.end.html'] } ], tokens: [ { offset: 0, language: 'html', type: '' }, { offset: 1, language: 'html', type: 'meta.tag.html.punctuation.definition.block.any.begin' }, { offset: 2, language: 'html', type: 'meta.tag.html.block.any.entity.name' }, { offset: 4, language: 'html', type: 'meta.tag.html.punctuation.definition.block.any.end' }, { offset: 5, language: 'html', type: '' }, { offset: 17, language: 'html', type: 'meta.tag.html.punctuation.definition.block.any.begin' }, { offset: 19, language: 'html', type: 'meta.tag.html.block.any.entity.name' }, { offset: 21, language: 'html', type: 'meta.tag.html.punctuation.definition.block.any.end' }, ], }, { line: '\t', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['text.html.basic'] }, { startIndex: 1, endIndex: 2, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'punctuation.definition.tag.begin.html'] }, { startIndex: 2, endIndex: 7, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'entity.name.tag.inline.any.html'] }, { startIndex: 7, endIndex: 8, scopes: ['text.html.basic', 'meta.tag.inline.any.html'] }, { startIndex: 8, endIndex: 16, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'entity.other.attribute-name.html'] }, { startIndex: 16, endIndex: 17, scopes: ['text.html.basic', 'meta.tag.inline.any.html'] }, { startIndex: 17, endIndex: 21, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'entity.other.attribute-name.html'] }, { startIndex: 21, endIndex: 22, scopes: ['text.html.basic', 'meta.tag.inline.any.html'] }, { startIndex: 22, endIndex: 23, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html', 'punctuation.definition.string.begin.html'] }, { startIndex: 23, endIndex: 29, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html'] }, { startIndex: 29, endIndex: 30, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html', 'punctuation.definition.string.end.html'] }, { startIndex: 30, endIndex: 31, scopes: ['text.html.basic', 'meta.tag.inline.any.html'] }, { startIndex: 31, endIndex: 36, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'entity.other.attribute-name.html'] }, { startIndex: 36, endIndex: 37, scopes: ['text.html.basic', 'meta.tag.inline.any.html'] }, { startIndex: 37, endIndex: 38, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html', 'punctuation.definition.string.begin.html'] }, { startIndex: 38, endIndex: 46, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html'] }, { startIndex: 46, endIndex: 47, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'string.quoted.double.html', 'punctuation.definition.string.end.html'] }, { startIndex: 47, endIndex: 50, scopes: ['text.html.basic', 'meta.tag.inline.any.html', 'punctuation.definition.tag.end.html'] } ], tokens: [ { offset: 0, language: 'html', type: '' }, { offset: 1, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.begin' }, { offset: 2, language: 'html', type: 'meta.tag.html.any.entity.name.inline' }, { offset: 7, language: 'html', type: 'meta.tag.html.any.inline' }, { offset: 8, language: 'html', type: 'meta.tag.html.any.entity.inline.other.attribute-name' }, { offset: 16, language: 'html', type: 'meta.tag.html.any.inline' }, { offset: 17, language: 'html', type: 'meta.tag.html.any.entity.inline.other.attribute-name' }, { offset: 21, language: 'html', type: 'meta.tag.html.any.inline' }, { offset: 22, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.begin.string.quoted.double' }, { offset: 23, language: 'html', type: 'meta.tag.html.any.inline.string.quoted.double' }, { offset: 29, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.end.string.quoted.double' }, { offset: 30, language: 'html', type: 'meta.tag.html.any.inline' }, { offset: 31, language: 'html', type: 'meta.tag.html.any.entity.inline.other.attribute-name' }, { offset: 36, language: 'html', type: 'meta.tag.html.any.inline' }, { offset: 37, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.begin.string.quoted.double' }, { offset: 38, language: 'html', type: 'meta.tag.html.any.inline.string.quoted.double' }, { offset: 46, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.end.string.quoted.double' }, { offset: 47, language: 'html', type: 'meta.tag.html.punctuation.definition.any.inline.end' }, ], }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 2, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] }, { startIndex: 2, endIndex: 6, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'entity.name.tag.structure.any.html'] }, { startIndex: 6, endIndex: 7, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, { offset: 2, language: 'html', type: 'meta.tag.html.structure.any.entity.name' }, { offset: 6, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, ], }, { line: '', tmTokens: [ { startIndex: 0, endIndex: 2, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] }, { startIndex: 2, endIndex: 6, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'entity.name.tag.structure.any.html'] }, { startIndex: 6, endIndex: 7, scopes: ['text.html.basic', 'meta.tag.structure.any.html', 'punctuation.definition.tag.html'] } ], tokens: [ { offset: 0, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, { offset: 2, language: 'html', type: 'meta.tag.html.structure.any.entity.name' }, { offset: 6, language: 'html', type: 'meta.tag.html.punctuation.definition.structure.any' }, ], } ]; let registry = new TMScopeRegistry(); registry.register('text.html.basic', null, { 'text.html.basic': 'html', 'source.css': 'css', 'source.js': 'javascript', 'source.python': 'python', 'source.smarty': 'smarty' }); let decodeMap = new DecodeMap(registry.getLanguageRegistration('text.html.basic')); for (let i = 0, len = tests.length; i < len; i++) { let test = tests[i]; let actual = decodeTextMateTokens('html', decodeMap, test.line, 0, test.tmTokens, null); assert.deepEqual(actual.tokens, test.tokens, 'test ' + test.line); } }); test('issue #14661: Comment shortcut in SCSS now using CSS style comments', () => { let tests = [ { line: 'class {', tmTokens: [ { startIndex: 0, endIndex: 6, scopes: ['source.css.scss'] }, { startIndex: 6, endIndex: 7, scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.section.property-list.begin.bracket.curly.scss'] } ], tokens: [ { offset: 0, language: 'scss', type: '' }, { offset: 6, language: 'scss', type: 'meta.property-list.scss.punctuation.section.begin.bracket.curly' } ], }, { line: ' background: red;', tmTokens: [ { startIndex: 0, endIndex: 4, scopes: ['source.css.scss', 'meta.property-list.scss'] }, { startIndex: 4, endIndex: 14, scopes: ['source.css.scss', 'meta.property-list.scss', 'meta.property-name.scss', 'support.type.property-name.scss'] }, { startIndex: 14, endIndex: 15, scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.separator.key-value.scss'] }, { startIndex: 15, endIndex: 16, scopes: ['source.css.scss', 'meta.property-list.scss'] }, { startIndex: 16, endIndex: 19, scopes: ['source.css.scss', 'meta.property-list.scss', 'meta.property-value.scss', 'support.constant.color.w3c-standard-color-name.scss'] }, { startIndex: 19, endIndex: 20, scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.terminator.rule.scss'] } ], tokens: [ { offset: 0, language: 'scss', type: 'meta.property-list.scss' }, { offset: 4, language: 'scss', type: 'meta.property-list.scss.property-name.support.type' }, { offset: 14, language: 'scss', type: 'meta.property-list.scss.punctuation.separator.key-value' }, { offset: 15, language: 'scss', type: 'meta.property-list.scss' }, { offset: 16, language: 'scss', type: 'meta.property-list.scss.support.property-value.constant.color.w3c-standard-color-name' }, { offset: 19, language: 'scss', type: 'meta.property-list.scss.punctuation.terminator.rule' } ], }, { line: '}', tmTokens: [ { startIndex: 0, endIndex: 1, scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.section.property-list.end.bracket.curly.scss'] } ], tokens: [ { offset: 0, language: 'scss', type: 'meta.property-list.scss.punctuation.section.bracket.curly.end' } ], } ]; let registry = new TMScopeRegistry(); registry.register('source.css.scss', './syntaxes/scss.json'); let decodeMap = new DecodeMap(registry.getLanguageRegistration('source.css.scss')); for (let i = 0, len = tests.length; i < len; i++) { let test = tests[i]; let actual = decodeTextMateTokens('scss', decodeMap, test.line, 0, test.tmTokens, null); assert.deepEqual(actual.tokens, test.tokens, 'test ' + test.line); } }); }); suite('textMate', () => { function assertRelaxedEqual(a: string, b: string): void { let relaxString = (str: string) => { let pieces = str.split('.'); pieces.sort(); return pieces.join('.'); }; assert.equal(relaxString(a), relaxString(b)); } function slowDecodeTextMateToken(scopes: string[]): string { let allTokensMap: { [token: string]: boolean; } = Object.create(null); for (let i = 1; i < scopes.length; i++) { let pieces = scopes[i].split('.'); for (let j = 0; j < pieces.length; j++) { allTokensMap[pieces[j]] = true; } } return Object.keys(allTokensMap).join('.'); } function testOneDecodeTextMateToken(decodeMap: DecodeMap, scopes: string[], expected: string): void { let actualDecodedToken = decodeTextMateToken(decodeMap, scopes); let actual = actualDecodedToken ? decodeMap.getToken(actualDecodedToken.tokensMask) : ''; assert.equal(actual, expected); // Sanity-check let alternativeExpected = slowDecodeTextMateToken(scopes); assertRelaxedEqual(actual, alternativeExpected); } function testDecodeTextMateToken(input: string[][], expected: string[]): void { let decodeMap = new DecodeMap(new TMLanguageRegistration(null, null, null, null)); for (let i = 0; i < input.length; i++) { testOneDecodeTextMateToken(decodeMap, input[i], expected[i]); } } test('decodeTextMateToken JSON regression', () => { let input = [ ['source.json', 'meta.structure.dictionary.json'], ['source.json', 'meta.structure.dictionary.json', 'support.type.property-name.json', 'punctuation.support.type.property-name.begin.json'], ['source.json', 'meta.structure.dictionary.json', 'support.type.property-name.json'], ['source.json', 'meta.structure.dictionary.json', 'support.type.property-name.json', 'punctuation.support.type.property-name.end.json'], ['source.json', 'meta.structure.dictionary.json', 'meta.structure.dictionary.value.json', 'punctuation.separator.dictionary.key-value.json'], ['source.json', 'meta.structure.dictionary.json', 'meta.structure.dictionary.value.json'], ['source.json', 'meta.structure.dictionary.json', 'meta.structure.dictionary.value.json', 'string.quoted.double.json', 'punctuation.definition.string.begin.json'], ['source.json', 'meta.structure.dictionary.json', 'meta.structure.dictionary.value.json', 'string.quoted.double.json', 'punctuation.definition.string.end.json'], ['source.json', 'meta.structure.dictionary.json', 'meta.structure.dictionary.value.json', 'punctuation.separator.dictionary.pair.json'] ]; let expected = [ 'meta.structure.dictionary.json', 'meta.structure.dictionary.json.support.type.property-name.punctuation.begin', 'meta.structure.dictionary.json.support.type.property-name', 'meta.structure.dictionary.json.support.type.property-name.punctuation.end', 'meta.structure.dictionary.json.punctuation.value.separator.key-value', 'meta.structure.dictionary.json.value', 'meta.structure.dictionary.json.punctuation.begin.value.string.quoted.double.definition', 'meta.structure.dictionary.json.punctuation.end.value.string.quoted.double.definition', 'meta.structure.dictionary.json.punctuation.value.separator.pair' ]; testDecodeTextMateToken(input, expected); }); test('decodeTextMateToken', () => { let input = getTestScopes(); let expected = [ 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.entity.name', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.parameter.brace.round', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.parameter', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.name.parameter.variable', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.parameter', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.name.parameter.variable', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.parameter', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.name.parameter.variable', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.parameter.brace.round', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.entity.name.overload', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.parameter.brace.round', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.name.parameter.variable', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.parameter.brace.round', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.brace.curly', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.keyword.operator.comparison', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.string.double', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.string.double', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.string.double', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.keyword.operator.arithmetic', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.keyword.operator.arithmetic', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.string.double', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.string.double', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.string.double', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.brace.array.literal.square', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.array.literal', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.brace.array.literal.square', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.keyword.operator.comparison', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.brace.curly', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.brace.curly', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.name', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member.name', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member', 'meta.function.js.decl.block.type.parameters.paren.cover.object.method.declaration.field.member' ]; testDecodeTextMateToken(input, expected); }); }); function getTestScopes(): string[][] { return [ ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'entity.name.function.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js', 'meta.brace.round.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js', 'parameter.name.js', 'variable.parameter.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js', 'parameter.name.js', 'variable.parameter.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js', 'parameter.name.js', 'variable.parameter.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js', 'meta.brace.round.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.method.overload.declaration.js', 'entity.name.function.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js', 'meta.brace.round.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js', 'parameter.name.js', 'variable.parameter.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.function.type.parameter.js', 'meta.brace.round.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.brace.curly.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'keyword.operator.comparison.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'string.double.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'string.double.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'string.double.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'keyword.operator.arithmetic.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'keyword.operator.arithmetic.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'string.double.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'string.double.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'string.double.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.array.literal.js', 'meta.brace.square.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.array.literal.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.array.literal.js', 'meta.brace.square.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'keyword.operator.comparison.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.brace.curly.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.brace.curly.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.name.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.name.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js'], ['source.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js', 'meta.object.type.js', 'meta.field.declaration.js', 'meta.block.js', 'meta.object.member.js', 'meta.function.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.object.type.js', 'meta.method.declaration.js', 'meta.decl.block.js', 'meta.type.parameters.js', 'meta.type.paren.cover.js'] ]; }