17
17
from pyupgrade ._data import TokenFunc
18
18
from pyupgrade ._token_helpers import find_end
19
19
from pyupgrade ._token_helpers import find_token
20
+ from pyupgrade ._token_helpers import has_space_before
20
21
from pyupgrade ._token_helpers import indented_amount
21
22
22
23
# GENERATED VIA generate-imports
@@ -259,13 +260,19 @@ def _remove_import(i: int, tokens: list[Token]) -> None:
259
260
260
261
261
262
class FromImport (NamedTuple ):
263
+ start : int
262
264
mod_start : int
263
265
mod_end : int
264
266
names : tuple [int , ...]
265
267
end : int
266
268
267
269
@classmethod
268
270
def parse (cls , i : int , tokens : list [Token ]) -> FromImport :
271
+ if has_space_before (i , tokens ):
272
+ start = i - 1
273
+ else :
274
+ start = i
275
+
269
276
j = i + 1
270
277
# XXX: does not handle explicit relative imports
271
278
while tokens [j ].name != 'NAME' :
@@ -290,7 +297,10 @@ def parse(cls, i: int, tokens: list[Token]) -> FromImport:
290
297
if tokens [names [i ]].src == 'as' :
291
298
del names [i :i + 2 ]
292
299
293
- return cls (mod_start , mod_end + 1 , tuple (names ), end )
300
+ return cls (start , mod_start , mod_end + 1 , tuple (names ), end )
301
+
302
+ def remove_self (self , tokens : list [Token ]) -> None :
303
+ del tokens [self .start :self .end ]
294
304
295
305
def replace_modname (self , tokens : list [Token ], modname : str ) -> None :
296
306
tokens [self .mod_start :self .mod_end ] = [Token ('CODE' , modname )]
@@ -365,7 +375,7 @@ def _replace_from_mixed(
365
375
366
376
# all names rewritten -- delete import
367
377
if len (parsed .names ) == len (removal_idxs ):
368
- del tokens [ i : parsed .end ]
378
+ parsed .remove_self ( tokens )
369
379
else :
370
380
parsed .remove_parts (tokens , removal_idxs )
371
381
@@ -443,6 +453,10 @@ def _replace_import(
443
453
except ValueError :
444
454
return
445
455
456
+ if has_space_before (i , tokens ):
457
+ start = i - 1
458
+ else :
459
+ start = i
446
460
end = find_end (tokens , i )
447
461
448
462
parts = []
@@ -478,7 +492,7 @@ def _replace_import(
478
492
tokens [end :end ] = [Token ('CODE' , '' .join (new_imports ))]
479
493
480
494
if len (to_from ) == len (parts ):
481
- del tokens [i :end ]
495
+ del tokens [start :end ]
482
496
else :
483
497
for idx , _ , _ , _ in reversed (to_from ):
484
498
if idx == 0 : # look forward until next name and del
0 commit comments