From d8ff031413f30aa8fa1a1116c7e3e85f3a7268a5 Mon Sep 17 00:00:00 2001 From: Erignik Date: Fri, 9 Apr 2021 21:52:48 +0800 Subject: [PATCH] Add function pointer parse. #66 --- CppHeaderParser/CppHeaderParser.py | 18 ++++++++++++++++++ test/test_CppHeaderParser.py | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/CppHeaderParser/CppHeaderParser.py b/CppHeaderParser/CppHeaderParser.py index 70cffda..9796cea 100644 --- a/CppHeaderParser/CppHeaderParser.py +++ b/CppHeaderParser/CppHeaderParser.py @@ -2375,6 +2375,20 @@ def _evaluate_method_stack(self): self.stack = [] self.stmtTokens = [] + _function_point_typedef_format = re.compile(r".*?\(.*?\*(.*?)\).*?\(.*?\).*?") + + def _function_point_typedef_parse(self, stack): + idx = stack.index("typedef") + expression = "".join(stack[idx + 1 :]) + m = self._function_point_typedef_format.match(expression) + if m is None: + return {} + + name = m.group(1) + s = " ".join([i for i in stack if i != name]) + r = {"name": name, "raw": s, "type": s} + return r + def _parse_typedef(self, stack, namespace=""): if not stack or "typedef" not in stack: return @@ -2382,6 +2396,10 @@ def _parse_typedef(self, stack, namespace=""): if stack[-1] == ";": stack.pop() + r = self._function_point_typedef_parse(stack) + if len(r) == 3: + return r + while stack and stack[-1].isdigit(): stack.pop() # throw away array size for now diff --git a/test/test_CppHeaderParser.py b/test/test_CppHeaderParser.py index fedacc0..514cc48 100644 --- a/test/test_CppHeaderParser.py +++ b/test/test_CppHeaderParser.py @@ -4038,5 +4038,23 @@ def test_fn(self): self.assertEqual(m["parameters"][0]["type"], "typename TP::S") +class FunctionPointerParse(unittest.TestCase): + def setUp(self): + self.cppHeader = CppHeaderParser.CppHeader( + """ +typedef int U32; +typedef unsigned int( * p )(int, int); +typedef int( * mmmmp )(int, int) ; +""", + "string", + ) + + def test_fn(self): + c = self.cppHeader + self.assertEqual(c.typedefs["U32"], "int") + self.assertEqual(c.typedefs["p"], "typedef unsigned int ( * ) ( int , int )") + self.assertEqual(c.typedefs["mmmmp"], "typedef int ( * ) ( int , int )") + + if __name__ == "__main__": unittest.main()