(asyncToken?: KeywordToken)
| 306 | |
| 307 | // for_stmt: [async] 'for' exprlist 'in' testlist suite ['else' suite] |
| 308 | private _parseForStatement(asyncToken?: KeywordToken): ForNode { |
| 309 | let forToken = this._getKeywordToken(KeywordType.For); |
| 310 | |
| 311 | let exprListResult = this._parseExpressionList(true); |
| 312 | let targetExpr = this._makeExpressionOrTuple(exprListResult); |
| 313 | let seqExpr: ExpressionNode; |
| 314 | let forSuite: SuiteNode; |
| 315 | let elseSuite: SuiteNode | undefined; |
| 316 | |
| 317 | if (!this._consumeTokenIfKeyword(KeywordType.In)) { |
| 318 | seqExpr = this._handleExpressionParseError('Expected "in"'); |
| 319 | forSuite = new SuiteNode(this._peekToken()); |
| 320 | } else { |
| 321 | seqExpr = this._parseTestListAsExpression('Expected expression after "in"'); |
| 322 | forSuite = this._parseLoopSuite(); |
| 323 | |
| 324 | if (this._consumeTokenIfKeyword(KeywordType.Else)) { |
| 325 | elseSuite = this._parseSuite(); |
| 326 | } |
| 327 | } |
| 328 | |
| 329 | let forNode = new ForNode(forToken, targetExpr, seqExpr, forSuite); |
| 330 | forNode.elseSuite = elseSuite; |
| 331 | forNode.extend(elseSuite); |
| 332 | |
| 333 | if (asyncToken) { |
| 334 | forNode.isAsync = true; |
| 335 | forNode.extend(asyncToken); |
| 336 | } |
| 337 | |
| 338 | return forNode; |
| 339 | } |
| 340 | |
| 341 | // comp_iter: comp_for | comp_if |
| 342 | private _tryParseListComprehension<T extends ParseNode>(target: T): ListComprehensionNode<T> | undefined { |
no test coverage detected