8000 Don't strip pointer from inside of templates · PBCOnGit/robotpy-cppheaderparser@9ff5a7a · GitHub
[go: up one dir, main page]

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)
0