Don't break long lines when type: ignore is present (#1040)

Fixes #997.
This commit is contained in:
Michael J. Sullivan 2019-10-02 18:57:49 -07:00 committed by Jelle Zijlstra
parent c5637a7085
commit d9e71a75cc
5 changed files with 84 additions and 16 deletions

View File

@ -1325,6 +1325,28 @@ def contains_uncollapsable_type_comments(self) -> bool:
return False return False
def contains_unsplittable_type_ignore(self) -> bool:
if not self.leaves:
return False
# If a 'type: ignore' is attached to the end of a line, we
# can't split the line, because we can't know which of the
# subexpressions the ignore was meant to apply to.
#
# We only want this to apply to actual physical lines from the
# original source, though: we don't want the presence of a
# 'type: ignore' at the end of a multiline expression to
# justify pushing it all onto one line. Thus we
# (unfortunately) need to check the actual source lines and
# only report an unsplittable 'type: ignore' if this line was
# one line in the original code.
if self.leaves[0].lineno == self.leaves[-1].lineno:
for comment in self.comments.get(id(self.leaves[-1]), []):
if is_type_comment(comment, " ignore"):
return True
return False
def contains_multiline_strings(self) -> bool: def contains_multiline_strings(self) -> bool:
for leaf in self.leaves: for leaf in self.leaves:
if is_multiline_string(leaf): if is_multiline_string(leaf):
@ -2332,7 +2354,10 @@ def split_line(
if ( if (
not line.contains_uncollapsable_type_comments() not line.contains_uncollapsable_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)
or line.contains_unsplittable_type_ignore()
)
): ):
yield line yield line
return return
@ -2705,12 +2730,14 @@ def is_import(leaf: Leaf) -> bool:
) )
def is_type_comment(leaf: Leaf) -> bool: def is_type_comment(leaf: Leaf, suffix: str = "") -> 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 t in {token.COMMENT, t == STANDALONE_COMMENT} and v.startswith("# type:") return t in {token.COMMENT, t == STANDALONE_COMMENT} and v.startswith(
"# type:" + suffix
)
def normalize_prefix(leaf: Leaf, *, inside_brackets: bool) -> None: def normalize_prefix(leaf: Leaf, *, inside_brackets: bool) -> None:

View File

@ -99,5 +99,9 @@ def func(
a[-1], # type: ignore a[-1], # type: ignore
) )
c = call(
"aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa" # type: ignore
)
result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa

View File

@ -36,6 +36,25 @@
result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa
def func():
c = call(
0.0123,
0.0456,
0.0789,
0.0123,
0.0789,
a[-1], # type: ignore
)
# The type: ignore exception only applies to line length, not
# other types of formatting.
c = call(
"aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", # type: ignore
"aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa"
)
# output # output
from .config import ( from .config import (
@ -71,3 +90,26 @@
result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa
result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa
def func():
c = call(
0.0123, 0.0456, 0.0789, 0.0123, 0.0789, a[-1] # type: ignore
)
# The type: ignore exception only applies to line length, not
# other types of formatting.
c = call(
"aaaaaaaa",
"aaaaaaaa",
"aaaaaaaa",
"aaaaaaaa",
"aaaaaaaa",
"aaaaaaaa", # type: ignore
"aaaaaaaa",
"aaaaaaaa",
"aaaaaaaa",
"aaaaaaaa",
"aaaaaaaa",
"aaaaaaaa",
)

View File

@ -118,7 +118,7 @@
call(**self.screen_kwargs) call(**self.screen_kwargs)
call(b, **self.screen_kwargs) call(b, **self.screen_kwargs)
lukasz.langa.pl lukasz.langa.pl
@@ -94,23 +115,25 @@ @@ -94,23 +115,23 @@
1.0 .real 1.0 .real
....__class__ ....__class__
list[str] list[str]
@ -132,15 +132,12 @@
xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore
sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__) sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
) )
-xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore
- sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__) sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
-) )
xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[ -xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[
..., List[SomeClass] - ..., List[SomeClass]
-] = classmethod(sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)) # type: ignore -] = classmethod(sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)) # type: ignore
+] = classmethod( # type: ignore
+ sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
+)
+xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( +xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod(
+ sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__) + sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
+) # type: ignore +) # type: ignore
@ -149,7 +146,7 @@
slice[0:1:2] slice[0:1:2]
slice[:] slice[:]
slice[:-1] slice[:-1]
@@ -134,113 +157,171 @@ @@ -134,113 +155,171 @@
numpy[-(c + 1) :, d] numpy[-(c + 1) :, d]
numpy[:, l[-2]] numpy[:, l[-2]]
numpy[:, ::-1] numpy[:, ::-1]

View File

@ -374,9 +374,7 @@ async def f():
xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore
sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__) sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
) )
xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[ xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore
..., List[SomeClass]
] = classmethod( # type: ignore
sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__) sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
) )
xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod(