From 776aa2faa4124ae23a9efacbb4476de60d5a78e3 Mon Sep 17 00:00:00 2001 From: Richard Si <63936253+ichard26@users.noreply.github.com> Date: Sun, 2 May 2021 23:17:11 -0400 Subject: [PATCH] Detect `'@' dotted_name '(' ')' NEWLINE` as a simple decorator 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 321f8c083b2..899b102d95c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,9 @@ - Set `--pyi` mode if `--stdin-filename` ends in `.pyi` (#2169) +- 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 49d088b531d..cf257876c03 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 acfad51fcb8..a0f38ca7b9d 100644 --- a/tests/data/decorators.py +++ b/tests/data/decorators.py @@ -13,6 +13,12 @@ def f(): ## +@decorator() +def f(): + ... + +## + @decorator(arg) def f(): ...