From 12440ede9c667aa0e8cfe2aaa9e2e8f649250a0f Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 13 Jan 2023 12:56:42 -0500 Subject: [PATCH] Remove non-magic trailing comma from tuple (#1854) Closes #1821. --- .../fixtures/flake8_comprehensions/C405.py | 1 + src/flake8_comprehensions/fixes.rs | 24 ++++++++++++++++--- ...8_comprehensions__tests__C405_C405.py.snap | 19 ++++++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/resources/test/fixtures/flake8_comprehensions/C405.py b/resources/test/fixtures/flake8_comprehensions/C405.py index 8456d427de..e5f05511d1 100644 --- a/resources/test/fixtures/flake8_comprehensions/C405.py +++ b/resources/test/fixtures/flake8_comprehensions/C405.py @@ -3,3 +3,4 @@ s2 = set((1, 2)) s3 = set([]) s4 = set(()) s5 = set() +s6 = set((1,)) diff --git a/src/flake8_comprehensions/fixes.rs b/src/flake8_comprehensions/fixes.rs index b94b280fdd..79cc104fc3 100644 --- a/src/flake8_comprehensions/fixes.rs +++ b/src/flake8_comprehensions/fixes.rs @@ -258,6 +258,24 @@ pub fn fix_unnecessary_list_comprehension_dict( )) } +fn drop_trailing_comma<'a>(elements: &[Element<'a>]) -> Vec> { + let mut elements = elements.to_vec(); + if elements.len() == 1 { + if let Some(Element::Simple { + value, + comma: Some(..), + .. + }) = elements.last() + { + elements[0] = Element::Simple { + value: value.clone(), + comma: None, + }; + } + } + elements +} + /// (C405) Convert `set((1, 2))` to `{1, 2}`. pub fn fix_unnecessary_literal_set(locator: &Locator, expr: &rustpython_ast::Expr) -> Result { // Expr(Call(List|Tuple)))) -> Expr(Set))) @@ -268,8 +286,8 @@ pub fn fix_unnecessary_literal_set(locator: &Locator, expr: &rustpython_ast::Exp let arg = match_arg(call)?; let elements = match &arg.value { - Expression::Tuple(inner) => &inner.elements, - Expression::List(inner) => &inner.elements, + Expression::Tuple(inner) => drop_trailing_comma(&inner.elements), + Expression::List(inner) => inner.elements.clone(), _ => { bail!("Expected Expression::Tuple | Expression::List"); } @@ -279,7 +297,7 @@ pub fn fix_unnecessary_literal_set(locator: &Locator, expr: &rustpython_ast::Exp call.args = vec![]; } else { body.value = Expression::Set(Box::new(Set { - elements: elements.clone(), + elements, lbrace: LeftCurlyBrace { whitespace_after: call.whitespace_before_args.clone(), }, diff --git a/src/flake8_comprehensions/snapshots/ruff__flake8_comprehensions__tests__C405_C405.py.snap b/src/flake8_comprehensions/snapshots/ruff__flake8_comprehensions__tests__C405_C405.py.snap index d16f4e3084..46f36e2a4a 100644 --- a/src/flake8_comprehensions/snapshots/ruff__flake8_comprehensions__tests__C405_C405.py.snap +++ b/src/flake8_comprehensions/snapshots/ruff__flake8_comprehensions__tests__C405_C405.py.snap @@ -1,6 +1,6 @@ --- source: src/flake8_comprehensions/mod.rs -expression: checks +expression: diagnostics --- - kind: UnnecessaryLiteralSet: list @@ -70,4 +70,21 @@ expression: checks row: 4 column: 12 parent: ~ +- kind: + UnnecessaryLiteralSet: tuple + location: + row: 6 + column: 5 + end_location: + row: 6 + column: 14 + fix: + content: "{1}" + location: + row: 6 + column: 5 + end_location: + row: 6 + column: 14 + parent: ~