From e42f9921e291790202147c1e3dc1a3df7036c652 Mon Sep 17 00:00:00 2001 From: Richard Si <63936253+ichard26@users.noreply.github.com> Date: Tue, 4 May 2021 04:46:46 -0400 Subject: [PATCH] Detect `'@' dotted_name '(' ')' NEWLINE` as a simple decorator (#2182) Previously the RELAXED_DECORATOR detection would be falsely True on that example. The problem was that an argument-less parentheses pair didn't pass the `is_simple_decorator_trailer` check even it should. OTOH a parentheses pair containing an argument or more passed as expected. --- CHANGES.md | 3 +++ src/black/__init__.py | 7 +++++++ tests/data/decorators.py | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 7741d92..00d6782 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,9 @@ - Set `--pyi` mode if `--stdin-filename` ends in `.pyi` (#2169) - Add `--no-diff` to black-primer to suppress formatting changes (#2187) +- Stop detecting target version as Python 3.9+ with pre-PEP-614 decorators that are + being called but with no arguments (#2182) + ### 21.4b2 #### _Black_ diff --git a/src/black/__init__.py b/src/black/__init__.py index 49d088b..cf25787 100644 --- a/src/black/__init__.py +++ b/src/black/__init__.py @@ -5761,6 +5761,13 @@ def is_simple_decorator_trailer(node: LN, last: bool = False) -> bool: and node.children[0].type == token.DOT and node.children[1].type == token.NAME ) + # last trailer can be an argument-less parentheses pair + or ( + last + and len(node.children) == 2 + and node.children[0].type == token.LPAR + and node.children[1].type == token.RPAR + ) # last trailer can be arguments or ( last diff --git a/tests/data/decorators.py b/tests/data/decorators.py index acfad51..a0f38ca 100644 --- a/tests/data/decorators.py +++ b/tests/data/decorators.py @@ -13,6 +13,12 @@ def f(): ## +@decorator() +def f(): + ... + +## + @decorator(arg) def f(): ... -- 2.39.2