Skip to content

Commit c67678a

Browse files
thomas-serre-sonarsourcesonartech
authored andcommitted
SONARPY-3128 S7500: Rule should not raise on async comprehensions (#353)
GitOrigin-RevId: e4daf35e2ae2d85ca4bada689d8f59aa1f75148e
1 parent cdbd140 commit c67678a

2 files changed

Lines changed: 15 additions & 2 deletions

File tree

python-checks/src/main/java/org/sonar/python/checks/UnnecessaryComprehensionCheck.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ private static void checkComprehensionExpression(SubscriptionContext ctx) {
5656
var valueExpression = comprehension.resultExpression();
5757
var loopExpression = Optional.of(comprehension)
5858
.map(ComprehensionExpression::comprehensionFor)
59-
.filter(comprehensionFor -> Objects.isNull(comprehensionFor.nestedClause()))
59+
.filter(comprehensionFor -> Objects.isNull(comprehensionFor.nestedClause()) && comprehensionFor.asyncToken() == null)
6060
.map(ComprehensionFor::loopExpression)
6161
.orElse(null);
6262

@@ -75,7 +75,7 @@ private static void checkDictComprehensionExpression(SubscriptionContext ctx) {
7575
var valueExpression = comprehension.valueExpression();
7676
var loopExpressions = Optional.of(comprehension)
7777
.map(DictCompExpression::comprehensionFor)
78-
.filter(comprehensionFor -> Objects.isNull(comprehensionFor.nestedClause()))
78+
.filter(comprehensionFor -> Objects.isNull(comprehensionFor.nestedClause()) && comprehensionFor.asyncToken() == null)
7979
.map(ComprehensionFor::loopExpression)
8080
.map(TreeUtils.toInstanceOfMapper(Tuple.class))
8181
.map(Tuple::elements)

python-checks/src/test/resources/checks/unnecessaryComprehension.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,16 @@ def case2():
2626
dict_comp = {k: v for k, v in iterable_pairs if something(k)}
2727
dict_comp = {k: v1 for k, v2 in iterable_pairs}
2828
dict_comp = {k1: v for k2, v in iterable_pairs}
29+
30+
def async_case():
31+
32+
from somewhere import async_generator, async_pair_generator
33+
34+
iterable_single = aiter(async_generator())
35+
list_comp = [x async for x in iterable_single]
36+
set_comp = {x async for x in iterable_single}
37+
list_comp = list(x async for x in iterable_single)
38+
set_comp = set(x async for x in iterable_single)
39+
40+
iterable_pairs = aiter(async_pair_generator())
41+
dict_comp = {k: v async for k, v in iterable_pairs}

0 commit comments

Comments
 (0)