@@ -2074,19 +2074,19 @@ module ts {
20742074 sourceMapDir = getDirectoryPath ( normalizePath ( jsFilePath ) ) ;
20752075 }
20762076
2077- function emitNodeWithSourceMap ( node : Node ) {
2077+ function emitNodeWithSourceMap ( node : Node , allowGeneratedIdentifiers ?: boolean ) {
20782078 if ( node ) {
20792079 if ( nodeIsSynthesized ( node ) ) {
2080- return emitNodeWithoutSourceMap ( node ) ;
2080+ return emitNodeWithoutSourceMap ( node , /*allowGeneratedIdentifiers*/ false ) ;
20812081 }
20822082 if ( node . kind != SyntaxKind . SourceFile ) {
20832083 recordEmitNodeStartSpan ( node ) ;
2084- emitNodeWithoutSourceMap ( node ) ;
2084+ emitNodeWithoutSourceMap ( node , allowGeneratedIdentifiers ) ;
20852085 recordEmitNodeEndSpan ( node ) ;
20862086 }
20872087 else {
20882088 recordNewSourceFileStart ( < SourceFile > node ) ;
2089- emitNodeWithoutSourceMap ( node ) ;
2089+ emitNodeWithoutSourceMap ( node , /*allowGeneratedIdentifiers*/ false ) ;
20902090 }
20912091 }
20922092 }
@@ -2623,17 +2623,24 @@ module ts {
26232623 }
26242624 }
26252625
2626- function getBlockScopedVariableId ( node : Identifier ) : number {
2627- // return undefined for synthesized nodes
2628- return ! nodeIsSynthesized ( node ) && resolver . getBlockScopedVariableId ( node ) ;
2626+ function getGeneratedNameForIdentifier ( node : Identifier ) : string {
2627+ if ( nodeIsSynthesized ( node ) || ! generatedBlockScopeNames ) {
2628+ return undefined ;
2629+ }
2630+
2631+ var variableId = resolver . getBlockScopedVariableId ( node )
2632+ if ( variableId === undefined ) {
2633+ return undefined ;
2634+ }
2635+
2636+ return generatedBlockScopeNames [ variableId ] ;
26292637 }
26302638
2631- function emitIdentifier ( node : Identifier ) {
2632- let variableId = getBlockScopedVariableId ( node ) ;
2633- if ( variableId !== undefined && generatedBlockScopeNames ) {
2634- let text = generatedBlockScopeNames [ variableId ] ;
2635- if ( text ) {
2636- write ( text ) ;
2639+ function emitIdentifier ( node : Identifier , allowGeneratedIdentifiers : boolean ) {
2640+ if ( allowGeneratedIdentifiers ) {
2641+ let generatedName = getGeneratedNameForIdentifier ( node ) ;
2642+ if ( generatedName ) {
2643+ write ( generatedName ) ;
26372644 return ;
26382645 }
26392646 }
@@ -2686,7 +2693,7 @@ module ts {
26862693
26872694 function emitBindingElement ( node : BindingElement ) {
26882695 if ( node . propertyName ) {
2689- emit ( node . propertyName ) ;
2696+ emit ( node . propertyName , /*allowGeneratedIdentifiers*/ false ) ;
26902697 write ( ": " ) ;
26912698 }
26922699 if ( node . dotDotDotToken ) {
@@ -3030,21 +3037,21 @@ module ts {
30303037 }
30313038
30323039 function emitMethod ( node : MethodDeclaration ) {
3033- emit ( node . name ) ;
3040+ emit ( node . name , /*allowGeneratedIdentifiers*/ false ) ;
30343041 if ( languageVersion < ScriptTarget . ES6 ) {
30353042 write ( ": function " ) ;
30363043 }
30373044 emitSignatureAndBody ( node ) ;
30383045 }
30393046
30403047 function emitPropertyAssignment ( node : PropertyDeclaration ) {
3041- emit ( node . name ) ;
3048+ emit ( node . name , /*allowGeneratedIdentifiers*/ false ) ;
30423049 write ( ": " ) ;
30433050 emit ( node . initializer ) ;
30443051 }
30453052
30463053 function emitShorthandPropertyAssignment ( node : ShorthandPropertyAssignment ) {
3047- emit ( node . name ) ;
3054+ emit ( node . name , /*allowGeneratedIdentifiers*/ false ) ;
30483055 // If short-hand property has a prefix, then regardless of the target version, we will emit it as normal property assignment. For example:
30493056 // module m {
30503057 // export let y;
@@ -3053,7 +3060,20 @@ module ts {
30533060 // export let obj = { y };
30543061 // }
30553062 // The short-hand property in obj need to emit as such ... = { y : m.y } regardless of the TargetScript version
3056- if ( languageVersion < ScriptTarget . ES6 || resolver . getExpressionNameSubstitution ( node . name ) ) {
3063+ if ( languageVersion < ScriptTarget . ES6 ) {
3064+ // Emit identifier as an identifier
3065+ write ( ": " ) ;
3066+ var generatedName = getGeneratedNameForIdentifier ( node . name ) ;
3067+ if ( generatedName ) {
3068+ write ( generatedName ) ;
3069+ }
3070+ else {
3071+ // Even though this is stored as identifier treat it as an expression
3072+ // Short-hand, { x }, is equivalent of normal form { x: x }
3073+ emitExpressionIdentifier ( node . name ) ;
3074+ }
3075+ }
3076+ else if ( resolver . getExpressionNameSubstitution ( node . name ) ) {
30573077 // Emit identifier as an identifier
30583078 write ( ": " ) ;
30593079 // Even though this is stored as identifier treat it as an expression
@@ -3106,7 +3126,7 @@ module ts {
31063126 let indentedBeforeDot = indentIfOnDifferentLines ( node , node . expression , node . dotToken ) ;
31073127 write ( "." ) ;
31083128 let indentedAfterDot = indentIfOnDifferentLines ( node , node . dotToken , node . name ) ;
3109- emit ( node . name ) ;
3129+ emit ( node . name , /*allowGeneratedIdentifiers*/ false ) ;
31103130 decreaseIndentIf ( indentedBeforeDot , indentedAfterDot ) ;
31113131 }
31123132
@@ -4294,7 +4314,7 @@ module ts {
42944314
42954315 function emitAccessor ( node : AccessorDeclaration ) {
42964316 write ( node . kind === SyntaxKind . GetAccessor ? "get " : "set " ) ;
4297- emit ( node . name ) ;
4317+ emit ( node . name , /*allowGeneratedIdentifiers*/ false ) ;
42984318 emitSignatureAndBody ( node ) ;
42994319 }
43004320
@@ -5340,7 +5360,7 @@ module ts {
53405360 emitLeadingComments ( node . endOfFileToken ) ;
53415361 }
53425362
5343- function emitNodeWithoutSourceMapWithComments ( node : Node ) : void {
5363+ function emitNodeWithoutSourceMapWithComments ( node : Node , allowGeneratedIdentifiers ?: boolean ) : void {
53445364 if ( ! node ) {
53455365 return ;
53465366 }
@@ -5354,14 +5374,14 @@ module ts {
53545374 emitLeadingComments ( node ) ;
53555375 }
53565376
5357- emitJavaScriptWorker ( node ) ;
5377+ emitJavaScriptWorker ( node , allowGeneratedIdentifiers ) ;
53585378
53595379 if ( emitComments ) {
53605380 emitTrailingComments ( node ) ;
53615381 }
53625382 }
53635383
5364- function emitNodeWithoutSourceMapWithoutComments ( node : Node ) : void {
5384+ function emitNodeWithoutSourceMapWithoutComments ( node : Node , allowGeneratedIdentifiers ?: boolean ) : void {
53655385 if ( ! node ) {
53665386 return ;
53675387 }
@@ -5370,7 +5390,7 @@ module ts {
53705390 return emitPinnedOrTripleSlashComments ( node ) ;
53715391 }
53725392
5373- emitJavaScriptWorker ( node ) ;
5393+ emitJavaScriptWorker ( node , allowGeneratedIdentifiers ) ;
53745394 }
53755395
53765396 function shouldEmitLeadingAndTrailingComments ( node : Node ) {
@@ -5400,11 +5420,11 @@ module ts {
54005420 return true ;
54015421 }
54025422
5403- function emitJavaScriptWorker ( node : Node ) {
5423+ function emitJavaScriptWorker ( node : Node , allowGeneratedIdentifiers : boolean = true ) {
54045424 // Check if the node can be emitted regardless of the ScriptTarget
54055425 switch ( node . kind ) {
54065426 case SyntaxKind . Identifier :
5407- return emitIdentifier ( < Identifier > node ) ;
5427+ return emitIdentifier ( < Identifier > node , allowGeneratedIdentifiers ) ;
54085428 case SyntaxKind . Parameter :
54095429 return emitParameter ( < ParameterDeclaration > node ) ;
54105430 case SyntaxKind . MethodDeclaration :
0 commit comments