@@ -406,6 +406,14 @@ namespace ts {
406
406
setWriter ( /*output*/ undefined ) ;
407
407
}
408
408
409
+ // TODO: Should this just be `emit`?
410
+ // See https://github.com/Microsoft/TypeScript/pull/18284#discussion_r137611034
411
+ function emitIfPresent ( node : Node | undefined ) {
412
+ if ( node ) {
413
+ emit ( node ) ;
414
+ }
415
+ }
416
+
409
417
function emit ( node : Node ) {
410
418
pipelineEmitWithNotification ( EmitHint . Unspecified , node ) ;
411
419
}
@@ -451,6 +459,7 @@ namespace ts {
451
459
case EmitHint . SourceFile : return pipelineEmitSourceFile ( node ) ;
452
460
case EmitHint . IdentifierName : return pipelineEmitIdentifierName ( node ) ;
453
461
case EmitHint . Expression : return pipelineEmitExpression ( node ) ;
462
+ case EmitHint . MappedTypeParameter : return emitMappedTypeParameter ( cast ( node , isTypeParameterDeclaration ) ) ;
454
463
case EmitHint . Unspecified : return pipelineEmitUnspecified ( node ) ;
455
464
}
456
465
}
@@ -465,6 +474,12 @@ namespace ts {
465
474
emitIdentifier ( < Identifier > node ) ;
466
475
}
467
476
477
+ function emitMappedTypeParameter ( node : TypeParameterDeclaration ) : void {
478
+ emit ( node . name ) ;
479
+ write ( " in " ) ;
480
+ emit ( node . constraint ) ;
481
+ }
482
+
468
483
function pipelineEmitUnspecified ( node : Node ) : void {
469
484
const kind = node . kind ;
470
485
@@ -898,9 +913,9 @@ namespace ts {
898
913
function emitParameter ( node : ParameterDeclaration ) {
899
914
emitDecorators ( node , node . decorators ) ;
900
915
emitModifiers ( node , node . modifiers ) ;
901
- writeIfPresent ( node . dotDotDotToken , "..." ) ;
916
+ emitIfPresent ( node . dotDotDotToken ) ;
902
917
emit ( node . name ) ;
903
- writeIfPresent ( node . questionToken , "?" ) ;
918
+ emitIfPresent ( node . questionToken ) ;
904
919
emitWithPrefix ( ": " , node . type ) ;
905
920
emitExpressionWithPrefix ( " = " , node . initializer ) ;
906
921
}
@@ -918,7 +933,7 @@ namespace ts {
918
933
emitDecorators ( node , node . decorators ) ;
919
934
emitModifiers ( node , node . modifiers ) ;
920
935
emit ( node . name ) ;
921
- writeIfPresent ( node . questionToken , "?" ) ;
936
+ emitIfPresent ( node . questionToken ) ;
922
937
emitWithPrefix ( ": " , node . type ) ;
923
938
write ( ";" ) ;
924
939
}
@@ -927,7 +942,7 @@ namespace ts {
927
942
emitDecorators ( node , node . decorators ) ;
928
943
emitModifiers ( node , node . modifiers ) ;
929
944
emit ( node . name ) ;
930
- writeIfPresent ( node . questionToken , "?" ) ;
945
+ emitIfPresent ( node . questionToken ) ;
931
946
emitWithPrefix ( ": " , node . type ) ;
932
947
emitExpressionWithPrefix ( " = " , node . initializer ) ;
933
948
write ( ";" ) ;
@@ -937,7 +952,7 @@ namespace ts {
937
952
emitDecorators ( node , node . decorators ) ;
938
953
emitModifiers ( node , node . modifiers ) ;
939
954
emit ( node . name ) ;
940
- writeIfPresent ( node . questionToken , "?" ) ;
955
+ emitIfPresent ( node . questionToken ) ;
941
956
emitTypeParameters ( node , node . typeParameters ) ;
942
957
emitParameters ( node , node . parameters ) ;
943
958
emitWithPrefix ( ": " , node . type ) ;
@@ -947,9 +962,9 @@ namespace ts {
947
962
function emitMethodDeclaration ( node : MethodDeclaration ) {
948
963
emitDecorators ( node , node . decorators ) ;
949
964
emitModifiers ( node , node . modifiers ) ;
950
- writeIfPresent ( node . asteriskToken , "*" ) ;
965
+ emitIfPresent ( node . asteriskToken ) ;
951
966
emit ( node . name ) ;
952
- writeIfPresent ( node . questionToken , "?" ) ;
967
+ emitIfPresent ( node . questionToken ) ;
953
968
emitSignatureAndBody ( node , emitSignatureHead ) ;
954
969
}
955
970
@@ -1035,10 +1050,8 @@ namespace ts {
1035
1050
1036
1051
function emitTypeLiteral ( node : TypeLiteralNode ) {
1037
1052
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
- }
1053
+ const flags = getEmitFlags ( node ) & EmitFlags . SingleLine ? ListFormat . SingleLineTypeLiteralMembers : ListFormat . MultiLineTypeLiteralMembers ;
1054
+ emitList ( node , node . members , flags | ListFormat . NoSpaceIfEmpty ) ;
1042
1055
write ( "}" ) ;
1043
1056
}
1044
1057
@@ -1094,13 +1107,16 @@ namespace ts {
1094
1107
writeLine ( ) ;
1095
1108
increaseIndent ( ) ;
1096
1109
}
1097
- writeIfPresent ( node . readonlyToken , "readonly " ) ;
1110
+ if ( node . readonlyToken ) {
1111
+ emit ( node . readonlyToken ) ;
1112
+ write ( " " ) ;
1113
+ }
1114
+
1098
1115
write ( "[" ) ;
1099
- emit ( node . typeParameter . name ) ;
1100
- write ( " in " ) ;
1101
- emit ( node . typeParameter . constraint ) ;
1116
+ pipelineEmitWithNotification ( EmitHint . MappedTypeParameter , node . typeParameter ) ;
1102
1117
write ( "]" ) ;
1103
- writeIfPresent ( node . questionToken , "?" ) ;
1118
+
1119
+ emitIfPresent ( node . questionToken ) ;
1104
1120
write ( ": " ) ;
1105
1121
emit ( node . type ) ;
1106
1122
write ( ";" ) ;
@@ -1148,7 +1164,7 @@ namespace ts {
1148
1164
1149
1165
function emitBindingElement ( node : BindingElement ) {
1150
1166
emitWithSuffix ( node . propertyName , ": " ) ;
1151
- writeIfPresent ( node . dotDotDotToken , "..." ) ;
1167
+ emitIfPresent ( node . dotDotDotToken ) ;
1152
1168
emit ( node . name ) ;
1153
1169
emitExpressionWithPrefix ( " = " , node . initializer ) ;
1154
1170
}
@@ -1159,33 +1175,22 @@ namespace ts {
1159
1175
1160
1176
function emitArrayLiteralExpression ( node : ArrayLiteralExpression ) {
1161
1177
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
- }
1178
+ const preferNewLine = node . multiLine ? ListFormat . PreferNewLine : ListFormat . None ;
1179
+ emitExpressionList ( node , elements , ListFormat . ArrayLiteralExpressionElements | preferNewLine ) ;
1169
1180
}
1170
1181
1171
1182
function emitObjectLiteralExpression ( node : ObjectLiteralExpression ) {
1172
- const properties = node . properties ;
1173
- if ( properties . length === 0 ) {
1174
- write ( "{}" ) ;
1183
+ const indentedFlag = getEmitFlags ( node ) & EmitFlags . Indented ;
1184
+ if ( indentedFlag ) {
1185
+ increaseIndent ( ) ;
1175
1186
}
1176
- else {
1177
- const indentedFlag = getEmitFlags ( node ) & EmitFlags . Indented ;
1178
- if ( indentedFlag ) {
1179
- increaseIndent ( ) ;
1180
- }
1181
1187
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 ) ;
1188
+ const preferNewLine = node . multiLine ? ListFormat . PreferNewLine : ListFormat . None ;
1189
+ const allowTrailingComma = currentSourceFile . languageVersion >= ScriptTarget . ES5 ? ListFormat . AllowTrailingComma : ListFormat . None ;
1190
+ emitList ( node , node . properties , ListFormat . ObjectLiteralExpressionProperties | allowTrailingComma | preferNewLine ) ;
1185
1191
1186
- if ( indentedFlag ) {
1187
- decreaseIndent ( ) ;
1188
- }
1192
+ if ( indentedFlag ) {
1193
+ decreaseIndent ( ) ;
1189
1194
}
1190
1195
}
1191
1196
@@ -1286,7 +1291,8 @@ namespace ts {
1286
1291
emitTypeParameters ( node , node . typeParameters ) ;
1287
1292
emitParametersForArrow ( node , node . parameters ) ;
1288
1293
emitWithPrefix ( ": " , node . type ) ;
1289
- write ( " =>" ) ;
1294
+ write ( " " ) ;
1295
+ emit ( node . equalsGreaterThanToken ) ;
1290
1296
}
1291
1297
1292
1298
function emitDeleteExpression ( node : DeleteExpression ) {
@@ -1364,13 +1370,13 @@ namespace ts {
1364
1370
1365
1371
emitExpression ( node . condition ) ;
1366
1372
increaseIndentIf ( indentBeforeQuestion , " " ) ;
1367
- write ( "?" ) ;
1373
+ emit ( node . questionToken ) ;
1368
1374
increaseIndentIf ( indentAfterQuestion , " " ) ;
1369
1375
emitExpression ( node . whenTrue ) ;
1370
1376
decreaseIndentIf ( indentBeforeQuestion , indentAfterQuestion ) ;
1371
1377
1372
1378
increaseIndentIf ( indentBeforeColon , " " ) ;
1373
- write ( ":" ) ;
1379
+ emit ( node . colonToken ) ;
1374
1380
increaseIndentIf ( indentAfterColon , " " ) ;
1375
1381
emitExpression ( node . whenFalse ) ;
1376
1382
decreaseIndentIf ( indentBeforeColon , indentAfterColon ) ;
@@ -1382,7 +1388,8 @@ namespace ts {
1382
1388
}
1383
1389
1384
1390
function emitYieldExpression ( node : YieldExpression ) {
1385
- write ( node . asteriskToken ? "yield*" : "yield" ) ;
1391
+ write ( "yield" ) ;
1392
+ emit ( node . asteriskToken ) ;
1386
1393
emitExpressionWithPrefix ( " " , node . expression ) ;
1387
1394
}
1388
1395
@@ -1662,7 +1669,9 @@ namespace ts {
1662
1669
function emitFunctionDeclarationOrExpression ( node : FunctionDeclaration | FunctionExpression ) {
1663
1670
emitDecorators ( node , node . decorators ) ;
1664
1671
emitModifiers ( node , node . modifiers ) ;
1665
- write ( node . asteriskToken ? "function* " : "function " ) ;
1672
+ write ( "function" ) ;
1673
+ emitIfPresent ( node . asteriskToken ) ;
1674
+ write ( " " ) ;
1666
1675
emitIdentifierName ( node . name ) ;
1667
1676
emitSignatureAndBody ( node , emitSignatureHead ) ;
1668
1677
}
@@ -2068,9 +2077,7 @@ namespace ts {
2068
2077
function emitJsxExpression ( node : JsxExpression ) {
2069
2078
if ( node . expression ) {
2070
2079
write ( "{" ) ;
2071
- if ( node . dotDotDotToken ) {
2072
- write ( "..." ) ;
2073
- }
2080
+ emitIfPresent ( node . dotDotDotToken ) ;
2074
2081
emitExpression ( node . expression ) ;
2075
2082
write ( "}" ) ;
2076
2083
}
@@ -2128,13 +2135,12 @@ namespace ts {
2128
2135
emitTrailingCommentsOfPosition ( statements . pos ) ;
2129
2136
}
2130
2137
2138
+ let format = ListFormat . CaseOrDefaultClauseStatements ;
2131
2139
if ( emitAsSingleStatement ) {
2132
2140
write ( " " ) ;
2133
- emit ( statements [ 0 ] ) ;
2134
- }
2135
- else {
2136
- emitList ( parentNode , statements , ListFormat . CaseOrDefaultClauseStatements ) ;
2141
+ format &= ~ ( ListFormat . MultiLine | ListFormat . Indented ) ;
2137
2142
}
2143
+ emitList ( parentNode , statements , format ) ;
2138
2144
}
2139
2145
2140
2146
function emitHeritageClause ( node : HeritageClause ) {
@@ -2384,7 +2390,7 @@ namespace ts {
2384
2390
2385
2391
function emitParametersForArrow ( parentNode : FunctionTypeNode | ArrowFunction , parameters : NodeArray < ParameterDeclaration > ) {
2386
2392
if ( canEmitSimpleArrowHead ( parentNode , parameters ) ) {
2387
- emit ( parameters [ 0 ] ) ;
2393
+ emitList ( parentNode , parameters , ListFormat . Parameters & ~ ListFormat . Parenthesis ) ;
2388
2394
}
2389
2395
else {
2390
2396
emitParameters ( parentNode , parameters ) ;
@@ -2427,7 +2433,7 @@ namespace ts {
2427
2433
if ( format & ListFormat . MultiLine ) {
2428
2434
writeLine ( ) ;
2429
2435
}
2430
- else if ( format & ListFormat . SpaceBetweenBraces ) {
2436
+ else if ( format & ListFormat . SpaceBetweenBraces && ! ( format & ListFormat . NoSpaceIfEmpty ) ) {
2431
2437
write ( " " ) ;
2432
2438
}
2433
2439
}
@@ -2568,12 +2574,6 @@ namespace ts {
2568
2574
}
2569
2575
}
2570
2576
2571
- function writeIfPresent ( node : Node , text : string ) {
2572
- if ( node ) {
2573
- write ( text ) ;
2574
- }
2575
- }
2576
-
2577
2577
function writeToken ( token : SyntaxKind , pos : number , contextNode ?: Node ) {
2578
2578
return onEmitSourceMapOfToken
2579
2579
? onEmitSourceMapOfToken ( contextNode , token , pos , writeTokenText )
@@ -2584,7 +2584,7 @@ namespace ts {
2584
2584
if ( onBeforeEmitToken ) {
2585
2585
onBeforeEmitToken ( node ) ;
2586
2586
}
2587
- writeTokenText ( node . kind ) ;
2587
+ write ( tokenToString ( node . kind ) ) ;
2588
2588
if ( onAfterEmitToken ) {
2589
2589
onAfterEmitToken ( node ) ;
2590
2590
}
@@ -3107,6 +3107,9 @@ namespace ts {
3107
3107
NoTrailingNewLine = 1 << 16 , // Do not emit a trailing NewLine for a MultiLine list.
3108
3108
NoInterveningComments = 1 << 17 , // Do not emit comments between each node
3109
3109
3110
+ NoSpaceIfEmpty = 1 << 18 , // If the literal is empty, do not add spaces between braces.
3111
+ SingleElement = 1 << 19 ,
3112
+
3110
3113
// Precomputed Formats
3111
3114
Modifiers = SingleLine | SpaceBetweenSiblings | NoInterveningComments ,
3112
3115
HeritageClauses = SingleLine | SpaceBetweenSiblings ,
@@ -3118,7 +3121,7 @@ namespace ts {
3118
3121
IntersectionTypeConstituents = AmpersandDelimited | SpaceBetweenSiblings | SingleLine ,
3119
3122
ObjectBindingPatternElements = SingleLine | AllowTrailingComma | SpaceBetweenBraces | CommaDelimited | SpaceBetweenSiblings ,
3120
3123
ArrayBindingPatternElements = SingleLine | AllowTrailingComma | CommaDelimited | SpaceBetweenSiblings ,
3121
- ObjectLiteralExpressionProperties = PreserveLines | CommaDelimited | SpaceBetweenSiblings | SpaceBetweenBraces | Indented | Braces ,
3124
+ ObjectLiteralExpressionProperties = PreserveLines | CommaDelimited | SpaceBetweenSiblings | SpaceBetweenBraces | Indented | Braces | NoSpaceIfEmpty ,
3122
3125
ArrayLiteralExpressionElements = PreserveLines | CommaDelimited | SpaceBetweenSiblings | AllowTrailingComma | Indented | SquareBrackets ,
3123
3126
CommaListElements = CommaDelimited | SpaceBetweenSiblings | SingleLine ,
3124
3127
CallExpressionArguments = CommaDelimited | SpaceBetweenSiblings | SingleLine | Parenthesis ,
0 commit comments