@@ -35,13 +35,28 @@ def __attrs_post_init__(self):
35
35
self ._clean_name = clean_name (self .m_Name )
36
36
37
37
38
+ TYPETREENODE_KEYS = [
39
+ "m_Level" ,
40
+ "m_Type" ,
41
+ "m_Name" ,
42
+ "m_ByteSize" ,
43
+ "m_Version" ,
44
+ "m_Children" ,
45
+ "m_TypeFlags" ,
46
+ "m_VariableCount" ,
47
+ "m_Index" ,
48
+ "m_MetaFlag" ,
49
+ "m_RefTypeHash" ,
50
+ ]
51
+
52
+
38
53
class TypeTreeNode (TypeTreeNodeC ):
39
54
def traverse (self ) -> Iterator [TypeTreeNode ]:
40
55
stack : list [TypeTreeNode ] = [self ]
41
56
while stack :
42
57
node = stack .pop ()
43
- stack .extend (reversed (node .m_Children ))
44
58
yield node
59
+ stack .extend (reversed (node .m_Children ))
45
60
46
61
@classmethod
47
62
def parse (cls , reader : EndianBinaryReader , version : int ) -> TypeTreeNode :
@@ -132,7 +147,7 @@ def from_list(cls, nodes: List[dict]) -> TypeTreeNode:
132
147
133
148
for node in nodes :
134
149
if isinstance (node , dict ):
135
- node = cls (node )
150
+ node = cls (** node )
136
151
137
152
if node .m_Level > prev .m_Level :
138
153
stack .append (parent )
@@ -224,6 +239,22 @@ def dump_structure(self, indent: str = " ") -> str:
224
239
sb .append (child .dump_structure (indent + " " ))
225
240
return "\n " .join (sb )
226
241
242
+ def to_dict (self ) -> dict :
243
+ return {
244
+ key : value
245
+ for key , value in ((key , getattr (self , key )) for key in TYPETREENODE_KEYS )
246
+ if value is not None
247
+ }
248
+
249
+ def to_dict_list (self ) -> List [dict ]:
250
+ return [
251
+ self .to_dict (),
252
+ * (item for child in self .m_Children for item in child .to_dict_list ()),
253
+ ]
254
+
255
+ def __eq__ (self , other : TypeTreeNode ) -> bool :
256
+ return self .to_dict () == other .to_dict () and self .m_Children == other .m_Children
257
+
227
258
228
259
COMMONSTRING_CACHE : Dict [Optional [UnityVersion ], Dict [int , str ]] = {}
229
260
@@ -284,3 +315,10 @@ def clean_name(name: str) -> str:
284
315
if name [0 ].isdigit ():
285
316
name = f"x{ name } "
286
317
return name
318
+
319
+
320
+ __all__ = (
321
+ "TypeTreeNode" ,
322
+ "get_common_strings" ,
323
+ "clean_name" ,
324
+ )
0 commit comments