()
| 2092 | // augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | |
| 2093 | // '<<=' | '>>=' | '**=' | '//=') |
| 2094 | private _parseExpressionStatement(): ExpressionNode { |
| 2095 | let leftExpr = this._parseTestOrStarListAsExpression(); |
| 2096 | let annotationExpr: TypeAnnotationExpression | undefined; |
| 2097 | |
| 2098 | if (leftExpr instanceof ErrorExpressionNode) { |
| 2099 | return leftExpr; |
| 2100 | } |
| 2101 | |
| 2102 | // Is this a type annotation assignment? |
| 2103 | if (this._consumeTokenIfType(TokenType.Colon)) { |
| 2104 | annotationExpr = this._parseTypeAnnotation(this._parseTestExpression()); |
| 2105 | leftExpr = new TypeAnnotationExpressionNode(leftExpr, annotationExpr); |
| 2106 | |
| 2107 | if (!this._consumeTokenIfOperator(OperatorType.Assign)) { |
| 2108 | return leftExpr; |
| 2109 | } |
| 2110 | |
| 2111 | if (!this._parseOptions.isStubFile && this._getLanguageVersion() < PythonVersion.V36) { |
| 2112 | this._addError('Type annotations for variables requires Python 3.6 or newer', |
| 2113 | annotationExpr.rawExpression); |
| 2114 | } |
| 2115 | |
| 2116 | let rightExpr = this._parseTestExpression(); |
| 2117 | return new AssignmentNode(leftExpr, rightExpr); |
| 2118 | } |
| 2119 | |
| 2120 | // Is this a simple assignment? |
| 2121 | if (this._consumeTokenIfOperator(OperatorType.Assign)) { |
| 2122 | return this._parseChainAssignments(leftExpr); |
| 2123 | } |
| 2124 | |
| 2125 | if (!annotationExpr && Tokenizer.isOperatorAssignment(this._peekOperatorType())) { |
| 2126 | let operatorToken = this._getNextToken() as OperatorToken; |
| 2127 | |
| 2128 | // Is the left side of the assignment assignable? |
| 2129 | const assignError = leftExpr.getAssignmentError(); |
| 2130 | if (assignError) { |
| 2131 | this._addError(assignError, leftExpr); |
| 2132 | } |
| 2133 | |
| 2134 | let rightExpr = this._tryParseYieldExpression() || |
| 2135 | this._parseTestListAsExpression('Expected expression to the right of operator'); |
| 2136 | return new AugmentedAssignemtnExpressionNode(leftExpr, rightExpr, operatorToken.operatorType); |
| 2137 | } |
| 2138 | |
| 2139 | return leftExpr; |
| 2140 | } |
| 2141 | |
| 2142 | private _parseChainAssignments(leftExpr: ExpressionNode): ExpressionNode { |
| 2143 | // Is the left side of the assignment assignable? |
no test coverage detected