Skip to content

Commit cacf1e6

Browse files
authored
SONARPY-1727: S5905: Make sure the quick fix removes trailing commas (#2020)
* SONARPY-1727 remove trailing comma of singelton tuple * SONARPY-1727 fix after review * SONARPY-1727 fix review nitpick
1 parent 0478d39 commit cacf1e6

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheck.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@
2121

2222
import org.sonar.check.Rule;
2323
import org.sonar.plugins.python.api.PythonSubscriptionCheck;
24+
import org.sonar.plugins.python.api.quickfix.PythonQuickFix;
2425
import org.sonar.plugins.python.api.tree.AssertStatement;
26+
import org.sonar.plugins.python.api.tree.Token;
2527
import org.sonar.plugins.python.api.tree.Tree;
2628
import org.sonar.plugins.python.api.tree.Tuple;
27-
import org.sonar.plugins.python.api.quickfix.PythonQuickFix;
2829
import org.sonar.python.quickfix.TextEditUtils;
2930

3031
@Rule(key = "S5905")
@@ -43,17 +44,22 @@ public void initialize(Context context) {
4344

4445
var issue = ctx.addIssue(tuple, MESSAGE);
4546

46-
if (tuple.leftParenthesis() != null && tuple.rightParenthesis() != null) {
47-
// defensive condition
48-
issue.addQuickFix(PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE)
47+
if (isSingletonTupleWithParenthesis(tuple)) {
48+
Token comma = tuple.commas().get(0);
49+
var quickfixBuilder = PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE)
4950
.addTextEdit(TextEditUtils.remove(tuple.leftParenthesis()))
50-
.addTextEdit(TextEditUtils.remove(tuple.rightParenthesis()))
51-
.build());
51+
.addTextEdit(TextEditUtils.replaceRange(comma, tuple.rightParenthesis(), ""));
52+
53+
issue.addQuickFix(quickfixBuilder.build());
5254
}
5355
}
5456
});
5557
}
5658

59+
private static boolean isSingletonTupleWithParenthesis(Tuple tuple) {
60+
return tuple.leftParenthesis() != null && tuple.rightParenthesis() != null && tuple.elements().size() == 1;
61+
}
62+
5763
@Override
5864
public CheckScope scope() {
5965
return CheckScope.ALL;

python-checks/src/test/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheckTest.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,11 @@ void test() {
3535

3636
@Test
3737
void quickFixTest() {
38-
var before = "def foo():\n" +
39-
" assert (a, b)";
40-
var after = "def foo():\n" +
41-
" assert a, b";
42-
PythonQuickFixVerifier.verify(new AssertOnTupleLiteralCheck(), before, after);
43-
PythonQuickFixVerifier.verifyQuickFixMessages(new AssertOnTupleLiteralCheck(), before, AssertOnTupleLiteralCheck.QUICK_FIX_MESSAGE);
38+
PythonQuickFixVerifier.verifyQuickFixMessages(new AssertOnTupleLiteralCheck(), "assert (foo(),)", "Remove parentheses");
39+
PythonQuickFixVerifier.verify(new AssertOnTupleLiteralCheck(), "assert (foo(),)", "assert foo()");
40+
PythonQuickFixVerifier.verifyNoQuickFixes(new AssertOnTupleLiteralCheck(), "assert (foo(),b,)");
41+
PythonQuickFixVerifier.verifyNoQuickFixes(new AssertOnTupleLiteralCheck(), "assert (foo(),b)");
42+
PythonQuickFixVerifier.verifyNoQuickFixes(new AssertOnTupleLiteralCheck(), "assert ()");
4443
}
4544

4645
@Test

0 commit comments

Comments
 (0)