@@ -1378,6 +1378,8 @@ namespace ts {
1378
1378
}
1379
1379
1380
1380
function emitObjectLiteralExpression ( node : ObjectLiteralExpression ) {
1381
+ forEach ( node . properties , generateMemberNames ) ;
1382
+
1381
1383
const indentedFlag = getEmitFlags ( node ) & EmitFlags . Indented ;
1382
1384
if ( indentedFlag ) {
1383
1385
increaseIndent ( ) ;
@@ -1481,6 +1483,7 @@ namespace ts {
1481
1483
}
1482
1484
1483
1485
function emitFunctionExpression ( node : FunctionExpression ) {
1486
+ generateNameIfNeeded ( node . name ) ;
1484
1487
emitFunctionDeclarationOrExpression ( node ) ;
1485
1488
}
1486
1489
@@ -1606,6 +1609,7 @@ namespace ts {
1606
1609
}
1607
1610
1608
1611
function emitClassExpression ( node : ClassExpression ) {
1612
+ generateNameIfNeeded ( node . name ) ;
1609
1613
emitClassDeclarationOrExpression ( node ) ;
1610
1614
}
1611
1615
@@ -1911,6 +1915,9 @@ namespace ts {
1911
1915
}
1912
1916
1913
1917
pushNameGenerationScope ( node ) ;
1918
+ forEach ( node . parameters , generateNames ) ;
1919
+ generateNames ( node . body ) ;
1920
+
1914
1921
emitSignatureHead ( node ) ;
1915
1922
if ( onEmitNode ) {
1916
1923
onEmitNode ( EmitHint . Unspecified , body , emitBlockCallback ) ;
@@ -2025,6 +2032,8 @@ namespace ts {
2025
2032
}
2026
2033
2027
2034
function emitClassDeclarationOrExpression ( node : ClassDeclaration | ClassExpression ) {
2035
+ forEach ( node . members , generateMemberNames ) ;
2036
+
2028
2037
emitDecorators ( node , node . decorators ) ;
2029
2038
emitModifiers ( node , node . modifiers ) ;
2030
2039
writeKeyword ( "class" ) ;
@@ -2113,6 +2122,7 @@ namespace ts {
2113
2122
2114
2123
function emitModuleBlock ( node : ModuleBlock ) {
2115
2124
pushNameGenerationScope ( node ) ;
2125
+ forEach ( node . statements , generateNames ) ;
2116
2126
emitBlockStatements ( node , /*forceSingleLine*/ isEmptyBlock ( node ) ) ;
2117
2127
popNameGenerationScope ( node ) ;
2118
2128
}
@@ -2516,6 +2526,7 @@ namespace ts {
2516
2526
function emitSourceFileWorker ( node : SourceFile ) {
2517
2527
const statements = node . statements ;
2518
2528
pushNameGenerationScope ( node ) ;
2529
+ forEach ( node . statements , generateNames ) ;
2519
2530
emitHelpers ( node ) ;
2520
2531
const index = findIndex ( statements , statement => ! isPrologueDirective ( statement ) ) ;
2521
2532
emitTripleSlashDirectivesIfNeeded ( node ) ;
@@ -3222,24 +3233,122 @@ namespace ts {
3222
3233
reservedNames . set ( name , true ) ;
3223
3234
}
3224
3235
3236
+ function generateNames ( node : Node | undefined ) {
3237
+ if ( ! node ) return ;
3238
+ switch ( node . kind ) {
3239
+ case SyntaxKind . Block :
3240
+ forEach ( ( < Block > node ) . statements , generateNames ) ;
3241
+ break ;
3242
+ case SyntaxKind . LabeledStatement :
3243
+ case SyntaxKind . WithStatement :
3244
+ case SyntaxKind . DoStatement :
3245
+ case SyntaxKind . WhileStatement :
3246
+ generateNames ( ( < LabeledStatement | WithStatement | DoStatement | WhileStatement > node ) . statement ) ;
3247
+ break ;
3248
+ case SyntaxKind . IfStatement :
3249
+ generateNames ( ( < IfStatement > node ) . thenStatement ) ;
3250
+ generateNames ( ( < IfStatement > node ) . elseStatement ) ;
3251
+ break ;
3252
+ case SyntaxKind . ForStatement :
3253
+ case SyntaxKind . ForOfStatement :
3254
+ case SyntaxKind . ForInStatement :
3255
+ generateNames ( ( < ForStatement | ForInOrOfStatement > node ) . initializer ) ;
3256
+ generateNames ( ( < ForStatement | ForInOrOfStatement > node ) . statement ) ;
3257
+ break ;
3258
+ case SyntaxKind . SwitchStatement :
3259
+ generateNames ( ( < SwitchStatement > node ) . caseBlock ) ;
3260
+ break ;
3261
+ case SyntaxKind . CaseBlock :
3262
+ forEach ( ( < CaseBlock > node ) . clauses , generateNames ) ;
3263
+ break ;
3264
+ case SyntaxKind . CaseClause :
3265
+ case SyntaxKind . DefaultClause :
3266
+ forEach ( ( < CaseOrDefaultClause > node ) . statements , generateNames ) ;
3267
+ break ;
3268
+ case SyntaxKind . TryStatement :
3269
+ generateNames ( ( < TryStatement > node ) . tryBlock ) ;
3270
+ generateNames ( ( < TryStatement > node ) . catchClause ) ;
3271
+ generateNames ( ( < TryStatement > node ) . finallyBlock ) ;
3272
+ break ;
3273
+ case SyntaxKind . CatchClause :
3274
+ generateNames ( ( < CatchClause > node ) . variableDeclaration ) ;
3275
+ generateNames ( ( < CatchClause > node ) . block ) ;
3276
+ break ;
3277
+ case SyntaxKind . VariableStatement :
3278
+ generateNames ( ( < VariableStatement > node ) . declarationList ) ;
3279
+ break ;
3280
+ case SyntaxKind . VariableDeclarationList :
3281
+ forEach ( ( < VariableDeclarationList > node ) . declarations , generateNames ) ;
3282
+ break ;
3283
+ case SyntaxKind . VariableDeclaration :
3284
+ case SyntaxKind . Parameter :
3285
+ case SyntaxKind . BindingElement :
3286
+ case SyntaxKind . ClassDeclaration :
3287
+ generateNameIfNeeded ( ( < NamedDeclaration > node ) . name ) ;
3288
+ break ;
3289
+ case SyntaxKind . FunctionDeclaration :
3290
+ generateNameIfNeeded ( ( < FunctionDeclaration > node ) . name ) ;
3291
+ if ( getEmitFlags ( node ) & EmitFlags . ReuseTempVariableScope ) {
3292
+ forEach ( ( < FunctionDeclaration > node ) . parameters , generateNames ) ;
3293
+ generateNames ( ( < FunctionDeclaration > node ) . body ) ;
3294
+ }
3295
+ break ;
3296
+ case SyntaxKind . ObjectBindingPattern :
3297
+ case SyntaxKind . ArrayBindingPattern :
3298
+ forEach ( ( < BindingPattern > node ) . elements , generateNames ) ;
3299
+ break ;
3300
+ case SyntaxKind . ImportDeclaration :
3301
+ generateNames ( ( < ImportDeclaration > node ) . importClause ) ;
3302
+ break ;
3303
+ case SyntaxKind . ImportClause :
3304
+ generateNameIfNeeded ( ( < ImportClause > node ) . name ) ;
3305
+ generateNames ( ( < ImportClause > node ) . namedBindings ) ;
3306
+ break ;
3307
+ case SyntaxKind . NamespaceImport :
3308
+ generateNameIfNeeded ( ( < NamespaceImport > node ) . name ) ;
3309
+ break ;
3310
+ case SyntaxKind . NamedImports :
3311
+ forEach ( ( < NamedImports > node ) . elements , generateNames ) ;
3312
+ break ;
3313
+ case SyntaxKind . ImportSpecifier :
3314
+ generateNameIfNeeded ( ( < ImportSpecifier > node ) . propertyName || ( < ImportSpecifier > node ) . name ) ;
3315
+ break ;
3316
+ }
3317
+ }
3318
+
3319
+ function generateMemberNames ( node : Node | undefined ) {
3320
+ if ( ! node ) return ;
3321
+ switch ( node . kind ) {
3322
+ case SyntaxKind . PropertyAssignment :
3323
+ case SyntaxKind . ShorthandPropertyAssignment :
3324
+ case SyntaxKind . PropertyDeclaration :
3325
+ case SyntaxKind . MethodDeclaration :
3326
+ case SyntaxKind . GetAccessor :
3327
+ case SyntaxKind . SetAccessor :
3328
+ generateNameIfNeeded ( ( < NamedDeclaration > node ) . name ) ;
3329
+ break ;
3330
+ }
3331
+ }
3332
+
3333
+ function generateNameIfNeeded ( name : DeclarationName | undefined ) {
3334
+ if ( name ) {
3335
+ if ( isGeneratedIdentifier ( name ) ) {
3336
+ generateName ( name ) ;
3337
+ }
3338
+ else if ( isBindingPattern ( name ) ) {
3339
+ generateNames ( name ) ;
3340
+ }
3341
+ }
3342
+ }
3343
+
3225
3344
/**
3226
3345
* Generate the text for a generated identifier.
3227
3346
*/
3228
3347
function generateName ( name : GeneratedIdentifier ) {
3229
3348
if ( ( name . autoGenerateFlags & GeneratedIdentifierFlags . KindMask ) === GeneratedIdentifierFlags . Node ) {
3230
3349
// Node names generate unique names based on their original node
3231
3350
// and are cached based on that node's id.
3232
- if ( name . autoGenerateFlags & GeneratedIdentifierFlags . SkipNameGenerationScope ) {
3233
- const savedTempFlags = tempFlags ;
3234
- popNameGenerationScope ( /*node*/ undefined ) ;
3235
- const result = generateNameCached ( getNodeForGeneratedName ( name ) ) ;
3236
- pushNameGenerationScope ( /*node*/ undefined ) ;
3237
- tempFlags = savedTempFlags ;
3238
- return result ;
3239
- }
3240
- else {
3241
- return generateNameCached ( getNodeForGeneratedName ( name ) ) ;
3242
- }
3351
+ return generateNameCached ( getNodeForGeneratedName ( name ) ) ;
3243
3352
}
3244
3353
else {
3245
3354
// Auto, Loop, and Unique names are cached based on their unique
0 commit comments