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