Skip to content

Commit b41b6e6

Browse files
committed
feat(NativeAPI): restore backward compatibility, add option to add/remove MonoBehaviour nodes to generated classes, fix spelling mistakes
1 parent f00117e commit b41b6e6

2 files changed

Lines changed: 96 additions & 18 deletions

File tree

TypeTreeGeneratorAPI/NativeAPI.cs

Lines changed: 77 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
1-
using System.Reflection;
2-
using System.Runtime.InteropServices;
1+
using System.Runtime.InteropServices;
32
using TypeTreeGeneratorAPI.TypeTreeGenerator;
43

54
namespace TypeTreeGeneratorAPI
65
{
76
public static class NativeAPI
87
{
8+
private static bool addMonoBehaviourRootNodes = true;
9+
10+
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_setAddMonoBehaviourRootNodes")]
11+
public static int TypeTreeGenerator_Config_setAddMonoBehaviourRootNodes(byte value)
12+
{
13+
switch (value)
14+
{
15+
case 0:
16+
addMonoBehaviourRootNodes = false;
17+
break;
18+
case 1:
19+
addMonoBehaviourRootNodes = true;
20+
break;
21+
default:
22+
Console.WriteLine($"Expected True(1)/False(0), but got {value} for TypeTreeGenerator_setAddMonoBehaviourRootNodes");
23+
return -1;
24+
}
25+
return 0;
26+
}
27+
928
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_init")]
1029
public static IntPtr TypeTreeGenerator_init(IntPtr unityVersionPtr, IntPtr generatorName)
1130
{
@@ -130,14 +149,36 @@ public static IntPtr TypeTreeGenerator_getLoadedDLLNames(IntPtr typeTreeGenerato
130149
var json = string.Join(",", names.Select(name => $"\"{name}\""));
131150
return Marshal.StringToCoTaskMemUTF8($"[{json}]");
132151
}
133-
152+
134153
public enum GenerateTreeNodesResult
135154
{
136155
Ok = 0,
137156
Error = -1,
138157
NotFound = -2,
139158
}
140159

160+
private static List<TypeTreeNode>? GenerateTypeTreeNodes(TypeTreeGeneratorHandle handle, string assemblyName, string fullName)
161+
{
162+
var typeTreeNodes = handle.Instance.GenerateTreeNodes(assemblyName, fullName);
163+
if (addMonoBehaviourRootNodes && typeTreeNodes != null && fullName != "UnityEngine.MonoBehaviour")
164+
{
165+
var monoBehaviourRootNodes = handle.Instance.GetMonoBehaviourRootNodes();
166+
if (typeTreeNodes.Count == 0)
167+
{
168+
return monoBehaviourRootNodes;
169+
}
170+
if (typeTreeNodes[0].m_Level == 0)
171+
{
172+
// move head to MonoBehaviour head
173+
monoBehaviourRootNodes[0] = typeTreeNodes[0];
174+
typeTreeNodes = typeTreeNodes.Slice(0, typeTreeNodes.Count - 1);
175+
}
176+
return monoBehaviourRootNodes.Concat(typeTreeNodes).ToList();
177+
}
178+
return typeTreeNodes;
179+
}
180+
181+
141182
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_generateTreeNodesJson")]
142183
public static GenerateTreeNodesResult TypeTreeGenerator_generateTreeNodesJson(IntPtr typeTreeGeneratorPtr, IntPtr assemblyNamePtr, IntPtr fullNamePtr, IntPtr jsonAddr)
143184
{
@@ -151,8 +192,7 @@ public static GenerateTreeNodesResult TypeTreeGenerator_generateTreeNodesJson(In
151192
try
152193
{
153194
var handle = (TypeTreeGeneratorHandle)GCHandle.FromIntPtr(typeTreeGeneratorPtr).Target!;
154-
155-
var typeTreeNodes = handle.Instance.GenerateTreeNodes(assemblyName, fullName);
195+
var typeTreeNodes = GenerateTypeTreeNodes(handle, assemblyName, fullName);
156196
if (typeTreeNodes == null)
157197
{
158198
Marshal.WriteIntPtr(jsonAddr, IntPtr.Zero);
@@ -182,7 +222,7 @@ public static GenerateTreeNodesResult TypeTreeGenerator_generateTreeNodesRaw(Int
182222
try
183223
{
184224
var handle = (TypeTreeGeneratorHandle)GCHandle.FromIntPtr(typeTreeGeneratorPtr).Target!;
185-
var typeTreeNodes = handle.Instance.GenerateTreeNodes(assemblyName, fullName);
225+
var typeTreeNodes = GenerateTypeTreeNodes(handle, assemblyName, fullName);
186226
if (typeTreeNodes == null)
187227
{
188228
Marshal.WriteIntPtr(arrAddrPtr, IntPtr.Zero);
@@ -218,8 +258,7 @@ public static int TypeTreeGenerator_freeTreeNodesRaw(IntPtr arrAddr, int arrLeng
218258
return 0;
219259
}
220260

221-
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_getMonoBehaviorDefinitions")]
222-
public static int TypeTreeGenerator_getMonoBehaviorDefinitions(IntPtr typeTreeGeneratorPtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
261+
public static int _TypeTreeGenerator_getMonoBehaviourDefinitions(IntPtr typeTreeGeneratorPtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
223262
{
224263
if (typeTreeGeneratorPtr == IntPtr.Zero)
225264
{
@@ -248,14 +287,12 @@ public static int TypeTreeGenerator_getMonoBehaviorDefinitions(IntPtr typeTreeGe
248287
}
249288
catch (Exception ex)
250289
{
251-
Console.WriteLine($"Error geting mono behaviour definitions:\n{ex.Message}");
290+
Console.WriteLine($"Error getting MonoBehaviour definitions:\n{ex.Message}");
252291
return -1;
253292
}
254293
}
255294

256-
257-
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_freeMonoBehaviorDefinitions")]
258-
public static int TypeTreeGenerator_freeMonoBehaviorDefinitions(IntPtr arrAddr, int arrLength)
295+
public static int _TypeTreeGenerator_freeMonoBehaviourDefinitions(IntPtr arrAddr, int arrLength)
259296
{
260297
if (arrAddr == IntPtr.Zero)
261298
{
@@ -272,6 +309,34 @@ public static int TypeTreeGenerator_freeMonoBehaviorDefinitions(IntPtr arrAddr,
272309
return 0;
273310
}
274311

312+
// alias for backward compatibility
313+
// alias for backward compatibility
314+
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_getMonoBehaviourDefinitions")]
315+
public static int TypeTreeGenerator_getMonoBehaviourDefinitions(IntPtr typeTreeGeneratorPtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
316+
{
317+
return _TypeTreeGenerator_getMonoBehaviourDefinitions(typeTreeGeneratorPtr, arrAddrPtr, arrLengthPtr);
318+
}
319+
320+
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_freeMonoBehaviourDefinitions")]
321+
public static int TypeTreeGenerator_freeMonoBehaviourDefinitions(IntPtr arrAddr, int arrLength)
322+
{
323+
return _TypeTreeGenerator_freeMonoBehaviourDefinitions(arrAddr, arrLength);
324+
}
325+
326+
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_getMonoBehaviorDefinitions")]
327+
public static int TypeTreeGenerator_getMonoBehaviorDefinitions(IntPtr typeTreeGeneratorPtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
328+
{
329+
return _TypeTreeGenerator_getMonoBehaviourDefinitions(typeTreeGeneratorPtr, arrAddrPtr, arrLengthPtr);
330+
}
331+
332+
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_freeMonoBehaviorDefinitions")]
333+
public static int TypeTreeGenerator_freeMonoBehaviorDefinitions(IntPtr arrAddr, int arrLength)
334+
{
335+
return _TypeTreeGenerator_freeMonoBehaviourDefinitions(arrAddr, arrLength);
336+
}
337+
338+
339+
275340
[UnmanagedCallersOnly(EntryPoint = "FreeCoTaskMem")]
276341
public static void FreeCoTaskMem(IntPtr ptr)
277342
{

bindings/python/TypeTreeGeneratorAPI/TypeTreeGenerator.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,12 @@ def init_dll(asm_path: Optional[str] = None):
8383
ctypes.POINTER(TypeTreeNodeNative),
8484
ctypes.c_int,
8585
]
86-
dll.TypeTreeGenerator_getMonoBehaviorDefinitions.argtypes = [
86+
dll.TypeTreeGenerator_getMonoBehaviourDefinitions.argtypes = [
8787
ctypes.c_void_p,
8888
ctypes.POINTER(ctypes.POINTER(ctypes.c_char_p)),
8989
ctypes.POINTER(ctypes.c_int),
9090
]
91-
dll.TypeTreeGenerator_freeMonoBehaviorDefinitions.argtypes = [
91+
dll.TypeTreeGenerator_freeMonoBehaviourDefinitions.argtypes = [
9292
ctypes.POINTER(ctypes.c_char_p),
9393
ctypes.c_int,
9494
]
@@ -97,8 +97,11 @@ def init_dll(asm_path: Optional[str] = None):
9797

9898
dll.TypeTreeGenerator_del.argtypes = [ctypes.c_void_p]
9999
dll.FreeCoTaskMem.argtypes = [ctypes.c_void_p]
100-
DLL = dll # type: ignore
101100

101+
dll.TypeTreeGenerator_setAddMonoBehaviourRootNodes.argtypes = [ctypes.c_void_p, ctypes.c_ubyte]
102+
dll.TypeTreeGenerator_setAddMonoBehaviourRootNodes.restype = ctypes.c_int
103+
104+
DLL = dll # type: ignore
102105

103106
class TypeTreeGenerator:
104107
ptr = ctypes.c_void_p
@@ -163,19 +166,23 @@ def get_nodes(self, assembly: str, fullname: str) -> List[TypeTreeNode]:
163166
DLL.TypeTreeGenerator_freeTreeNodesRaw(nodes_ptr, nodes_count)
164167
return nodes
165168

166-
def get_monobehavior_definitions(self) -> List[Tuple[str, str]]:
169+
def get_monobehaviour_definitions(self) -> List[Tuple[str, str]]:
167170
names_ptr = ctypes.POINTER(ctypes.c_char_p)()
168171
names_cnt = ctypes.c_int()
169-
assert not DLL.TypeTreeGenerator_getMonoBehaviorDefinitions(
172+
assert not DLL.TypeTreeGenerator_getMonoBehaviourDefinitions(
170173
self.ptr,
171174
ctypes.byref(names_ptr),
172175
ctypes.byref(names_cnt),
173176
), "failed to get module exports"
174-
ptr_array = ctypes.cast(names_ptr, ctypes.POINTER(ctypes.c_char_p * names_cnt.value))
177+
ptr_array = ctypes.cast(names_ptr, ctypes.POINTER(ctypes.c_char_p * (names_cnt.value*2)))
175178
names = [name.decode("utf-8") for name in ptr_array.contents]
176179
DLL.TypeTreeGenerator_freeMonoBehaviorDefinitions(names_ptr, names_cnt)
177180
return [(module, fullname) for module, fullname in zip(names[::2], names[1::2])]
178181

182+
def get_monobehavior_definitions(self) -> List[Tuple[str, str]]:
183+
# alias for backward compatibility
184+
return self.get_monobehaviour_definitions()
185+
179186
def get_loaded_dll_names(self) -> List[str]:
180187
names_ptr = DLL.TypeTreeGenerator_getLoadedDLLNames(self.ptr)
181188
if not names_ptr:
@@ -188,5 +195,11 @@ def get_loaded_dll_names(self) -> List[str]:
188195
DLL.FreeCoTaskMem(names_ptr)
189196
return names
190197

198+
def set_add_mono_behaviour_root_nodes(self, enable: bool):
199+
if hasattr(DLL, "TypeTreeGenerator_setAddMonoBehaviourRootNodes"):
200+
DLL.TypeTreeGenerator_setAddMonoBehaviourRootNodes(self.ptr, int(enable))
201+
else:
202+
raise Exception("setAddMonoBehaviourRootNodes is not supported in this version of TypeTreeGeneratorAPI")
203+
191204

192205
__all__ = ["TypeTreeGenerator", "TypeTreeNode", "TypeTreeNodeNative", "TypeTreeBackend"]

0 commit comments

Comments
 (0)