@@ -1982,7 +1982,7 @@ function generateConstructorFunction(definition) {
1982
1982
result += ";\r\n" ;
1983
1983
}
1984
1984
result += " };\r\n" ;
1985
- result += " " + definition . name + ".prototype.kind = function() { return SyntaxKind." + getNameWithoutSuffix ( definition ) + "; } \r\n" ;
1985
+ result += " " + definition . name + ".prototype.kind = SyntaxKind." + getNameWithoutSuffix ( definition ) + ";\r\n" ;
1986
1986
return result ;
1987
1987
}
1988
1988
function generateSyntaxInterfaces ( ) {
@@ -2154,16 +2154,28 @@ function max(array, func) {
2154
2154
}
2155
2155
return max ;
2156
2156
}
2157
+ function generateUtilities ( ) {
2158
+ var result = "" ;
2159
+ result += " var fixedWidthArray = [" ;
2160
+ for ( var i = 0 ; i <= TypeScript . SyntaxKind . LastFixedWidth ; i ++ ) {
2161
+ if ( i ) {
2162
+ result += ", " ;
2163
+ }
2164
+ if ( i < TypeScript . SyntaxKind . FirstFixedWidth ) {
2165
+ result += "0" ;
2166
+ }
2167
+ else {
2168
+ result += TypeScript . SyntaxFacts . getText ( i ) . length ;
2169
+ }
2170
+ }
2171
+ result += "];\r\n" ;
2172
+ result += " function fixedWidthTokenLength(kind: SyntaxKind) {\r\n" ;
2173
+ result += " return fixedWidthArray[kind];\r\n" ;
2174
+ result += " }\r\n" ;
2175
+ return result ;
2176
+ }
2157
2177
function generateScannerUtilities ( ) {
2158
2178
var result = "///<reference path='references.ts' />\r\n" + "\r\n" + "module TypeScript {\r\n" + " export module ScannerUtilities {\r\n" ;
2159
- result += " export function fixedWidthTokenLength(kind: SyntaxKind) {\r\n" ;
2160
- result += " switch (kind) {\r\n" ;
2161
- for ( var k = TypeScript . SyntaxKind . FirstFixedWidth ; k <= TypeScript . SyntaxKind . LastFixedWidth ; k ++ ) {
2162
- result += " case SyntaxKind." + syntaxKindName ( k ) + ": return " + TypeScript . SyntaxFacts . getText ( k ) . length + ";\r\n" ;
2163
- }
2164
- result += " default: throw new Error();\r\n" ;
2165
- result += " }\r\n" ;
2166
- result += " }\r\n\r\n" ;
2167
2179
var i ;
2168
2180
var keywords = [ ] ;
2169
2181
for ( i = TypeScript . SyntaxKind . FirstKeyword ; i <= TypeScript . SyntaxKind . LastKeyword ; i ++ ) {
@@ -2202,7 +2214,7 @@ function generateVisitor() {
2202
2214
result += "module TypeScript {\r\n" ;
2203
2215
result += " export function visitNodeOrToken(visitor: ISyntaxVisitor, element: ISyntaxNodeOrToken): any {\r\n" ;
2204
2216
result += " if (element === undefined) { return undefined; }\r\n" ;
2205
- result += " switch (element.kind() ) {\r\n" ;
2217
+ result += " switch (element.kind) {\r\n" ;
2206
2218
for ( var i = 0 ; i < definitions . length ; i ++ ) {
2207
2219
var definition = definitions [ i ] ;
2208
2220
result += " case SyntaxKind." + getNameWithoutSuffix ( definition ) + ": " ;
@@ -2240,31 +2252,38 @@ function generateServicesUtilities() {
2240
2252
result += "];\r\n\r\n" ;
2241
2253
result += " export function childCount(element: ISyntaxElement): number {\r\n" ;
2242
2254
result += " if (isList(element)) { return (<ISyntaxNodeOrToken[]>element).length; }\r\n" ;
2243
- result += " return childCountArray[element.kind() ];\r\n" ;
2255
+ result += " return childCountArray[element.kind];\r\n" ;
2244
2256
result += " }\r\n\r\n" ;
2257
+ result += " var childAtArray: ((nodeOrToken: ISyntaxElement, index: number) => ISyntaxElement)[] = [\r\n " ;
2258
+ for ( var i = 0 ; i < TypeScript . SyntaxKind . FirstNode ; i ++ ) {
2259
+ if ( i ) {
2260
+ result += ", " ;
2261
+ }
2262
+ result += "undefined" ;
2263
+ }
2245
2264
for ( var i = 0 ; i < definitions . length ; i ++ ) {
2246
2265
var definition = definitions [ i ] ;
2247
- result += " function " + camelCase ( getNameWithoutSuffix ( definition ) ) + "ChildAt(node: " + definition . name + ", index: number): ISyntaxElement {\r\n" ;
2266
+ result += ",\r\n" ;
2267
+ result += " (node: " + definition . name + ", index: number): ISyntaxElement => {\r\n" ;
2248
2268
if ( definition . children . length ) {
2249
- result += " switch (index) {\r\n" ;
2269
+ result += " switch (index) {\r\n" ;
2250
2270
for ( var j = 0 ; j < definition . children . length ; j ++ ) {
2251
- result += " case " + j + ": return node." + definition . children [ j ] . name + ";\r\n" ;
2271
+ result += " case " + j + ": return node." + definition . children [ j ] . name + ";\r\n" ;
2252
2272
}
2253
- result += " }\r\n" ;
2273
+ result += " }\r\n" ;
2254
2274
}
2255
2275
else {
2256
- result += " throw Errors.invalidOperation();\r\n" ;
2276
+ result += " throw Errors.invalidOperation();\r\n" ;
2257
2277
}
2258
- result += " }\r\n " ;
2278
+ result += " } " ;
2259
2279
}
2280
+ result += "\r\n ];\r\n" ;
2260
2281
result += " export function childAt(element: ISyntaxElement, index: number): ISyntaxElement {\r\n" ;
2261
2282
result += " if (isList(element)) { return (<ISyntaxNodeOrToken[]>element)[index]; }\r\n" ;
2262
- result += " switch (element.kind()) {\r\n" ;
2263
- for ( var i = 0 ; i < definitions . length ; i ++ ) {
2264
- var definition = definitions [ i ] ;
2265
- result += " case SyntaxKind." + getNameWithoutSuffix ( definition ) + ": return " + camelCase ( getNameWithoutSuffix ( definition ) ) + "ChildAt(<" + definition . name + ">element, index);\r\n" ;
2266
- }
2267
- result += " }\r\n" ;
2283
+ result += " return childAtArray[element.kind](element, index);\r\n" ;
2284
+ result += " }\r\n\r\n" ;
2285
+ result += " export function getChildAtFunction(element: ISyntaxNodeOrToken): (nodeOrToken: ISyntaxElement, index: number) => ISyntaxElement {\r\n" ;
2286
+ result += " return childAtArray[element.kind];\r\n" ;
2268
2287
result += " }\r\n" ;
2269
2288
result += "}" ;
2270
2289
return result ;
@@ -2275,9 +2294,11 @@ var walker = generateWalker();
2275
2294
var scannerUtilities = generateScannerUtilities ( ) ;
2276
2295
var visitor = generateVisitor ( ) ;
2277
2296
var servicesUtilities = generateServicesUtilities ( ) ;
2297
+ var utilities = generateUtilities ( ) ;
2278
2298
sys . writeFile ( sys . getCurrentDirectory ( ) + "\\src\\services\\syntax\\syntaxNodes.concrete.generated.ts" , syntaxNodesConcrete , false ) ;
2279
2299
sys . writeFile ( sys . getCurrentDirectory ( ) + "\\src\\services\\syntax\\syntaxInterfaces.generated.ts" , syntaxInterfaces , false ) ;
2280
2300
sys . writeFile ( sys . getCurrentDirectory ( ) + "\\src\\services\\syntax\\syntaxWalker.generated.ts" , walker , false ) ;
2281
2301
sys . writeFile ( sys . getCurrentDirectory ( ) + "\\src\\services\\syntax\\scannerUtilities.generated.ts" , scannerUtilities , false ) ;
2282
2302
sys . writeFile ( sys . getCurrentDirectory ( ) + "\\src\\services\\syntax\\syntaxVisitor.generated.ts" , visitor , false ) ;
2283
2303
sys . writeFile ( sys . getCurrentDirectory ( ) + "\\src\\services\\syntax\\syntaxUtilities.generated.ts" , servicesUtilities , false ) ;
2304
+ sys . writeFile ( sys . getCurrentDirectory ( ) + "\\src\\services\\syntax\\utilities.generated.ts" , utilities , false ) ;
0 commit comments