@@ -20,11 +20,15 @@ namespace ts {
2020 return node ;
2121 }
2222 switch ( node . kind ) {
23+ case SyntaxKind . CallExpression : {
24+ const updated = visitNonOptionalCallExpression ( node as CallExpression , /*captureThisArg*/ false ) ;
25+ Debug . assertNotNode ( updated , isSyntheticReference ) ;
26+ return updated ;
27+ }
2328 case SyntaxKind . PropertyAccessExpression :
2429 case SyntaxKind . ElementAccessExpression :
25- case SyntaxKind . CallExpression :
26- if ( node . flags & NodeFlags . OptionalChain ) {
27- const updated = visitOptionalExpression ( node as OptionalChain , /*captureThisArg*/ false , /*isDelete*/ false ) ;
30+ if ( isOptionalChain ( node ) ) {
31+ const updated = visitOptionalExpression ( node , /*captureThisArg*/ false , /*isDelete*/ false ) ;
2832 Debug . assertNotNode ( updated , isSyntheticReference ) ;
2933 return updated ;
3034 }
@@ -91,6 +95,15 @@ namespace ts {
9195 // If `node` is an optional chain, then it is the outermost chain of an optional expression.
9296 return visitOptionalExpression ( node , captureThisArg , /*isDelete*/ false ) ;
9397 }
98+ if ( isOptionalChain ( skipParentheses ( node . expression ) ) ) {
99+ // capture thisArg for calls of parenthesized optional chains like `(foo?.bar)()`
100+ const expression = visitNonOptionalParenthesizedExpression ( node . expression as ParenthesizedExpression , /*captureThisArg*/ true , /*isDelete*/ false ) ;
101+ const args = visitNodes ( node . arguments , visitor , isExpression ) ;
102+ if ( isSyntheticReference ( expression ) ) {
103+ return createFunctionCall ( expression . expression , expression . thisArg , args , node ) ;
104+ }
105+ return updateCall ( node , expression , /*typeArguments*/ undefined , args ) ;
106+ }
94107 return visitEachChild ( node , visitor , context ) ;
95108 }
96109
0 commit comments