@@ -169,21 +169,36 @@ def __init__(self):
169169 self .prev_row = 1
170170 self .prev_col = 0
171171 self .prev_type = None
172+ self .prev_line = ""
172173 self .encoding = None
173174
174175 def add_whitespace (self , start ):
175176 row , col = start
176177 if row < self .prev_row or row == self .prev_row and col < self .prev_col :
177178 raise ValueError ("start ({},{}) precedes previous end ({},{})"
178179 .format (row , col , self .prev_row , self .prev_col ))
179- row_offset = row - self .prev_row
180- if row_offset :
181- self .tokens .append ("\\ \n " * row_offset )
182- self .prev_col = 0
180+ self .add_backslash_continuation (start )
183181 col_offset = col - self .prev_col
184182 if col_offset :
185183 self .tokens .append (" " * col_offset )
186184
185+ def add_backslash_continuation (self , start ):
186+ """Add backslash continuation characters if the row has increased
187+ without encountering a newline token.
188+
189+ This also inserts the correct amount of whitespace before the backslash.
190+ """
191+ row = start [0 ]
192+ row_offset = row - self .prev_row
193+ if row_offset == 0 :
194+ return
195+
196+ newline = '\r \n ' if self .prev_line .endswith ('\r \n ' ) else '\n '
197+ line = self .prev_line .rstrip ('\\ \r \n ' )
198+ ws = '' .join (_itertools .takewhile (str .isspace , reversed (line )))
199+ self .tokens .append (ws + f"\\ { newline } " * row_offset )
200+ self .prev_col = 0
201+
187202 def escape_brackets (self , token ):
188203 characters = []
189204 consume_until_next_bracket = False
@@ -243,8 +258,6 @@ def untokenize(self, iterable):
243258 end_line , end_col = end
244259 extra_chars = last_line .count ("{{" ) + last_line .count ("}}" )
245260 end = (end_line , end_col + extra_chars )
246- elif tok_type in (STRING , FSTRING_START ) and self .prev_type in (STRING , FSTRING_END ):
247- self .tokens .append (" " )
248261
249262 self .add_whitespace (start )
250263 self .tokens .append (token )
@@ -253,6 +266,7 @@ def untokenize(self, iterable):
253266 self .prev_row += 1
254267 self .prev_col = 0
255268 self .prev_type = tok_type
269+ self .prev_line = line
256270 return "" .join (self .tokens )
257271
258272 def compat (self , token , iterable ):
0 commit comments