private void BuildHierarchy(CallTreeNode callee, int depth) { if (depth++ == m_MaxDepth) { return; } // let's find all callers with matching callee if (m_BucketedCallPairs.ContainsKey(callee.name)) { var callPairs = m_BucketedCallPairs[callee.name]; foreach (var call in callPairs) { // ignore recursive calls if (!call.caller.FullName.Equals(callee.name)) { var callerInstance = new CallTreeNode(call.caller); callerInstance.location = call.location; callerInstance.perfCriticalContext = call.perfCriticalContext; BuildHierarchy(callerInstance, depth); callee.AddChild(callerInstance); } } } }
public CallTreeNode(MethodReference methodReference, CallTreeNode caller = null) { name = methodReference.FullName; methodName = "(anonymous)"; // default value assemblyName = methodReference.Module.Name; // check if it's a coroutine if (methodReference.DeclaringType.FullName.IndexOf("/<") >= 0) { var fullName = methodReference.DeclaringType.FullName; var methodStartIndex = fullName.IndexOf("<") + 1; if (methodStartIndex > 0) { var length = fullName.IndexOf(">") - methodStartIndex; typeName = fullName.Substring(0, fullName.IndexOf("/")); if (length > 0) { methodName = fullName.Substring(methodStartIndex, length); } else { // handle example: System.Int32 DelegateTest/<>c::<Update>b__1_0() methodStartIndex = name.LastIndexOf("<") + 1; if (methodStartIndex > 0) { length = name.LastIndexOf(">") - methodStartIndex; methodName = name.Substring(methodStartIndex, length) + ".(anonymous)"; } } } else { // for some reason, some generated types don't have the same syntax typeName = fullName; } } else { typeName = methodReference.DeclaringType.Name; methodName = methodReference.Name; } if (caller != null) { children.Add(caller); } perfCriticalContext = false; }
public void AddChild(CallTreeNode child) { children.Add(child); }