Faster fixedWidthTokenLength function.

This commit is contained in:
Cyrus Najmabadi 2014-11-03 21:39:22 -08:00
parent ddfdfc3dd5
commit 6fd900b4c2
5 changed files with 62 additions and 237 deletions

View File

@ -2154,16 +2154,28 @@ function max(array, func) {
}
return max;
}
function generateUtilities() {
var result = "";
result += " var fixedWidthArray = [";
for (var i = 0; i <= TypeScript.SyntaxKind.LastFixedWidth; i++) {
if (i) {
result += ", ";
}
if (i < TypeScript.SyntaxKind.FirstFixedWidth) {
result += "0";
}
else {
result += TypeScript.SyntaxFacts.getText(i).length;
}
}
result += "];\r\n";
result += " export function fixedWidthTokenLength(kind: SyntaxKind) {\r\n";
result += " return fixedWidthArray[kind];\r\n";
result += " }\r\n";
return result;
}
function generateScannerUtilities() {
var result = "///<reference path='references.ts' />\r\n" + "\r\n" + "module TypeScript {\r\n" + " export module ScannerUtilities {\r\n";
result += " export function fixedWidthTokenLength(kind: SyntaxKind) {\r\n";
result += " switch (kind) {\r\n";
for (var k = TypeScript.SyntaxKind.FirstFixedWidth; k <= TypeScript.SyntaxKind.LastFixedWidth; k++) {
result += " case SyntaxKind." + syntaxKindName(k) + ": return " + TypeScript.SyntaxFacts.getText(k).length + ";\r\n";
}
result += " default: throw new Error();\r\n";
result += " }\r\n";
result += " }\r\n\r\n";
var i;
var keywords = [];
for (i = TypeScript.SyntaxKind.FirstKeyword; i <= TypeScript.SyntaxKind.LastKeyword; i++) {
@ -2275,9 +2287,11 @@ var walker = generateWalker();
var scannerUtilities = generateScannerUtilities();
var visitor = generateVisitor();
var servicesUtilities = generateServicesUtilities();
var utilities = generateUtilities();
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxNodes.concrete.generated.ts", syntaxNodesConcrete, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxInterfaces.generated.ts", syntaxInterfaces, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxWalker.generated.ts", walker, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\scannerUtilities.generated.ts", scannerUtilities, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxVisitor.generated.ts", visitor, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxUtilities.generated.ts", servicesUtilities, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\utilities.generated.ts", utilities, false);

View File

@ -1708,114 +1708,8 @@ module TypeScript.Scanner {
};
}
var fixedWidthArray = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 5, 8, 8, 7, 6, 2, 4, 5, 7, 3, 8, 2, 2, 10, 3, 4, 6, 6, 4, 5, 4, 3, 6, 3, 4, 5, 4, 5, 5, 4, 6, 7, 6, 5, 10, 9, 3, 7, 7, 9, 6, 6, 5, 3, 7, 11, 7, 3, 6, 7, 6, 3, 6, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 2, 2, 2, 1, 2];
function fixedWidthTokenLength(kind: SyntaxKind) {
switch (kind) {
case SyntaxKind.BreakKeyword: return 5;
case SyntaxKind.CaseKeyword: return 4;
case SyntaxKind.CatchKeyword: return 5;
case SyntaxKind.ContinueKeyword: return 8;
case SyntaxKind.DebuggerKeyword: return 8;
case SyntaxKind.DefaultKeyword: return 7;
case SyntaxKind.DeleteKeyword: return 6;
case SyntaxKind.DoKeyword: return 2;
case SyntaxKind.ElseKeyword: return 4;
case SyntaxKind.FalseKeyword: return 5;
case SyntaxKind.FinallyKeyword: return 7;
case SyntaxKind.ForKeyword: return 3;
case SyntaxKind.FunctionKeyword: return 8;
case SyntaxKind.IfKeyword: return 2;
case SyntaxKind.InKeyword: return 2;
case SyntaxKind.InstanceOfKeyword: return 10;
case SyntaxKind.NewKeyword: return 3;
case SyntaxKind.NullKeyword: return 4;
case SyntaxKind.ReturnKeyword: return 6;
case SyntaxKind.SwitchKeyword: return 6;
case SyntaxKind.ThisKeyword: return 4;
case SyntaxKind.ThrowKeyword: return 5;
case SyntaxKind.TrueKeyword: return 4;
case SyntaxKind.TryKeyword: return 3;
case SyntaxKind.TypeOfKeyword: return 6;
case SyntaxKind.VarKeyword: return 3;
case SyntaxKind.VoidKeyword: return 4;
case SyntaxKind.WhileKeyword: return 5;
case SyntaxKind.WithKeyword: return 4;
case SyntaxKind.ClassKeyword: return 5;
case SyntaxKind.ConstKeyword: return 5;
case SyntaxKind.EnumKeyword: return 4;
case SyntaxKind.ExportKeyword: return 6;
case SyntaxKind.ExtendsKeyword: return 7;
case SyntaxKind.ImportKeyword: return 6;
case SyntaxKind.SuperKeyword: return 5;
case SyntaxKind.ImplementsKeyword: return 10;
case SyntaxKind.InterfaceKeyword: return 9;
case SyntaxKind.LetKeyword: return 3;
case SyntaxKind.PackageKeyword: return 7;
case SyntaxKind.PrivateKeyword: return 7;
case SyntaxKind.ProtectedKeyword: return 9;
case SyntaxKind.PublicKeyword: return 6;
case SyntaxKind.StaticKeyword: return 6;
case SyntaxKind.YieldKeyword: return 5;
case SyntaxKind.AnyKeyword: return 3;
case SyntaxKind.BooleanKeyword: return 7;
case SyntaxKind.ConstructorKeyword: return 11;
case SyntaxKind.DeclareKeyword: return 7;
case SyntaxKind.GetKeyword: return 3;
case SyntaxKind.ModuleKeyword: return 6;
case SyntaxKind.RequireKeyword: return 7;
case SyntaxKind.NumberKeyword: return 6;
case SyntaxKind.SetKeyword: return 3;
case SyntaxKind.StringKeyword: return 6;
case SyntaxKind.OpenBraceToken: return 1;
case SyntaxKind.CloseBraceToken: return 1;
case SyntaxKind.OpenParenToken: return 1;
case SyntaxKind.CloseParenToken: return 1;
case SyntaxKind.OpenBracketToken: return 1;
case SyntaxKind.CloseBracketToken: return 1;
case SyntaxKind.DotToken: return 1;
case SyntaxKind.DotDotDotToken: return 3;
case SyntaxKind.SemicolonToken: return 1;
case SyntaxKind.CommaToken: return 1;
case SyntaxKind.LessThanToken: return 1;
case SyntaxKind.GreaterThanToken: return 1;
case SyntaxKind.LessThanEqualsToken: return 2;
case SyntaxKind.GreaterThanEqualsToken: return 2;
case SyntaxKind.EqualsEqualsToken: return 2;
case SyntaxKind.EqualsGreaterThanToken: return 2;
case SyntaxKind.ExclamationEqualsToken: return 2;
case SyntaxKind.EqualsEqualsEqualsToken: return 3;
case SyntaxKind.ExclamationEqualsEqualsToken: return 3;
case SyntaxKind.PlusToken: return 1;
case SyntaxKind.MinusToken: return 1;
case SyntaxKind.AsteriskToken: return 1;
case SyntaxKind.PercentToken: return 1;
case SyntaxKind.PlusPlusToken: return 2;
case SyntaxKind.MinusMinusToken: return 2;
case SyntaxKind.LessThanLessThanToken: return 2;
case SyntaxKind.GreaterThanGreaterThanToken: return 2;
case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: return 3;
case SyntaxKind.AmpersandToken: return 1;
case SyntaxKind.BarToken: return 1;
case SyntaxKind.CaretToken: return 1;
case SyntaxKind.ExclamationToken: return 1;
case SyntaxKind.TildeToken: return 1;
case SyntaxKind.AmpersandAmpersandToken: return 2;
case SyntaxKind.BarBarToken: return 2;
case SyntaxKind.QuestionToken: return 1;
case SyntaxKind.ColonToken: return 1;
case SyntaxKind.EqualsToken: return 1;
case SyntaxKind.PlusEqualsToken: return 2;
case SyntaxKind.MinusEqualsToken: return 2;
case SyntaxKind.AsteriskEqualsToken: return 2;
case SyntaxKind.PercentEqualsToken: return 2;
case SyntaxKind.LessThanLessThanEqualsToken: return 3;
case SyntaxKind.GreaterThanGreaterThanEqualsToken: return 3;
case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: return 4;
case SyntaxKind.AmpersandEqualsToken: return 2;
case SyntaxKind.BarEqualsToken: return 2;
case SyntaxKind.CaretEqualsToken: return 2;
case SyntaxKind.SlashToken: return 1;
case SyntaxKind.SlashEqualsToken: return 2;
default: throw new Error();
}
return fixedWidthArray[kind];
}
}

View File

@ -2,117 +2,6 @@
module TypeScript {
export module ScannerUtilities {
export function fixedWidthTokenLength(kind: SyntaxKind) {
switch (kind) {
case SyntaxKind.BreakKeyword: return 5;
case SyntaxKind.CaseKeyword: return 4;
case SyntaxKind.CatchKeyword: return 5;
case SyntaxKind.ContinueKeyword: return 8;
case SyntaxKind.DebuggerKeyword: return 8;
case SyntaxKind.DefaultKeyword: return 7;
case SyntaxKind.DeleteKeyword: return 6;
case SyntaxKind.DoKeyword: return 2;
case SyntaxKind.ElseKeyword: return 4;
case SyntaxKind.FalseKeyword: return 5;
case SyntaxKind.FinallyKeyword: return 7;
case SyntaxKind.ForKeyword: return 3;
case SyntaxKind.FunctionKeyword: return 8;
case SyntaxKind.IfKeyword: return 2;
case SyntaxKind.InKeyword: return 2;
case SyntaxKind.InstanceOfKeyword: return 10;
case SyntaxKind.NewKeyword: return 3;
case SyntaxKind.NullKeyword: return 4;
case SyntaxKind.ReturnKeyword: return 6;
case SyntaxKind.SwitchKeyword: return 6;
case SyntaxKind.ThisKeyword: return 4;
case SyntaxKind.ThrowKeyword: return 5;
case SyntaxKind.TrueKeyword: return 4;
case SyntaxKind.TryKeyword: return 3;
case SyntaxKind.TypeOfKeyword: return 6;
case SyntaxKind.VarKeyword: return 3;
case SyntaxKind.VoidKeyword: return 4;
case SyntaxKind.WhileKeyword: return 5;
case SyntaxKind.WithKeyword: return 4;
case SyntaxKind.ClassKeyword: return 5;
case SyntaxKind.ConstKeyword: return 5;
case SyntaxKind.EnumKeyword: return 4;
case SyntaxKind.ExportKeyword: return 6;
case SyntaxKind.ExtendsKeyword: return 7;
case SyntaxKind.ImportKeyword: return 6;
case SyntaxKind.SuperKeyword: return 5;
case SyntaxKind.ImplementsKeyword: return 10;
case SyntaxKind.InterfaceKeyword: return 9;
case SyntaxKind.LetKeyword: return 3;
case SyntaxKind.PackageKeyword: return 7;
case SyntaxKind.PrivateKeyword: return 7;
case SyntaxKind.ProtectedKeyword: return 9;
case SyntaxKind.PublicKeyword: return 6;
case SyntaxKind.StaticKeyword: return 6;
case SyntaxKind.YieldKeyword: return 5;
case SyntaxKind.AnyKeyword: return 3;
case SyntaxKind.BooleanKeyword: return 7;
case SyntaxKind.ConstructorKeyword: return 11;
case SyntaxKind.DeclareKeyword: return 7;
case SyntaxKind.GetKeyword: return 3;
case SyntaxKind.ModuleKeyword: return 6;
case SyntaxKind.RequireKeyword: return 7;
case SyntaxKind.NumberKeyword: return 6;
case SyntaxKind.SetKeyword: return 3;
case SyntaxKind.StringKeyword: return 6;
case SyntaxKind.OpenBraceToken: return 1;
case SyntaxKind.CloseBraceToken: return 1;
case SyntaxKind.OpenParenToken: return 1;
case SyntaxKind.CloseParenToken: return 1;
case SyntaxKind.OpenBracketToken: return 1;
case SyntaxKind.CloseBracketToken: return 1;
case SyntaxKind.DotToken: return 1;
case SyntaxKind.DotDotDotToken: return 3;
case SyntaxKind.SemicolonToken: return 1;
case SyntaxKind.CommaToken: return 1;
case SyntaxKind.LessThanToken: return 1;
case SyntaxKind.GreaterThanToken: return 1;
case SyntaxKind.LessThanEqualsToken: return 2;
case SyntaxKind.GreaterThanEqualsToken: return 2;
case SyntaxKind.EqualsEqualsToken: return 2;
case SyntaxKind.EqualsGreaterThanToken: return 2;
case SyntaxKind.ExclamationEqualsToken: return 2;
case SyntaxKind.EqualsEqualsEqualsToken: return 3;
case SyntaxKind.ExclamationEqualsEqualsToken: return 3;
case SyntaxKind.PlusToken: return 1;
case SyntaxKind.MinusToken: return 1;
case SyntaxKind.AsteriskToken: return 1;
case SyntaxKind.PercentToken: return 1;
case SyntaxKind.PlusPlusToken: return 2;
case SyntaxKind.MinusMinusToken: return 2;
case SyntaxKind.LessThanLessThanToken: return 2;
case SyntaxKind.GreaterThanGreaterThanToken: return 2;
case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: return 3;
case SyntaxKind.AmpersandToken: return 1;
case SyntaxKind.BarToken: return 1;
case SyntaxKind.CaretToken: return 1;
case SyntaxKind.ExclamationToken: return 1;
case SyntaxKind.TildeToken: return 1;
case SyntaxKind.AmpersandAmpersandToken: return 2;
case SyntaxKind.BarBarToken: return 2;
case SyntaxKind.QuestionToken: return 1;
case SyntaxKind.ColonToken: return 1;
case SyntaxKind.EqualsToken: return 1;
case SyntaxKind.PlusEqualsToken: return 2;
case SyntaxKind.MinusEqualsToken: return 2;
case SyntaxKind.AsteriskEqualsToken: return 2;
case SyntaxKind.PercentEqualsToken: return 2;
case SyntaxKind.LessThanLessThanEqualsToken: return 3;
case SyntaxKind.GreaterThanGreaterThanEqualsToken: return 3;
case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: return 4;
case SyntaxKind.AmpersandEqualsToken: return 2;
case SyntaxKind.BarEqualsToken: return 2;
case SyntaxKind.CaretEqualsToken: return 2;
case SyntaxKind.SlashToken: return 1;
case SyntaxKind.SlashEqualsToken: return 2;
default: throw new Error();
}
}
export function identifierKind(str: string, start: number, length: number): SyntaxKind {
switch (length) {
case 2: // do, if, in

View File

@ -1401,22 +1401,44 @@ function max<T>(array: T[], func: (v: T) => number): number {
return max;
}
function generateUtilities(): string {
var result = "";
result += " var fixedWidthArray = [";
for (var i = 0; i <= TypeScript.SyntaxKind.LastFixedWidth; i++) {
if (i) {
result += ", ";
}
if (i < TypeScript.SyntaxKind.FirstFixedWidth) {
result += "0";
}
else {
result += TypeScript.SyntaxFacts.getText(i).length;
}
}
result += "];\r\n";
result += " function fixedWidthTokenLength(kind: SyntaxKind) {\r\n";
result += " return fixedWidthArray[kind];\r\n";
//result += " switch (kind) {\r\n";
//for (var k = TypeScript.SyntaxKind.FirstFixedWidth; k <= TypeScript.SyntaxKind.LastFixedWidth; k++) {
// result += " case SyntaxKind." + syntaxKindName(k) + ": return " + TypeScript.SyntaxFacts.getText(k).length + ";\r\n";
//}
//result += " default: throw new Error();\r\n";
//result += " }\r\n";
result += " }\r\n";
return result;
}
function generateScannerUtilities(): string {
var result = "///<reference path='references.ts' />\r\n" +
"\r\n" +
"module TypeScript {\r\n" +
" export module ScannerUtilities {\r\n";
result += " export function fixedWidthTokenLength(kind: SyntaxKind) {\r\n";
result += " switch (kind) {\r\n";
for (var k = TypeScript.SyntaxKind.FirstFixedWidth; k <= TypeScript.SyntaxKind.LastFixedWidth; k++) {
result += " case SyntaxKind." + syntaxKindName(k) + ": return " + TypeScript.SyntaxFacts.getText(k).length + ";\r\n";
}
result += " default: throw new Error();\r\n";
result += " }\r\n";
result += " }\r\n\r\n";
var i: number;
var keywords: { text: string; kind: TypeScript.SyntaxKind; }[] = [];
@ -1566,6 +1588,7 @@ var walker = generateWalker();
var scannerUtilities = generateScannerUtilities();
var visitor = generateVisitor();
var servicesUtilities = generateServicesUtilities();
var utilities = generateUtilities();
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxNodes.concrete.generated.ts", syntaxNodesConcrete, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxInterfaces.generated.ts", syntaxInterfaces, false);
@ -1573,3 +1596,4 @@ sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxWalker
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\scannerUtilities.generated.ts", scannerUtilities, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxVisitor.generated.ts", visitor, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxUtilities.generated.ts", servicesUtilities, false);
sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\utilities.generated.ts", utilities, false);

View File

@ -0,0 +1,4 @@
var fixedWidthArray = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 5, 8, 8, 7, 6, 2, 4, 5, 7, 3, 8, 2, 2, 10, 3, 4, 6, 6, 4, 5, 4, 3, 6, 3, 4, 5, 4, 5, 5, 4, 6, 7, 6, 5, 10, 9, 3, 7, 7, 9, 6, 6, 5, 3, 7, 11, 7, 3, 6, 7, 6, 3, 6, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 2, 2, 2, 1, 2];
export function fixedWidthTokenLength(kind: SyntaxKind) {
return fixedWidthArray[kind];
}