]>
git.madduck.net Git - etc/vim.git/blobdiff - src/black/lines.py
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:
is_multiline_string,
is_one_sequence_between,
is_type_comment,
is_multiline_string,
is_one_sequence_between,
is_type_comment,
+ is_type_ignore_comment,
is_with_or_async_with_stmt,
replace_child,
syms,
whitespace,
)
is_with_or_async_with_stmt,
replace_child,
syms,
whitespace,
)
+from black.strings import str_width
from blib2to3.pgen2 import token
from blib2to3.pytree import Leaf, Node
from blib2to3.pgen2 import token
from blib2to3.pytree import Leaf, Node
class Line:
"""Holds leaves and comments. Can be printed with `str(line)`."""
class Line:
"""Holds leaves and comments. Can be printed with `str(line)`."""
+ mode: Mode = field(repr=False)
depth: int = 0
leaves: List[Leaf] = field(default_factory=list)
# keys ordered like `leaves`
depth: int = 0
leaves: List[Leaf] = field(default_factory=list)
# keys ordered like `leaves`
for comment in comments:
if is_type_comment(comment):
if comment_seen or (
for comment in comments:
if is_type_comment(comment):
if comment_seen or (
- not is_type_comment(comment, " ignore" )
+ not is_type_ignore_comment(comment )
and leaf_id not in ignored_ids
):
return True
and leaf_id not in ignored_ids
):
return True
# line.
for node in self.leaves[-2:]:
for comment in self.comments.get(id(node), []):
# line.
for node in self.leaves[-2:]:
for comment in self.comments.get(id(node), []):
- if is_type_comment(comment, " ignore" ):
+ if is_type_ignore_comment(comment ):
mode: Mode
previous_line: Optional[Line] = None
previous_block: Optional[LinesBlock] = None
mode: Mode
previous_line: Optional[Line] = None
previous_block: Optional[LinesBlock] = None
- previous_defs: List[int ] = field(default_factory=list)
+ previous_defs: List[Line ] = field(default_factory=list)
semantic_leading_comment: Optional[LinesBlock] = None
def maybe_empty_lines(self, current_line: Line) -> LinesBlock:
semantic_leading_comment: Optional[LinesBlock] = None
def maybe_empty_lines(self, current_line: Line) -> LinesBlock:
else:
before = 0
depth = current_line.depth
else:
before = 0
depth = current_line.depth
- while self.previous_defs and self.previous_defs[-1] >= depth:
+
+ previous_def = None
+ while self.previous_defs and self.previous_defs[-1].depth >= depth:
+ previous_def = self.previous_defs.pop()
+
+ if previous_def is not None:
+ assert self.previous_line is not None
- assert self.previous_line is not None
if depth and not current_line.is_def and self.previous_line.is_def:
# Empty lines between attributes and methods should be preserved.
before = min(1, before)
if depth and not current_line.is_def and self.previous_line.is_def:
# Empty lines between attributes and methods should be preserved.
before = min(1, before)
+ elif (
+ Preview.blank_line_after_nested_stub_class in self.mode
+ and previous_def.is_class
+ and not previous_def.is_stub_class
+ ):
+ before = 1
elif depth:
before = 0
else:
elif depth:
before = 0
else:
before = 1
elif (
not depth
before = 1
elif (
not depth
- and self.previous_defs[-1]
and current_line.leaves[-1].type == token.COLON
and (
current_line.leaves[0].value
and current_line.leaves[-1].type == token.COLON
and (
current_line.leaves[0].value
before = 1
else:
before = 2
before = 1
else:
before = 2
- self.previous_defs.pop()
if current_line.is_decorator or current_line.is_def or current_line.is_class:
return self._maybe_empty_lines_for_class_or_def(current_line, before)
if current_line.is_decorator or current_line.is_def or current_line.is_class:
return self._maybe_empty_lines_for_class_or_def(current_line, before)
and self.previous_line.is_class
and current_line.is_triple_quoted_string
):
and self.previous_line.is_class
and current_line.is_triple_quoted_string
):
+ if Preview.no_blank_line_before_class_docstring in current_line.mode:
+ return 0, 1
return before, 1
if self.previous_line and self.previous_line.opens_block:
return before, 1
if self.previous_line and self.previous_line.opens_block:
self, current_line: Line, before: int
) -> Tuple[int, int]:
if not current_line.is_decorator:
self, current_line: Line, before: int
) -> Tuple[int, int]:
if not current_line.is_decorator:
- self.previous_defs.append(current_line.depth )
+ self.previous_defs.append(current_line)
if self.previous_line is None:
# Don't insert empty lines before the first line in the file.
return 0, 0
if self.previous_line is None:
# Don't insert empty lines before the first line in the file.
return 0, 0
if not line_str:
line_str = line_to_string(line)
if not line_str:
line_str = line_to_string(line)
+ width = str_width if mode.preview else len
+
if Preview.multiline_string_handling not in mode:
return (
if Preview.multiline_string_handling not in mode:
return (
- len (line_str) <= mode.line_length
+ width (line_str) <= mode.line_length
and "\n" not in line_str # multiline strings
and not line.contains_standalone_comments()
)
and "\n" not in line_str # multiline strings
and not line.contains_standalone_comments()
)
return False
if "\n" not in line_str:
# No multiline strings (MLS) present
return False
if "\n" not in line_str:
# No multiline strings (MLS) present
- return len (line_str) <= mode.line_length
+ return width (line_str) <= mode.line_length
first, *_, last = line_str.split("\n")
first, *_, last = line_str.split("\n")
- if len(first) > mode.line_length or len (last) > mode.line_length:
+ if width(first) > mode.line_length or width (last) > mode.line_length:
return False
# Traverse the AST to examine the context of the multiline string (MLS),
return False
# Traverse the AST to examine the context of the multiline string (MLS),
# store the leaves that contain parts of the MLS
multiline_string_contexts: List[LN] = []
# store the leaves that contain parts of the MLS
multiline_string_contexts: List[LN] = []
- max_level_to_update = math.inf # track the depth of the MLS
+ max_level_to_update: Union[int, float] = math.inf # track the depth of the MLS
for i, leaf in enumerate(line.leaves):
if max_level_to_update == math.inf:
had_comma: Optional[int] = None
for i, leaf in enumerate(line.leaves):
if max_level_to_update == math.inf:
had_comma: Optional[int] = None