@@ -1132,6 +1132,7 @@ namespace ts {
11321132 }
11331133
11341134 function emitMethodSignature ( node : MethodSignature ) {
1135+ pushNameGenerationScope ( node ) ;
11351136 emitDecorators ( node , node . decorators ) ;
11361137 emitModifiers ( node , node . modifiers ) ;
11371138 emit ( node . name ) ;
@@ -1140,6 +1141,7 @@ namespace ts {
11401141 emitParameters ( node , node . parameters ) ;
11411142 emitTypeAnnotation ( node . type ) ;
11421143 writeSemicolon ( ) ;
1144+ popNameGenerationScope ( node ) ;
11431145 }
11441146
11451147 function emitMethodDeclaration ( node : MethodDeclaration ) {
@@ -1167,15 +1169,18 @@ namespace ts {
11671169 }
11681170
11691171 function emitCallSignature ( node : CallSignatureDeclaration ) {
1172+ pushNameGenerationScope ( node ) ;
11701173 emitDecorators ( node , node . decorators ) ;
11711174 emitModifiers ( node , node . modifiers ) ;
11721175 emitTypeParameters ( node , node . typeParameters ) ;
11731176 emitParameters ( node , node . parameters ) ;
11741177 emitTypeAnnotation ( node . type ) ;
11751178 writeSemicolon ( ) ;
1179+ popNameGenerationScope ( node ) ;
11761180 }
11771181
11781182 function emitConstructSignature ( node : ConstructSignatureDeclaration ) {
1183+ pushNameGenerationScope ( node ) ;
11791184 emitDecorators ( node , node . decorators ) ;
11801185 emitModifiers ( node , node . modifiers ) ;
11811186 writeKeyword ( "new" ) ;
@@ -1184,6 +1189,7 @@ namespace ts {
11841189 emitParameters ( node , node . parameters ) ;
11851190 emitTypeAnnotation ( node . type ) ;
11861191 writeSemicolon ( ) ;
1192+ popNameGenerationScope ( node ) ;
11871193 }
11881194
11891195 function emitIndexSignature ( node : IndexSignatureDeclaration ) {
@@ -1216,12 +1222,14 @@ namespace ts {
12161222 }
12171223
12181224 function emitFunctionType ( node : FunctionTypeNode ) {
1225+ pushNameGenerationScope ( node ) ;
12191226 emitTypeParameters ( node , node . typeParameters ) ;
12201227 emitParametersForArrow ( node , node . parameters ) ;
12211228 writeSpace ( ) ;
12221229 writePunctuation ( "=>" ) ;
12231230 writeSpace ( ) ;
12241231 emit ( node . type ) ;
1232+ popNameGenerationScope ( node ) ;
12251233 }
12261234
12271235 function emitJSDocFunctionType ( node : JSDocFunctionType ) {
@@ -1248,6 +1256,7 @@ namespace ts {
12481256 }
12491257
12501258 function emitConstructorType ( node : ConstructorTypeNode ) {
1259+ pushNameGenerationScope ( node ) ;
12511260 writeKeyword ( "new" ) ;
12521261 writeSpace ( ) ;
12531262 emitTypeParameters ( node , node . typeParameters ) ;
@@ -1256,6 +1265,7 @@ namespace ts {
12561265 writePunctuation ( "=>" ) ;
12571266 writeSpace ( ) ;
12581267 emit ( node . type ) ;
1268+ popNameGenerationScope ( node ) ;
12591269 }
12601270
12611271 function emitTypeQuery ( node : TypeQueryNode ) {
@@ -3241,7 +3251,7 @@ namespace ts {
32413251 if ( isGeneratedIdentifier ( node ) ) {
32423252 return generateName ( node ) ;
32433253 }
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 ) ) ) ) {
32453255 return idText ( node ) ;
32463256 }
32473257 else if ( node . kind === SyntaxKind . StringLiteral && ( < StringLiteral > node ) . textSourceNode ) {
@@ -3415,7 +3425,7 @@ namespace ts {
34153425 if ( ( name . autoGenerateFlags & GeneratedIdentifierFlags . KindMask ) === GeneratedIdentifierFlags . Node ) {
34163426 // Node names generate unique names based on their original node
34173427 // and are cached based on that node's id.
3418- return generateNameCached ( getNodeForGeneratedName ( name ) ) ;
3428+ return generateNameCached ( getNodeForGeneratedName ( name ) , name . autoGenerateFlags ) ;
34193429 }
34203430 else {
34213431 // Auto, Loop, and Unique names are cached based on their unique
@@ -3425,9 +3435,9 @@ namespace ts {
34253435 }
34263436 }
34273437
3428- function generateNameCached ( node : Node ) {
3438+ function generateNameCached ( node : Node , flags ?: GeneratedIdentifierFlags ) {
34293439 const nodeId = getNodeId ( node ) ;
3430- return nodeIdToGeneratedName [ nodeId ] || ( nodeIdToGeneratedName [ nodeId ] = generateNameForNode ( node ) ) ;
3440+ return nodeIdToGeneratedName [ nodeId ] || ( nodeIdToGeneratedName [ nodeId ] = generateNameForNode ( node , flags ) ) ;
34313441 }
34323442
34333443 /**
@@ -3444,7 +3454,7 @@ namespace ts {
34443454 * Returns a value indicating whether a name is unique globally or within the current file.
34453455 */
34463456 function isFileLevelUniqueName ( name : string ) {
3447- return ts . isFileLevelUniqueName ( currentSourceFile , name , hasGlobalName ) ;
3457+ return currentSourceFile ? ts . isFileLevelUniqueName ( currentSourceFile , name , hasGlobalName ) : true ;
34483458 }
34493459
34503460 /**
@@ -3504,10 +3514,15 @@ namespace ts {
35043514 * makeUniqueName are guaranteed to never conflict.
35053515 * If `optimistic` is set, the first instance will use 'baseName' verbatim instead of 'baseName_1'
35063516 */
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 {
35083518 if ( optimistic ) {
35093519 if ( checkFn ( baseName ) ) {
3510- generatedNames . set ( baseName , true ) ;
3520+ if ( scoped ) {
3521+ reserveNameInNestedScopes ( baseName ) ;
3522+ }
3523+ else {
3524+ generatedNames . set ( baseName , true ) ;
3525+ }
35113526 return baseName ;
35123527 }
35133528 }
@@ -3519,7 +3534,12 @@ namespace ts {
35193534 while ( true ) {
35203535 const generatedName = baseName + i ;
35213536 if ( checkFn ( generatedName ) ) {
3522- generatedNames . set ( generatedName , true ) ;
3537+ if ( scoped ) {
3538+ reserveNameInNestedScopes ( generatedName ) ;
3539+ }
3540+ else {
3541+ generatedNames . set ( generatedName , true ) ;
3542+ }
35233543 return generatedName ;
35243544 }
35253545 i ++ ;
@@ -3573,10 +3593,15 @@ namespace ts {
35733593 /**
35743594 * Generates a unique name from a node.
35753595 */
3576- function generateNameForNode ( node : Node ) : string {
3596+ function generateNameForNode ( node : Node , flags ?: GeneratedIdentifierFlags ) : string {
35773597 switch ( node . kind ) {
35783598 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+ ) ;
35803605 case SyntaxKind . ModuleDeclaration :
35813606 case SyntaxKind . EnumDeclaration :
35823607 return generateNameForModuleOrEnum ( < ModuleDeclaration | EnumDeclaration > node ) ;
@@ -3611,7 +3636,8 @@ namespace ts {
36113636 return makeUniqueName (
36123637 idText ( name ) ,
36133638 ( name . autoGenerateFlags & GeneratedIdentifierFlags . FileLevel ) ? isFileLevelUniqueName : isUniqueName ,
3614- ! ! ( name . autoGenerateFlags & GeneratedIdentifierFlags . Optimistic )
3639+ ! ! ( name . autoGenerateFlags & GeneratedIdentifierFlags . Optimistic ) ,
3640+ ! ! ( name . autoGenerateFlags & GeneratedIdentifierFlags . ReservedInNestedScopes )
36153641 ) ;
36163642 }
36173643
@@ -3631,7 +3657,7 @@ namespace ts {
36313657 // if "node" is a different generated name (having a different
36323658 // "autoGenerateId"), use it and stop traversing.
36333659 if ( isIdentifier ( node )
3634- && node . autoGenerateFlags === GeneratedIdentifierFlags . Node
3660+ && ! ! ( node . autoGenerateFlags & GeneratedIdentifierFlags . Node )
36353661 && node . autoGenerateId !== autoGenerateId ) {
36363662 break ;
36373663 }
0 commit comments