mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-02 06:41:23 +00:00
[flake8-comprehensions]: Handle trailing comma in C403 fix (#16110)
## Summary Resolves [#16099 ](https://github.com/astral-sh/ruff/issues/16099) based on [#15929 ](https://github.com/astral-sh/ruff/pull/15929) ## Test Plan Added test case `s = set([x for x in range(3)],)` and updated snapshot. --------- Co-authored-by: dylwil3 <dylwil3@gmail.com>
This commit is contained in:
parent
3c69b685ee
commit
df45a9db64
5 changed files with 51 additions and 14 deletions
|
@ -32,3 +32,6 @@ s = set( # outer set comment
|
||||||
[ # comprehension comment
|
[ # comprehension comment
|
||||||
x for x in range(3)]
|
x for x in range(3)]
|
||||||
))))
|
))))
|
||||||
|
|
||||||
|
# Test trailing comma case
|
||||||
|
s = set([x for x in range(3)],)
|
|
@ -4,7 +4,7 @@ use ruff_python_ast as ast;
|
||||||
use ruff_python_ast::comparable::ComparableExpr;
|
use ruff_python_ast::comparable::ComparableExpr;
|
||||||
use ruff_python_ast::parenthesize::parenthesized_range;
|
use ruff_python_ast::parenthesize::parenthesized_range;
|
||||||
use ruff_python_ast::ExprGenerator;
|
use ruff_python_ast::ExprGenerator;
|
||||||
use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer};
|
use ruff_python_parser::TokenKind;
|
||||||
use ruff_text_size::{Ranged, TextRange, TextSize};
|
use ruff_text_size::{Ranged, TextRange, TextSize};
|
||||||
|
|
||||||
use crate::checkers::ast::Checker;
|
use crate::checkers::ast::Checker;
|
||||||
|
@ -125,11 +125,13 @@ pub(crate) fn unnecessary_generator_list(checker: &Checker, call: &ast::ExprCall
|
||||||
|
|
||||||
// Replace `)` with `]`.
|
// Replace `)` with `]`.
|
||||||
// Place `]` at argument's end or at trailing comma if present
|
// Place `]` at argument's end or at trailing comma if present
|
||||||
let mut tokenizer =
|
let after_arg_tokens = checker
|
||||||
SimpleTokenizer::new(checker.source(), TextRange::new(argument.end(), call.end()));
|
.tokens()
|
||||||
let right_bracket_loc = tokenizer
|
.in_range(TextRange::new(argument.end(), call.end()));
|
||||||
.find(|token| token.kind == SimpleTokenKind::Comma)
|
let right_bracket_loc = after_arg_tokens
|
||||||
.map_or(call.arguments.end(), |comma| comma.end())
|
.iter()
|
||||||
|
.find(|token| token.kind() == TokenKind::Comma)
|
||||||
|
.map_or(call.arguments.end(), Ranged::end)
|
||||||
- TextSize::from(1);
|
- TextSize::from(1);
|
||||||
let call_end = Edit::replacement("]".to_string(), right_bracket_loc, call.end());
|
let call_end = Edit::replacement("]".to_string(), right_bracket_loc, call.end());
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ use ruff_python_ast as ast;
|
||||||
use ruff_python_ast::comparable::ComparableExpr;
|
use ruff_python_ast::comparable::ComparableExpr;
|
||||||
use ruff_python_ast::parenthesize::parenthesized_range;
|
use ruff_python_ast::parenthesize::parenthesized_range;
|
||||||
use ruff_python_ast::ExprGenerator;
|
use ruff_python_ast::ExprGenerator;
|
||||||
use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer};
|
use ruff_python_parser::TokenKind;
|
||||||
use ruff_text_size::{Ranged, TextRange, TextSize};
|
use ruff_text_size::{Ranged, TextRange, TextSize};
|
||||||
|
|
||||||
use crate::checkers::ast::Checker;
|
use crate::checkers::ast::Checker;
|
||||||
|
@ -128,11 +128,13 @@ pub(crate) fn unnecessary_generator_set(checker: &Checker, call: &ast::ExprCall)
|
||||||
|
|
||||||
// Replace `)` with `}`.
|
// Replace `)` with `}`.
|
||||||
// Place `}` at argument's end or at trailing comma if present
|
// Place `}` at argument's end or at trailing comma if present
|
||||||
let mut tokenizer =
|
let after_arg_tokens = checker
|
||||||
SimpleTokenizer::new(checker.source(), TextRange::new(argument.end(), call.end()));
|
.tokens()
|
||||||
let right_brace_loc = tokenizer
|
.in_range(TextRange::new(argument.end(), call.end()));
|
||||||
.find(|token| token.kind == SimpleTokenKind::Comma)
|
let right_brace_loc = after_arg_tokens
|
||||||
.map_or(call.arguments.end(), |comma| comma.end())
|
.iter()
|
||||||
|
.find(|token| token.kind() == TokenKind::Comma)
|
||||||
|
.map_or(call.arguments.end(), Ranged::end)
|
||||||
- TextSize::from(1);
|
- TextSize::from(1);
|
||||||
let call_end = Edit::replacement(
|
let call_end = Edit::replacement(
|
||||||
pad_end("}", call.range(), checker.locator(), checker.semantic()),
|
pad_end("}", call.range(), checker.locator(), checker.semantic()),
|
||||||
|
|
|
@ -2,7 +2,8 @@ use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Edit, Fix};
|
||||||
use ruff_macros::{derive_message_formats, ViolationMetadata};
|
use ruff_macros::{derive_message_formats, ViolationMetadata};
|
||||||
use ruff_python_ast as ast;
|
use ruff_python_ast as ast;
|
||||||
use ruff_python_ast::parenthesize::parenthesized_range;
|
use ruff_python_ast::parenthesize::parenthesized_range;
|
||||||
use ruff_text_size::{Ranged, TextSize};
|
use ruff_python_parser::TokenKind;
|
||||||
|
use ruff_text_size::{Ranged, TextRange, TextSize};
|
||||||
|
|
||||||
use crate::checkers::ast::Checker;
|
use crate::checkers::ast::Checker;
|
||||||
use crate::rules::flake8_comprehensions::fixes::{pad_end, pad_start};
|
use crate::rules::flake8_comprehensions::fixes::{pad_end, pad_start};
|
||||||
|
@ -70,9 +71,18 @@ pub(crate) fn unnecessary_list_comprehension_set(checker: &Checker, call: &ast::
|
||||||
);
|
);
|
||||||
|
|
||||||
// Replace `)` with `}`.
|
// Replace `)` with `}`.
|
||||||
|
// Place `}` at argument's end or at trailing comma if present
|
||||||
|
let after_arg_tokens = checker
|
||||||
|
.tokens()
|
||||||
|
.in_range(TextRange::new(argument.end(), call.end()));
|
||||||
|
let right_brace_loc = after_arg_tokens
|
||||||
|
.iter()
|
||||||
|
.find(|token| token.kind() == TokenKind::Comma)
|
||||||
|
.map_or(call.arguments.end() - one, |comma| comma.end() - one);
|
||||||
|
|
||||||
let call_end = Edit::replacement(
|
let call_end = Edit::replacement(
|
||||||
pad_end("}", call.range(), checker.locator(), checker.semantic()),
|
pad_end("}", call.range(), checker.locator(), checker.semantic()),
|
||||||
call.arguments.end() - one,
|
right_brace_loc,
|
||||||
call.end(),
|
call.end(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -292,6 +292,8 @@ C403.py:29:5: C403 [*] Unnecessary list comprehension (rewrite as a set comprehe
|
||||||
33 | | x for x in range(3)]
|
33 | | x for x in range(3)]
|
||||||
34 | | ))))
|
34 | | ))))
|
||||||
| |_____^ C403
|
| |_____^ C403
|
||||||
|
35 |
|
||||||
|
36 | # Test trailing comma case
|
||||||
|
|
|
|
||||||
= help: Rewrite as a set comprehension
|
= help: Rewrite as a set comprehension
|
||||||
|
|
||||||
|
@ -308,3 +310,21 @@ C403.py:29:5: C403 [*] Unnecessary list comprehension (rewrite as a set comprehe
|
||||||
29 |+s = { # outer set comment
|
29 |+s = { # outer set comment
|
||||||
30 |+ # comprehension comment
|
30 |+ # comprehension comment
|
||||||
31 |+ x for x in range(3)}
|
31 |+ x for x in range(3)}
|
||||||
|
35 32 |
|
||||||
|
36 33 | # Test trailing comma case
|
||||||
|
37 34 | s = set([x for x in range(3)],)
|
||||||
|
|
||||||
|
C403.py:37:5: C403 [*] Unnecessary list comprehension (rewrite as a set comprehension)
|
||||||
|
|
|
||||||
|
36 | # Test trailing comma case
|
||||||
|
37 | s = set([x for x in range(3)],)
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ C403
|
||||||
|
|
|
||||||
|
= help: Rewrite as a set comprehension
|
||||||
|
|
||||||
|
ℹ Unsafe fix
|
||||||
|
34 34 | ))))
|
||||||
|
35 35 |
|
||||||
|
36 36 | # Test trailing comma case
|
||||||
|
37 |-s = set([x for x in range(3)],)
|
||||||
|
37 |+s = {x for x in range(3)}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue