From 6ba615092e0b323072058f0a90bb7ab301957b7f Mon Sep 17 00:00:00 2001
From: =?utf8?q?=C5=81ukasz=20Langa?= <lukasz@langa.pl>
Date: Fri, 16 Mar 2018 17:09:23 -0700
Subject: [PATCH] Ignore empty bracket pairs while splitting

Fixes #35
---
 black.py          | 31 +++++++++++--------------------
 tests/function.py | 16 +++++++++++++++-
 2 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/black.py b/black.py
index 48ba0a2..b343da7 100644
--- a/black.py
+++ b/black.py
@@ -1178,7 +1178,7 @@ def left_hand_split(line: Line, py36: bool = False) -> Iterator[Line]:
             leaf.type in CLOSING_BRACKETS and
             leaf.opening_bracket is matching_bracket
         ):
-            current_leaves = tail_leaves
+            current_leaves = tail_leaves if body_leaves else head_leaves
         current_leaves.append(leaf)
         if current_leaves is head_leaves:
             if leaf.type in OPENING_BRACKETS:
@@ -1196,18 +1196,7 @@ def left_hand_split(line: Line, py36: bool = False) -> Iterator[Line]:
             comment_after = line.comments.get(id(leaf))
             if comment_after:
                 result.append(comment_after, preformatted=True)
-    # Check if the split succeeded.
-    tail_len = len(str(tail))
-    if not body:
-        if tail_len == 0:
-            raise CannotSplit("Splitting brackets produced the same line")
-
-        elif tail_len < 3:
-            raise CannotSplit(
-                f"Splitting brackets on an empty body to save "
-                f"{tail_len} characters is not worth it"
-            )
-
+    split_succeeded_or_raise(head, body, tail)
     for result in (head, body, tail):
         if result:
             yield result
@@ -1226,7 +1215,7 @@ def right_hand_split(line: Line, py36: bool = False) -> Iterator[Line]:
     for leaf in reversed(line.leaves):
         if current_leaves is body_leaves:
             if leaf is opening_bracket:
-                current_leaves = head_leaves
+                current_leaves = head_leaves if body_leaves else tail_leaves
         current_leaves.append(leaf)
         if current_leaves is tail_leaves:
             if leaf.type in CLOSING_BRACKETS:
@@ -1247,8 +1236,14 @@ def right_hand_split(line: Line, py36: bool = False) -> Iterator[Line]:
             comment_after = line.comments.get(id(leaf))
             if comment_after:
                 result.append(comment_after, preformatted=True)
-    # Check if the split succeeded.
-    tail_len = len(str(tail).strip('\n'))
+    split_succeeded_or_raise(head, body, tail)
+    for result in (head, body, tail):
+        if result:
+            yield result
+
+
+def split_succeeded_or_raise(head: Line, body: Line, tail: Line) -> None:
+    tail_len = len(str(tail).strip())
     if not body:
         if tail_len == 0:
             raise CannotSplit("Splitting brackets produced the same line")
@@ -1259,10 +1254,6 @@ def right_hand_split(line: Line, py36: bool = False) -> Iterator[Line]:
                 f"{tail_len} characters is not worth it"
             )
 
-    for result in (head, body, tail):
-        if result:
-            yield result
-
 
 def delimiter_split(line: Line, py36: bool = False) -> Iterator[Line]:
     """Split according to delimiters of the highest priority.
diff --git a/tests/function.py b/tests/function.py
index abe2200..29de408 100644
--- a/tests/function.py
+++ b/tests/function.py
@@ -32,7 +32,13 @@ def spaces(a=1, b=(), c=[], d={}, e=True, f=-1, g=1 if False else 2, h="", i=r''
  assert task._cancel_stack[:len(old_stack)] == old_stack
 def spaces2(result= _core.Value(None)):
  ...
-
+def example(session):
+    result = session.query(models.Customer.id).filter(
+        models.Customer.account_id == account_id,
+        models.Customer.email == email_address,
+    ).order_by(
+        models.Customer.id.asc(),
+    ).all()
 def long_lines():
     if True:
         typedargslist.extend(
@@ -119,6 +125,14 @@ def spaces2(result=_core.Value(None)):
     ...
 
 
+def example(session):
+    result = session.query(models.Customer.id).filter(
+        models.Customer.account_id == account_id, models.Customer.email == email_address
+    ).order_by(
+        models.Customer.id.asc(),
+    ).all()
+
+
 def long_lines():
     if True:
         typedargslist.extend(
-- 
2.39.5