Skip to content

Commit ac1f3dc

Browse files
committed
Add 'parent' attributes to vars/methods/classes
- The parent attribute already exists, but sometimes it was a string and sometimes it was a thing. Now it's always a thing
1 parent 08950fc commit ac1f3dc

File tree

2 files changed

+32
-24
lines changed

2 files changed

+32
-24
lines changed

CppHeaderParser/CppHeaderParser.py

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,7 @@ class CppClass(dict):
589589
* ``nested_classes`` - Classes and structs defined within this class
590590
* ``final`` - True if final
591591
* ``abstract`` - True if abstract
592+
* ``parent`` - If not None, the class that this class is nested in
592593
593594
An example of how this could look is as follows::
594595
@@ -713,7 +714,7 @@ def show(self):
713714
if "doxygen" in list(self.keys()):
714715
rtn += self["doxygen"] + "\n"
715716
if "parent" in list(self.keys()) and self["parent"]:
716-
rtn += "parent class: " + self["parent"] + "\n"
717+
rtn += "parent class: " + self["parent"]["name"] + "\n"
717718

718719
if "inherits" in list(self.keys()):
719720
rtn += " Inherits: "
@@ -759,7 +760,7 @@ def __str__(self):
759760
if "doxygen" in list(self.keys()):
760761
rtn += self["doxygen"] + "\n"
761762
if "parent" in list(self.keys()) and self["parent"]:
762-
rtn += "parent class: " + self["parent"] + "\n"
763+
rtn += "parent class: " + self["parent"]["name"] + "\n"
763764

764765
if "inherits" in list(self.keys()) and len(self["inherits"]):
765766
rtn += "Inherits: "
@@ -834,7 +835,7 @@ def __str__(self):
834835
if "doxygen" in list(self.keys()):
835836
rtn += self["doxygen"] + "\n"
836837
if "parent" in list(self.keys()) and self["parent"]:
837-
rtn += "parent class: " + self["parent"] + "\n"
838+
rtn += "parent class: " + self["parent"]["name"] + "\n"
838839

839840
rtn += "{\n"
840841
for member in self["members"]:
@@ -898,6 +899,7 @@ def _params_helper1(self, stack):
898899
def _params_helper2(self, params):
899900
for p in params:
900901
p["method"] = self # save reference in variable to parent method
902+
p["parent"] = self
901903
if "::" in p["type"]:
902904
ns = p["type"].split("::")[0]
903905
if ns not in Resolver.NAMESPACES and ns in Resolver.CLASSES:
@@ -914,6 +916,7 @@ class CppMethod(_CppMethod):
914916
* ``name`` - Name of the method
915917
* ``doxygen`` - Doxygen comments associated with the method if they exist
916918
* ``parameters`` - List of :class:`.CppVariable`
919+
* ``parent`` - If not None, the class this method belongs to
917920
"""
918921

919922
def show(self):
@@ -1538,14 +1541,16 @@ def finalize_vars(self):
15381541
nestedEnum = None
15391542
nestedStruct = None
15401543
nestedTypedef = None
1541-
if "method" in var and "parent" in list(var["method"].keys()):
1542-
klass = var["method"]["parent"]
1543-
if tag in var["method"]["parent"]._public_enums:
1544-
nestedEnum = var["method"]["parent"]._public_enums[tag]
1545-
elif tag in var["method"]["parent"]._public_typedefs:
1546-
nestedTypedef = var["method"]["parent"]._public_typedefs[
1547-
tag
1548-
]
1544+
1545+
parent = var["parent"]
1546+
while parent:
1547+
nestedEnum = getattr(parent, "_public_enums", {}).get(tag)
1548+
if nestedEnum:
1549+
break
1550+
nestedTypedef = getattr(parent, "_public_typedefs", {}).get(tag)
1551+
if nestedTypedef:
1552+
break
1553+
parent = parent["parent"]
15491554

15501555
if "<" in tag: # should also contain '>'
15511556
var["template"] = tag # do not resolve templates
@@ -1604,7 +1609,7 @@ def finalize_vars(self):
16041609
var["enum"] = enum["namespace"] + enum["name"]
16051610
var["fundamental"] = True
16061611

1607-
elif var["parent"]:
1612+
elif var["parent"] and var["unresolved"]:
16081613
warning_print("WARN unresolved %s", _tag)
16091614
var["ctypes_type"] = "ctypes.c_void_p"
16101615
var["unresolved"] = True
@@ -1750,17 +1755,15 @@ def finalize_vars(self):
17501755
var["raw_type"] = (
17511756
var["class"]["namespace"] + "::" + var["raw_type"]
17521757
)
1753-
elif var["class"]["parent"] in self.classes:
1754-
parent = self.classes[var["class"]["parent"]]
1758+
else:
1759+
parent = var["class"]["parent"]
17551760
var["raw_type"] = (
17561761
parent["namespace"]
17571762
+ "::"
17581763
+ var["class"]["name"]
17591764
+ "::"
17601765
+ var["raw_type"]
17611766
)
1762-
else:
1763-
var["unresolved"] = True
17641767

17651768
elif (
17661769
"::" in var["raw_type"]
@@ -2166,6 +2169,7 @@ def _evaluate_method_stack(self):
21662169
self._get_stmt_doxygen(),
21672170
self._get_location(self.nameStack),
21682171
)
2172+
newMethod["parent"] = None
21692173
self.functions.append(newMethod)
21702174
global parseHistory
21712175
parseHistory.append(
@@ -2299,6 +2303,7 @@ def _evaluate_property_stack(self, clearStack=True, addToVar=None):
22992303
klass = self.classes[self.curClass]
23002304
klass["properties"][self.curAccessSpecifier].append(newVar)
23012305
newVar["property_of_class"] = klass["name"]
2306+
newVar["parent"] = klass
23022307
parseHistory.append(
23032308
{"braceDepth": self.braceDepth, "item_type": "variable", "item": newVar}
23042309
)
@@ -2373,16 +2378,17 @@ def _evaluate_class_stack(self):
23732378

23742379
if parent:
23752380
newClass["namespace"] = self.classes[parent]["namespace"] + "::" + parent
2376-
newClass["parent"] = parent
2381+
newClass["parent"] = self.classes[parent]
23772382
self.classes[parent]["nested_classes"].append(newClass)
23782383
## supports nested classes with the same name ##
23792384
self.curClass = key = parent + "::" + classKey
23802385
self._classes_brace_level[key] = self.braceDepth
23812386

23822387
elif newClass["parent"]: # nested class defined outside of parent. A::B {...}
2383-
parent = newClass["parent"]
2384-
newClass["namespace"] = self.classes[parent]["namespace"] + "::" + parent
2385-
self.classes[parent]["nested_classes"].append(newClass)
2388+
pcls = newClass["parent"]
2389+
parent = pcls["name"]
2390+
newClass["namespace"] = pcls["namespace"] + "::" + parent
2391+
pcls["nested_classes"].append(newClass)
23862392
## supports nested classes with the same name ##
23872393
self.curClass = key = parent + "::" + classKey
23882394
self._classes_brace_level[key] = self.braceDepth
@@ -2767,7 +2773,9 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
27672773
self.curAccessSpecifier = self.accessSpecifierStack[-1]
27682774
self.accessSpecifierStack = self.accessSpecifierStack[:-1]
27692775
if self.curClass and self.classes[self.curClass]["parent"]:
2770-
self.curClass = self.classes[self.curClass]["parent"]
2776+
self.curClass = self.classes[self.curClass]["parent"][
2777+
"name"
2778+
]
27712779
else:
27722780
self.curClass = ""
27732781
self.stack = []

test/test_CppHeaderParser.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,7 @@ def test_property_CONST_A(self):
952952
"unresolved": False,
953953
"constant": 1,
954954
"name": "CONST_A",
955-
"parent": None,
955+
"parent": self.cppHeader.classes["PandaClass"],
956956
"pointer": 0,
957957
"namespace": "",
958958
"raw_type": "int",
@@ -981,7 +981,7 @@ def test_property_CONST_B(self):
981981
"unresolved": False,
982982
"constant": 1,
983983
"name": "CONST_B",
984-
"parent": None,
984+
"parent": self.cppHeader.classes["PandaClass"],
985985
"pointer": 0,
986986
"namespace": "",
987987
"raw_type": "int",
@@ -1052,7 +1052,7 @@ def test_property(self):
10521052
def test_union(self):
10531053
cmp_values = {
10541054
"name": "union HogUnion",
1055-
"parent": "HogClass",
1055+
"parent": self.cppHeader.classes["HogClass"],
10561056
"declaration_method": "union",
10571057
}
10581058
self.assertEqual(

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