@@ -1261,7 +1261,7 @@ def _populate_codegen_class_methods(self, cls, node, class_scope):
12611261 )
12621262 )
12631263
1264- def _visit_SemanticModule (self , node ):
1264+ def _prepare_semantic_module (self , node ):
12651265 if node .metadata .get (models .PYI_LOADED_METADATA ) and not node .metadata .get (
12661266 models .PYI_NATIVE_CONTRACT_PREPARED_METADATA
12671267 ):
@@ -1280,10 +1280,45 @@ def _visit_SemanticModule(self, node):
12801280 for semantic_class in node .classes :
12811281 custom_types .setdefault (semantic_class .name , _class_type (semantic_class ))
12821282 self .scope .insert_cls_construct (custom_types [semantic_class .name ])
1283+ return custom_types , class_lookup , class_descendants , class_order
1284+
1285+ def _lower_module_child (self , item , * , custom_types , class_lookup , class_descendants , class_order ):
1286+ return self ._lower_child (
1287+ item ,
1288+ custom_types = custom_types ,
1289+ class_lookup = class_lookup ,
1290+ class_descendants = class_descendants ,
1291+ class_order = class_order ,
1292+ )
12831293
1294+ def _record_module_conversion_metadata (
1295+ self ,
1296+ item ,
1297+ converted ,
1298+ * ,
1299+ python_exports ,
1300+ native_imports ,
1301+ overload_target_names = frozenset (),
1302+ ) -> None :
1303+ python_exports [id (converted )] = _semantic_python_exports (item , converted , self .scope )
1304+ native_import = _pyi_native_import (item , converted , overload_target_names = overload_target_names )
1305+ if native_import is not None :
1306+ native_imports .append (native_import )
1307+
1308+ def _lower_module_classes (
1309+ self ,
1310+ node ,
1311+ * ,
1312+ custom_types ,
1313+ class_lookup ,
1314+ class_descendants ,
1315+ class_order ,
1316+ python_exports ,
1317+ native_imports ,
1318+ ):
12841319 class_items = [item for item in node .classes if _is_public (item )]
12851320 classes = [
1286- self ._lower_child (
1321+ self ._lower_module_child (
12871322 item ,
12881323 custom_types = custom_types ,
12891324 class_lookup = class_lookup ,
@@ -1292,18 +1327,32 @@ def _visit_SemanticModule(self, node):
12921327 )
12931328 for item in class_items
12941329 ]
1330+ for item , converted in zip (class_items , classes , strict = True ):
1331+ self ._record_module_conversion_metadata (
1332+ item ,
1333+ converted ,
1334+ python_exports = python_exports ,
1335+ native_imports = native_imports ,
1336+ )
1337+ native_imports .extend (_pyi_class_overload_native_imports (item , converted ))
1338+ return classes
1339+
1340+ def _lower_module_functions (
1341+ self ,
1342+ node ,
1343+ * ,
1344+ custom_types ,
1345+ class_lookup ,
1346+ class_descendants ,
1347+ class_order ,
1348+ python_exports ,
1349+ native_imports ,
1350+ ):
12951351 funcs = []
12961352 generated_overload_sets = []
1297- python_exports = {}
1298- native_imports = []
12991353 overload_target_names = _pyi_overload_target_names (node )
1300- for item , converted in zip (class_items , classes , strict = True ):
1301- python_exports [id (converted )] = _semantic_python_exports (item , converted , self .scope )
1302- if native_import := _pyi_native_import (item , converted ):
1303- native_imports .append (native_import )
1304- native_imports .extend (_pyi_class_overload_native_imports (item , converted ))
13051354 for item in node .functions :
1306- converted = self ._lower_child (
1355+ converted = self ._lower_module_child (
13071356 item ,
13081357 custom_types = custom_types ,
13091358 class_lookup = class_lookup ,
@@ -1314,11 +1363,28 @@ def _visit_SemanticModule(self, node):
13141363 generated_overload_sets .append (converted )
13151364 else :
13161365 funcs .append (converted )
1317- python_exports [id (converted )] = _semantic_python_exports (item , converted , self .scope )
1318- if native_import := _pyi_native_import (item , converted , overload_target_names = overload_target_names ):
1319- native_imports .append (native_import )
1366+ self ._record_module_conversion_metadata (
1367+ item ,
1368+ converted ,
1369+ python_exports = python_exports ,
1370+ native_imports = native_imports ,
1371+ overload_target_names = overload_target_names ,
1372+ )
1373+ return funcs , generated_overload_sets
1374+
1375+ def _lower_module_overload_sets (
1376+ self ,
1377+ node ,
1378+ * ,
1379+ custom_types ,
1380+ class_lookup ,
1381+ class_descendants ,
1382+ class_order ,
1383+ python_exports ,
1384+ native_imports ,
1385+ ):
13201386 overload_sets = [
1321- self ._lower_child (
1387+ self ._lower_module_child (
13221388 item ,
13231389 custom_types = custom_types ,
13241390 class_lookup = class_lookup ,
@@ -1328,28 +1394,61 @@ def _visit_SemanticModule(self, node):
13281394 for item in node .overload_sets
13291395 ]
13301396 for item , converted in zip (node .overload_sets , overload_sets , strict = True ):
1331- python_exports [id (converted )] = _semantic_python_exports (item , converted , self .scope )
1332- if native_import := _pyi_native_import (item , converted ):
1333- native_imports .append (native_import )
1397+ self ._record_module_conversion_metadata (
1398+ item ,
1399+ converted ,
1400+ python_exports = python_exports ,
1401+ native_imports = native_imports ,
1402+ )
1403+ return overload_sets
1404+
1405+ def _lower_module_declarations (self , node , * , custom_types , python_exports , native_imports ):
13341406 declarations = [self ._lower_child (item , custom_types = custom_types ) for item in node .variables ]
13351407 for item , converted in zip (node .variables , declarations , strict = True ):
1336- python_exports [id (converted )] = _semantic_python_exports (item , converted , self .scope )
1337- if native_import := _pyi_native_import (item , converted ):
1338- native_imports .append (native_import )
1408+ self ._record_module_conversion_metadata (
1409+ item ,
1410+ converted ,
1411+ python_exports = python_exports ,
1412+ native_imports = native_imports ,
1413+ )
1414+ return declarations
1415+
1416+ @staticmethod
1417+ def _semantic_module_imports (node , native_imports ):
1418+ if node .metadata .get (models .PYI_LOADED_METADATA ):
1419+ return native_imports
1420+ return [Import (module_name , target = ()) for module_name in node .metadata .get ("wrapper_native_modules" , ())]
1421+
1422+ def _visit_SemanticModule (self , node ):
1423+ custom_types , class_lookup , class_descendants , class_order = self ._prepare_semantic_module (node )
1424+ python_exports = {}
1425+ native_imports = []
1426+ lowering_context = {
1427+ "custom_types" : custom_types ,
1428+ "class_lookup" : class_lookup ,
1429+ "class_descendants" : class_descendants ,
1430+ "class_order" : class_order ,
1431+ "python_exports" : python_exports ,
1432+ "native_imports" : native_imports ,
1433+ }
1434+ classes = self ._lower_module_classes (node , ** lowering_context )
1435+ funcs , generated_overload_sets = self ._lower_module_functions (node , ** lowering_context )
1436+ overload_sets = self ._lower_module_overload_sets (node , ** lowering_context )
1437+ declarations = self ._lower_module_declarations (
1438+ node ,
1439+ custom_types = custom_types ,
1440+ python_exports = python_exports ,
1441+ native_imports = native_imports ,
1442+ )
13391443 name = self .scope .get_new_public_name (node .name , object_type = "module" , owner = node .name )
13401444 explicit_exports = node .metadata .get (models .PYTHON_EXPORTS_PREPARED_METADATA )
1341- imports = (
1342- native_imports
1343- if node .metadata .get (models .PYI_LOADED_METADATA )
1344- else [Import (module_name , target = ()) for module_name in node .metadata .get ("wrapper_native_modules" , ())]
1345- )
13461445 return Module (
13471446 name ,
13481447 declarations ,
13491448 funcs ,
13501449 overload_sets = [* generated_overload_sets , * overload_sets ],
13511450 classes = classes ,
1352- imports = imports ,
1451+ imports = self . _semantic_module_imports ( node , native_imports ) ,
13531452 scope = self .scope ,
13541453 python_exports = python_exports if explicit_exports else None ,
13551454 )
0 commit comments