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