Optimize decodeTextMateToken (#4828)

This commit is contained in:
Alex Dima 2016-04-01 13:58:50 +02:00
parent e25312d0f5
commit 61246fb16f
2 changed files with 203 additions and 43 deletions

View file

@ -12,7 +12,7 @@ import {ILineTokens, IMode, IToken, ITokenizationSupport} from 'vs/editor/common
import {TMState} from 'vs/editor/common/modes/TMState';
import {Token} from 'vs/editor/common/modes/supports';
import {IModeService} from 'vs/editor/common/services/modeService';
import {IGrammar, ITMToken, Registry} from 'vscode-textmate';
import {IGrammar, Registry} from 'vscode-textmate';
export interface ITMSyntaxExtensionPoint {
language: string;
@ -126,15 +126,78 @@ function createTokenizationSupport(mode: IMode, grammar: IGrammar): ITokenizatio
};
}
export class DecodeMap {
_decodeMapTrait: void;
lastAssignedId: number;
scopeToTokenIds: { [scope:string]:number[]; };
tokenToTokenId: { [token:string]:number; };
tokenIdToToken: string[];
prevToken: TMTokenDecodeData;
constructor() {
this.lastAssignedId = 0;
this.scopeToTokenIds = Object.create(null);
this.tokenToTokenId = Object.create(null);
this.tokenIdToToken = [null];
this.prevToken = new TMTokenDecodeData([], []);
}
public getTokenIds(scope:string): number[] {
let tokens = this.scopeToTokenIds[scope];
if (tokens) {
return tokens;
}
let tmpTokens = scope.split('.');
tokens = [];
for (let i = 0; i < tmpTokens.length; i++) {
let token = tmpTokens[i];
let tokenId = this.tokenToTokenId[token];
if (!tokenId) {
tokenId = (++this.lastAssignedId);
this.tokenToTokenId[token] = tokenId;
this.tokenIdToToken[tokenId] = token + ' ';
}
tokens.push(tokenId);
}
this.scopeToTokenIds[scope] = tokens;
return tokens;
}
public getToken(tokenMap:boolean[]): string {
let result = '';
for (let i = 1; i < this.lastAssignedId; i++) {
if (tokenMap[i]) {
result += this.tokenIdToToken[i];
}
}
return result;
}
}
export class TMTokenDecodeData {
_tmTokenDecodeDataTrait: void;
public scopes: string[];
public scopeTokensMaps: boolean[][];
constructor(scopes:string[], scopeTokensMaps:boolean[][]) {
this.scopes = scopes;
this.scopeTokensMaps = scopeTokensMaps;
}
}
class Tokenizer {
private _grammar: IGrammar;
private _modeId: string;
private _decodeMap: DecodeMap;
constructor(modeId:string, grammar: IGrammar) {
this._modeId = modeId;
this._grammar = grammar;
this._decodeMap = new DecodeMap();
}
public tokenize(line: string, state: TMState, offsetDelta: number = 0, stopAtOffset?: number): ILineTokens {
@ -165,12 +228,12 @@ class Tokenizer {
for (let tokenIndex = 0, len = textMateResult.tokens.length; tokenIndex < len; tokenIndex++) {
let token = textMateResult.tokens[tokenIndex];
let tokenStartIndex = token.startIndex;
let t = decodeTextMateToken(this._modeId, token);
let tokenType = decodeTextMateToken(this._decodeMap, token.scopes);
// do not push a new token if the type is exactly the same (also helps with ligatures)
if (t.tokenType !== lastTokenType) {
ret.tokens.push(new Token(tokenStartIndex + offsetDelta, t.tokenType));
lastTokenType = t.tokenType;
if (tokenType !== lastTokenType) {
ret.tokens.push(new Token(tokenStartIndex + offsetDelta, tokenType));
lastTokenType = tokenType;
}
}
@ -178,48 +241,34 @@ class Tokenizer {
}
}
function decodeTextMateToken(modeId:string, entry: ITMToken) {
let tokenTypeArray: string[] = [];
for (let level = 1 /* deliberately skip scope 0*/; level < entry.scopes.length; ++level) {
tokenTypeArray = tokenTypeArray.concat(entry.scopes[level].split('.'));
}
let modeToken = '';
if (entry.scopes.length > 0) {
let dotIndex = entry.scopes[0].lastIndexOf('.');
if (dotIndex >= 0) {
modeToken = entry.scopes[0].substr(dotIndex + 1);
}
}
let tokenTypes: string[] = [];
dedupTokens(tokenTypeArray, modeToken, tokenTypes);
export function decodeTextMateToken(decodeMap: DecodeMap, scopes: string[]): string {
const prevTokenScopes = decodeMap.prevToken.scopes;
const prevTokenScopesLength = prevTokenScopes.length;
const prevTokenScopeTokensMaps = decodeMap.prevToken.scopeTokensMaps;
return {
tokenType: tokenTypes.join('.'),
modeToken: modeId
};
}
let scopeTokensMaps: boolean[][] = [];
let prevScopeTokensMaps: boolean[] = [];
let sameAsPrev = true;
for (let level = 1/* deliberately skip scope 0*/; level < scopes.length; level++) {
let scope = scopes[level];
/**
* Remove duplicate entries, collect result in `result`, place `modeToken` at the end
* and detect if this is a comment => return true if it looks like a comment
*/
function dedupTokens(tokenTypeArray:string[], modeToken:string, result:string[]): void {
tokenTypeArray.sort();
var prev:string = null,
curr:string = null;
for (var i = 0, len = tokenTypeArray.length; i < len; i++) {
prev = curr;
curr = tokenTypeArray[i];
if (curr === prev || curr === modeToken) {
continue;
if (sameAsPrev) {
if (level < prevTokenScopesLength && prevTokenScopes[level] === scope) {
prevScopeTokensMaps = prevTokenScopeTokensMaps[level];
scopeTokensMaps[level] = prevScopeTokensMaps;
continue;
}
sameAsPrev = false;
}
result.push(curr);
let tokens = decodeMap.getTokenIds(scope);
prevScopeTokensMaps = prevScopeTokensMaps.slice(0);
for (let i = 0; i < tokens.length; i++) {
prevScopeTokensMaps[tokens[i]] = true;
}
scopeTokensMaps[level] = prevScopeTokensMaps;
}
result.push(modeToken);
decodeMap.prevToken = new TMTokenDecodeData(scopes, scopeTokensMaps);
return decodeMap.getToken(prevScopeTokensMaps);
}

View file

@ -0,0 +1,111 @@
/*---------------------------------------------------------------------------------------------
* 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, DecodeMap} from 'vs/editor/node/textMate/TMSyntax';
suite('textMate', () => {
test('decodeTextMateToken', () => {
let decodeMap = new DecodeMap();
let input = getTestScopes();
let actual:string[] = [];
for (let i = 0, len = input.length; i < len; i++) {
actual.push(decodeTextMateToken(decodeMap, input[i]));
}
let expected = [
'meta function js decl block type parameters paren cover object method declaration field member entity ',
'meta function js decl block type parameters paren cover object method declaration field member parameter brace ',
'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 ',
'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 ',
'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 ',
'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 ',
'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 ',
'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 ',
'meta function js decl block type parameters paren cover object method declaration field member string ',
'meta function js decl block type parameters paren cover object method declaration field member string ',
'meta function js decl block type parameters paren cover object method declaration field member string ',
'meta function js decl block type parameters paren cover object method declaration field member keyword operator ',
'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 ',
'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 ',
'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 ',
'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 '
];
assert.deepEqual(actual, 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']
];
}