MCPcopy Create free account
hub / github.com/microsoft/typescript-go / parseCallExpressionRest

Method parseCallExpressionRest

internal/parser/parser.go:5463–5497  ·  view source on GitHub ↗
(pos int, expression *ast.Expression)

Source from the content-addressed store, hash-verified

5461}
5462
5463func (p *Parser) parseCallExpressionRest(pos int, expression *ast.Expression) *ast.Expression {
5464 for {
5465 expression = p.parseMemberExpressionRest(pos, expression /*allowOptionalChain*/, true)
5466 var typeArguments *ast.NodeList
5467 questionDotToken := p.parseOptionalToken(ast.KindQuestionDotToken)
5468 if questionDotToken != nil {
5469 typeArguments = p.tryParseTypeArgumentsInExpression()
5470 if p.isTemplateStartOfTaggedTemplate() {
5471 expression = p.parseTaggedTemplateRest(pos, expression, questionDotToken, typeArguments)
5472 continue
5473 }
5474 }
5475 if typeArguments != nil || p.token == ast.KindOpenParenToken {
5476 // Absorb type arguments into CallExpression when preceding expression is ExpressionWithTypeArguments
5477 if questionDotToken == nil && expression.Kind == ast.KindExpressionWithTypeArguments {
5478 typeArguments = expression.TypeArgumentList()
5479 expression = expression.AsExpressionWithTypeArguments().Expression
5480 }
5481 inner := expression
5482 argumentList := p.parseArgumentList()
5483 isOptionalChain := questionDotToken != nil || p.tryReparseOptionalChain(expression)
5484 expression = p.checkJSSyntax(p.finishNode(p.factory.NewCallExpression(expression, questionDotToken, typeArguments, argumentList, core.IfElse(isOptionalChain, ast.NodeFlagsOptionalChain, ast.NodeFlagsNone)), pos))
5485 p.unparseExpressionWithTypeArguments(inner, typeArguments, expression)
5486 continue
5487 }
5488 if questionDotToken != nil {
5489 // We parsed `?.` but then failed to parse anything, so report a missing identifier here.
5490 p.parseErrorAtCurrentToken(diagnostics.Identifier_expected)
5491 name := p.createMissingIdentifier()
5492 expression = p.finishNode(p.factory.NewPropertyAccessExpression(expression, questionDotToken, name, ast.NodeFlagsOptionalChain), pos)
5493 }
5494 break
5495 }
5496 return expression
5497}
5498
5499func (p *Parser) parseArgumentList() *ast.NodeList {
5500 p.parseExpected(ast.KindOpenParenToken)

Tested by

no test coverage detected