Skip to content

Commit 5b7279b

Browse files
Do not sort unused error codes in unused error codes warning (#20036)
I intuit the previous author of this code sorted the codes for stability, but it actually should be in default order, to match what the user typed in. This will be more intuitive for the user. In my first commit, I add the failing testUnusedIgnoreCodeOrder test. In my second commit, I fix the code.
1 parent 320ea65 commit 5b7279b

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

mypy/errors.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -806,8 +806,8 @@ def generate_unused_ignore_errors(self, file: str) -> None:
806806
continue
807807
if codes.UNUSED_IGNORE.code in ignored_codes:
808808
continue
809-
used_ignored_codes = used_ignored_lines[line]
810-
unused_ignored_codes = set(ignored_codes) - set(used_ignored_codes)
809+
used_ignored_codes = set(used_ignored_lines[line])
810+
unused_ignored_codes = [c for c in ignored_codes if c not in used_ignored_codes]
811811
# `ignore` is used
812812
if not ignored_codes and used_ignored_codes:
813813
continue
@@ -817,7 +817,7 @@ def generate_unused_ignore_errors(self, file: str) -> None:
817817
# Display detail only when `ignore[...]` specifies more than one error code
818818
unused_codes_message = ""
819819
if len(ignored_codes) > 1 and unused_ignored_codes:
820-
unused_codes_message = f"[{', '.join(sorted(unused_ignored_codes))}]"
820+
unused_codes_message = f"[{', '.join(unused_ignored_codes)}]"
821821
message = f'Unused "type: ignore{unused_codes_message}" comment'
822822
for unused in unused_ignored_codes:
823823
narrower = set(used_ignored_codes) & codes.sub_code_map[unused]

test-data/unit/check-ignore.test

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,16 @@ class CD(six.with_metaclass(M)): # E: Multiple metaclass definitions
275275

276276
[builtins fixtures/tuple.pyi]
277277

278+
[case testUnusedIgnoreCodeOrder]
279+
# flags: --warn-unused-ignores
280+
5 # type: ignore[import, steven] # E: Unused "type: ignore[import, steven]" comment
281+
-- User ordering of codes is preserved
282+
5 # type: ignore[steven, import] # E: Unused "type: ignore[steven, import]" comment
283+
-- Spacing is not preserved
284+
5 # type: ignore[ steven, import ] # E: Unused "type: ignore[steven, import]" comment
285+
-- Make sure it works as intended in more complex situations
286+
1 + "ok" + "ok".foo # type: ignore[ operator,steven,attr-defined, import] # E: Unused "type: ignore[steven, import]" comment
287+
278288
[case testUnusedIgnoreTryExcept]
279289
# flags: --warn-unused-ignores
280290
try:

0 commit comments

Comments
 (0)