Skip to content

Commit 1988637

Browse files
Merge pull request #1045 from Microsoft/childCountArray
Encode child counts as an array, not as a switch.
2 parents c514f71 + b97c0b4 commit 1988637

11 files changed

+328
-418
lines changed

src/compiler/emitter.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,6 +1351,10 @@ module ts {
13511351
emitToken(SyntaxKind.CloseBraceToken, node.clauses.end);
13521352
}
13531353

1354+
function isOnSameLine(node1: Node, node2: Node) {
1355+
return getLineOfLocalPosition(skipTrivia(currentSourceFile.text, node1.pos)) === getLineOfLocalPosition(skipTrivia(currentSourceFile.text, node2.pos));
1356+
}
1357+
13541358
function emitCaseOrDefaultClause(node: CaseOrDefaultClause) {
13551359
if (node.kind === SyntaxKind.CaseClause) {
13561360
write("case ");
@@ -1360,9 +1364,16 @@ module ts {
13601364
else {
13611365
write("default:");
13621366
}
1363-
increaseIndent();
1364-
emitLines(node.statements);
1365-
decreaseIndent();
1367+
1368+
if (node.statements.length === 1 && isOnSameLine(node, node.statements[0])) {
1369+
write(" ");
1370+
emit(node.statements[0]);
1371+
}
1372+
else {
1373+
increaseIndent();
1374+
emitLines(node.statements);
1375+
decreaseIndent();
1376+
}
13661377
}
13671378

13681379
function emitThrowStatement(node: ThrowStatement) {

src/services/syntax/SyntaxGenerator.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,7 +1300,7 @@ var definitions = [
13001300
interfaces: ['IMemberExpressionSyntax', 'ICallExpressionSyntax'],
13011301
children: [
13021302
{ name: 'expression', type: 'ILeftHandSideExpressionSyntax' },
1303-
{ name: 'templateExpression', type: 'IPrimaryExpressionSyntax' },
1303+
{ name: 'templateExpression', type: 'IPrimaryExpressionSyntax' }
13041304
]
13051305
},
13061306
{
@@ -1309,15 +1309,15 @@ var definitions = [
13091309
interfaces: ['IPrimaryExpressionSyntax'],
13101310
children: [
13111311
{ name: 'templateStartToken', isToken: true, excludeFromAST: true },
1312-
{ name: 'templateClauses', isList: true, elementType: 'TemplateClauseSyntax' },
1312+
{ name: 'templateClauses', isList: true, elementType: 'TemplateClauseSyntax' }
13131313
]
13141314
},
13151315
{
13161316
name: 'TemplateClauseSyntax',
13171317
baseType: 'ISyntaxNode',
13181318
children: [
13191319
{ name: 'expression', type: 'IExpressionSyntax' },
1320-
{ name: 'templateMiddleOrEndToken', isToken: true, elementType: 'TemplateSpanSyntax' },
1320+
{ name: 'templateMiddleOrEndToken', isToken: true, elementType: 'TemplateSpanSyntax' }
13211321
]
13221322
},
13231323
{
@@ -2224,15 +2224,23 @@ function generateVisitor() {
22242224
function generateServicesUtilities() {
22252225
var result = "";
22262226
result += "module TypeScript {\r\n";
2227+
result += " var childCountArray = [";
2228+
for (var i = 0, n = TypeScript.SyntaxKind.LastNode; i <= n; i++) {
2229+
if (i) {
2230+
result += ", ";
2231+
}
2232+
if (i <= TypeScript.SyntaxKind.LastToken) {
2233+
result += "0";
2234+
}
2235+
else {
2236+
var definition = TypeScript.ArrayUtilities.first(definitions, function (d) { return firstKind(d) === i; });
2237+
result += definition.children.length;
2238+
}
2239+
}
2240+
result += "];\r\n\r\n";
22272241
result += " export function childCount(element: ISyntaxElement): number {\r\n";
22282242
result += " if (isList(element)) { return (<ISyntaxNodeOrToken[]>element).length; }\r\n";
2229-
result += " switch (element.kind()) {\r\n";
2230-
for (var i = 0; i < definitions.length; i++) {
2231-
var definition = definitions[i];
2232-
result += " case SyntaxKind." + getNameWithoutSuffix(definition) + ": return " + definition.children.length + ";\r\n";
2233-
}
2234-
result += " default: return 0;\r\n";
2235-
result += " }\r\n";
2243+
result += " return childCountArray[element.kind()];\r\n";
22362244
result += " }\r\n\r\n";
22372245
for (var i = 0; i < definitions.length; i++) {
22382246
var definition = definitions[i];

src/services/syntax/syntaxGenerator.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ var definitions:ITypeDefinition[] = [
449449
interfaces: ['IMemberExpressionSyntax', 'ICallExpressionSyntax'],
450450
children: [
451451
<any>{ name: 'expression', type: 'ILeftHandSideExpressionSyntax' },
452-
<any>{ name: 'templateExpression', type: 'IPrimaryExpressionSyntax' },
452+
<any>{ name: 'templateExpression', type: 'IPrimaryExpressionSyntax' }
453453
]
454454
},
455455
<any>{
@@ -458,15 +458,15 @@ var definitions:ITypeDefinition[] = [
458458
interfaces: ['IPrimaryExpressionSyntax'],
459459
children: [
460460
<any>{ name: 'templateStartToken', isToken: true, excludeFromAST: true },
461-
<any>{ name: 'templateClauses', isList: true, elementType: 'TemplateClauseSyntax' },
461+
<any>{ name: 'templateClauses', isList: true, elementType: 'TemplateClauseSyntax' }
462462
]
463463
},
464464
<any>{
465465
name: 'TemplateClauseSyntax',
466466
baseType: 'ISyntaxNode',
467467
children: [
468468
<any>{ name: 'expression', type: 'IExpressionSyntax' },
469-
<any>{ name: 'templateMiddleOrEndToken', isToken: true, elementType: 'TemplateSpanSyntax' },
469+
<any>{ name: 'templateMiddleOrEndToken', isToken: true, elementType: 'TemplateSpanSyntax' }
470470
]
471471
},
472472
<any>{
@@ -1502,18 +1502,25 @@ function generateServicesUtilities(): string {
15021502
var result = "";
15031503
result += "module TypeScript {\r\n";
15041504

1505-
result += " export function childCount(element: ISyntaxElement): number {\r\n";
1506-
result += " if (isList(element)) { return (<ISyntaxNodeOrToken[]>element).length; }\r\n";
1507-
result += " switch (element.kind()) {\r\n";
1505+
result += " var childCountArray = [";
1506+
for (var i = 0, n = TypeScript.SyntaxKind.LastNode; i <= n; i++) {
1507+
if (i) {
1508+
result += ", ";
1509+
}
15081510

1509-
for (var i = 0; i < definitions.length; i++) {
1510-
var definition = definitions[i];
1511-
result += " case SyntaxKind." + getNameWithoutSuffix(definition) + ": return " + definition.children.length + ";\r\n";
1511+
if (i <= TypeScript.SyntaxKind.LastToken) {
1512+
result += "0";
1513+
}
1514+
else {
1515+
var definition = TypeScript.ArrayUtilities.first(definitions,d => firstKind(d) === i);
1516+
result += definition.children.length;
1517+
}
15121518
}
1519+
result += "];\r\n\r\n";
15131520

1514-
result += " default: return 0;\r\n"
1515-
1516-
result += " }\r\n";
1521+
result += " export function childCount(element: ISyntaxElement): number {\r\n";
1522+
result += " if (isList(element)) { return (<ISyntaxNodeOrToken[]>element).length; }\r\n";
1523+
result += " return childCountArray[element.kind()];\r\n";
15171524
result += " }\r\n\r\n";
15181525

15191526
for (var i = 0; i < definitions.length; i++) {

src/services/syntax/syntaxUtilities.generated.ts

Lines changed: 3 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,9 @@
11
module TypeScript {
2+
var childCountArray = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 4, 3, 5, 2, 2, 3, 3, 3, 6, 6, 7, 8, 6, 6, 4, 5, 3, 5, 3, 5, 5, 3, 3, 2, 4, 3, 3, 6, 3, 2, 3, 7, 3, 3, 10, 8, 1, 3, 5, 4, 3, 7, 2, 5, 2, 2, 2, 2, 5, 3, 2, 3, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 2, 2, 2, 3, 4, 3, 3, 3, 2, 2, 4, 3, 2, 6, 2, 2, 2, 2, 3, 3, 6, 2, 2, 4, 1];
3+
24
export function childCount(element: ISyntaxElement): number {
35
if (isList(element)) { return (<ISyntaxNodeOrToken[]>element).length; }
4-
switch (element.kind()) {
5-
case SyntaxKind.SourceUnit: return 2;
6-
case SyntaxKind.QualifiedName: return 3;
7-
case SyntaxKind.ObjectType: return 3;
8-
case SyntaxKind.FunctionType: return 4;
9-
case SyntaxKind.ArrayType: return 3;
10-
case SyntaxKind.ConstructorType: return 5;
11-
case SyntaxKind.GenericType: return 2;
12-
case SyntaxKind.TypeQuery: return 2;
13-
case SyntaxKind.TupleType: return 3;
14-
case SyntaxKind.UnionType: return 3;
15-
case SyntaxKind.ParenthesizedType: return 3;
16-
case SyntaxKind.InterfaceDeclaration: return 6;
17-
case SyntaxKind.FunctionDeclaration: return 6;
18-
case SyntaxKind.ModuleDeclaration: return 7;
19-
case SyntaxKind.ClassDeclaration: return 8;
20-
case SyntaxKind.EnumDeclaration: return 6;
21-
case SyntaxKind.ImportDeclaration: return 6;
22-
case SyntaxKind.ExportAssignment: return 4;
23-
case SyntaxKind.MemberFunctionDeclaration: return 5;
24-
case SyntaxKind.MemberVariableDeclaration: return 3;
25-
case SyntaxKind.ConstructorDeclaration: return 5;
26-
case SyntaxKind.IndexMemberDeclaration: return 3;
27-
case SyntaxKind.GetAccessor: return 5;
28-
case SyntaxKind.SetAccessor: return 5;
29-
case SyntaxKind.PropertySignature: return 3;
30-
case SyntaxKind.CallSignature: return 3;
31-
case SyntaxKind.ConstructSignature: return 2;
32-
case SyntaxKind.IndexSignature: return 4;
33-
case SyntaxKind.MethodSignature: return 3;
34-
case SyntaxKind.Block: return 3;
35-
case SyntaxKind.IfStatement: return 6;
36-
case SyntaxKind.VariableStatement: return 3;
37-
case SyntaxKind.ExpressionStatement: return 2;
38-
case SyntaxKind.ReturnStatement: return 3;
39-
case SyntaxKind.SwitchStatement: return 7;
40-
case SyntaxKind.BreakStatement: return 3;
41-
case SyntaxKind.ContinueStatement: return 3;
42-
case SyntaxKind.ForStatement: return 10;
43-
case SyntaxKind.ForInStatement: return 8;
44-
case SyntaxKind.EmptyStatement: return 1;
45-
case SyntaxKind.ThrowStatement: return 3;
46-
case SyntaxKind.WhileStatement: return 5;
47-
case SyntaxKind.TryStatement: return 4;
48-
case SyntaxKind.LabeledStatement: return 3;
49-
case SyntaxKind.DoStatement: return 7;
50-
case SyntaxKind.DebuggerStatement: return 2;
51-
case SyntaxKind.WithStatement: return 5;
52-
case SyntaxKind.PrefixUnaryExpression: return 2;
53-
case SyntaxKind.DeleteExpression: return 2;
54-
case SyntaxKind.TypeOfExpression: return 2;
55-
case SyntaxKind.VoidExpression: return 2;
56-
case SyntaxKind.ConditionalExpression: return 5;
57-
case SyntaxKind.BinaryExpression: return 3;
58-
case SyntaxKind.PostfixUnaryExpression: return 2;
59-
case SyntaxKind.MemberAccessExpression: return 3;
60-
case SyntaxKind.InvocationExpression: return 2;
61-
case SyntaxKind.ArrayLiteralExpression: return 3;
62-
case SyntaxKind.ObjectLiteralExpression: return 3;
63-
case SyntaxKind.ObjectCreationExpression: return 3;
64-
case SyntaxKind.ParenthesizedExpression: return 3;
65-
case SyntaxKind.ParenthesizedArrowFunctionExpression: return 4;
66-
case SyntaxKind.SimpleArrowFunctionExpression: return 4;
67-
case SyntaxKind.CastExpression: return 4;
68-
case SyntaxKind.ElementAccessExpression: return 4;
69-
case SyntaxKind.FunctionExpression: return 4;
70-
case SyntaxKind.OmittedExpression: return 0;
71-
case SyntaxKind.TemplateExpression: return 2;
72-
case SyntaxKind.TemplateAccessExpression: return 2;
73-
case SyntaxKind.VariableDeclaration: return 2;
74-
case SyntaxKind.VariableDeclarator: return 3;
75-
case SyntaxKind.ArgumentList: return 4;
76-
case SyntaxKind.ParameterList: return 3;
77-
case SyntaxKind.TypeArgumentList: return 3;
78-
case SyntaxKind.TypeParameterList: return 3;
79-
case SyntaxKind.HeritageClause: return 2;
80-
case SyntaxKind.EqualsValueClause: return 2;
81-
case SyntaxKind.CaseSwitchClause: return 4;
82-
case SyntaxKind.DefaultSwitchClause: return 3;
83-
case SyntaxKind.ElseClause: return 2;
84-
case SyntaxKind.CatchClause: return 6;
85-
case SyntaxKind.FinallyClause: return 2;
86-
case SyntaxKind.TemplateClause: return 2;
87-
case SyntaxKind.TypeParameter: return 2;
88-
case SyntaxKind.Constraint: return 2;
89-
case SyntaxKind.SimplePropertyAssignment: return 3;
90-
case SyntaxKind.FunctionPropertyAssignment: return 3;
91-
case SyntaxKind.Parameter: return 6;
92-
case SyntaxKind.EnumElement: return 2;
93-
case SyntaxKind.TypeAnnotation: return 2;
94-
case SyntaxKind.ExternalModuleReference: return 4;
95-
case SyntaxKind.ModuleNameModuleReference: return 1;
96-
default: return 0;
97-
}
6+
return childCountArray[element.kind()];
987
}
998

1009
function sourceUnitChildAt(node: SourceUnitSyntax, index: number): ISyntaxElement {

tests/baselines/reference/constEnums.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,11 +216,8 @@ function foo(x) {
216216
}
217217
function bar(e) {
218218
switch (e) {
219-
case 1 /* V1 */:
220-
return 1;
221-
case 101 /* V2 */:
222-
return 1;
223-
case 64 /* V3 */:
224-
return 1;
219+
case 1 /* V1 */: return 1;
220+
case 101 /* V2 */: return 1;
221+
case 64 /* V3 */: return 1;
225222
}
226223
}

tests/baselines/reference/sourceMapValidationStatements.js

Lines changed: 13 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/baselines/reference/sourceMapValidationStatements.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)