Skip to content

Commit 9ff5a7a

Browse files
committed
Don't strip pointer from inside of templates
1 parent 56400a4 commit 9ff5a7a

File tree

2 files changed

+48
-5
lines changed

2 files changed

+48
-5
lines changed

CppHeaderParser/CppHeaderParser.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,6 +1470,23 @@ def guess_ctypes_type(self, string):
14701470
x += ")" * pointers
14711471
return x
14721472

1473+
def _remove_modifiers(self, vtype):
1474+
return " ".join(x for x in vtype.split() if x not in self.C_MODIFIERS)
1475+
1476+
def _create_raw_type(self, vtype):
1477+
lt = vtype.find("<")
1478+
if lt != -1:
1479+
gt = vtype.rfind(">")
1480+
vtype = (
1481+
self._remove_modifiers(vtype[:lt])
1482+
+ vtype[lt : gt + 1]
1483+
+ self._remove_modifiers(vtype[gt + 1 :])
1484+
)
1485+
else:
1486+
vtype = self._remove_modifiers(vtype)
1487+
1488+
return vtype
1489+
14731490
def resolve_type(self, string, result): # recursive
14741491
"""
14751492
keeps track of useful things like: how many pointers, number of typedefs, is fundamental or a class, etc...
@@ -1788,11 +1805,7 @@ def finalize_vars(self):
17881805
# create stripped raw_type #
17891806
for var in CppVariable.Vars:
17901807
if "raw_type" not in var:
1791-
raw = []
1792-
for x in var["type"].split():
1793-
if x not in self.C_MODIFIERS:
1794-
raw.append(x)
1795-
var["raw_type"] = " ".join(raw)
1808+
var["raw_type"] = self._create_raw_type(var["type"])
17961809

17971810
# if 'AutoConstantEntry' in var['raw_type']: print(var); assert 0
17981811
if var["class"]:

test/test_CppHeaderParser.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3648,5 +3648,35 @@ def test_fn(self):
36483648
self.assertEqual(fn["rtnType"], "HAL_Value")
36493649

36503650

3651+
class PointerTemplate_TestCase(unittest.TestCase):
3652+
def setUp(self):
3653+
self.cppHeader = CppHeaderParser.CppHeader(
3654+
"""
3655+
3656+
std::vector<Pointer*> * fn(std::vector<Pointer*> * ps);
3657+
3658+
""",
3659+
"string",
3660+
)
3661+
3662+
def test_fn(self):
3663+
self.assertEqual(len(self.cppHeader.functions), 1)
3664+
fn = self.cppHeader.functions[0]
3665+
self.assertEqual(fn["name"], "fn")
3666+
self.assertEqual(
3667+
filter_pameters(fn["parameters"], ["namespace", "raw_type"]),
3668+
[
3669+
{
3670+
"type": "std::vector<Pointer *> *",
3671+
"name": "ps",
3672+
"desc": None,
3673+
"namespace": None,
3674+
"raw_type": "std::vector<Pointer *>",
3675+
},
3676+
],
3677+
)
3678+
self.assertEqual(fn["rtnType"], "std::vector<Pointer *> *")
3679+
3680+
36513681
if __name__ == "__main__":
36523682
unittest.main()

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy