Skip to content

Commit cff542f

Browse files
Seppli11Peter Aisher
andauthored
SONARPY-1974 fix FPs for unused variable in assignment expressions (#2025)
When using an assignment expression in a generator, or a set/list/dict comprehension, the scope of the expression was wrongly set, which lead to the analyzer not finding usages of the variable set in the assignment expression Co-authored-by: Peter Aisher <[email protected]>
1 parent a62deca commit cff542f

File tree

8 files changed

+384
-176
lines changed

8 files changed

+384
-176
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030
import org.sonar.plugins.python.api.PythonSubscriptionCheck;
3131
import org.sonar.plugins.python.api.SubscriptionContext;
3232
import org.sonar.plugins.python.api.quickfix.PythonQuickFix;
33+
import org.sonar.plugins.python.api.quickfix.PythonTextEdit;
3334
import org.sonar.plugins.python.api.symbols.Symbol;
3435
import org.sonar.plugins.python.api.symbols.Usage;
3536
import org.sonar.plugins.python.api.tree.AnnotatedAssignment;
37+
import org.sonar.plugins.python.api.tree.AssignmentExpression;
3638
import org.sonar.plugins.python.api.tree.AssignmentStatement;
3739
import org.sonar.plugins.python.api.tree.ComprehensionExpression;
3840
import org.sonar.plugins.python.api.tree.DictCompExpression;
@@ -161,6 +163,23 @@ private static void createAssignmentQuickFix(Usage usage, PreciseIssue issue) {
161163
TextEditUtils.removeUntil(usage.tree(), assignedValue.firstToken()));
162164
issue.addQuickFix(quickFix);
163165
});
166+
167+
Tree assignmentTree = TreeUtils.firstAncestorOfKind(usage.tree(), Kind.ASSIGNMENT_EXPRESSION);
168+
Optional.ofNullable(assignmentTree).map(AssignmentExpression.class::cast).ifPresent(assignmentExpr -> {
169+
PythonQuickFix quickFix = PythonQuickFix.newQuickFix(ASSIGNMENT_QUICK_FIX_MESSAGE,
170+
createAssignmentExpressionQuickFix(usage, assignmentExpr));
171+
issue.addQuickFix(quickFix);
172+
});
173+
}
174+
}
175+
176+
private static PythonTextEdit createAssignmentExpressionQuickFix(final Usage usage, final AssignmentExpression assignmentExpression) {
177+
var expression = assignmentExpression.expression();
178+
var parent = assignmentExpression.parent();
179+
if (parent.is(Kind.PARENTHESIZED) && expression instanceof Name nameExpr) {
180+
return TextEditUtils.replace(parent, nameExpr.name());
181+
} else {
182+
return TextEditUtils.removeUntil(usage.tree(), expression.firstToken());
164183
}
165184
}
166185

0 commit comments

Comments
 (0)