1- from typing import List , Tuple
1+ from abc import abstractmethod , ABC
2+ from typing import List , Tuple , Optional , Protocol
23
34
45class ImportStatement :
@@ -64,9 +65,11 @@ def accept(self, visitor):
6465 return visitor .dispatch (self )
6566
6667
67- class ImportInfo :
68- def get_imported_primaries (self , context ):
69- pass
68+ class ImportInfo (ABC ):
69+ names_and_aliases : List [Tuple [str , Optional [str ]]]
70+
71+ @abstractmethod
72+ def get_imported_primaries (self , context ) -> List [str ]: ...
7073
7174 def get_imported_names (self , context ):
7275 return [
@@ -76,8 +79,8 @@ def get_imported_names(self, context):
7679 def __repr__ (self ):
7780 return f'<{ self .__class__ .__name__ } "{ self .get_import_statement ()} ">'
7881
79- def get_import_statement ( self ):
80- pass
82+ @ abstractmethod
83+ def get_import_statement ( self ) -> str : ...
8184
8285 def is_empty (self ):
8386 pass
@@ -108,10 +111,13 @@ def get_empty_import():
108111
109112
110113class NormalImport (ImportInfo ):
111- def __init__ (self , names_and_aliases ):
114+ def __init__ (
115+ self ,
116+ names_and_aliases : List [Tuple [str , Optional [str ]]],
117+ ) -> None :
112118 self .names_and_aliases = names_and_aliases
113119
114- def get_imported_primaries (self , context ):
120+ def get_imported_primaries (self , context ) -> List [ str ] :
115121 result = []
116122 for name , alias in self .names_and_aliases :
117123 if alias :
@@ -120,7 +126,7 @@ def get_imported_primaries(self, context):
120126 result .append (name )
121127 return result
122128
123- def get_import_statement (self ):
129+ def get_import_statement (self ) -> str :
124130 result = "import "
125131 for name , alias in self .names_and_aliases :
126132 result += name
@@ -134,12 +140,20 @@ def is_empty(self):
134140
135141
136142class FromImport (ImportInfo ):
137- def __init__ (self , module_name , level , names_and_aliases ):
143+ module_name : str
144+ level : int
145+
146+ def __init__ (
147+ self ,
148+ module_name : str ,
149+ level : int ,
150+ names_and_aliases : List [Tuple [str , Optional [str ]]],
151+ ):
138152 self .module_name = module_name
139153 self .level = level
140154 self .names_and_aliases = names_and_aliases
141155
142- def get_imported_primaries (self , context ):
156+ def get_imported_primaries (self , context ) -> List [ str ] :
143157 if self .names_and_aliases [0 ][0 ] == "*" :
144158 module = self .get_imported_module (context )
145159 return [name for name in module if not name .startswith ("_" )]
@@ -176,7 +190,7 @@ def get_imported_module(self, context):
176190 self .module_name , context .folder , self .level
177191 )
178192
179- def get_import_statement (self ):
193+ def get_import_statement (self ) -> str :
180194 result = "from " + "." * self .level + self .module_name + " import "
181195 for name , alias in self .names_and_aliases :
182196 result += name
@@ -193,14 +207,17 @@ def is_star_import(self):
193207
194208
195209class EmptyImport (ImportInfo ):
196- names_and_aliases : List [ Tuple [ str , str ]] = []
210+ names_and_aliases = []
197211
198212 def is_empty (self ):
199213 return True
200214
201- def get_imported_primaries (self , context ):
215+ def get_imported_primaries (self , context ) -> List [ str ] :
202216 return []
203217
218+ def get_import_statement (self ) -> str :
219+ raise NotImplementedError ()
220+
204221
205222class ImportContext :
206223 def __init__ (self , project , folder ):
0 commit comments