@@ -4685,12 +4685,20 @@ namespace ts {
46854685 && lookAhead ( nextTokenIsIdentifierOrKeywordOrOpenBracketOrTemplate ) ;
46864686 }
46874687
4688+ function hasOptionalChain ( node : Node ) {
4689+ while ( true ) {
4690+ if ( node . flags & NodeFlags . OptionalChain ) return true ;
4691+ if ( ! isNonNullExpression ( node ) ) return false ;
4692+ node = node . expression ;
4693+ }
4694+ }
4695+
46884696 function parsePropertyAccessExpressionRest ( expression : LeftHandSideExpression , questionDotToken : QuestionDotToken | undefined ) {
46894697 const propertyAccess = < PropertyAccessExpression > createNode ( SyntaxKind . PropertyAccessExpression , expression . pos ) ;
46904698 propertyAccess . expression = expression ;
46914699 propertyAccess . questionDotToken = questionDotToken ;
46924700 propertyAccess . name = parseRightSideOfDot ( /*allowIdentifierNames*/ true , /*allowPrivateIdentifiers*/ true ) ;
4693- if ( questionDotToken || expression . flags & NodeFlags . OptionalChain ) {
4701+ if ( questionDotToken || hasOptionalChain ( expression ) ) {
46944702 propertyAccess . flags |= NodeFlags . OptionalChain ;
46954703 if ( isPrivateIdentifier ( propertyAccess . name ) ) {
46964704 parseErrorAtRange ( propertyAccess . name , Diagnostics . An_optional_chain_cannot_contain_private_identifiers ) ;
@@ -4716,7 +4724,7 @@ namespace ts {
47164724 }
47174725
47184726 parseExpected ( SyntaxKind . CloseBracketToken ) ;
4719- if ( questionDotToken || expression . flags & NodeFlags . OptionalChain ) {
4727+ if ( questionDotToken || hasOptionalChain ( expression ) ) {
47204728 indexedAccess . flags |= NodeFlags . OptionalChain ;
47214729 }
47224730 return finishNode ( indexedAccess ) ;
@@ -4803,7 +4811,7 @@ namespace ts {
48034811 callExpr . questionDotToken = questionDotToken ;
48044812 callExpr . typeArguments = typeArguments ;
48054813 callExpr . arguments = parseArgumentList ( ) ;
4806- if ( questionDotToken || expression . flags & NodeFlags . OptionalChain ) {
4814+ if ( questionDotToken || hasOptionalChain ( expression ) ) {
48074815 callExpr . flags |= NodeFlags . OptionalChain ;
48084816 }
48094817 expression = finishNode ( callExpr ) ;
@@ -4815,7 +4823,7 @@ namespace ts {
48154823 callExpr . expression = expression ;
48164824 callExpr . questionDotToken = questionDotToken ;
48174825 callExpr . arguments = parseArgumentList ( ) ;
4818- if ( questionDotToken || expression . flags & NodeFlags . OptionalChain ) {
4826+ if ( questionDotToken || hasOptionalChain ( expression ) ) {
48194827 callExpr . flags |= NodeFlags . OptionalChain ;
48204828 }
48214829 expression = finishNode ( callExpr ) ;
0 commit comments