()
| 1574 | // atom_expr: ['await'] atom trailer* |
| 1575 | // trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME |
| 1576 | private _parseAtomExpression(): ExpressionNode { |
| 1577 | let awaitToken: KeywordToken | undefined; |
| 1578 | if (this._peekKeywordType() === KeywordType.Await) { |
| 1579 | awaitToken = this._getKeywordToken(KeywordType.Await); |
| 1580 | if (this._getLanguageVersion() < PythonVersion.V35) { |
| 1581 | this._addError( |
| 1582 | `Support for 'await' keyword requires Python 3.5 or newer`, |
| 1583 | awaitToken); |
| 1584 | } |
| 1585 | } |
| 1586 | |
| 1587 | let atomExpression = this._parseAtom(); |
| 1588 | if (atomExpression instanceof ErrorExpressionNode) { |
| 1589 | return atomExpression; |
| 1590 | } |
| 1591 | |
| 1592 | // Consume trailers. |
| 1593 | while (true) { |
| 1594 | // Is it a function call? |
| 1595 | if (this._consumeTokenIfType(TokenType.OpenParenthesis)) { |
| 1596 | let argList = this._parseArgList(); |
| 1597 | let callNode = new CallExpressionNode(atomExpression); |
| 1598 | callNode.arguments = argList; |
| 1599 | callNode.extend(argList); |
| 1600 | |
| 1601 | let nextToken = this._peekToken(); |
| 1602 | if (!this._consumeTokenIfType(TokenType.CloseParenthesis)) { |
| 1603 | return this._handleExpressionParseError('Expected ")"'); |
| 1604 | } else { |
| 1605 | callNode.extend(nextToken); |
| 1606 | } |
| 1607 | |
| 1608 | atomExpression = callNode; |
| 1609 | } else if (this._consumeTokenIfType(TokenType.OpenBracket)) { |
| 1610 | // Is it an index operator? |
| 1611 | let indexExpr = this._parseSubscriptList(); |
| 1612 | let indexNode = new IndexExpressionNode(atomExpression, indexExpr); |
| 1613 | indexNode.extend(indexNode); |
| 1614 | |
| 1615 | let nextToken = this._peekToken(); |
| 1616 | if (!this._consumeTokenIfType(TokenType.CloseBracket)) { |
| 1617 | return this._handleExpressionParseError('Expected "]"'); |
| 1618 | } else { |
| 1619 | indexNode.extend(nextToken); |
| 1620 | } |
| 1621 | |
| 1622 | atomExpression = indexNode; |
| 1623 | } else if (this._consumeTokenIfType(TokenType.Dot)) { |
| 1624 | // Is it a member access? |
| 1625 | let memberName = this._getTokenIfIdentifier(); |
| 1626 | if (!memberName) { |
| 1627 | return this._handleExpressionParseError('Expected member name after "."'); |
| 1628 | } |
| 1629 | atomExpression = new MemberAccessExpressionNode( |
| 1630 | atomExpression, new NameNode(memberName)); |
| 1631 | } else { |
| 1632 | break; |
| 1633 | } |
no test coverage detected