MCPcopy
hub / github.com/microsoft/pyright / _parseExpressionStatement

Method _parseExpressionStatement

server/src/parser/parser.ts:2094–2140  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

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?

Callers 1

_parseSmallStatementMethod · 0.95

Calls 14

_consumeTokenIfTypeMethod · 0.95
_parseTypeAnnotationMethod · 0.95
_parseTestExpressionMethod · 0.95
_getLanguageVersionMethod · 0.95
_addErrorMethod · 0.95
_peekOperatorTypeMethod · 0.95
_getNextTokenMethod · 0.95

Tested by

no test coverage detected