8000 Add access specifier for nested classes · PBCOnGit/robotpy-cppheaderparser@d444b58 · GitHub
[go: up one dir, main page]

Skip to content

Commit d444b58

Browse files
committed
Add access specifier for nested classes
1 parent 5e65a22 commit d444b58

File tree

2 files changed

+39
-5
lines changed

2 files changed

+39
-5
lines changed

CppHeaderParser/CppHeaderParser.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2428,12 +2428,9 @@ def _evaluate_class_stack(self):
24282428
# dont support sub classes today
24292429
# print( 'eval class stack', self.nameStack )
24302430
parent = self.curClass
2431-
if self.braceDepth > len(self.nameSpaces) and parent:
2432-
trace_print("HIT NESTED SUBCLASS")
2431+
if parent:
2432+
debug_print("found nested subclass")
24332433
self.accessSpecifierStack.append(self.curAccessSpecifier)
2434-
elif self.braceDepth != len(self.nameSpaces):
2435-
error_print("ERROR: WRONG BRACE DEPTH")
2436-
return
24372434

24382435
# When dealing with typedefed structs, get rid of typedef keyword to handle later on
24392436
if self.nameStack[0] == "typedef":
@@ -2478,6 +2475,7 @@ def _evaluate_class_stack(self):
24782475
if parent:
24792476
newClass["namespace"] = self.classes[parent]["namespace"] + "::" + parent
24802477
newClass["parent"] = self.classes[parent]
2478+
newClass["access_in_parent"] = self.accessSpecifierStack[-1]
24812479
self.classes[parent]["nested_classes"].append(newClass)
24822480
## supports nested classes with the same name ##
24832481
self.curClass = key = parent + "::" + classKey

test/test_CppHeaderParser.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3708,5 +3708,41 @@ def test_fn(self):
37083708
self.assertEqual(fn["rtnType"], "void")
37093709

37103710

3711+
class NestedClassAccess_TestCase(unittest.TestCase):
3712+
def setUp(self):
3713+
self.cppHeader = CppHeaderParser.CppHeader(
3714+
"""
3715+
class Outer {
3716+
struct Inner {
3717+
void fn();
3718+
};
3719+
3720+
void ofn();
3721+
};
3722+
""",
3723+
"string",
3724+
)
3725+
3726+
def test_fn(self):
3727+
self.assertEqual(len(self.cppHeader.functions), 0)
3728+
3729+
outer = self.cppHeader.classes["Outer"]
3730+
self.assertEqual(outer["parent"], None)
3731+
3732+
self.assertEqual(0, len(outer["methods"]["public"]))
3733+
self.assertEqual(0, len(outer["methods"]["protected"]))
3734+
self.assertEqual(1, len(outer["methods"]["private"]))
3735+
self.assertEqual("ofn", outer["methods"]["private"][0]["name"])
3736+
3737+
inner = self.cppHeader.classes["Outer::Inner"]
3738+
self.assertIs(inner["parent"], outer)
3739+
self.assertEqual(inner["access_in_parent"], "private")
3740+
3741+
self.assertEqual(1, len(inner["methods"]["public"]))
3742+
self.assertEqual(0, len(inner["methods"]["protected"]))
3743+
self.assertEqual(0, len(inner["methods"]["private"]))
3744+
self.assertEqual("fn", inner["methods"]["public"][0]["name"])
3745+
3746+
37113747
if __name__ == "__main__":
37123748
unittest.main()

0 commit comments

Comments
 (0)
0