DebuggingUtils.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.Diagnostics;
  3. using System.Reflection;
  4. using System.Text;
  5. namespace Godot
  6. {
  7. internal static class DebuggingUtils
  8. {
  9. internal static void AppendTypeName(this StringBuilder sb, Type type)
  10. {
  11. if (type.IsPrimitive)
  12. sb.Append(type.Name);
  13. else if (type == typeof(void))
  14. sb.Append("void");
  15. else
  16. sb.Append(type);
  17. sb.Append(" ");
  18. }
  19. public static void GetStackFrameInfo(StackFrame frame, out string fileName, out int fileLineNumber, out string methodDecl)
  20. {
  21. fileName = frame.GetFileName();
  22. fileLineNumber = frame.GetFileLineNumber();
  23. MethodBase methodBase = frame.GetMethod();
  24. if (methodBase == null)
  25. {
  26. methodDecl = string.Empty;
  27. return;
  28. }
  29. var sb = new StringBuilder();
  30. if (methodBase is MethodInfo)
  31. sb.AppendTypeName(((MethodInfo)methodBase).ReturnType);
  32. sb.Append(methodBase.DeclaringType.FullName);
  33. sb.Append(".");
  34. sb.Append(methodBase.Name);
  35. if (methodBase.IsGenericMethod)
  36. {
  37. Type[] genericParams = methodBase.GetGenericArguments();
  38. sb.Append("<");
  39. for (int j = 0; j < genericParams.Length; j++)
  40. {
  41. if (j > 0)
  42. sb.Append(", ");
  43. sb.AppendTypeName(genericParams[j]);
  44. }
  45. sb.Append(">");
  46. }
  47. sb.Append("(");
  48. bool varArgs = (methodBase.CallingConvention & CallingConventions.VarArgs) != 0;
  49. ParameterInfo[] parameter = methodBase.GetParameters();
  50. for (int i = 0; i < parameter.Length; i++)
  51. {
  52. if (i > 0)
  53. sb.Append(", ");
  54. if (i == parameter.Length - 1 && varArgs)
  55. sb.Append("params ");
  56. sb.AppendTypeName(parameter[i].ParameterType);
  57. }
  58. sb.Append(")");
  59. methodDecl = sb.ToString();
  60. }
  61. }
  62. }