From afd5edfd1e539a3d2dd6bcafe844d2a8759c0693 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Wed, 5 Jun 2024 23:42:25 +0200 Subject: [PATCH] [multiple-statements] Make pylint compatible with black's 2024 style (#9697) * Add more test cases to cover pass / ... * Define the confidence as HIGH * Exclude the class with Ellipsis from the check Closes #9398 --- doc/whatsnew/fragments/9398.false_positive | 4 ++++ pylint/checkers/format.py | 11 +++++------ tests/functional/m/multiple_statements.py | 15 +++++++++++++++ tests/functional/m/multiple_statements.txt | 15 ++++++++++----- .../m/multiple_statements_single_line.py | 15 ++++++++++++++- .../m/multiple_statements_single_line.txt | 6 ++++-- 6 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 doc/whatsnew/fragments/9398.false_positive diff --git a/doc/whatsnew/fragments/9398.false_positive b/doc/whatsnew/fragments/9398.false_positive new file mode 100644 index 0000000000..12069d6478 --- /dev/null +++ b/doc/whatsnew/fragments/9398.false_positive @@ -0,0 +1,4 @@ +Classes with only an Ellipsis (``...``) in their body do not trigger 'multiple-statements' +anymore if they are inlined (in accordance with black's 2024 style). + +Closes #9398 diff --git a/pylint/checkers/format.py b/pylint/checkers/format.py index f4de616598..f8aecbda64 100644 --- a/pylint/checkers/format.py +++ b/pylint/checkers/format.py @@ -522,9 +522,8 @@ def visit_default(self, node: nodes.NodeNG) -> None: def _check_multi_statement_line(self, node: nodes.NodeNG, line: int) -> None: """Check for lines containing multiple statements.""" - # Do not warn about multiple nested context managers - # in with statements. if isinstance(node, nodes.With): + # Do not warn about multiple nested context managers in with statements. return if ( isinstance(node.parent, nodes.If) @@ -539,16 +538,16 @@ def _check_multi_statement_line(self, node: nodes.NodeNG, line: int) -> None: ): return - # Functions stubs with ``Ellipsis`` as body are exempted. + # Functions stubs and class with ``Ellipsis`` as body are exempted. if ( - isinstance(node.parent, nodes.FunctionDef) - and isinstance(node, nodes.Expr) + isinstance(node, nodes.Expr) + and isinstance(node.parent, (nodes.FunctionDef, nodes.ClassDef)) and isinstance(node.value, nodes.Const) and node.value.value is Ellipsis ): return - self.add_message("multiple-statements", node=node) + self.add_message("multiple-statements", node=node, confidence=HIGH) self._visited_lines[line] = 2 def check_trailing_whitespace_ending(self, line: str, i: int) -> None: diff --git a/tests/functional/m/multiple_statements.py b/tests/functional/m/multiple_statements.py index c3252f797c..cc0a53e111 100644 --- a/tests/functional/m/multiple_statements.py +++ b/tests/functional/m/multiple_statements.py @@ -4,13 +4,28 @@ from typing import overload +if True: print("Golfing sure is nice") # [multiple-statements] if True: pass # [multiple-statements] +if True: ... # [multiple-statements] + +if True: print("Golfing sure is nice") # [multiple-statements] +else: + pass if True: pass # [multiple-statements] else: pass +if True: ... # [multiple-statements] +else: + pass + +# The following difference in behavior is due to black 2024's style +# that reformat pass on multiple line but reformat "..." on a single line +# (only for classes, not for the examples above) +class MyException(Exception): print("Golfing sure is nice") # [multiple-statements] class MyError(Exception): pass # [multiple-statements] +class DebugTrueDetected(Exception): ... class MyError(Exception): a='a' # [multiple-statements] diff --git a/tests/functional/m/multiple_statements.txt b/tests/functional/m/multiple_statements.txt index 661314268d..6b5be1adf6 100644 --- a/tests/functional/m/multiple_statements.txt +++ b/tests/functional/m/multiple_statements.txt @@ -1,5 +1,10 @@ -multiple-statements:7:9:7:13::More than one statement on a single line:UNDEFINED -multiple-statements:9:9:9:13::More than one statement on a single line:UNDEFINED -multiple-statements:13:26:13:30:MyError:More than one statement on a single line:UNDEFINED -multiple-statements:15:26:15:31:MyError:More than one statement on a single line:UNDEFINED -multiple-statements:17:26:17:31:MyError:More than one statement on a single line:UNDEFINED +multiple-statements:7:9:7:38::More than one statement on a single line:HIGH +multiple-statements:8:9:8:13::More than one statement on a single line:HIGH +multiple-statements:9:9:9:12::More than one statement on a single line:HIGH +multiple-statements:11:9:11:38::More than one statement on a single line:HIGH +multiple-statements:15:9:15:13::More than one statement on a single line:HIGH +multiple-statements:19:9:19:12::More than one statement on a single line:HIGH +multiple-statements:26:30:26:59:MyException:More than one statement on a single line:HIGH +multiple-statements:27:26:27:30:MyError:More than one statement on a single line:HIGH +multiple-statements:30:26:30:31:MyError:More than one statement on a single line:HIGH +multiple-statements:32:26:32:31:MyError:More than one statement on a single line:HIGH diff --git a/tests/functional/m/multiple_statements_single_line.py b/tests/functional/m/multiple_statements_single_line.py index 93a470702c..8b39d631bd 100644 --- a/tests/functional/m/multiple_statements_single_line.py +++ b/tests/functional/m/multiple_statements_single_line.py @@ -4,19 +4,32 @@ from typing import overload +if True: print("Golfing sure is nice") if True: pass +if True: ... + +if True: print("Golfing sure is nice") # [multiple-statements] +else: + pass if True: pass # [multiple-statements] else: pass +if True: ... # [multiple-statements] +else: + pass + +class MyException(Exception): print("Golfing sure is nice") class MyError(Exception): pass +class DebugTrueDetected(Exception): ... + class MyError(Exception): a='a' class MyError(Exception): a='a'; b='b' # [multiple-statements] -try: +try: #@ pass except: pass diff --git a/tests/functional/m/multiple_statements_single_line.txt b/tests/functional/m/multiple_statements_single_line.txt index cac2f7eb2e..8d19c72516 100644 --- a/tests/functional/m/multiple_statements_single_line.txt +++ b/tests/functional/m/multiple_statements_single_line.txt @@ -1,2 +1,4 @@ -multiple-statements:9:9:9:13::More than one statement on a single line:UNDEFINED -multiple-statements:17:26:17:31:MyError:More than one statement on a single line:UNDEFINED +multiple-statements:11:9:11:38::More than one statement on a single line:HIGH +multiple-statements:15:9:15:13::More than one statement on a single line:HIGH +multiple-statements:19:9:19:12::More than one statement on a single line:HIGH +multiple-statements:30:26:30:31:MyError:More than one statement on a single line:HIGH