diff --git a/crates/ruff_linter/resources/test/fixtures/ruff/RUF031.py b/crates/ruff_linter/resources/test/fixtures/ruff/RUF031.py index 89e06f6bd4e207..4000930038b493 100644 --- a/crates/ruff_linter/resources/test/fixtures/ruff/RUF031.py +++ b/crates/ruff_linter/resources/test/fixtures/ruff/RUF031.py @@ -26,4 +26,6 @@ d[1,] d[(1,)] -d[()] # empty tuples should be ignored \ No newline at end of file +d[()] # empty tuples should be ignored +d[:,] # slices in the subscript lead to syntax error if parens are added +d[1,2,:] \ No newline at end of file diff --git a/crates/ruff_linter/resources/test/fixtures/ruff/RUF031_prefer_parens.py b/crates/ruff_linter/resources/test/fixtures/ruff/RUF031_prefer_parens.py index f3d701ae0df3ac..f546515a743fe0 100644 --- a/crates/ruff_linter/resources/test/fixtures/ruff/RUF031_prefer_parens.py +++ b/crates/ruff_linter/resources/test/fixtures/ruff/RUF031_prefer_parens.py @@ -25,4 +25,7 @@ ] = self._extract_raw_features_from_token d[1,] d[(1,)] -d[()] # empty tuples should be ignored \ No newline at end of file +d[()] # empty tuples should be ignored + +d[:,] # slices in the subscript lead to syntax error if parens are added +d[1,2,:] \ No newline at end of file diff --git a/crates/ruff_linter/src/rules/ruff/rules/incorrectly_parenthesized_tuple_in_subscript.rs b/crates/ruff_linter/src/rules/ruff/rules/incorrectly_parenthesized_tuple_in_subscript.rs index 01e8638c0d220a..473a0e2f5f8c2c 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/incorrectly_parenthesized_tuple_in_subscript.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/incorrectly_parenthesized_tuple_in_subscript.rs @@ -1,6 +1,6 @@ use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::ExprSubscript; +use ruff_python_ast::{Expr, ExprSubscript}; use ruff_text_size::Ranged; use crate::checkers::ast::Checker; @@ -64,6 +64,10 @@ pub(crate) fn subscript_with_parenthesized_tuple(checker: &mut Checker, subscrip if tuple_subscript.parenthesized == prefer_parentheses || tuple_subscript.elts.is_empty() { return; } + // Adding parentheses in the presence of a slice leads to a syntax error. + if prefer_parentheses && tuple_subscript.elts.iter().any(Expr::is_slice_expr) { + return; + } let locator = checker.locator(); let source_range = subscript.slice.range(); let new_source = if prefer_parentheses { diff --git a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF031_RUF031.py.snap b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF031_RUF031.py.snap index 2c9d230802a60c..4dbad809a6b3df 100644 --- a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF031_RUF031.py.snap +++ b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF031_RUF031.py.snap @@ -156,6 +156,7 @@ RUF031.py:28:3: RUF031 [*] Avoid parentheses for tuples in subscripts. 28 | d[(1,)] | ^^^^ RUF031 29 | d[()] # empty tuples should be ignored +30 | d[:,] # slices in the subscript lead to syntax error if parens are added | = help: Remove the parentheses. @@ -166,3 +167,5 @@ RUF031.py:28:3: RUF031 [*] Avoid parentheses for tuples in subscripts. 28 |-d[(1,)] 28 |+d[1,] 29 29 | d[()] # empty tuples should be ignored +30 30 | d[:,] # slices in the subscript lead to syntax error if parens are added +31 31 | d[1,2,:] diff --git a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__prefer_parentheses_getitem_tuple.snap b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__prefer_parentheses_getitem_tuple.snap index 9f776e10124a7b..9af8d5e20bb47d 100644 --- a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__prefer_parentheses_getitem_tuple.snap +++ b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__prefer_parentheses_getitem_tuple.snap @@ -129,3 +129,5 @@ RUF031_prefer_parens.py:26:3: RUF031 [*] Use parentheses for tuples in subscript 27 26 | d[(1,)] 27 |+d[(1,)] 28 28 | d[()] # empty tuples should be ignored +29 29 | +30 30 | d[:,] # slices in the subscript lead to syntax error if parens are added