From: Ɓukasz Langa Date: Tue, 8 May 2018 01:46:16 +0000 (-0700) Subject: Don't fail the entire right_hand_split if an optional split failed X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/0967dfcbeba8aceaacd468b279cc23089d697878?ds=sidebyside;pf=etc Don't fail the entire right_hand_split if an optional split failed Fixes splitting long import lines with only a single name. --- diff --git a/.flake8 b/.flake8 index fae93b0..c286ad0 100644 --- a/.flake8 +++ b/.flake8 @@ -4,5 +4,5 @@ [flake8] ignore = E203, E266, E501, W503 max-line-length = 80 -max-complexity = 15 +max-complexity = 18 select = B,C,E,F,W,T4,B9 diff --git a/README.md b/README.md index 3099059..a9ec9ea 100644 --- a/README.md +++ b/README.md @@ -547,6 +547,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md). * fixed non-deterministic formatting when multiple pairs of removable parentheses were used (#183) +* fixed not splitting long from-imports with only a single name + ### 18.4a4 diff --git a/black.py b/black.py index c10eb39..d2d23c8 100644 --- a/black.py +++ b/black.py @@ -41,7 +41,7 @@ from blib2to3 import pygram, pytree from blib2to3.pgen2 import driver, token from blib2to3.pgen2.parse import ParseError -__version__ = "18.4a5" +__version__ = "18.4a6" DEFAULT_LINE_LENGTH = 88 # types @@ -1830,7 +1830,8 @@ def left_hand_split(line: Line, py36: bool = False) -> Iterator[Line]: """Split line into many lines, starting with the first matching bracket pair. Note: this usually looks weird, only use this for function definitions. - Prefer RHS otherwise. + Prefer RHS otherwise. This is why this function is not symmetrical with + :func:`right_hand_split` which also handles optional parentheses. """ head = Line(depth=line.depth) body = Line(depth=line.depth + 1, inside_brackets=True) @@ -1870,7 +1871,10 @@ def left_hand_split(line: Line, py36: bool = False) -> Iterator[Line]: def right_hand_split( line: Line, py36: bool = False, omit: Collection[LeafID] = () ) -> Iterator[Line]: - """Split line into many lines, starting with the last matching bracket pair.""" + """Split line into many lines, starting with the last matching bracket pair. + + If the split was by optional parentheses, attempt splitting without them, too. + """ head = Line(depth=line.depth) body = Line(depth=line.depth + 1, inside_brackets=True) tail = Line(depth=line.depth) @@ -1909,20 +1913,25 @@ def right_hand_split( bracket_split_succeeded_or_raise(head, body, tail) assert opening_bracket and closing_bracket if ( + # the opening bracket is an optional paren opening_bracket.type == token.LPAR and not opening_bracket.value + # the closing bracket is an optional paren and closing_bracket.type == token.RPAR and not closing_bracket.value + # there are no delimiters or standalone comments in the body + and not body.bracket_tracker.delimiters + and not line.contains_standalone_comments(0) + # and it's not an import (optional parens are the only thing we can split + # on in this case; attempting a split without them is a waste of time) + and not line.is_import ): - # These parens were optional. If there aren't any delimiters or standalone - # comments in the body, they were unnecessary and another split without - # them should be attempted. - if not ( - body.bracket_tracker.delimiters or line.contains_standalone_comments(0) - ): - omit = {id(closing_bracket), *omit} + omit = {id(closing_bracket), *omit} + try: yield from right_hand_split(line, py36=py36, omit=omit) return + except CannotSplit: + pass ensure_visible(opening_bracket) ensure_visible(closing_bracket) diff --git a/tests/import_spacing.py b/tests/import_spacing.py index cc17405..cefa1e9 100644 --- a/tests/import_spacing.py +++ b/tests/import_spacing.py @@ -23,6 +23,7 @@ from ..streams import * from some_library import ( Just, Enough, Libraries, To, Fit, In, This, Nice, Split, Which, We, No, Longer, Use ) +from name_of_a_company.extremely_long_project_name.component.ttypes import CuteLittleServiceHandlerFactoryyy from .a.b.c.subprocess import * from . import (tasks) @@ -83,6 +84,9 @@ from some_library import ( Longer, Use, ) +from name_of_a_company.extremely_long_project_name.component.ttypes import ( + CuteLittleServiceHandlerFactoryyy +) from .a.b.c.subprocess import * from . import tasks