mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-30 22:01:18 +00:00
Remove call when removing final argument from format
(#15309)
## Summary Closes https://github.com/astral-sh/ruff/issues/15303.
This commit is contained in:
parent
75a24bbc67
commit
065274d353
3 changed files with 64 additions and 4 deletions
|
@ -31,3 +31,7 @@
|
||||||
# Multiline
|
# Multiline
|
||||||
(''
|
(''
|
||||||
.format(2))
|
.format(2))
|
||||||
|
|
||||||
|
# Removing the final argument.
|
||||||
|
"Hello".format("world")
|
||||||
|
"Hello".format("world", key="value")
|
||||||
|
|
|
@ -2,6 +2,7 @@ use anyhow::{Context, Ok, Result};
|
||||||
|
|
||||||
use ruff_diagnostics::Edit;
|
use ruff_diagnostics::Edit;
|
||||||
use ruff_python_ast as ast;
|
use ruff_python_ast as ast;
|
||||||
|
use ruff_python_ast::Expr;
|
||||||
use ruff_python_codegen::Stylist;
|
use ruff_python_codegen::Stylist;
|
||||||
use ruff_python_semantic::Binding;
|
use ruff_python_semantic::Binding;
|
||||||
use ruff_python_trivia::{BackwardsTokenizer, SimpleTokenKind, SimpleTokenizer};
|
use ruff_python_trivia::{BackwardsTokenizer, SimpleTokenKind, SimpleTokenizer};
|
||||||
|
@ -69,6 +70,18 @@ pub(crate) fn remove_unused_positional_arguments_from_format_call(
|
||||||
locator: &Locator,
|
locator: &Locator,
|
||||||
stylist: &Stylist,
|
stylist: &Stylist,
|
||||||
) -> Result<Edit> {
|
) -> Result<Edit> {
|
||||||
|
// If we're removing _all_ arguments, we can remove the entire call.
|
||||||
|
//
|
||||||
|
// For example, `"Hello".format(", world!")` -> `"Hello"`, as opposed to `"Hello".format()`.
|
||||||
|
if unused_arguments.len() == call.arguments.len() {
|
||||||
|
if let Expr::Attribute(attribute) = &*call.func {
|
||||||
|
return Ok(Edit::range_replacement(
|
||||||
|
locator.slice(&*attribute.value).to_string(),
|
||||||
|
call.range(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let source_code = locator.slice(call);
|
let source_code = locator.slice(call);
|
||||||
transform_expression(source_code, stylist, |mut expression| {
|
transform_expression(source_code, stylist, |mut expression| {
|
||||||
let call = match_call_mut(&mut expression)?;
|
let call = match_call_mut(&mut expression)?;
|
||||||
|
@ -81,7 +94,12 @@ pub(crate) fn remove_unused_positional_arguments_from_format_call(
|
||||||
!is_unused
|
!is_unused
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok(expression)
|
// If there are no arguments left, remove the parentheses.
|
||||||
|
if call.args.is_empty() {
|
||||||
|
Ok((*call.func).clone())
|
||||||
|
} else {
|
||||||
|
Ok(expression)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.map(|output| Edit::range_replacement(output, call.range()))
|
.map(|output| Edit::range_replacement(output, call.range()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
source: crates/ruff_linter/src/rules/pyflakes/mod.rs
|
source: crates/ruff_linter/src/rules/pyflakes/mod.rs
|
||||||
snapshot_kind: text
|
|
||||||
---
|
---
|
||||||
F523.py:2:1: F523 [*] `.format` call has unused arguments at position(s): 1
|
F523.py:2:1: F523 [*] `.format` call has unused arguments at position(s): 1
|
||||||
|
|
|
|
||||||
|
@ -255,12 +254,51 @@ F523.py:32:2: F523 [*] `.format` call has unused arguments at position(s): 0
|
||||||
| __^
|
| __^
|
||||||
33 | | .format(2))
|
33 | | .format(2))
|
||||||
| |__________^ F523
|
| |__________^ F523
|
||||||
|
34 |
|
||||||
|
35 | # Removing the final argument.
|
||||||
|
|
|
|
||||||
= help: Remove extra positional arguments at position(s): 0
|
= help: Remove extra positional arguments at position(s): 0
|
||||||
|
|
||||||
ℹ Safe fix
|
ℹ Safe fix
|
||||||
|
29 29 | "{1} {8}".format(0, 1) # F523, # F524
|
||||||
30 30 |
|
30 30 |
|
||||||
31 31 | # Multiline
|
31 31 | # Multiline
|
||||||
32 32 | (''
|
32 |-(''
|
||||||
33 |-.format(2))
|
33 |-.format(2))
|
||||||
33 |+.format())
|
32 |+('')
|
||||||
|
34 33 |
|
||||||
|
35 34 | # Removing the final argument.
|
||||||
|
36 35 | "Hello".format("world")
|
||||||
|
|
||||||
|
F523.py:36:1: F523 [*] `.format` call has unused arguments at position(s): 0
|
||||||
|
|
|
||||||
|
35 | # Removing the final argument.
|
||||||
|
36 | "Hello".format("world")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ F523
|
||||||
|
37 | "Hello".format("world", key="value")
|
||||||
|
|
|
||||||
|
= help: Remove extra positional arguments at position(s): 0
|
||||||
|
|
||||||
|
ℹ Safe fix
|
||||||
|
33 33 | .format(2))
|
||||||
|
34 34 |
|
||||||
|
35 35 | # Removing the final argument.
|
||||||
|
36 |-"Hello".format("world")
|
||||||
|
36 |+"Hello"
|
||||||
|
37 37 | "Hello".format("world", key="value")
|
||||||
|
|
||||||
|
F523.py:37:1: F523 [*] `.format` call has unused arguments at position(s): 0
|
||||||
|
|
|
||||||
|
35 | # Removing the final argument.
|
||||||
|
36 | "Hello".format("world")
|
||||||
|
37 | "Hello".format("world", key="value")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ F523
|
||||||
|
|
|
||||||
|
= help: Remove extra positional arguments at position(s): 0
|
||||||
|
|
||||||
|
ℹ Safe fix
|
||||||
|
34 34 |
|
||||||
|
35 35 | # Removing the final argument.
|
||||||
|
36 36 | "Hello".format("world")
|
||||||
|
37 |-"Hello".format("world", key="value")
|
||||||
|
37 |+"Hello".format(key="value")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue