(pos, expression, allowOptionalChain)
| 35514 | return finishNode(indexedAccess, pos); |
| 35515 | } |
| 35516 | function parseMemberExpressionRest(pos, expression, allowOptionalChain) { |
| 35517 | while (true) { |
| 35518 | var questionDotToken = void 0; |
| 35519 | var isPropertyAccess = false; |
| 35520 | if (allowOptionalChain && isStartOfOptionalPropertyOrElementAccessChain()) { |
| 35521 | questionDotToken = parseExpectedToken(28 /* SyntaxKind.QuestionDotToken */); |
| 35522 | isPropertyAccess = ts.tokenIsIdentifierOrKeyword(token()); |
| 35523 | } |
| 35524 | else { |
| 35525 | isPropertyAccess = parseOptional(24 /* SyntaxKind.DotToken */); |
| 35526 | } |
| 35527 | if (isPropertyAccess) { |
| 35528 | expression = parsePropertyAccessExpressionRest(pos, expression, questionDotToken); |
| 35529 | continue; |
| 35530 | } |
| 35531 | // when in the [Decorator] context, we do not parse ElementAccess as it could be part of a ComputedPropertyName |
| 35532 | if ((questionDotToken || !inDecoratorContext()) && parseOptional(22 /* SyntaxKind.OpenBracketToken */)) { |
| 35533 | expression = parseElementAccessExpressionRest(pos, expression, questionDotToken); |
| 35534 | continue; |
| 35535 | } |
| 35536 | if (isTemplateStartOfTaggedTemplate()) { |
| 35537 | // Absorb type arguments into TemplateExpression when preceding expression is ExpressionWithTypeArguments |
| 35538 | expression = !questionDotToken && expression.kind === 228 /* SyntaxKind.ExpressionWithTypeArguments */ ? |
| 35539 | parseTaggedTemplateRest(pos, expression.expression, questionDotToken, expression.typeArguments) : |
| 35540 | parseTaggedTemplateRest(pos, expression, questionDotToken, /*typeArguments*/ undefined); |
| 35541 | continue; |
| 35542 | } |
| 35543 | if (!questionDotToken) { |
| 35544 | if (token() === 53 /* SyntaxKind.ExclamationToken */ && !scanner.hasPrecedingLineBreak()) { |
| 35545 | nextToken(); |
| 35546 | expression = finishNode(factory.createNonNullExpression(expression), pos); |
| 35547 | continue; |
| 35548 | } |
| 35549 | var typeArguments = tryParse(parseTypeArgumentsInExpression); |
| 35550 | if (typeArguments) { |
| 35551 | expression = finishNode(factory.createExpressionWithTypeArguments(expression, typeArguments), pos); |
| 35552 | continue; |
| 35553 | } |
| 35554 | } |
| 35555 | return expression; |
| 35556 | } |
| 35557 | } |
| 35558 | function isTemplateStartOfTaggedTemplate() { |
| 35559 | return token() === 14 /* SyntaxKind.NoSubstitutionTemplateLiteral */ || token() === 15 /* SyntaxKind.TemplateHead */; |
| 35560 | } |
no test coverage detected
searching dependent graphs…