4242from __future__ import annotations
4343
4444import argparse
45- import glob
4645import keyword
4746import os
4847import os .path
4948import sys
5049import traceback
51- from collections import defaultdict
52- from typing import Final , Iterable , Mapping
53- from typing_extensions import Final
50+ from typing import Final , Iterable
5451
5552import mypy .build
5653import mypy .mixedtraverser
113110from mypy .stubdoc import ArgSig , FunctionSig
114111from mypy .stubgenc import InspectionStubGenerator , generate_stub_for_c_module
115112from mypy .stubutil import (
113+ BaseStubGenerator ,
116114 CantImport ,
117115 ClassInfo ,
118116 FunctionContext ,
119- BaseStubGenerator ,
120117 common_dir_prefix ,
121118 fail_missing ,
122119 find_module_path_and_all_py3 ,
@@ -735,19 +732,20 @@ def get_base_types(self, cdef: ClassDef) -> list[str]:
735732 typename = base .args [0 ].value
736733 if nt_fields is not None :
737734 fields_str = ", " .join (f"({ f !r} , { t } )" for f , t in nt_fields )
738- namedtuple_name = self .typing_name ("NamedTuple" )
735+ namedtuple_name = self .add_typing_import ("NamedTuple" )
739736 base_types .append (f"{ namedtuple_name } ({ typename !r} , [{ fields_str } ])" )
740737 self .add_typing_import ("NamedTuple" )
741738 else :
742739 # Invalid namedtuple() call, cannot determine fields
743- base_types .append (self .typing_name ("Incomplete" ))
740+ base_types .append (
741+ self .add_obj_import ("_typeshed" , "Incomplete" , require = True )
742+ )
744743 elif self .is_typed_namedtuple (base ):
745744 base_types .append (base .accept (p ))
746745 else :
747746 # At this point, we don't know what the base class is, so we
748747 # just use Incomplete as the base class.
749- base_types .append (self .typing_name ("Incomplete" ))
750- self .add_typing_import ("Incomplete" )
748+ base_types .append (self .add_obj_import ("_typeshed" , "Incomplete" , require = True ))
751749 for name , value in cdef .keywords .items ():
752750 if name == "metaclass" :
753751 continue # handled separately
@@ -860,8 +858,7 @@ def process_namedtuple(self, lvalue: NameExpr, rvalue: CallExpr) -> None:
860858 if fields is None :
861859 self .annotate_as_incomplete (lvalue )
862860 return
863- self .add_typing_import ("NamedTuple" )
864- bases = self .typing_name ("NamedTuple" )
861+ bases = self .add_typing_import ("NamedTuple" )
865862 # TODO: Add support for generic NamedTuples. Requires `Generic` as base class.
866863 class_def = f"{ self ._indent } class { lvalue .name } ({ bases } ):"
867864 if len (fields ) == 0 :
@@ -918,8 +915,7 @@ def process_typeddict(self, lvalue: NameExpr, rvalue: CallExpr) -> None:
918915 self .add (f"{ self ._indent } { lvalue .name } = { rvalue .accept (p )} \n " )
919916 self ._state = VAR
920917 else :
921- incomplete = self .add_obj_import ("_typeshed" , "Incomplete" , require = True )
922- bases = self .typing_name ("TypedDict" )
918+ bases = self .add_typing_import ("TypedDict" )
923919 # TODO: Add support for generic TypedDicts. Requires `Generic` as base class.
924920 if total is not None :
925921 bases += f", total={ total .accept (p )} "
@@ -936,8 +932,8 @@ def process_typeddict(self, lvalue: NameExpr, rvalue: CallExpr) -> None:
936932 self ._state = CLASS
937933
938934 def annotate_as_incomplete (self , lvalue : NameExpr ) -> None :
939- self .add_typing_import ( " Incomplete" )
940- self .add (f"{ self ._indent } { lvalue .name } : { self . typing_name ( 'Incomplete' ) } \n " )
935+ incomplete = self .add_obj_import ( "_typeshed" , " Incomplete", require = True )
936+ self .add (f"{ self ._indent } { lvalue .name } : { incomplete } \n " )
941937 self ._state = VAR
942938
943939 def is_alias_expression (self , expr : Expression , top_level : bool = True ) -> bool :
0 commit comments