11from context import scripts
22import scripts .utils as utils
3+ from typing import Any , List , Dict
34
45
56class bind :
@@ -44,7 +45,7 @@ def __init__(self, root: dict, module_name: str) -> None:
4445 "ANONYMOUS_UNION_DECL" : handled_elsewhere , # in (handle_struct_decl) via get_fields_from_anonymous
4546 "ANONYMOUS_STRUCT_DECL" : handled_elsewhere , # in (handle_struct_decl) via get_fields_from_anonymous
4647 "FRIEND_DECL" : unsure ,
47- "FUNCTION_DECL" : unsure ,
48+ "FUNCTION_DECL" : self . handle_function ,
4849 # EXPRs: An expression that refers to a member of a struct, union, class, Objective-C class, etc.
4950 "CALL_EXPR" : handled_by_pybind ,
5051 "UNEXPOSED_EXPR" : unsure ,
@@ -281,6 +282,26 @@ def handle_struct_decl(self) -> None:
281282 f'.def("{ sub_item ["name" ]} ", py::overload_cast<>(&{ self .name } ::{ sub_item ["name" ]} ))'
282283 )
283284
285+ def handle_function (self ) -> None :
286+ """
287+ Handles `CursorKind.FUNCTION_DECL`
288+
289+ - Bind the function and its parameter list
290+ """
291+ parameter_type_list = []
292+ details = self ._state_stack [- 1 ]
293+ for sub_item in self .members :
294+ if sub_item ["kind" ] == "PARM_DECL" :
295+ parameter_type_list .append (f'"{ sub_item ["name" ]} "_a' )
296+
297+ parameter_type_list = "," .join (parameter_type_list )
298+ if parameter_type_list :
299+ parameter_type_list = "," + parameter_type_list
300+
301+ self ._linelist .append (
302+ f'm.def("{ self .name } ", &{ self .name } { parameter_type_list } );'
303+ )
304+
284305 def handle_constructor (self ) -> None :
285306 """
286307 Handles `CursorKind.CONSTRUCTOR`
@@ -295,35 +316,35 @@ def handle_constructor(self) -> None:
295316 # generate parameter type list
296317 for sub_item in self .members :
297318 if sub_item ["kind" ] == "PARM_DECL" :
298- if sub_item ["element_type" ] == "LValueReference" :
299- for sub_sub_item in sub_item ["members" ]:
300- if sub_sub_item ["kind" ] == "TYPE_REF" :
301- # @TODO: Make more robust
302- type_ref = (
303- sub_sub_item ["name" ]
304- .replace ("struct " , "" )
305- .replace ("pcl::" , "" )
306- )
307- parameter_type_list .append (f"{ type_ref } &" )
308- elif sub_item ["element_type" ] == "Elaborated" :
309- namespace_ref = ""
310- for sub_sub_item in sub_item ["members" ]:
311- if sub_sub_item ["kind" ] == "NAMESPACE_REF" :
312- namespace_ref += f'{ sub_sub_item ["name" ]} ::'
313- if sub_sub_item ["kind" ] == "TYPE_REF" :
314- parameter_type_list .append (
315- f'{ namespace_ref } { sub_sub_item ["name" ]} '
316- )
317- elif sub_item ["element_type" ] in ("Float" , "Int" ):
318- parameter_type_list .append (f'{ sub_item ["element_type" ].lower ()} ' )
319- else :
320- parameter_type_list .append (f'{ sub_item ["element_type" ]} ' )
319+ parameter_type_list .append (self .get_parm_types (sub_item ))
321320 parameter_type_list = "," .join (parameter_type_list )
322321
323322 # default ctor `.def(py::init<>())` already inserted while handling struct/class decl
324323 if parameter_type_list :
325324 self ._linelist .append (f".def(py::init<{ parameter_type_list } >())" )
326325
326+ def get_parm_types (self , item : Dict [str , Any ]) -> List [str ]:
327+ if item ["element_type" ] == "LValueReference" :
328+ for sub_item in item ["members" ]:
329+ if sub_item ["kind" ] == "TYPE_REF" :
330+ # @TODO: Make more robust
331+ type_ref = (
332+ sub_item ["name" ].replace ("struct " , "" ).replace ("pcl::" , "" )
333+ )
334+ parameter_type_list = f"{ type_ref } &"
335+ elif item ["element_type" ] == "Elaborated" :
336+ namespace_ref = ""
337+ for sub_item in item ["members" ]:
338+ if sub_item ["kind" ] == "NAMESPACE_REF" :
339+ namespace_ref += f'{ sub_item ["name" ]} ::'
340+ if sub_item ["kind" ] == "TYPE_REF" :
341+ parameter_type_list = f'{ namespace_ref } { sub_item ["name" ]} '
342+ elif item ["element_type" ] in ("Float" , "Double" , "Int" ):
343+ parameter_type_list = f'{ item ["element_type" ].lower ()} '
344+ else :
345+ parameter_type_list = f'{ item ["element_type" ]} '
346+ return parameter_type_list
347+
327348 def handle_inclusion_directive (self ) -> None :
328349 """
329350 Handle `CursorKind.INCLUSION_DIRECTIVE`
0 commit comments