8000 Resolve forward declared variables correctly · Erignik/robotpy-cppheaderparser@b87ee6d · GitHub
[go: up one dir, main page]

Skip to content

Commit b87ee6d

Browse files
committed
Resolve forward declared variables correctly
1 parent 151a283 commit b87ee6d

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

CppHeaderParser/CppHeaderParser.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,7 +1473,7 @@ def initextra(self):
14731473
[]
14741474
) # full name stack, good idea to keep both stacks? (simple stack and full stack)
14751475
self._classes_brace_level = {} # class name : level
1476-
self._forward_decls = []
1476+
self._forward_decls = {} # name: namespace
14771477
self._template_typenames = [] # template<typename XXX>
14781478

14791479
def current_namespace(self):
@@ -1747,6 +1747,7 @@ def finalize_vars(self):
17471747

17481748
elif tag in self._forward_decls:
17491749
var["forward_declared"] = tag
1750+
var["namespace"] = self._forward_decls[tag]
17501751
var["ctypes_type"] = "ctypes.c_void_p"
17511752

17521753
elif tag in self.global_enums:
@@ -2599,7 +2600,7 @@ def evalute_forward_decl(self):
25992600
if self.curAccessSpecifier == "public":
26002601
klass._public_forward_declares.append(name)
26012602
else:
2602-
self._forward_decls.append(name)
2603+
self._forward_decls[name] = self.current_namespace()
26032604

26042605

26052606
# fmt: off

test/test_CppHeaderParser.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3929,5 +3929,37 @@ def test_fn(self):
39293929
self.assertEqual(m["returns"], "int")
39303930

39313931

3932+
class ForwardDeclResolve(unittest.TestCase):
3933+
def setUp(self):
3934+
self.cppHeader = CppHeaderParser.CppHeader(
3935+
"""
3936+
namespace n1 {
3937+
3938+
class A;
3939+
3940+
namespace n2 {
3941+
3942+
class B {
3943+
public:
3944+
explicit B(const A &a);
3945+
};
3946+
3947+
}
3948+
""",
3949+
"string",
3950+
)
3951+
3952+
def test_fn(self):
3953+
c = self.cppHeader.classes["B"]
3954+
self.assertEqual("B", c["name"])
3955+
3956+
m = c["methods"]["public"][0]
3957+
self.assertEqual(m["name"], "B")
3958+
self.assertEqual(m["parameters"][0]["forward_declared"], "A")
3959+
self.assertEqual(m["parameters"][0]["namespace"], "n1::")
3960+
self.assertEqual(m["parameters"][0]["name"], "a")
3961+
self.assertEqual(m["parameters"][0]["raw_type"], "n1::A")
3962+
3963+
39323964
if __name__ == "__main__":
39333965
unittest.main()

0 commit comments

Comments
 (0)
0