Enhance the type comment patch

This commit is contained in:
Łukasz Langa 2019-03-14 16:26:06 +01:00
parent ca679cd177
commit ca9ad698ef
No known key found for this signature in database
GPG Key ID: B26995E310250568
4 changed files with 63 additions and 13 deletions

View File

@ -948,6 +948,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).
* long `del` statements are now split into multiple lines (#698) * 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) * improved performance of formatting deeply nested data structures (#509)
* `blackd` now supports CORS (#622) * `blackd` now supports CORS (#622)
@ -1370,5 +1372,6 @@ Multiple contributions by:
* [Peter Bengtsson](mailto:mail@peterbe.com) * [Peter Bengtsson](mailto:mail@peterbe.com)
* [Stavros Korokithakis](mailto:hi@stavros.io) * [Stavros Korokithakis](mailto:hi@stavros.io)
* [Sunil Kapil](mailto:snlkapil@gmail.com) * [Sunil Kapil](mailto:snlkapil@gmail.com)
* [Utsav Shah](mailto:ukshah2@illinois.edu)
* [Vishwas B Sharma](mailto:sharma.vishwas88@gmail.com) * [Vishwas B Sharma](mailto:sharma.vishwas88@gmail.com)
* [Chuck Wooters](mailto:chuck.wooters@microsoft.com) * [Chuck Wooters](mailto:chuck.wooters@microsoft.com)

View File

@ -1192,6 +1192,29 @@ def contains_standalone_comments(self, depth_limit: int = sys.maxsize) -> bool:
if leaf.type == STANDALONE_COMMENT: if leaf.type == STANDALONE_COMMENT:
if leaf.bracket_depth <= depth_limit: if leaf.bracket_depth <= depth_limit:
return True 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 return False
@ -2135,16 +2158,8 @@ def split_line(
line_str = str(line).strip("\n") 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 ( if (
not has_special_comment not line.contains_inner_type_comments()
and not line.should_explode and not line.should_explode
and is_line_short_enough(line, line_length=line_length, line_str=line_str) 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. """Return True if the given leaf is a special comment.
Only returns true for type comments for now.""" Only returns true for type comments for now."""
t = leaf.type t = leaf.type
v = leaf.value v = leaf.value
return bool( return t in {token.COMMENT, t == STANDALONE_COMMENT} and v.startswith("# type:")
(t == token.COMMENT or t == STANDALONE_COMMENT) and (v.startswith("# type:"))
)
def normalize_prefix(leaf: Leaf, *, inside_brackets: bool) -> None: def normalize_prefix(leaf: Leaf, *, inside_brackets: bool) -> None:

View File

@ -65,12 +65,18 @@ def inline_comments_in_brackets_ruin_everything():
body, body,
children[-1], # )1 children[-1], # )1
] ]
parameters.children = [
children[0],
body,
children[-1], # type: ignore
]
else: else:
parameters.children = [ parameters.children = [
parameters.children[0], # (2 what if this was actually long parameters.children[0], # (2 what if this was actually long
body, body,
parameters.children[-1], # )2 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 if (self._proc is not None
# has the child process finished? # has the child process finished?
and self._returncode is None and self._returncode is None
@ -217,12 +223,22 @@ def inline_comments_in_brackets_ruin_everything():
def inline_comments_in_brackets_ruin_everything(): def inline_comments_in_brackets_ruin_everything():
if typedargslist: if typedargslist:
parameters.children = [children[0], body, children[-1]] # (1 # )1 parameters.children = [children[0], body, children[-1]] # (1 # )1
parameters.children = [
children[0],
body,
children[-1], # type: ignore
]
else: else:
parameters.children = [ parameters.children = [
parameters.children[0], # (2 what if this was actually long parameters.children[0], # (2 what if this was actually long
body, body,
parameters.children[-1], # )2 parameters.children[-1], # )2
] ]
parameters.children = [
parameters.what_if_this_was_actually_long.children[0],
body,
parameters.children[-1],
] # type: ignore
if ( if (
self._proc is not None self._proc is not None
# has the child process finished? # has the child process finished?

View File

@ -52,6 +52,7 @@ def f(
another_really_really_long_element_with_a_unnecessarily_long_name_to_describe_what_it_does_enterprise_style = ( another_really_really_long_element_with_a_unnecessarily_long_name_to_describe_what_it_does_enterprise_style = (
3 3
) # type: int ) # type: int
an_element_with_a_long_value = calls() or more_calls() and more() # type: bool
tup = ( tup = (
another_element, # type: int another_element, # type: int
@ -66,3 +67,20 @@ def f(
+ another_element + another_element
+ another_element_with_long_name + another_element_with_long_name
) # type: int ) # 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
)