Consolidate empty line handling in EmptyLineTracker

Previously, extra newlines left on imports were handled sort of by accident.
Now it's all handled uniformly in one place.
This commit is contained in:
Łukasz Langa 2018-03-17 00:40:21 -07:00
parent b9c06a0d23
commit 6c3ce53b60
2 changed files with 20 additions and 9 deletions

View File

@ -210,8 +210,13 @@ def format_str(src_contents: str, line_length: int) -> FileContent:
dst_contents += str(line) dst_contents += str(line)
else: else:
comments.append(current_line) comments.append(current_line)
for comment in comments: if comments:
dst_contents += str(comment) if elt.previous_defs:
# Separate postscriptum comments from the last module-level def.
dst_contents += str(empty_line)
dst_contents += str(empty_line)
for comment in comments:
dst_contents += str(comment)
return dst_contents return dst_contents
@ -615,7 +620,9 @@ class EmptyLineTracker:
"""Provides a stateful method that returns the number of potential extra """Provides a stateful method that returns the number of potential extra
empty lines needed before and after the currently processed line. empty lines needed before and after the currently processed line.
Note: this tracker works on lines that haven't been split yet. Note: this tracker works on lines that haven't been split yet. It assumes
the prefix of the first leaf consists of optional newlines. Those newlines
are consumed by `maybe_empty_lines()` and included in the computation.
""" """
previous_line: Optional[Line] = None previous_line: Optional[Line] = None
previous_after: int = 0 previous_after: int = 0
@ -633,16 +640,23 @@ def maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
return 0, 0 return 0, 0
before, after = self._maybe_empty_lines(current_line) before, after = self._maybe_empty_lines(current_line)
before -= self.previous_after
self.previous_after = after self.previous_after = after
self.previous_line = current_line self.previous_line = current_line
return before, after return before, after
def _maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]: def _maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
before = 0 if current_line.leaves:
# Consume the first leaf's extra newlines.
first_leaf = current_line.leaves[0]
before = int('\n' in first_leaf.prefix)
first_leaf.prefix = ''
else:
before = 0
depth = current_line.depth depth = current_line.depth
while self.previous_defs and self.previous_defs[-1] >= depth: while self.previous_defs and self.previous_defs[-1] >= depth:
self.previous_defs.pop() self.previous_defs.pop()
before = (1 if depth else 2) - self.previous_after before = 1 if depth else 2
is_decorator = current_line.is_decorator is_decorator = current_line.is_decorator
if is_decorator or current_line.is_def or current_line.is_class: if is_decorator or current_line.is_def or current_line.is_class:
if not is_decorator: if not is_decorator:
@ -658,7 +672,6 @@ def _maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
newlines = 2 newlines = 2
if current_line.depth: if current_line.depth:
newlines -= 1 newlines -= 1
newlines -= self.previous_after
return newlines, 0 return newlines, 0
if current_line.is_flow_control: if current_line.is_flow_control:
@ -1335,9 +1348,6 @@ def normalize_prefix(leaf: Leaf) -> None:
if is_import(leaf): if is_import(leaf):
spl = leaf.prefix.split('#', 1) spl = leaf.prefix.split('#', 1)
nl_count = spl[0].count('\n') nl_count = spl[0].count('\n')
if len(spl) > 1:
# Skip one newline since it was for a standalone comment.
nl_count -= 1
leaf.prefix = '\n' * nl_count leaf.prefix = '\n' * nl_count
return return

View File

@ -38,6 +38,7 @@
"""The asyncio package, tracking PEP 3156.""" """The asyncio package, tracking PEP 3156."""
# flake8: noqa # flake8: noqa
import sys import sys