@@ -909,6 +909,9 @@ namespace ts {
909
909
let currentParenthesizerRule : ( ( node : Node ) => Node ) | undefined ;
910
910
const { enter : enterComment , exit : exitComment } = performance . createTimerIf ( extendedDiagnostics , "commentTime" , "beforeComment" , "afterComment" ) ;
911
911
const parenthesizer = factory . parenthesizer ;
912
+ const typeArgumentParenthesizerRuleSelector : OrdinalParentheizerRuleSelector < Node > = {
913
+ select : index => index === 0 ? parenthesizer . parenthesizeLeadingTypeArgument : undefined
914
+ } ;
912
915
const emitBinaryExpression = createEmitBinaryExpression ( ) ;
913
916
914
917
reset ( ) ;
@@ -2241,7 +2244,7 @@ namespace ts {
2241
2244
}
2242
2245
2243
2246
function emitArrayType ( node : ArrayTypeNode ) {
2244
- emit ( node . elementType , parenthesizer . parenthesizeElementTypeOfArrayType ) ;
2247
+ emit ( node . elementType , parenthesizer . parenthesizeNonArrayTypeOfPostfixType ) ;
2245
2248
writePunctuation ( "[" ) ;
2246
2249
writePunctuation ( "]" ) ;
2247
2250
}
@@ -2254,7 +2257,7 @@ namespace ts {
2254
2257
function emitTupleType ( node : TupleTypeNode ) {
2255
2258
emitTokenWithComment ( SyntaxKind . OpenBracketToken , node . pos , writePunctuation , node ) ;
2256
2259
const flags = getEmitFlags ( node ) & EmitFlags . SingleLine ? ListFormat . SingleLineTupleTypeElements : ListFormat . MultiLineTupleTypeElements ;
2257
- emitList ( node , node . elements , flags | ListFormat . NoSpaceIfEmpty ) ;
2260
+ emitList ( node , node . elements , flags | ListFormat . NoSpaceIfEmpty , parenthesizer . parenthesizeElementTypeOfTupleType ) ;
2258
2261
emitTokenWithComment ( SyntaxKind . CloseBracketToken , node . elements . end , writePunctuation , node ) ;
2259
2262
}
2260
2263
@@ -2268,24 +2271,24 @@ namespace ts {
2268
2271
}
2269
2272
2270
2273
function emitOptionalType ( node : OptionalTypeNode ) {
2271
- emit ( node . type , parenthesizer . parenthesizeElementTypeOfArrayType ) ;
2274
+ emit ( node . type , parenthesizer . parenthesizeTypeOfOptionalType ) ;
2272
2275
writePunctuation ( "?" ) ;
2273
2276
}
2274
2277
2275
2278
function emitUnionType ( node : UnionTypeNode ) {
2276
- emitList ( node , node . types , ListFormat . UnionTypeConstituents , parenthesizer . parenthesizeMemberOfElementType ) ;
2279
+ emitList ( node , node . types , ListFormat . UnionTypeConstituents , parenthesizer . parenthesizeConstituentTypeOfUnionType ) ;
2277
2280
}
2278
2281
2279
2282
function emitIntersectionType ( node : IntersectionTypeNode ) {
2280
- emitList ( node , node . types , ListFormat . IntersectionTypeConstituents , parenthesizer . parenthesizeMemberOfElementType ) ;
2283
+ emitList ( node , node . types , ListFormat . IntersectionTypeConstituents , parenthesizer . parenthesizeConstituentTypeOfIntersectionType ) ;
2281
2284
}
2282
2285
2283
2286
function emitConditionalType ( node : ConditionalTypeNode ) {
2284
- emit ( node . checkType , parenthesizer . parenthesizeMemberOfConditionalType ) ;
2287
+ emit ( node . checkType , parenthesizer . parenthesizeCheckTypeOfConditionalType ) ;
2285
2288
writeSpace ( ) ;
2286
2289
writeKeyword ( "extends" ) ;
2287
2290
writeSpace ( ) ;
2288
- emit ( node . extendsType , parenthesizer . parenthesizeMemberOfConditionalType ) ;
2291
+ emit ( node . extendsType , parenthesizer . parenthesizeExtendsTypeOfConditionalType ) ;
2289
2292
writeSpace ( ) ;
2290
2293
writePunctuation ( "?" ) ;
2291
2294
writeSpace ( ) ;
@@ -2315,11 +2318,15 @@ namespace ts {
2315
2318
function emitTypeOperator ( node : TypeOperatorNode ) {
2316
2319
writeTokenText ( node . operator , writeKeyword ) ;
2317
2320
writeSpace ( ) ;
2318
- emit ( node . type , parenthesizer . parenthesizeMemberOfElementType ) ;
2321
+
2322
+ const parenthesizerRule = node . operator === SyntaxKind . ReadonlyKeyword ?
2323
+ parenthesizer . parenthesizeOperandOfReadonlyTypeOperator :
2324
+ parenthesizer . parenthesizeOperandOfTypeOperator ;
2325
+ emit ( node . type , parenthesizerRule ) ;
2319
2326
}
2320
2327
2321
2328
function emitIndexedAccessType ( node : IndexedAccessTypeNode ) {
2322
- emit ( node . objectType , parenthesizer . parenthesizeMemberOfElementType ) ;
2329
+ emit ( node . objectType , parenthesizer . parenthesizeNonArrayTypeOfPostfixType ) ;
2323
2330
writePunctuation ( "[" ) ;
2324
2331
emit ( node . indexType ) ;
2325
2332
writePunctuation ( "]" ) ;
@@ -4256,7 +4263,7 @@ namespace ts {
4256
4263
}
4257
4264
4258
4265
function emitTypeArguments ( parentNode : Node , typeArguments : NodeArray < TypeNode > | undefined ) {
4259
- emitList ( parentNode , typeArguments , ListFormat . TypeArguments , parenthesizer . parenthesizeMemberOfElementType ) ;
4266
+ emitList ( parentNode , typeArguments , ListFormat . TypeArguments , typeArgumentParenthesizerRuleSelector ) ;
4260
4267
}
4261
4268
4262
4269
function emitTypeParameters ( parentNode : SignatureDeclaration | InterfaceDeclaration | TypeAliasDeclaration | ClassDeclaration | ClassExpression , typeParameters : NodeArray < TypeParameterDeclaration > | undefined ) {
@@ -4324,15 +4331,15 @@ namespace ts {
4324
4331
}
4325
4332
}
4326
4333
4327
- function emitList ( parentNode : Node | undefined , children : NodeArray < Node > | undefined , format : ListFormat , parenthesizerRule ?: ( node : Node ) => Node , start ?: number , count ?: number ) {
4334
+ function emitList ( parentNode : Node | undefined , children : NodeArray < Node > | undefined , format : ListFormat , parenthesizerRule ?: ParenthesizerRuleOrSelector < Node > , start ?: number , count ?: number ) {
4328
4335
emitNodeList ( emit , parentNode , children , format , parenthesizerRule , start , count ) ;
4329
4336
}
4330
4337
4331
- function emitExpressionList ( parentNode : Node | undefined , children : NodeArray < Node > | undefined , format : ListFormat , parenthesizerRule ?: ( node : Expression ) => Expression , start ?: number , count ?: number ) {
4338
+ function emitExpressionList ( parentNode : Node | undefined , children : NodeArray < Node > | undefined , format : ListFormat , parenthesizerRule ?: ParenthesizerRuleOrSelector < Expression > , start ?: number , count ?: number ) {
4332
4339
emitNodeList ( emitExpression , parentNode , children , format , parenthesizerRule , start , count ) ;
4333
4340
}
4334
4341
4335
- function emitNodeList ( emit : ( node : Node , parenthesizerRule ?: ( ( node : Node ) => Node ) | undefined ) => void , parentNode : Node | undefined , children : NodeArray < Node > | undefined , format : ListFormat , parenthesizerRule : ( ( node : Node ) => Node ) | undefined , start = 0 , count = children ? children . length - start : 0 ) {
4342
+ function emitNodeList ( emit : ( node : Node , parenthesizerRule ?: ( ( node : Node ) => Node ) | undefined ) => void , parentNode : Node | undefined , children : NodeArray < Node > | undefined , format : ListFormat , parenthesizerRule : ParenthesizerRuleOrSelector < Node > | undefined , start = 0 , count = children ? children . length - start : 0 ) {
4336
4343
const isUndefined = children === undefined ;
4337
4344
if ( isUndefined && format & ListFormat . OptionalIfUndefined ) {
4338
4345
return ;
@@ -4388,6 +4395,8 @@ namespace ts {
4388
4395
increaseIndent ( ) ;
4389
4396
}
4390
4397
4398
+ const emitListItem = getEmitListItem ( emit , parenthesizerRule ) ;
4399
+
4391
4400
// Emit each child.
4392
4401
let previousSibling : Node | undefined ;
4393
4402
let previousSourceFileTextKind : ReturnType < typeof recordBundleFileInternalSectionStart > ;
@@ -4443,12 +4452,7 @@ namespace ts {
4443
4452
}
4444
4453
4445
4454
nextListElementPos = child . pos ;
4446
- if ( emit . length === 1 ) {
4447
- emit ( child ) ;
4448
- }
4449
- else {
4450
- emit ( child , parenthesizerRule ) ;
4451
- }
4455
+ emitListItem ( child , emit , parenthesizerRule , i ) ;
4452
4456
4453
4457
if ( shouldDecreaseIndentAfterEmit ) {
4454
4458
decreaseIndent ( ) ;
@@ -5890,4 +5894,30 @@ namespace ts {
5890
5894
CountMask = 0x0FFFFFFF , // Temp variable counter
5891
5895
_i = 0x10000000 , // Use/preference flag for '_i'
5892
5896
}
5897
+
5898
+ interface OrdinalParentheizerRuleSelector < T extends Node > {
5899
+ select ( index : number ) : ( ( node : T ) => T ) | undefined ;
5900
+ }
5901
+
5902
+ type ParenthesizerRule < T extends Node > = ( node : T ) => T ;
5903
+
5904
+ type ParenthesizerRuleOrSelector < T extends Node > = OrdinalParentheizerRuleSelector < T > | ParenthesizerRule < T > ;
5905
+
5906
+ function emitListItemNoParenthesizer ( node : Node , emit : ( node : Node , parenthesizerRule ?: ( ( node : Node ) => Node ) | undefined ) => void , _parenthesizerRule : ParenthesizerRuleOrSelector < Node > | undefined , _index : number ) {
5907
+ emit ( node ) ;
5908
+ }
5909
+
5910
+ function emitListItemWithParenthesizerRuleSelector ( node : Node , emit : ( node : Node , parenthesizerRule ?: ( ( node : Node ) => Node ) | undefined ) => void , parenthesizerRuleSelector : OrdinalParentheizerRuleSelector < Node > , index : number ) {
5911
+ emit ( node , parenthesizerRuleSelector . select ( index ) ) ;
5912
+ }
5913
+
5914
+ function emitListItemWithParenthesizerRule ( node : Node , emit : ( node : Node , parenthesizerRule ?: ( ( node : Node ) => Node ) | undefined ) => void , parenthesizerRule : ParenthesizerRule < Node > | undefined , _index : number ) {
5915
+ emit ( node , parenthesizerRule ) ;
5916
+ }
5917
+
5918
+ function getEmitListItem < T extends Node , R extends ParenthesizerRuleOrSelector < T > | undefined > ( emit : ( node : Node , parenthesizerRule ?: ( ( node : Node ) => Node ) | undefined ) => void , parenthesizerRule : R ) : ( node : Node , emit : ( node : Node , parenthesizerRule ?: ( ( node : Node ) => Node ) | undefined ) => void , parenthesizerRule : R , index : number ) => void {
5919
+ return emit . length === 1 ? emitListItemNoParenthesizer :
5920
+ typeof parenthesizerRule === "object" ? emitListItemWithParenthesizerRuleSelector :
5921
+ emitListItemWithParenthesizerRule ;
5922
+ }
5893
5923
}
0 commit comments