@@ -1132,6 +1132,7 @@ namespace ts {
1132
1132
}
1133
1133
1134
1134
function emitMethodSignature ( node : MethodSignature ) {
1135
+ pushNameGenerationScope ( node ) ;
1135
1136
emitDecorators ( node , node . decorators ) ;
1136
1137
emitModifiers ( node , node . modifiers ) ;
1137
1138
emit ( node . name ) ;
@@ -1140,6 +1141,7 @@ namespace ts {
1140
1141
emitParameters ( node , node . parameters ) ;
1141
1142
emitTypeAnnotation ( node . type ) ;
1142
1143
writeSemicolon ( ) ;
1144
+ popNameGenerationScope ( node ) ;
1143
1145
}
1144
1146
1145
1147
function emitMethodDeclaration ( node : MethodDeclaration ) {
@@ -1167,15 +1169,18 @@ namespace ts {
1167
1169
}
1168
1170
1169
1171
function emitCallSignature ( node : CallSignatureDeclaration ) {
1172
+ pushNameGenerationScope ( node ) ;
1170
1173
emitDecorators ( node , node . decorators ) ;
1171
1174
emitModifiers ( node , node . modifiers ) ;
1172
1175
emitTypeParameters ( node , node . typeParameters ) ;
1173
1176
emitParameters ( node , node . parameters ) ;
1174
1177
emitTypeAnnotation ( node . type ) ;
1175
1178
writeSemicolon ( ) ;
1179
+ popNameGenerationScope ( node ) ;
1176
1180
}
1177
1181
1178
1182
function emitConstructSignature ( node : ConstructSignatureDeclaration ) {
1183
+ pushNameGenerationScope ( node ) ;
1179
1184
emitDecorators ( node , node . decorators ) ;
1180
1185
emitModifiers ( node , node . modifiers ) ;
1181
1186
writeKeyword ( "new" ) ;
@@ -1184,6 +1189,7 @@ namespace ts {
1184
1189
emitParameters ( node , node . parameters ) ;
1185
1190
emitTypeAnnotation ( node . type ) ;
1186
1191
writeSemicolon ( ) ;
1192
+ popNameGenerationScope ( node ) ;
1187
1193
}
1188
1194
1189
1195
function emitIndexSignature ( node : IndexSignatureDeclaration ) {
@@ -1216,12 +1222,14 @@ namespace ts {
1216
1222
}
1217
1223
1218
1224
function emitFunctionType ( node : FunctionTypeNode ) {
1225
+ pushNameGenerationScope ( node ) ;
1219
1226
emitTypeParameters ( node , node . typeParameters ) ;
1220
1227
emitParametersForArrow ( node , node . parameters ) ;
1221
1228
writeSpace ( ) ;
1222
1229
writePunctuation ( "=>" ) ;
1223
1230
writeSpace ( ) ;
1224
1231
emit ( node . type ) ;
1232
+ popNameGenerationScope ( node ) ;
1225
1233
}
1226
1234
1227
1235
function emitJSDocFunctionType ( node : JSDocFunctionType ) {
@@ -1248,6 +1256,7 @@ namespace ts {
1248
1256
}
1249
1257
1250
1258
function emitConstructorType ( node : ConstructorTypeNode ) {
1259
+ pushNameGenerationScope ( node ) ;
1251
1260
writeKeyword ( "new" ) ;
1252
1261
writeSpace ( ) ;
1253
1262
emitTypeParameters ( node , node . typeParameters ) ;
@@ -1256,6 +1265,7 @@ namespace ts {
1256
1265
writePunctuation ( "=>" ) ;
1257
1266
writeSpace ( ) ;
1258
1267
emit ( node . type ) ;
1268
+ popNameGenerationScope ( node ) ;
1259
1269
}
1260
1270
1261
1271
function emitTypeQuery ( node : TypeQueryNode ) {
@@ -3241,7 +3251,7 @@ namespace ts {
3241
3251
if ( isGeneratedIdentifier ( node ) ) {
3242
3252
return generateName ( node ) ;
3243
3253
}
3244
- else if ( isIdentifier ( node ) && ( nodeIsSynthesized ( node ) || ! node . parent ) ) {
3254
+ else if ( isIdentifier ( node ) && ( nodeIsSynthesized ( node ) || ! node . parent || ! currentSourceFile || ( node . parent && currentSourceFile && getSourceFileOfNode ( node ) !== getOriginalNode ( currentSourceFile ) ) ) ) {
3245
3255
return idText ( node ) ;
3246
3256
}
3247
3257
else if ( node . kind === SyntaxKind . StringLiteral && ( < StringLiteral > node ) . textSourceNode ) {
@@ -3415,7 +3425,7 @@ namespace ts {
3415
3425
if ( ( name . autoGenerateFlags & GeneratedIdentifierFlags . KindMask ) === GeneratedIdentifierFlags . Node ) {
3416
3426
// Node names generate unique names based on their original node
3417
3427
// and are cached based on that node's id.
3418
- return generateNameCached ( getNodeForGeneratedName ( name ) ) ;
3428
+ return generateNameCached ( getNodeForGeneratedName ( name ) , name . autoGenerateFlags ) ;
3419
3429
}
3420
3430
else {
3421
3431
// Auto, Loop, and Unique names are cached based on their unique
@@ -3425,9 +3435,9 @@ namespace ts {
3425
3435
}
3426
3436
}
3427
3437
3428
- function generateNameCached ( node : Node ) {
3438
+ function generateNameCached ( node : Node , flags ?: GeneratedIdentifierFlags ) {
3429
3439
const nodeId = getNodeId ( node ) ;
3430
- return nodeIdToGeneratedName [ nodeId ] || ( nodeIdToGeneratedName [ nodeId ] = generateNameForNode ( node ) ) ;
3440
+ return nodeIdToGeneratedName [ nodeId ] || ( nodeIdToGeneratedName [ nodeId ] = generateNameForNode ( node , flags ) ) ;
3431
3441
}
3432
3442
3433
3443
/**
@@ -3444,7 +3454,7 @@ namespace ts {
3444
3454
* Returns a value indicating whether a name is unique globally or within the current file.
3445
3455
*/
3446
3456
function isFileLevelUniqueName ( name : string ) {
3447
- return ts . isFileLevelUniqueName ( currentSourceFile , name , hasGlobalName ) ;
3457
+ return currentSourceFile ? ts . isFileLevelUniqueName ( currentSourceFile , name , hasGlobalName ) : true ;
3448
3458
}
3449
3459
3450
3460
/**
@@ -3504,10 +3514,15 @@ namespace ts {
3504
3514
* makeUniqueName are guaranteed to never conflict.
3505
3515
* If `optimistic` is set, the first instance will use 'baseName' verbatim instead of 'baseName_1'
3506
3516
*/
3507
- function makeUniqueName ( baseName : string , checkFn : ( name : string ) => boolean = isUniqueName , optimistic ?: boolean ) : string {
3517
+ function makeUniqueName ( baseName : string , checkFn : ( name : string ) => boolean = isUniqueName , optimistic ?: boolean , scoped ?: boolean ) : string {
3508
3518
if ( optimistic ) {
3509
3519
if ( checkFn ( baseName ) ) {
3510
- generatedNames . set ( baseName , true ) ;
3520
+ if ( scoped ) {
3521
+ reserveNameInNestedScopes ( baseName ) ;
3522
+ }
3523
+ else {
3524
+ generatedNames . set ( baseName , true ) ;
3525
+ }
3511
3526
return baseName ;
3512
3527
}
3513
3528
}
@@ -3519,7 +3534,12 @@ namespace ts {
3519
3534
while ( true ) {
3520
3535
const generatedName = baseName + i ;
3521
3536
if ( checkFn ( generatedName ) ) {
3522
- generatedNames . set ( generatedName , true ) ;
3537
+ if ( scoped ) {
3538
+ reserveNameInNestedScopes ( generatedName ) ;
3539
+ }
3540
+ else {
3541
+ generatedNames . set ( generatedName , true ) ;
3542
+ }
3523
3543
return generatedName ;
3524
3544
}
3525
3545
i ++ ;
@@ -3573,10 +3593,15 @@ namespace ts {
3573
3593
/**
3574
3594
* Generates a unique name from a node.
3575
3595
*/
3576
- function generateNameForNode ( node : Node ) : string {
3596
+ function generateNameForNode ( node : Node , flags ?: GeneratedIdentifierFlags ) : string {
3577
3597
switch ( node . kind ) {
3578
3598
case SyntaxKind . Identifier :
3579
- return makeUniqueName ( getTextOfNode ( node ) ) ;
3599
+ return makeUniqueName (
3600
+ getTextOfNode ( node ) ,
3601
+ isUniqueName ,
3602
+ ! ! ( flags & GeneratedIdentifierFlags . Optimistic ) ,
3603
+ ! ! ( flags & GeneratedIdentifierFlags . ReservedInNestedScopes )
3604
+ ) ;
3580
3605
case SyntaxKind . ModuleDeclaration :
3581
3606
case SyntaxKind . EnumDeclaration :
3582
3607
return generateNameForModuleOrEnum ( < ModuleDeclaration | EnumDeclaration > node ) ;
@@ -3611,7 +3636,8 @@ namespace ts {
3611
3636
return makeUniqueName (
3612
3637
idText ( name ) ,
3613
3638
( name . autoGenerateFlags & GeneratedIdentifierFlags . FileLevel ) ? isFileLevelUniqueName : isUniqueName ,
3614
- ! ! ( name . autoGenerateFlags & GeneratedIdentifierFlags . Optimistic )
3639
+ ! ! ( name . autoGenerateFlags & GeneratedIdentifierFlags . Optimistic ) ,
3640
+ ! ! ( name . autoGenerateFlags & GeneratedIdentifierFlags . ReservedInNestedScopes )
3615
3641
) ;
3616
3642
}
3617
3643
@@ -3631,7 +3657,7 @@ namespace ts {
3631
3657
// if "node" is a different generated name (having a different
3632
3658
// "autoGenerateId"), use it and stop traversing.
3633
3659
if ( isIdentifier ( node )
3634
- && node . autoGenerateFlags === GeneratedIdentifierFlags . Node
3660
+ && ! ! ( node . autoGenerateFlags & GeneratedIdentifierFlags . Node )
3635
3661
&& node . autoGenerateId !== autoGenerateId ) {
3636
3662
break ;
3637
3663
}
0 commit comments