@@ -170,6 +170,8 @@ def populate_type_details(self):
170170 trait_fn_lines = []
171171 field_var_lines = []
172172
173+ ordered_interpreted_lines = []
174+
173175 for idx , struct_line in enumerate (obj_lines ):
174176 struct_name_match = struct_name_regex .match (struct_line )
175177 if struct_name_match is not None :
@@ -196,9 +198,11 @@ def populate_type_details(self):
196198 trait_fn_match = line_indicates_trait_regex .match (struct_line )
197199 if trait_fn_match is not None :
198200 trait_fn_lines .append (trait_fn_match )
201+ ordered_interpreted_lines .append ({"type" : "lambda" , "value" : trait_fn_match })
199202 field_var_match = line_field_var_regex .match (struct_line )
200203 if field_var_match is not None :
201204 field_var_lines .append (field_var_match )
205+ ordered_interpreted_lines .append ({"type" : "field" , "value" : field_var_match })
202206 field_lines .append (struct_line )
203207
204208 assert (struct_name is not None )
@@ -259,7 +263,7 @@ def populate_type_details(self):
259263 # TODO: vector type (each one needs to be mapped)
260264 self .vec_types .add (struct_name )
261265 # vector_type_details = None
262- vector_type_details = TypeDetails () # iterator type
266+ vector_type_details = TypeDetails () # iterator type
263267 vector_type_details .type = CTypes .VECTOR
264268 vector_type_details .name = struct_name
265269
@@ -273,7 +277,7 @@ def populate_type_details(self):
273277 vector_type_details .is_primitive = True
274278 vector_type_details .primitive_swift_counterpart = self .language_constants .c_type_map [vec_ty ]
275279 self .type_details [struct_name ] = vector_type_details
276- # pass
280+ # pass
277281 elif is_union_enum :
278282 assert (struct_name .endswith ("_Tag" ))
279283 struct_name = struct_name [:- 4 ]
@@ -291,7 +295,7 @@ def populate_type_details(self):
291295 pass
292296 elif len (trait_fn_lines ) > 0 :
293297 self .trait_structs .add (struct_name )
294- lambdas = self .parse_lambda_details (trait_fn_lines )
298+ lambdas = self .parse_lambda_details (ordered_interpreted_lines )
295299 current_type_detail .lambdas = lambdas
296300 elif struct_name == "LDKTxOut" :
297301 # TODO: why is this even a special case? It's Swift, we dgaf
@@ -359,28 +363,57 @@ def populate_type_details(self):
359363 # self.global_methods.add(method_details)
360364 pass
361365
362- def parse_lambda_details (self , trait_fn_lines ):
366+ def parse_lambda_details (self , ordered_interpreted_lines ):
367+ field_var_convs = []
368+ flattened_field_var_convs = []
369+
363370 lambdas = []
364- for fn_line in trait_fn_lines :
365- ret_ty_info = swift_type_mapper .map_types_to_swift (fn_line .group (2 ).strip () + " ret" , None , False ,
366- self .tuple_types , self .unitary_enums ,
367- self .language_constants )
368- is_const = fn_line .group (4 ) is not None
369-
370- arg_tys = []
371- for idx , arg in enumerate (fn_line .group (5 ).split (',' )):
372- if arg == "" :
373- continue
374- arg_conv_info = swift_type_mapper .map_types_to_swift (arg , None , False , self .tuple_types ,
375- self .unitary_enums ,
376- self .language_constants )
377- arg_tys .append (arg_conv_info )
378- lambdas .append ({
379- 'name' : fn_line .group (3 ),
380- 'is_constant' : is_const ,
381- 'return_type' : ret_ty_info ,
382- 'argument_types' : arg_tys
383- })
371+
372+ for current_interpreted_line in ordered_interpreted_lines :
373+ if current_interpreted_line ['type' ] == 'field' :
374+ var_line = current_interpreted_line ['value' ]
375+ current_field_type = var_line .group (1 )
376+ current_field_name = var_line .group (2 )
377+ if False and current_field_type in self .trait_structs :
378+ lambdas .append ({
379+ 'name' : current_field_name ,
380+ 'field_details' : self .type_details [current_field_type ],
381+ 'is_lambda' : False
382+ })
383+ # flattened_field_var_convs.extend(self.type_details[current_field_type])
384+ else :
385+ mapped = swift_type_mapper .map_types_to_swift (current_field_type + " " + current_field_name , None , False ,
386+ self .tuple_types , self .unitary_enums ,
387+ self .language_constants )
388+ lambdas .append ({
389+ 'name' : current_field_name ,
390+ 'field_details' : mapped ,
391+ 'is_lambda' : False
392+ })
393+ elif current_interpreted_line ['type' ] == 'lambda' :
394+ fn_line = current_interpreted_line ['value' ]
395+ ret_ty_info = swift_type_mapper .map_types_to_swift (fn_line .group (2 ).strip () + " ret" , None , False ,
396+ self .tuple_types , self .unitary_enums ,
397+ self .language_constants )
398+ is_const = fn_line .group (4 ) is not None
399+
400+ arg_tys = []
401+ for idx , arg in enumerate (fn_line .group (5 ).split (',' )):
402+ if arg == "" :
403+ continue
404+ arg_conv_info = swift_type_mapper .map_types_to_swift (arg , None , False , self .tuple_types ,
405+ self .unitary_enums ,
406+ self .language_constants )
407+ arg_tys .append (arg_conv_info )
408+
409+ lambdas .append ({
410+ 'name' : fn_line .group (3 ),
411+ 'is_lambda' : True ,
412+ 'is_constant' : is_const ,
413+ 'return_type' : ret_ty_info ,
414+ 'argument_types' : arg_tys
415+ })
416+
384417 return lambdas
385418
386419 def parse_function_details (self , line , re_match , ret_arr_len , c_call_string ):
0 commit comments