Skip to content

Commit bcde5a4

Browse files
SONARPY-931 Fix parse error: assignment expression within subscription (#997)
1 parent 8a6a4a7 commit bcde5a4

File tree

3 files changed

+8
-2
lines changed

3 files changed

+8
-2
lines changed

python-frontend/src/main/java/org/sonar/python/api/PythonGrammar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ public static void grammar(LexerfulGrammarBuilder b) {
286286
b.rule(SUBSCRIPTLIST).is(SUBSCRIPT, b.zeroOrMore(",", SUBSCRIPT), b.optional(","));
287287
b.rule(SUBSCRIPT).is(b.firstOf(
288288
b.sequence(b.optional(TEST), ":", b.optional(TEST), b.optional(SLICEOP)),
289-
TEST));
289+
NAMED_EXPR_TEST));
290290
b.rule(SLICEOP).is(":", b.optional(TEST));
291291
b.rule(EXPRLIST).is(b.firstOf(EXPR, STAR_EXPR), b.zeroOrMore(",", b.firstOf(EXPR, STAR_EXPR)), b.optional(","));
292292
b.rule(TESTLIST).is(TEST, b.zeroOrMore(",", TEST), b.optional(","));

python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMaker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1336,7 +1336,7 @@ private Expression subscriptionOrSlicing(Expression expr, Token leftBracket, Ast
13361336
for (AstNode subscript : subscriptList.getChildren(PythonGrammar.SUBSCRIPT)) {
13371337
AstNode colon = subscript.getFirstChild(PythonPunctuator.COLON);
13381338
if (colon == null) {
1339-
slices.add(expression(subscript.getFirstChild(PythonGrammar.TEST)));
1339+
slices.add(expression(subscript.getFirstChild(PythonGrammar.NAMED_EXPR_TEST)));
13401340
} else {
13411341
slices.add(sliceItem(subscript));
13421342
}

python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,12 @@ public void subscription_expressions() {
17521752
assertThat(subscripts.children().get(1)).isSameAs(subscripts.commas().get(0));
17531753
assertThat(subscripts.expressions()).extracting(Tree::getKind)
17541754
.containsExactly(Tree.Kind.NAME, Tree.Kind.NUMERIC_LITERAL);
1755+
1756+
SubscriptionExpression subscriptionExpression = (SubscriptionExpression) parse("a[b:=1]", treeMaker::expression);
1757+
assertThat(subscriptionExpression.subscripts().expressions()).hasSize(1);
1758+
AssignmentExpression assignmentExpression = ((AssignmentExpression) subscriptionExpression.subscripts().expressions().get(0));
1759+
assertThat(assignmentExpression.lhsName().name()).isEqualTo("b");
1760+
assertThat(((NumericLiteral) assignmentExpression.expression()).valueAsLong()).isEqualTo(1);
17551761
}
17561762

17571763
@Test

0 commit comments

Comments
 (0)