@@ -4685,12 +4685,20 @@ namespace ts {
4685
4685
&& lookAhead ( nextTokenIsIdentifierOrKeywordOrOpenBracketOrTemplate ) ;
4686
4686
}
4687
4687
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
+
4688
4696
function parsePropertyAccessExpressionRest ( expression : LeftHandSideExpression , questionDotToken : QuestionDotToken | undefined ) {
4689
4697
const propertyAccess = < PropertyAccessExpression > createNode ( SyntaxKind . PropertyAccessExpression , expression . pos ) ;
4690
4698
propertyAccess . expression = expression ;
4691
4699
propertyAccess . questionDotToken = questionDotToken ;
4692
4700
propertyAccess . name = parseRightSideOfDot ( /*allowIdentifierNames*/ true , /*allowPrivateIdentifiers*/ true ) ;
4693
- if ( questionDotToken || expression . flags & NodeFlags . OptionalChain ) {
4701
+ if ( questionDotToken || hasOptionalChain ( expression ) ) {
4694
4702
propertyAccess . flags |= NodeFlags . OptionalChain ;
4695
4703
if ( isPrivateIdentifier ( propertyAccess . name ) ) {
4696
4704
parseErrorAtRange ( propertyAccess . name , Diagnostics . An_optional_chain_cannot_contain_private_identifiers ) ;
@@ -4716,7 +4724,7 @@ namespace ts {
4716
4724
}
4717
4725
4718
4726
parseExpected ( SyntaxKind . CloseBracketToken ) ;
4719
- if ( questionDotToken || expression . flags & NodeFlags . OptionalChain ) {
4727
+ if ( questionDotToken || hasOptionalChain ( expression ) ) {
4720
4728
indexedAccess . flags |= NodeFlags . OptionalChain ;
4721
4729
}
4722
4730
return finishNode ( indexedAccess ) ;
@@ -4803,7 +4811,7 @@ namespace ts {
4803
4811
callExpr . questionDotToken = questionDotToken ;
4804
4812
callExpr . typeArguments = typeArguments ;
4805
4813
callExpr . arguments = parseArgumentList ( ) ;
4806
- if ( questionDotToken || expression . flags & NodeFlags . OptionalChain ) {
4814
+ if ( questionDotToken || hasOptionalChain ( expression ) ) {
4807
4815
callExpr . flags |= NodeFlags . OptionalChain ;
4808
4816
}
4809
4817
expression = finishNode ( callExpr ) ;
@@ -4815,7 +4823,7 @@ namespace ts {
4815
4823
callExpr . expression = expression ;
4816
4824
callExpr . questionDotToken = questionDotToken ;
4817
4825
callExpr . arguments = parseArgumentList ( ) ;
4818
- if ( questionDotToken || expression . flags & NodeFlags . OptionalChain ) {
4826
+ if ( questionDotToken || hasOptionalChain ( expression ) ) {
4819
4827
callExpr . flags |= NodeFlags . OptionalChain ;
4820
4828
}
4821
4829
expression = finishNode ( callExpr ) ;
0 commit comments