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