8000 Add function pointer parse. #66 · Erignik/robotpy-cppheaderparser@d8ff031 · GitHub
[go: up one dir, main page]

Skip to content

Commit d8ff031

Browse files
committed
Add function pointer parse. robotpy#66
1 parent c9813ef commit d8ff031

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

CppHeaderParser/CppHeaderParser.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2375,13 +2375,31 @@ def _evaluate_method_stack(self):
23752375
self.stack = []
23762376
self.stmtTokens = []
23772377

2378+
_function_point_typedef_format = re.compile(r".*?\(.*?\*(.*?)\).*?\(.*?\).*?")
2379+
2380+
def _function_point_typedef_parse(self, stack):
2381+
idx = stack.index("typedef")
2382+
expression = "".join(stack[idx + 1 :])
2383+
m = self._function_point_typedef_format.match(expression)
2384+
if m is None:
2385+
return {}
2386+
2387+
name = m.group(1)
2388+
s = " ".join([i for i in stack if i != name])
2389+
r = {"name": name, "raw": s, "type": s}
2390+
return r
2391+
23782392
def _parse_typedef(self, stack, namespace=""):
23792393
if not stack or "typedef" not in stack:
23802394
return
23812395
stack = list(stack) # copy just to be safe
23822396
if stack[-1] == ";":
23832397
stack.pop()
23842398

2399+
r = self._function_point_typedef_parse(stack)
2400+
if len(r) == 3:
2401+
return r
2402+
23852403
while stack and stack[-1].isdigit():
23862404
stack.pop() # throw away array size for now
23872405

test/test_CppHeaderParser.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4038,5 +4038,23 @@ def test_fn(self):
403 8000 84038
self.assertEqual(m["parameters"][0]["type"], "typename TP<D >::S")
40394039

40404040

4041+
class FunctionPointerParse(unittest.TestCase):
4042+
def setUp(self):
4043+
self.cppHeader = CppHeaderParser.CppHeader(
4044+
"""
4045+
typedef int U32;
4046+
typedef unsigned int( * p )(int, int);
4047+
typedef int( * mmmmp )(int, int) ;
4048+
""",
4049+
"string",
4050+
)
4051+
4052+
def test_fn(self):
4053+
c = self.cppHeader
4054+
self.assertEqual(c.typedefs["U32"], "int")
4055+
self.assertEqual(c.typedefs["p"], "typedef unsigned int ( * ) ( int , int )")
4056+
self.assertEqual(c.typedefs["mmmmp"], "typedef int ( * ) ( int , int )")
4057+
4058+
40414059
if __name__ == "__main__":
40424060
unittest.main()

0 commit comments

Comments
 (0)
0