Skip to content

Commit 46c3754

Browse files
SONARPY-1341 Fix broken formatting when applying quick fix for S2772 (#1463)
1 parent 42775b2 commit 46c3754

File tree

2 files changed

+47
-8
lines changed

2 files changed

+47
-8
lines changed

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

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
import java.util.stream.Collectors;
2424
import org.sonar.check.Rule;
2525
import org.sonar.plugins.python.api.PythonSubscriptionCheck;
26+
import org.sonar.plugins.python.api.quickfix.PythonQuickFix;
27+
import org.sonar.plugins.python.api.quickfix.PythonTextEdit;
2628
import org.sonar.plugins.python.api.tree.ExpressionStatement;
2729
import org.sonar.plugins.python.api.tree.Statement;
2830
import org.sonar.plugins.python.api.tree.StatementList;
29-
import org.sonar.plugins.python.api.quickfix.PythonQuickFix;
3031
import org.sonar.python.quickfix.TextEditUtils;
32+
import org.sonar.python.tree.TreeUtils;
3133

3234
import static org.sonar.plugins.python.api.tree.Tree.Kind.EXPRESSION_STMT;
3335
import static org.sonar.plugins.python.api.tree.Tree.Kind.PASS_STMT;
@@ -49,21 +51,37 @@ public void initialize(Context context) {
4951
if (statements.size() <= 1) {
5052
return;
5153
}
52-
5354
statements.stream()
5455
.filter(st -> st.is(PASS_STMT))
5556
.findFirst()
5657
.ifPresent(st -> {
57-
var issue = ctx.addIssue(st, MESSAGE);
58+
var textEdit = createRemoveStatementTextEdit(statements, st);
5859
var quickFix = PythonQuickFix
5960
.newQuickFix(QUICK_FIX_MESSAGE)
60-
.addTextEdit(TextEditUtils.removeStatement(st))
61+
.addTextEdit(textEdit)
6162
.build();
62-
issue.addQuickFix(quickFix);
63+
ctx.addIssue(st, MESSAGE).addQuickFix(quickFix);
6364
});
6465
});
6566
}
6667

68+
private static PythonTextEdit createRemoveStatementTextEdit(List<Statement> statements, Statement toRemove) {
69+
var removeIndex = statements.indexOf(toRemove);
70+
var last = removeIndex == statements.size() - 1;
71+
if (last) {
72+
var previous = statements.get(removeIndex - 1);
73+
var removeFrom = TreeUtils.getTreeSeparatorOrLastToken(previous);
74+
var removeTo = TreeUtils.getTreeSeparatorOrLastToken(toRemove);
75+
return TextEditUtils.removeRange(
76+
removeFrom.line(),
77+
removeFrom.column(),
78+
removeTo.line(),
79+
removeTo.column());
80+
} else {
81+
return TextEditUtils.removeUntil(toRemove, statements.get(removeIndex + 1));
82+
}
83+
}
84+
6785
private static boolean isNotStringLiteralExpressionStatement(Statement st) {
6886
return !(st.is(EXPRESSION_STMT) && ((ExpressionStatement) st).expressions().stream().allMatch(e -> e.is(STRING_LITERAL)));
6987
}

python-checks/src/test/java/org/sonar/python/checks/NeedlessPassCheckTest.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,34 @@ public void test() {
3232

3333
@Test
3434
public void quick_fix_test() {
35-
var input = "def my_method():\n" +
36-
" print('foo')\n" +
37-
" pass";
3835
var expected = "def my_method():\n" +
36+
" print('foo')\n" +
3937
" print('foo')\n";
38+
39+
var input = "def my_method():\n" +
40+
" print('foo')\n" +
41+
" print('foo')\n" +
42+
" pass\n";
4043
PythonQuickFixVerifier.verify(new NeedlessPassCheck(), input, expected);
4144
PythonQuickFixVerifier.verifyQuickFixMessages(new NeedlessPassCheck(), input, NeedlessPassCheck.QUICK_FIX_MESSAGE);
45+
46+
input = "def my_method():\n" +
47+
" print('foo')\n" +
48+
" pass\n" +
49+
" print('foo')\n";
50+
PythonQuickFixVerifier.verify(new NeedlessPassCheck(), input, expected);
51+
52+
53+
expected = "def my_method():\n" +
54+
" print('foo'); print('foo')\n";
55+
56+
input = "def my_method():\n" +
57+
" print('foo'); pass; print('foo')\n";
58+
PythonQuickFixVerifier.verify(new NeedlessPassCheck(), input, expected);
59+
60+
input = "def my_method():\n" +
61+
" print('foo'); print('foo'); pass\n";
62+
PythonQuickFixVerifier.verify(new NeedlessPassCheck(), input, expected);
4263
}
4364

4465
}

0 commit comments

Comments
 (0)