diff --git a/crates/ruff_linter/resources/test/fixtures/ruff/RUF027_0.py b/crates/ruff_linter/resources/test/fixtures/ruff/RUF027_0.py index 4d9ecd2c49f165..be28914e982184 100644 --- a/crates/ruff_linter/resources/test/fixtures/ruff/RUF027_0.py +++ b/crates/ruff_linter/resources/test/fixtures/ruff/RUF027_0.py @@ -68,3 +68,7 @@ def method_calls(): first = "Wendy" last = "Appleseed" value.method("{first} {last}") # RUF027 + +def format_specifiers(): + a = 4 + b = "{a:b} {a:^5}" \ No newline at end of file diff --git a/crates/ruff_linter/src/rules/ruff/rules/missing_fstring_syntax.rs b/crates/ruff_linter/src/rules/ruff/rules/missing_fstring_syntax.rs index 7cfc2e7bf01b3c..d82a73512406db 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/missing_fstring_syntax.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/missing_fstring_syntax.rs @@ -88,8 +88,10 @@ fn should_be_fstring( return false; } + let fstring_expr = format!("f{}", locator.slice(literal.range())); + let Ok(ast::Expr::FString(ast::ExprFString { value, .. })) = - parse_expression(&format!("f{}", locator.slice(literal.range()))) + parse_expression(&fstring_expr) else { return false; }; @@ -159,7 +161,7 @@ fn should_be_fstring( has_name = true; } if let Some(spec) = &element.format_spec { - let spec = locator.slice(spec.range()); + let spec = &fstring_expr[spec.range()]; if FormatSpec::parse(spec).is_err() { return false; } diff --git a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF027_RUF027_0.py.snap b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF027_RUF027_0.py.snap index 2a3447006e433a..ca858cdcda6406 100644 --- a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF027_RUF027_0.py.snap +++ b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF027_RUF027_0.py.snap @@ -285,6 +285,8 @@ RUF027_0.py:70:18: RUF027 [*] Possible f-string without an `f` prefix 69 | last = "Appleseed" 70 | value.method("{first} {last}") # RUF027 | ^^^^^^^^^^^^^^^^ RUF027 +71 | +72 | def format_specifiers(): | = help: Add `f` prefix @@ -294,5 +296,24 @@ RUF027_0.py:70:18: RUF027 [*] Possible f-string without an `f` prefix 69 69 | last = "Appleseed" 70 |- value.method("{first} {last}") # RUF027 70 |+ value.method(f"{first} {last}") # RUF027 +71 71 | +72 72 | def format_specifiers(): +73 73 | a = 4 + +RUF027_0.py:74:9: RUF027 [*] Possible f-string without an `f` prefix + | +72 | def format_specifiers(): +73 | a = 4 +74 | b = "{a:b} {a:^5}" + | ^^^^^^^^^^^^^^ RUF027 + | + = help: Add `f` prefix + +ℹ Unsafe fix +71 71 | +72 72 | def format_specifiers(): +73 73 | a = 4 +74 |- b = "{a:b} {a:^5}" + 74 |+ b = f"{a:b} {a:^5}"