ruff/crates/ruff_linter/resources/test/fixtures/pylint
Dylan aa93005d8d
Control flow graph: setup (#17064)
This PR contains the scaffolding for a new control flow graph
implementation, along with its application to the `unreachable` rule. At
the moment, the implementation is a maximal over-approximation: no
control flow is modeled and all statements are counted as reachable.
With each additional statement type we support, this approximation will
improve.

So this PR just contains:
- A `ControlFlowGraph` struct and builder
- Support for printing the flow graph as a Mermaid graph
- Snapshot tests for the actual graphs
- (a very bad!) reimplementation of `unreachable` using the new structs
- Snapshot tests for `unreachable`

# Instructions for Viewing Mermaid snapshots
Unfortunately I don't know how to convince GitHub to render the Mermaid
graphs in the snapshots. However, you can view these locally in VSCode
if you install an extension that supports Mermaid graphs in Markdown,
and then add this to your `settings.json`:

```json
  "files.associations": {
"*.md.snap": "markdown",
  }
  ```
2025-04-01 05:53:42 -05:00
..
import_private_name [`pylint`] (Re-)Implement `import-private-name` (`C2701`) (#9553) 2024-01-16 14:03:11 -05:00
import_self Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
assert_on_string_literal.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
await_outside_async.ipynb Fix `await-outside-async` to allow `await` at the top-level scope of a notebook (#14225) 2024-11-09 12:44:48 -05:00
await_outside_async.py Fix miscellaneous issues in `await-outside-async detection` (#14218) 2024-11-08 21:07:13 -05:00
bad_dunder_method_name.py [pylint] removed dunder methods in Python 3 (PLW3201) (#13194) 2024-09-04 08:23:08 +02:00
bad_open_mode.py Improve handling of builtin symbols in linter rules (#10919) 2024-04-16 11:37:31 +01:00
bad_staticmethod_argument.py Consider `__new__` methods as special function type for enforcing class method or static method rules (#13305) 2025-02-16 14:12:25 -06:00
bad_str_strip_call.py [`pylint`] Also report when the object isn't a literal (`PLE1310`) (#15985) 2025-02-10 09:31:27 +01:00
bad_string_format_character.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
bad_string_format_type.py Fix bug where `PLE1307` was raised when formatting `%c` with characters (#8407) 2023-11-02 04:36:52 +00:00
bidirectional_unicode.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
binary_op_exception.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
boolean_chained_comparison.py [`pylint`] Include parentheses and multiple comparators in check for `boolean-chained-comparison (PLR1716)` (#14781) 2024-12-08 22:58:45 -06:00
collapsible_else_if.py Preserve trivia (i.e. comments) in PLR5501 (#13573) 2024-10-03 10:22:20 -05:00
compare_to_empty_string.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
comparison_of_constant.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
comparison_with_itself.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
continue_in_finally.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
dict_index_missing_items.py [`pylint`] Implement `dict-iter-missing-items` (`C0206`) (#11688) 2024-06-06 00:28:01 -04:00
dict_iter_missing_items.py [`pylint`] Add PLE1141 `DictIterMissingItems` (#9845) 2024-02-19 19:56:55 +05:30
duplicate_bases.py [`pylint`] Add fix for `duplicate-bases` (`PLE0241`) (#12105) 2024-06-29 17:48:24 +00:00
empty_comment.py Avoid panic when comment is preceded by Unicode (#9331) 2023-12-31 12:54:31 +00:00
eq_without_hash.py [`pylint`] Detect nested methods correctly (`PLW1641`) (#15032) 2024-12-30 16:55:14 +01:00
global_at_module_level.py [pylint] - implement `global-at-module-level` (`W0604`) (#8058) 2023-10-19 04:48:27 +00:00
global_statement.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
global_variable_not_assigned.py Track conditional deletions in the semantic model (#10415) 2024-03-14 20:45:46 -04:00
if_stmt_min_max.py [`pylint`] Correct ordering of arguments in fix for `if-stmt-min-max` (`PLR1730`) (#16080) 2025-02-12 10:27:46 +01:00
import_aliasing.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
import_outside_top_level.py Implement pylint import-outside-toplevel rule (C0415) (#5180) 2023-10-29 16:40:26 +00:00
import_outside_top_level_with_banned.py Honor banned top level imports by TID253 in PLC0415. (#15628) 2025-01-24 11:07:21 +01:00
invalid_all_format.py Allow named expressions in `__all__` assignments (#7673) 2023-09-27 00:36:55 -04:00
invalid_all_object.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
invalid_characters.py [`pylint`] Do not offer fix for raw strings (`PLE251`) (#16132) 2025-02-13 08:36:11 +00:00
invalid_characters_syntax_error.py Enable token-based rules on source with syntax errors (#11950) 2024-07-02 08:57:46 +00:00
invalid_envvar_default.py Fix `PLW1508` false positive for default string created via a mult operation (#14841) 2024-12-08 18:25:47 +00:00
invalid_envvar_value.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
invalid_return_type_bool.py [`pylint`] Implement `invalid-bool-return-type` (`E304`) (#10377) 2024-03-13 19:43:45 +05:30
invalid_return_type_bytes.py Allow `NoReturn`-like functions for `__str__`, `__len__`, etc. (#11017) 2024-04-18 22:55:15 +00:00
invalid_return_type_hash.py [`pylint`] Implement `invalid-hash-returned` (`PLE0309`) (#10961) 2024-04-19 03:33:52 +00:00
invalid_return_type_index.py [`pylint`] Implement `invalid-index-returned` (`PLE0305`) (#10962) 2024-04-19 03:44:05 +00:00
invalid_return_type_length.py Allow `NoReturn`-like functions for `__str__`, `__len__`, etc. (#11017) 2024-04-18 22:55:15 +00:00
invalid_return_type_str.py Allow `NoReturn`-like functions for `__str__`, `__len__`, etc. (#11017) 2024-04-18 22:55:15 +00:00
iteration_over_set.py Respect hash-equivalent literals in `iteration-over-set` (#14063) 2024-11-03 18:44:52 +00:00
len_as_condition.py [`pylint`] Fix false negatives for `ascii` and `sorted` in `len-as-condition` (PLC1802) (#14692) 2024-11-30 14:10:30 -06:00
literal_membership.py [`pylint`] Do not trigger `PLR6201` on empty collections (#15732) 2025-01-24 20:42:49 -06:00
load_before_global_declaration.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
logging_too_few_args.py Add `Expr::Name` checks to rules which use `is_logger_candidate` (#7521) 2023-09-27 00:21:22 +00:00
logging_too_many_args.py Add `Expr::Name` checks to rules which use `is_logger_candidate` (#7521) 2023-09-27 00:21:22 +00:00
magic_value_comparison.py `PLR2004`: Accept 0.0 and 1.0 as common magic values (#9964) 2024-02-13 01:21:06 +00:00
misplaced_bare_raise.py [pylint] Implement misplaced-bare-raise (E0704) (#7961) 2023-10-17 03:07:46 +00:00
misplaced_comparison_constant.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
modified_iterating_set.py [`pylint`] Implement `modified-iterating-set` (`E4703`) (#10473) 2024-03-31 14:37:49 +00:00
named_expr_without_context.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
nan_comparison.py [`pylint`] Also reports `case np.nan`/`case math.nan` (`PLW0177`) (#16378) 2025-02-26 13:50:21 -05:00
nested_min_max.py [`pylint`] - fix incorrect starred expression replacement for `nested-min-max` (`PLW3301`) (#13089) 2024-08-26 10:01:38 +05:30
no_method_decorator.py PLR0203: Delete entire statement, including semicolons (#10074) 2024-02-22 16:03:00 +00:00
no_self_use.py [`pylint`] Do not report methods with only one `EM101`-compatible `raise` (`PLR6301`) (#15507) 2025-01-17 10:17:39 +01:00
non_ascii_module_import.py [pylint] - Implement `non-ascii-module-import` (`C2403`) (#8056) 2023-10-20 18:06:22 +00:00
non_ascii_name.py [pylint] - implement `non-ascii-name` (`C2401`) (#8038) 2023-10-20 18:53:51 +00:00
non_augmented_assignment.py [`pylint`] Preserve original value format (`PLR6104`) (#14978) 2024-12-17 16:07:07 +01:00
non_slot_assignment.py [`pylint`] Ignore `__slots__` with dynamic values (#11488) 2024-05-22 04:18:01 +00:00
nonlocal_and_global.py [`pylint`] Implement `nonlocal-and-global` (`E115`) (#10407) 2024-03-18 00:43:02 +00:00
nonlocal_without_binding.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
potential_index_error.py [`pylint`] Implement `potential-index-error` (`PLE0643`) (#9545) 2024-01-21 03:59:48 +00:00
property_with_parameters.py Consider more stdlib decorators to be property-like (#12583) 2024-07-30 17:18:23 +00:00
redeclared_assigned_name.py [`pylint`] - implement `redeclared-assigned-name` (`W0128`) (#9268) 2024-03-15 09:43:55 -05:00
redefined_argument_from_local.py Consider expression before statement when determining binding kind (#12346) 2024-07-16 14:49:26 +00:00
redefined_loop_name.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
redefined_slots_in_subclass.py [`pylint`] Implement `redefined-slots-in-subclass` (`W0244`) (#9640) 2025-01-17 09:54:15 -06:00
repeated_equality_comparison.py [`pylint`] - use sets when possible for `PLR1714` autofix (`repeated-equality-comparison`) (#14372) 2024-11-18 08:57:43 +01:00
repeated_keyword_argument.py Add Implementation for Pylint E1132: Repeated Keyword (#8706) 2023-11-19 00:26:24 +00:00
return_in_init.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
self_assigning_variable.py [`pylint`] Extend `self-assigning-variable` to multi-target assignments (#8839) 2023-11-25 18:42:19 +00:00
self_or_cls_assignment.py Consider `__new__` methods as special function type for enforcing class method or static method rules (#13305) 2025-02-16 14:12:25 -06:00
shallow_copy_environ.py [PLW1507] Mark fix unsafe (#16343) 2025-02-24 13:42:44 +01:00
single_string_slots.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
singledispatch_method.py [`pylint`] Don't recommend decorating staticmethods with `@singledispatch` (`PLE1519`, `PLE1520`) (#10637) 2024-04-02 16:47:31 +00:00
singledispatchmethod_function.py [`pylint`] Don't recommend decorating staticmethods with `@singledispatch` (`PLE1519`, `PLE1520`) (#10637) 2024-04-02 16:47:31 +00:00
subprocess_popen_preexec_fn.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
subprocess_run_without_check.py [`pylint`] Add fix for `subprocess-run-without-check` (`PLW1510`) (#6708) 2023-12-12 05:08:17 +00:00
super_without_brackets.py [pylint] - implement `super-without-brackets`/`W0245` (#9257) 2024-01-02 21:57:53 +00:00
sys_exit_alias_0.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_1.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_2.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_3.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_4.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_5.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_6.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_7.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_8.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_9.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_10.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_11.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
sys_exit_alias_12.py Avoid inserting imports directly after continuation (#7553) 2023-09-20 21:26:48 +00:00
sys_exit_alias_13.py [`pylint`] Convert a `code` keyword argument to a positional argument (`PLR1722`) (#16424) 2025-03-03 09:20:57 -05:00
sys_exit_alias_14.py [`pylint`] Convert a `code` keyword argument to a positional argument (`PLR1722`) (#16424) 2025-03-03 09:20:57 -05:00
sys_exit_alias_15.py [`pylint`] Convert a `code` keyword argument to a positional argument (`PLR1722`) (#16424) 2025-03-03 09:20:57 -05:00
sys_exit_alias_16.py [`pylint`] Convert a `code` keyword argument to a positional argument (`PLR1722`) (#16424) 2025-03-03 09:20:57 -05:00
too_many_arguments.py Consider `__new__` methods as special function type for enforcing class method or static method rules (#13305) 2025-02-16 14:12:25 -06:00
too_many_arguments_params.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
too_many_boolean_expressions.py [pylint] Implement PLR0916 (`too-many-boolean-expressions`) (#7975) 2023-10-17 04:44:25 +00:00
too_many_branches.py [`pylint`] Remove `try` body from branch counting (#11487) 2024-05-21 23:38:51 -04:00
too_many_branches_params.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
too_many_locals.py [`pylint`] Implement `too-many-locals` (`PLR0914`) (#9163) 2023-12-18 20:00:04 +00:00
too_many_nested_blocks.py [`pylint`] Implement `too-many-nested-blocks` (`PLR1702`) (#9172) 2024-01-24 19:30:01 +00:00
too_many_positional_arguments.py Consider `__new__` methods as special function type for enforcing class method or static method rules (#13305) 2025-02-16 14:12:25 -06:00
too_many_positional_params.py [`pylint`] Implement `too-many-positional` (`PLR0917`) (#8995) 2023-12-04 18:03:09 +00:00
too_many_public_methods.py [`pylint`] Ignore overload in `PLR0904` (#14730) 2024-12-02 14:36:51 +00:00
too_many_return_statements.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
too_many_return_statements_params.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
too_many_statements.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
too_many_statements_params.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
type_bivariance.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
type_name_incorrect_variance.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
type_param_name_mismatch.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
unexpected_special_method_signature.py [`pylint`] Fix false positives, add missing methods, and support positional-only parameters (`PLE0302`) (#16263) 2025-02-21 08:38:51 -05:00
unnecessary_dict_index_lookup.py [`pylint`] Recurse into subscript subexpressions when searching for list/dict lookups (`PLR1733`, `PLR1736`) (#13186) 2024-09-01 17:22:45 +01:00
unnecessary_direct_lambda_call.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
unnecessary_dunder_call.py [`pylint`] Fix missing parens in unsafe fix for `unnecessary-dunder-call` (`PLC2801`) (#15762) 2025-02-04 09:54:01 +00:00
unnecessary_lambda.py [pylint] Implement unnecessary-lambda (W0108) (#7953) 2023-10-20 17:25:24 +00:00
unnecessary_list_index_lookup.py [`pylint`] Recurse into subscript subexpressions when searching for list/dict lookups (`PLR1733`, `PLR1736`) (#13186) 2024-09-01 17:22:45 +01:00
unreachable.py Control flow graph: setup (#17064) 2025-04-01 05:53:42 -05:00
unspecified_encoding.py [`pylint`] Detect `pathlib.Path.open` calls in `unspecified-encoding` (`PLW1514`) (#11288) 2024-05-09 12:36:20 +00:00
useless_else_on_loop.py [`pylint`] Add fix for `useless-else-on-loop` (`PLW0120`) (#9590) 2024-01-21 11:17:58 -05:00
useless_exception_statement.py Improve detection of whether a symbol refers to a builtin exception (#13215) 2024-09-03 10:33:03 +00:00
useless_return.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
useless_with_lock.py [pylint] Implement `useless-with-lock` (#8321) 2023-10-29 16:24:52 +00:00
yield_from_in_async_function.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00
yield_in_init.py Rename `ruff` crate to `ruff_linter` (#7529) 2023-09-20 08:38:27 +02:00