X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/51b3b2624d4b1e4608eb9addd7d292cc5174a047..ecdbf085a772e8d737b8a8735d39a7af413cecfb:/black.py diff --git a/black.py b/black.py index 4995b53..19871aa 100644 --- a/black.py +++ b/black.py @@ -10,6 +10,7 @@ import logging from multiprocessing import Manager import os from pathlib import Path +import re import tokenize import signal import sys @@ -561,12 +562,13 @@ class BracketTracker: leaf.opening_bracket = opening_bracket leaf.bracket_depth = self.depth if self.depth == 0: - after_delim = is_split_after_delimiter(leaf, self.previous) - before_delim = is_split_before_delimiter(leaf, self.previous) - if after_delim > before_delim: - self.delimiters[id(leaf)] = after_delim - elif before_delim > after_delim and self.previous is not None: - self.delimiters[id(self.previous)] = before_delim + delim = is_split_before_delimiter(leaf, self.previous) + if delim and self.previous is not None: + self.delimiters[id(self.previous)] = delim + else: + delim = is_split_after_delimiter(leaf, self.previous) + if delim: + self.delimiters[id(leaf)] = delim if leaf.type in OPENING_BRACKETS: self.bracket_match[self.depth, BRACKET[leaf.type]] = leaf self.depth += 1 @@ -1438,13 +1440,6 @@ def is_split_after_delimiter(leaf: Leaf, previous: Leaf = None) -> int: if leaf.type == token.COMMA: return COMMA_PRIORITY - if ( - leaf.type in VARARGS - and leaf.parent - and leaf.parent.type in {syms.argument, syms.typedargslist} - ): - return MATH_PRIORITY - return 0 @@ -1456,6 +1451,15 @@ def is_split_before_delimiter(leaf: Leaf, previous: Leaf = None) -> int: Higher numbers are higher priority. """ + if ( + leaf.type in VARARGS + and leaf.parent + and leaf.parent.type in {syms.argument, syms.typedargslist} + ): + # * and ** might also be MATH_OPERATORS but in this case they are not. + # Don't treat them as a delimiter. + return 0 + if ( leaf.type in MATH_OPERATORS and leaf.parent @@ -1919,8 +1923,10 @@ def normalize_string_quotes(leaf: Leaf) -> None: prefix = leaf.value[:first_quote_pos] body = leaf.value[first_quote_pos + len(orig_quote):-len(orig_quote)] + unescaped_new_quote = re.compile(rf"(([^\\]|^)(\\\\)*){new_quote}") + escaped_orig_quote = re.compile(rf"\\(\\\\)*{orig_quote}") if "r" in prefix.casefold(): - if body.count(new_quote) != body.count(f"\\{new_quote}"): + if unescaped_new_quote.search(body): # There's at least one unescaped new_quote in this raw string # so converting is impossible return @@ -1928,9 +1934,8 @@ def normalize_string_quotes(leaf: Leaf) -> None: # Do not introduce or remove backslashes in raw strings new_body = body else: - new_body = body.replace(f"\\{orig_quote}", orig_quote).replace( - new_quote, f"\\{new_quote}" - ) + new_body = escaped_orig_quote.sub(rf"\1{orig_quote}", body) + new_body = unescaped_new_quote.sub(rf"\1\\{new_quote}", new_body) if new_quote == '"""' and new_body[-1] == '"': # edge case: new_body = new_body[:-1] + '\\"'