]> git.madduck.net Git - etc/vim.git/commitdiff

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Enhance the type comment patch
authorŁukasz Langa <lukasz@langa.pl>
Thu, 14 Mar 2019 15:26:06 +0000 (16:26 +0100)
committerŁukasz Langa <lukasz@langa.pl>
Thu, 14 Mar 2019 15:26:41 +0000 (16:26 +0100)
README.md
black.py
tests/data/comments2.py
tests/data/comments6.py

index 00218b63c3d5c2bb1110f6d70939d47c4010c947..549003839c92f51c0d580daec1596d1524d7f3dd 100644 (file)
--- a/README.md
+++ b/README.md
@@ -948,6 +948,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).
 
 * long `del` statements are now split into multiple lines (#698)
 
+* type comments are no longer mangled in function signatures
+
 * improved performance of formatting deeply nested data structures (#509)
 
 * `blackd` now supports CORS (#622)
@@ -1370,5 +1372,6 @@ Multiple contributions by:
 * [Peter Bengtsson](mailto:mail@peterbe.com)
 * [Stavros Korokithakis](mailto:hi@stavros.io)
 * [Sunil Kapil](mailto:snlkapil@gmail.com)
+* [Utsav Shah](mailto:ukshah2@illinois.edu)
 * [Vishwas B Sharma](mailto:sharma.vishwas88@gmail.com)
 * [Chuck Wooters](mailto:chuck.wooters@microsoft.com)
index db1b2b6caa4192bd1a5e1479a680bf2b6f5689b5..31e629b90f9b84b3dbea1747a618b9ba04ac5620 100644 (file)
--- a/black.py
+++ b/black.py
@@ -1192,6 +1192,29 @@ class Line:
             if leaf.type == STANDALONE_COMMENT:
                 if leaf.bracket_depth <= depth_limit:
                     return True
+        return False
+
+    def contains_inner_type_comments(self) -> bool:
+        ignored_ids = set()
+        try:
+            last_leaf = self.leaves[-1]
+            ignored_ids.add(id(last_leaf))
+            if last_leaf.type == token.COMMA:
+                # When trailing commas are inserted by Black for consistency, comments
+                # after the previous last element are not moved (they don't have to,
+                # rendering will still be correct).  So we ignore trailing commas.
+                last_leaf = self.leaves[-2]
+                ignored_ids.add(id(last_leaf))
+        except IndexError:
+            return False
+
+        for leaf_id, comments in self.comments.items():
+            if leaf_id in ignored_ids:
+                continue
+
+            for comment in comments:
+                if is_type_comment(comment):
+                    return True
 
         return False
 
@@ -2135,16 +2158,8 @@ def split_line(
 
     line_str = str(line).strip("\n")
 
-    # we don't want to split special comments like type annotations
-    # https://github.com/python/typing/issues/186
-    has_special_comment = False
-    for leaf in line.leaves:
-        for comment in line.comments_after(leaf):
-            if leaf.type == token.COMMA and is_special_comment(comment):
-                has_special_comment = True
-
     if (
-        not has_special_comment
+        not line.contains_inner_type_comments()
         and not line.should_explode
         and is_line_short_enough(line, line_length=line_length, line_str=line_str)
     ):
@@ -2520,14 +2535,12 @@ def is_import(leaf: Leaf) -> bool:
     )
 
 
-def is_special_comment(leaf: Leaf) -> bool:
+def is_type_comment(leaf: Leaf) -> bool:
     """Return True if the given leaf is a special comment.
     Only returns true for type comments for now."""
     t = leaf.type
     v = leaf.value
-    return bool(
-        (t == token.COMMENT or t == STANDALONE_COMMENT) and (v.startswith("# type:"))
-    )
+    return t in {token.COMMENT, t == STANDALONE_COMMENT} and v.startswith("# type:")
 
 
 def normalize_prefix(leaf: Leaf, *, inside_brackets: bool) -> None:
index 53d4881f1807beea419af713840832f79bd5f5d1..54b7b0018c9390f0995afa8e481c394a1b706ad7 100644 (file)
@@ -65,12 +65,18 @@ def inline_comments_in_brackets_ruin_everything():
             body,
             children[-1],  # )1
         ]
+        parameters.children = [
+            children[0],
+            body,
+            children[-1],  # type: ignore
+        ]
     else:
         parameters.children = [
             parameters.children[0],  # (2 what if this was actually long
             body,
             parameters.children[-1],  # )2
         ]
+        parameters.children = [parameters.what_if_this_was_actually_long.children[0], body, parameters.children[-1]]  # type: ignore
     if (self._proc is not None
             # has the child process finished?
             and self._returncode is None
@@ -217,12 +223,22 @@ else:
 def inline_comments_in_brackets_ruin_everything():
     if typedargslist:
         parameters.children = [children[0], body, children[-1]]  # (1  # )1
+        parameters.children = [
+            children[0],
+            body,
+            children[-1],  # type: ignore
+        ]
     else:
         parameters.children = [
             parameters.children[0],  # (2 what if this was actually long
             body,
             parameters.children[-1],  # )2
         ]
+        parameters.children = [
+            parameters.what_if_this_was_actually_long.children[0],
+            body,
+            parameters.children[-1],
+        ]  # type: ignore
     if (
         self._proc is not None
         # has the child process finished?
index 770e3cc8837c4a445162ba6c528a25c8bc21073c..0a0bf469348c64b216e72c50e4038f3d47c32ad6 100644 (file)
@@ -52,6 +52,7 @@ def f(
     another_really_really_long_element_with_a_unnecessarily_long_name_to_describe_what_it_does_enterprise_style = (
         3
     )  # type: int
+    an_element_with_a_long_value = calls() or more_calls() and more()  # type: bool
 
     tup = (
         another_element,  # type: int
@@ -66,3 +67,20 @@ def f(
         + another_element
         + another_element_with_long_name
     )  # type: int
+
+
+def func(
+    a=some_list[0],  # type: int
+):  # type: () -> int
+    c = call(
+        0.0123,
+        0.0456,
+        0.0789,
+        0.0123,
+        0.0456,
+        0.0789,
+        0.0123,
+        0.0456,
+        0.0789,
+        a[-1],  # type: ignore
+    )
\ No newline at end of file