@@ -1035,10 +1035,8 @@ namespace ts {
1035
1035
1036
1036
function emitTypeLiteral ( node : TypeLiteralNode ) {
1037
1037
write ( "{" ) ;
1038
- // If the literal is empty, do not add spaces between braces.
1039
- if ( node . members . length > 0 ) {
1040
- emitList ( node , node . members , getEmitFlags ( node ) & EmitFlags . SingleLine ? ListFormat . SingleLineTypeLiteralMembers : ListFormat . MultiLineTypeLiteralMembers ) ;
1041
- }
1038
+ const flags = getEmitFlags ( node ) & EmitFlags . SingleLine ? ListFormat . SingleLineTypeLiteralMembers : ListFormat . MultiLineTypeLiteralMembers ;
1039
+ emitList ( node , node . members , flags | ListFormat . NoSpaceIfEmpty ) ;
1042
1040
write ( "}" ) ;
1043
1041
}
1044
1042
@@ -1095,11 +1093,14 @@ namespace ts {
1095
1093
increaseIndent ( ) ;
1096
1094
}
1097
1095
writeIfPresent ( node . readonlyToken , "readonly " ) ;
1098
- write ( "[" ) ;
1099
- emit ( node . typeParameter . name ) ;
1100
- write ( " in " ) ;
1101
- emit ( node . typeParameter . constraint ) ;
1102
- write ( "]" ) ;
1096
+
1097
+ if ( onEmitNode ) {
1098
+ onEmitNode ( EmitHint . Unspecified , node . typeParameter , emitMappedTypeParameter ) ;
1099
+ }
1100
+ else {
1101
+ emitMappedTypeParameter ( EmitHint . Unspecified , node . typeParameter ) ;
1102
+ }
1103
+
1103
1104
writeIfPresent ( node . questionToken , "?" ) ;
1104
1105
write ( ": " ) ;
1105
1106
emit ( node . type ) ;
@@ -1114,6 +1115,14 @@ namespace ts {
1114
1115
write ( "}" ) ;
1115
1116
}
1116
1117
1118
+ function emitMappedTypeParameter ( _hint : EmitHint , node : TypeParameterDeclaration ) {
1119
+ write ( "[" ) ;
1120
+ emit ( node . name ) ;
1121
+ write ( " in " ) ;
1122
+ emit ( node . constraint ) ;
1123
+ write ( "]" ) ;
1124
+ }
1125
+
1117
1126
function emitLiteralType ( node : LiteralTypeNode ) {
1118
1127
emitExpression ( node . literal ) ;
1119
1128
}
@@ -1159,33 +1168,22 @@ namespace ts {
1159
1168
1160
1169
function emitArrayLiteralExpression ( node : ArrayLiteralExpression ) {
1161
1170
const elements = node . elements ;
1162
- if ( elements . length === 0 ) {
1163
- write ( "[]" ) ;
1164
- }
1165
- else {
1166
- const preferNewLine = node . multiLine ? ListFormat . PreferNewLine : ListFormat . None ;
1167
- emitExpressionList ( node , elements , ListFormat . ArrayLiteralExpressionElements | preferNewLine ) ;
1168
- }
1171
+ const preferNewLine = node . multiLine ? ListFormat . PreferNewLine : ListFormat . None ;
1172
+ emitExpressionList ( node , elements , ListFormat . ArrayLiteralExpressionElements | preferNewLine ) ;
1169
1173
}
1170
1174
1171
1175
function emitObjectLiteralExpression ( node : ObjectLiteralExpression ) {
1172
- const properties = node . properties ;
1173
- if ( properties . length === 0 ) {
1174
- write ( "{}" ) ;
1176
+ const indentedFlag = getEmitFlags ( node ) & EmitFlags . Indented ;
1177
+ if ( indentedFlag ) {
1178
+ increaseIndent ( ) ;
1175
1179
}
1176
- else {
1177
- const indentedFlag = getEmitFlags ( node ) & EmitFlags . Indented ;
1178
- if ( indentedFlag ) {
1179
- increaseIndent ( ) ;
1180
- }
1181
1180
1182
- const preferNewLine = node . multiLine ? ListFormat . PreferNewLine : ListFormat . None ;
1183
- const allowTrailingComma = currentSourceFile . languageVersion >= ScriptTarget . ES5 ? ListFormat . AllowTrailingComma : ListFormat . None ;
1184
- emitList ( node , properties , ListFormat . ObjectLiteralExpressionProperties | allowTrailingComma | preferNewLine ) ;
1181
+ const preferNewLine = node . multiLine ? ListFormat . PreferNewLine : ListFormat . None ;
1182
+ const allowTrailingComma = currentSourceFile . languageVersion >= ScriptTarget . ES5 ? ListFormat . AllowTrailingComma : ListFormat . None ;
1183
+ emitList ( node , node . properties , ListFormat . ObjectLiteralExpressionProperties | allowTrailingComma | preferNewLine ) ;
1185
1184
1186
- if ( indentedFlag ) {
1187
- decreaseIndent ( ) ;
1188
- }
1185
+ if ( indentedFlag ) {
1186
+ decreaseIndent ( ) ;
1189
1187
}
1190
1188
}
1191
1189
@@ -1286,7 +1284,8 @@ namespace ts {
1286
1284
emitTypeParameters ( node , node . typeParameters ) ;
1287
1285
emitParametersForArrow ( node , node . parameters ) ;
1288
1286
emitWithPrefix ( ": " , node . type ) ;
1289
- write ( " =>" ) ;
1287
+ write ( " " ) ;
1288
+ emit ( node . equalsGreaterThanToken ) ;
1290
1289
}
1291
1290
1292
1291
function emitDeleteExpression ( node : DeleteExpression ) {
@@ -1382,7 +1381,10 @@ namespace ts {
1382
1381
}
1383
1382
1384
1383
function emitYieldExpression ( node : YieldExpression ) {
1385
- write ( node . asteriskToken ? "yield*" : "yield" ) ;
1384
+ write ( "yield" ) ;
1385
+ if ( node . asteriskToken ) {
1386
+ emit ( node . asteriskToken ) ;
1387
+ }
1386
1388
emitExpressionWithPrefix ( " " , node . expression ) ;
1387
1389
}
1388
1390
@@ -1662,7 +1664,11 @@ namespace ts {
1662
1664
function emitFunctionDeclarationOrExpression ( node : FunctionDeclaration | FunctionExpression ) {
1663
1665
emitDecorators ( node , node . decorators ) ;
1664
1666
emitModifiers ( node , node . modifiers ) ;
1665
- write ( node . asteriskToken ? "function* " : "function " ) ;
1667
+ write ( "function" ) ;
1668
+ if ( node . asteriskToken ) {
1669
+ emit ( node . asteriskToken ) ;
1670
+ }
1671
+ write ( " " ) ;
1666
1672
emitIdentifierName ( node . name ) ;
1667
1673
emitSignatureAndBody ( node , emitSignatureHead ) ;
1668
1674
}
@@ -2068,9 +2074,7 @@ namespace ts {
2068
2074
function emitJsxExpression ( node : JsxExpression ) {
2069
2075
if ( node . expression ) {
2070
2076
write ( "{" ) ;
2071
- if ( node . dotDotDotToken ) {
2072
- write ( "..." ) ;
2073
- }
2077
+ writeIfPresent ( node . dotDotDotToken , "..." ) ;
2074
2078
emitExpression ( node . expression ) ;
2075
2079
write ( "}" ) ;
2076
2080
}
@@ -2130,7 +2134,7 @@ namespace ts {
2130
2134
2131
2135
if ( emitAsSingleStatement ) {
2132
2136
write ( " " ) ;
2133
- emit ( statements [ 0 ] ) ;
2137
+ emitSingleElementList ( statements ) ;
2134
2138
}
2135
2139
else {
2136
2140
emitList ( parentNode , statements , ListFormat . CaseOrDefaultClauseStatements ) ;
@@ -2384,7 +2388,7 @@ namespace ts {
2384
2388
2385
2389
function emitParametersForArrow ( parentNode : FunctionTypeNode | ArrowFunction , parameters : NodeArray < ParameterDeclaration > ) {
2386
2390
if ( canEmitSimpleArrowHead ( parentNode , parameters ) ) {
2387
- emit ( parameters [ 0 ] ) ;
2391
+ emitSingleElementList ( parameters ) ;
2388
2392
}
2389
2393
else {
2390
2394
emitParameters ( parentNode , parameters ) ;
@@ -2395,6 +2399,17 @@ namespace ts {
2395
2399
emitList ( parentNode , parameters , ListFormat . IndexSignatureParameters ) ;
2396
2400
}
2397
2401
2402
+ function emitSingleElementList ( list : NodeArray < Node > ) {
2403
+ Debug . assert ( list . length === 1 ) ;
2404
+ if ( onBeforeEmitNodeArray ) {
2405
+ onBeforeEmitNodeArray ( list ) ;
2406
+ }
2407
+ emit ( list [ 0 ] ) ;
2408
+ if ( onAfterEmitNodeArray ) {
2409
+ onAfterEmitNodeArray ( list ) ;
2410
+ }
2411
+ }
2412
+
2398
2413
function emitList ( parentNode : Node , children : NodeArray < Node > , format : ListFormat , start ?: number , count ?: number ) {
2399
2414
emitNodeList ( emit , parentNode , children , format , start , count ) ;
2400
2415
}
@@ -2427,7 +2442,7 @@ namespace ts {
2427
2442
if ( format & ListFormat . MultiLine ) {
2428
2443
writeLine ( ) ;
2429
2444
}
2430
- else if ( format & ListFormat . SpaceBetweenBraces ) {
2445
+ else if ( format & ListFormat . SpaceBetweenBraces && ! ( format & ListFormat . NoSpaceIfEmpty ) ) {
2431
2446
write ( " " ) ;
2432
2447
}
2433
2448
}
@@ -2570,7 +2585,7 @@ namespace ts {
2570
2585
2571
2586
function writeIfPresent ( node : Node , text : string ) {
2572
2587
if ( node ) {
2573
- write ( text ) ;
2588
+ writeTokenAndCallCallbacks ( node , text ) ;
2574
2589
}
2575
2590
}
2576
2591
@@ -2580,16 +2595,20 @@ namespace ts {
2580
2595
: writeTokenText ( token , pos ) ;
2581
2596
}
2582
2597
2583
- function writeTokenNode ( node : Node ) {
2598
+ function writeTokenAndCallCallbacks ( node : Node , text : string ) {
2584
2599
if ( onBeforeEmitToken ) {
2585
2600
onBeforeEmitToken ( node ) ;
2586
2601
}
2587
- writeTokenText ( node . kind ) ;
2602
+ write ( text ) ;
2588
2603
if ( onAfterEmitToken ) {
2589
2604
onAfterEmitToken ( node ) ;
2590
2605
}
2591
2606
}
2592
2607
2608
+ function writeTokenNode ( node : Node ) {
2609
+ writeTokenAndCallCallbacks ( node , tokenToString ( node . kind ) ) ;
2610
+ }
2611
+
2593
2612
function writeTokenText ( token : SyntaxKind , pos ?: number ) {
2594
2613
const tokenString = tokenToString ( token ) ;
2595
2614
write ( tokenString ) ;
@@ -3107,6 +3126,8 @@ namespace ts {
3107
3126
NoTrailingNewLine = 1 << 16 , // Do not emit a trailing NewLine for a MultiLine list.
3108
3127
NoInterveningComments = 1 << 17 , // Do not emit comments between each node
3109
3128
3129
+ NoSpaceIfEmpty = 1 << 18 , // If the literal is empty, do not add spaces between braces.
3130
+
3110
3131
// Precomputed Formats
3111
3132
Modifiers = SingleLine | SpaceBetweenSiblings | NoInterveningComments ,
3112
3133
HeritageClauses = SingleLine | SpaceBetweenSiblings ,
@@ -3118,7 +3139,7 @@ namespace ts {
3118
3139
IntersectionTypeConstituents = AmpersandDelimited | SpaceBetweenSiblings | SingleLine ,
3119
3140
ObjectBindingPatternElements = SingleLine | AllowTrailingComma | SpaceBetweenBraces | CommaDelimited | SpaceBetweenSiblings ,
3120
3141
ArrayBindingPatternElements = SingleLine | AllowTrailingComma | CommaDelimited | SpaceBetweenSiblings ,
3121
- ObjectLiteralExpressionProperties = PreserveLines | CommaDelimited | SpaceBetweenSiblings | SpaceBetweenBraces | Indented | Braces ,
3142
+ ObjectLiteralExpressionProperties = PreserveLines | CommaDelimited | SpaceBetweenSiblings | SpaceBetweenBraces | Indented | Braces | NoSpaceIfEmpty ,
3122
3143
ArrayLiteralExpressionElements = PreserveLines | CommaDelimited | SpaceBetweenSiblings | AllowTrailingComma | Indented | SquareBrackets ,
3123
3144
CommaListElements = CommaDelimited | SpaceBetweenSiblings | SingleLine ,
3124
3145
CallExpressionArguments = CommaDelimited | SpaceBetweenSiblings | SingleLine | Parenthesis ,
0 commit comments