@@ -247,9 +247,9 @@ def __init__(self, buffers: list[str], encoding: str) -> None:
247
247
self .deforders : dict [str , int ] = {}
248
248
self .finals : list [str ] = []
249
249
self .overloads : dict [str , list [Signature ]] = {}
250
- self .typing : str | None = None
251
- self .typing_final : str | None = None
252
- self .typing_overload : str | None = None
250
+ self .typing : list [ str ] = []
251
+ self .typing_final : list [ str ] = []
252
+ self .typing_overload : list [ str ] = []
253
253
super ().__init__ ()
254
254
255
255
def get_qualname_for (self , name : str ) -> list [str ] | None :
@@ -295,12 +295,9 @@ def add_variable_annotation(self, name: str, annotation: ast.AST) -> None:
295
295
self .annotations [basename , name ] = ast_unparse (annotation )
296
296
297
297
def is_final (self , decorators : list [ast .expr ]) -> bool :
298
- final = []
299
- if self .typing :
300
- final .append ('%s.final' % self .typing )
301
- if self .typing_final :
302
- final .append (self .typing_final )
303
-
298
+ final = self .typing_final .copy ()
299
+ for modname in self .typing :
300
+ final .append (f'{ modname } .final' )
304
301
for decorator in decorators :
305
302
try :
306
303
if ast_unparse (decorator ) in final :
@@ -311,11 +308,9 @@ def is_final(self, decorators: list[ast.expr]) -> bool:
311
308
return False
312
309
313
310
def is_overload (self , decorators : list [ast .expr ]) -> bool :
314
- overload = []
315
- if self .typing :
316
- overload .append ('%s.overload' % self .typing )
317
- if self .typing_overload :
318
- overload .append (self .typing_overload )
311
+ overload = self .typing_overload .copy ()
312
+ for modname in self .typing :
313
+ overload .append (f'{ modname } .overload' )
319
314
320
315
for decorator in decorators :
321
316
try :
@@ -348,22 +343,24 @@ def visit_Import(self, node: ast.Import) -> None:
348
343
for name in node .names :
349
344
self .add_entry (name .asname or name .name )
350
345
351
- if name .name == 'typing' :
352
- self .typing = name .asname or name .name
353
- elif name .name == 'typing.final' :
354
- self .typing_final = name .asname or name .name
355
- elif name .name == 'typing.overload' :
356
- self .typing_overload = name .asname or name .name
346
+ if name .name in ( 'typing' , 'typing_extensions' ) :
347
+ self .typing . append ( name .asname or name .name )
348
+ elif name .name in ( 'typing.final' , 'typing_extensions.final' ) :
349
+ self .typing_final . append ( name .asname or name .name )
350
+ elif name .name in ( 'typing.overload' , 'typing_extensions.overload' ) :
351
+ self .typing_overload . append ( name .asname or name .name )
357
352
358
353
def visit_ImportFrom (self , node : ast .ImportFrom ) -> None :
359
354
"""Handles Import node and record the order of definitions."""
360
355
for name in node .names :
361
356
self .add_entry (name .asname or name .name )
362
357
363
- if node .module == 'typing' and name .name == 'final' :
364
- self .typing_final = name .asname or name .name
365
- elif node .module == 'typing' and name .name == 'overload' :
366
- self .typing_overload = name .asname or name .name
358
+ if node .module not in ('typing' , 'typing_extensions' ):
359
+ continue
360
+ if name .name == 'final' :
361
+ self .typing_final .append (name .asname or name .name )
362
+ elif name .name == 'overload' :
363
+ self .typing_overload .append (name .asname or name .name )
367
364
368
365
def visit_Assign (self , node : ast .Assign ) -> None :
369
366
"""Handles Assign node and pick up a variable comment."""
0 commit comments