Skip to content

Commit

Permalink
Avoid treating named expressions as static keys
Browse files Browse the repository at this point in the history
  • Loading branch information
charliermarsh committed Jan 12, 2024
1 parent d16c4a2 commit 47f7754
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 46 deletions.
2 changes: 2 additions & 0 deletions crates/ruff_linter/resources/test/fixtures/ruff/RUF011.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
{value.attribute: value.upper() for value in data for constant in data}
{constant[value]: value.upper() for value in data for constant in data}
{value[constant]: value.upper() for value in data for constant in data}
{local_id: token for token in tokens if (local_id := _extract_local_id(token)) is not None}

# Errors
{"key": value.upper() for value in data}
Expand All @@ -20,3 +21,4 @@
{constant + constant: value.upper() for value in data}
{constant.attribute: value.upper() for value in data}
{constant[0]: value.upper() for value in data}
{tokens: token for token in tokens}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ pub(crate) fn static_key_dict_comprehension(checker: &mut Checker, dict_comp: &a
let names = {
let mut visitor = NameFinder::default();
for generator in &dict_comp.generators {
visitor.visit_expr(&generator.target);
visitor.visit_comprehension(&generator);
}
visitor.names
};
Expand All @@ -73,7 +73,9 @@ pub(crate) fn static_key_dict_comprehension(checker: &mut Checker, dict_comp: &a
fn is_constant(key: &Expr, names: &FxHashMap<&str, &ast::ExprName>) -> bool {
match key {
Expr::Tuple(ast::ExprTuple { elts, .. }) => elts.iter().all(|elt| is_constant(elt, names)),
Expr::Name(ast::ExprName { id, .. }) => !names.contains_key(id.as_str()),
Expr::Name(ast::ExprName { id, .. }) => !names
.get(id.as_str())
.is_some_and(|name| name.ctx.is_store()),
Expr::Attribute(ast::ExprAttribute { value, .. }) => is_constant(value, names),
Expr::Subscript(ast::ExprSubscript { value, slice, .. }) => {
is_constant(value, names) && is_constant(slice, names)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,80 +1,90 @@
---
source: crates/ruff_linter/src/rules/ruff/mod.rs
---
RUF011.py:15:2: RUF011 Dictionary comprehension uses static key: `"key"`
RUF011.py:16:2: RUF011 Dictionary comprehension uses static key: `"key"`
|
14 | # Errors
15 | {"key": value.upper() for value in data}
15 | # Errors
16 | {"key": value.upper() for value in data}
| ^^^^^ RUF011
16 | {True: value.upper() for value in data}
17 | {0: value.upper() for value in data}
17 | {True: value.upper() for value in data}
18 | {0: value.upper() for value in data}
|

RUF011.py:16:2: RUF011 Dictionary comprehension uses static key: `True`
RUF011.py:17:2: RUF011 Dictionary comprehension uses static key: `True`
|
14 | # Errors
15 | {"key": value.upper() for value in data}
16 | {True: value.upper() for value in data}
15 | # Errors
16 | {"key": value.upper() for value in data}
17 | {True: value.upper() for value in data}
| ^^^^ RUF011
17 | {0: value.upper() for value in data}
18 | {(1, "a"): value.upper() for value in data} # Constant tuple
18 | {0: value.upper() for value in data}
19 | {(1, "a"): value.upper() for value in data} # Constant tuple
|

RUF011.py:17:2: RUF011 Dictionary comprehension uses static key: `0`
RUF011.py:18:2: RUF011 Dictionary comprehension uses static key: `0`
|
15 | {"key": value.upper() for value in data}
16 | {True: value.upper() for value in data}
17 | {0: value.upper() for value in data}
16 | {"key": value.upper() for value in data}
17 | {True: value.upper() for value in data}
18 | {0: value.upper() for value in data}
| ^ RUF011
18 | {(1, "a"): value.upper() for value in data} # Constant tuple
19 | {constant: value.upper() for value in data}
19 | {(1, "a"): value.upper() for value in data} # Constant tuple
20 | {constant: value.upper() for value in data}
|

RUF011.py:18:2: RUF011 Dictionary comprehension uses static key: `(1, "a")`
RUF011.py:19:2: RUF011 Dictionary comprehension uses static key: `(1, "a")`
|
16 | {True: value.upper() for value in data}
17 | {0: value.upper() for value in data}
18 | {(1, "a"): value.upper() for value in data} # Constant tuple
17 | {True: value.upper() for value in data}
18 | {0: value.upper() for value in data}
19 | {(1, "a"): value.upper() for value in data} # Constant tuple
| ^^^^^^^^ RUF011
19 | {constant: value.upper() for value in data}
20 | {constant + constant: value.upper() for value in data}
20 | {constant: value.upper() for value in data}
21 | {constant + constant: value.upper() for value in data}
|

RUF011.py:19:2: RUF011 Dictionary comprehension uses static key: `constant`
RUF011.py:20:2: RUF011 Dictionary comprehension uses static key: `constant`
|
17 | {0: value.upper() for value in data}
18 | {(1, "a"): value.upper() for value in data} # Constant tuple
19 | {constant: value.upper() for value in data}
18 | {0: value.upper() for value in data}
19 | {(1, "a"): value.upper() for value in data} # Constant tuple
20 | {constant: value.upper() for value in data}
| ^^^^^^^^ RUF011
20 | {constant + constant: value.upper() for value in data}
21 | {constant.attribute: value.upper() for value in data}
21 | {constant + constant: value.upper() for value in data}
22 | {constant.attribute: value.upper() for value in data}
|

RUF011.py:20:2: RUF011 Dictionary comprehension uses static key: `constant + constant`
RUF011.py:21:2: RUF011 Dictionary comprehension uses static key: `constant + constant`
|
18 | {(1, "a"): value.upper() for value in data} # Constant tuple
19 | {constant: value.upper() for value in data}
20 | {constant + constant: value.upper() for value in data}
19 | {(1, "a"): value.upper() for value in data} # Constant tuple
20 | {constant: value.upper() for value in data}
21 | {constant + constant: value.upper() for value in data}
| ^^^^^^^^^^^^^^^^^^^ RUF011
21 | {constant.attribute: value.upper() for value in data}
22 | {constant[0]: value.upper() for value in data}
22 | {constant.attribute: value.upper() for value in data}
23 | {constant[0]: value.upper() for value in data}
|

RUF011.py:21:2: RUF011 Dictionary comprehension uses static key: `constant.attribute`
RUF011.py:22:2: RUF011 Dictionary comprehension uses static key: `constant.attribute`
|
19 | {constant: value.upper() for value in data}
20 | {constant + constant: value.upper() for value in data}
21 | {constant.attribute: value.upper() for value in data}
20 | {constant: value.upper() for value in data}
21 | {constant + constant: value.upper() for value in data}
22 | {constant.attribute: value.upper() for value in data}
| ^^^^^^^^^^^^^^^^^^ RUF011
22 | {constant[0]: value.upper() for value in data}
23 | {constant[0]: value.upper() for value in data}
24 | {tokens: token for token in tokens}
|

RUF011.py:22:2: RUF011 Dictionary comprehension uses static key: `constant[0]`
RUF011.py:23:2: RUF011 Dictionary comprehension uses static key: `constant[0]`
|
20 | {constant + constant: value.upper() for value in data}
21 | {constant.attribute: value.upper() for value in data}
22 | {constant[0]: value.upper() for value in data}
21 | {constant + constant: value.upper() for value in data}
22 | {constant.attribute: value.upper() for value in data}
23 | {constant[0]: value.upper() for value in data}
| ^^^^^^^^^^^ RUF011
24 | {tokens: token for token in tokens}
|

RUF011.py:24:2: RUF011 Dictionary comprehension uses static key: `tokens`
|
22 | {constant.attribute: value.upper() for value in data}
23 | {constant[0]: value.upper() for value in data}
24 | {tokens: token for token in tokens}
| ^^^^^^ RUF011
|


0 comments on commit 47f7754

Please sign in to comment.