Skip to content

Commit 72de033

Browse files
ghislainpiotsonartech
authored andcommitted
SONARPY-3126 S7519: F-Strings are not constant and should not trigger the rule (#367)
GitOrigin-RevId: a6def97c63a5ac332079721065179a41cf4d588d
1 parent 5e3d046 commit 72de033

2 files changed

Lines changed: 14 additions & 4 deletions

File tree

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@
1616
*/
1717
package org.sonar.python.checks;
1818

19+
import java.util.List;
20+
1921
import org.sonar.check.Rule;
2022
import org.sonar.plugins.python.api.PythonSubscriptionCheck;
2123
import org.sonar.plugins.python.api.SubscriptionContext;
2224
import org.sonar.plugins.python.api.tree.DictCompExpression;
2325
import org.sonar.plugins.python.api.tree.Name;
26+
import org.sonar.plugins.python.api.tree.StringElement;
27+
import org.sonar.plugins.python.api.tree.StringLiteral;
2428
import org.sonar.plugins.python.api.tree.Tree;
2529
import org.sonar.python.semantic.v2.UsageV2;
2630
import org.sonar.python.tree.TreeUtils;
@@ -55,10 +59,10 @@ private static boolean isConstantValueDictComprehension(DictCompExpression dictC
5559
.stream()
5660
.map(UsageV2::tree)
5761
.allMatch(ut -> TreeUtils.firstAncestor(ut, dictComprehension::equals) != null);
62+
} else if (dictComprehension.valueExpression() instanceof StringLiteral stringLiteral) {
63+
return stringLiteral.stringElements().stream().map(StringElement::formattedExpressions).allMatch(List::isEmpty);
5864
} else {
59-
return dictComprehension.valueExpression().is(Tree.Kind.NONE, Tree.Kind.STRING_LITERAL, Tree.Kind.NUMERIC_LITERAL, Tree.Kind.BOOLEAN_LITERAL_PATTERN);
65+
return dictComprehension.valueExpression().is(Tree.Kind.NONE, Tree.Kind.NUMERIC_LITERAL, Tree.Kind.BOOLEAN_LITERAL_PATTERN);
6066
}
6167
}
62-
63-
6468
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,10 @@ def case2():
1818

1919
def case3():
2020
some_list = ["a/b", "c/d"]
21-
result = {q.split("/")[-1]: q for q in some_list}
21+
result = {q.split("/")[-1]: q for q in some_list}
22+
23+
def case4(columns_to_save):
24+
mapping = {col: f"new.{col}" for col in columns_to_save}
25+
some_v = "v"
26+
some_dict = {"a": "1", "b": "2"}
27+
one_more = {k: f"{some_v}" for k, v in some_dict} # FN

0 commit comments

Comments
 (0)