fix: Don't normalize whitespace before fmt:skip comments (#4146)

Signed-off-by: RedGuy12 <paul@reid-family.org>
This commit is contained in:
cobalt 2024-01-25 03:31:49 -06:00 committed by GitHub
parent 59b9d858a3
commit a5196e6f1f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 22 additions and 3 deletions

View File

@ -56,6 +56,7 @@ release:
- Format module docstrings the same as class and function docstrings (#4095) - Format module docstrings the same as class and function docstrings (#4095)
- Fix crash when using a walrus in a dictionary (#4155) - Fix crash when using a walrus in a dictionary (#4155)
- Fix unnecessary parentheses when wrapping long dicts (#4135) - Fix unnecessary parentheses when wrapping long dicts (#4135)
- Stop normalizing spaces before `# fmt: skip` comments (#4146)
### Configuration ### Configuration

View File

@ -3,7 +3,7 @@
from functools import lru_cache from functools import lru_cache
from typing import Collection, Final, Iterator, List, Optional, Tuple, Union from typing import Collection, Final, Iterator, List, Optional, Tuple, Union
from black.mode import Mode from black.mode import Mode, Preview
from black.nodes import ( from black.nodes import (
CLOSING_BRACKETS, CLOSING_BRACKETS,
STANDALONE_COMMENT, STANDALONE_COMMENT,
@ -46,6 +46,7 @@ class ProtoComment:
newlines: int # how many newlines before the comment newlines: int # how many newlines before the comment
consumed: int # how many characters of the original leaf's prefix did we consume consumed: int # how many characters of the original leaf's prefix did we consume
form_feed: bool # is there a form feed before the comment form_feed: bool # is there a form feed before the comment
leading_whitespace: str # leading whitespace before the comment, if any
def generate_comments(leaf: LN) -> Iterator[Leaf]: def generate_comments(leaf: LN) -> Iterator[Leaf]:
@ -88,7 +89,9 @@ def list_comments(prefix: str, *, is_endmarker: bool) -> List[ProtoComment]:
form_feed = False form_feed = False
for index, full_line in enumerate(re.split("\r?\n", prefix)): for index, full_line in enumerate(re.split("\r?\n", prefix)):
consumed += len(full_line) + 1 # adding the length of the split '\n' consumed += len(full_line) + 1 # adding the length of the split '\n'
line = full_line.lstrip() match = re.match(r"^(\s*)(\S.*|)$", full_line)
assert match
whitespace, line = match.groups()
if not line: if not line:
nlines += 1 nlines += 1
if "\f" in full_line: if "\f" in full_line:
@ -113,6 +116,7 @@ def list_comments(prefix: str, *, is_endmarker: bool) -> List[ProtoComment]:
newlines=nlines, newlines=nlines,
consumed=consumed, consumed=consumed,
form_feed=form_feed, form_feed=form_feed,
leading_whitespace=whitespace,
) )
) )
form_feed = False form_feed = False
@ -230,7 +234,11 @@ def convert_one_fmt_off_pair(
standalone_comment_prefix += fmt_off_prefix standalone_comment_prefix += fmt_off_prefix
hidden_value = comment.value + "\n" + hidden_value hidden_value = comment.value + "\n" + hidden_value
if _contains_fmt_skip_comment(comment.value, mode): if _contains_fmt_skip_comment(comment.value, mode):
hidden_value += " " + comment.value hidden_value += (
comment.leading_whitespace
if Preview.no_normalize_fmt_skip_whitespace in mode
else " "
) + comment.value
if hidden_value.endswith("\n"): if hidden_value.endswith("\n"):
# That happens when one of the `ignored_nodes` ended with a NEWLINE # That happens when one of the `ignored_nodes` ended with a NEWLINE
# leaf (possibly followed by a DEDENT). # leaf (possibly followed by a DEDENT).

View File

@ -174,6 +174,7 @@ class Preview(Enum):
string_processing = auto() string_processing = auto()
hug_parens_with_braces_and_square_brackets = auto() hug_parens_with_braces_and_square_brackets = auto()
unify_docstring_detection = auto() unify_docstring_detection = auto()
no_normalize_fmt_skip_whitespace = auto()
wrap_long_dict_values_in_parens = auto() wrap_long_dict_values_in_parens = auto()
multiline_string_handling = auto() multiline_string_handling = auto()

View File

@ -0,0 +1,9 @@
# flags: --preview
print () # fmt: skip
print () # fmt:skip
# output
print () # fmt: skip
print () # fmt:skip