| #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member | 
|   | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Diagnostics; | 
| using System.Text; | 
| using System.Threading; | 
| using Cysharp.Threading.Tasks.Internal; | 
|   | 
| namespace Cysharp.Threading.Tasks | 
| { | 
|     // public for add user custom. | 
|   | 
|     public static class TaskTracker | 
|     { | 
| #if UNITY_EDITOR | 
|   | 
|         static int trackingId = 0; | 
|   | 
|         public const string EnableAutoReloadKey = "UniTaskTrackerWindow_EnableAutoReloadKey"; | 
|         public const string EnableTrackingKey = "UniTaskTrackerWindow_EnableTrackingKey"; | 
|         public const string EnableStackTraceKey = "UniTaskTrackerWindow_EnableStackTraceKey"; | 
|   | 
|         public static class EditorEnableState | 
|         { | 
|             static bool enableAutoReload; | 
|             public static bool EnableAutoReload | 
|             { | 
|                 get { return enableAutoReload; } | 
|                 set | 
|                 { | 
|                     enableAutoReload = value; | 
|                     UnityEditor.EditorPrefs.SetBool(EnableAutoReloadKey, value); | 
|                 } | 
|             } | 
|   | 
|             static bool enableTracking; | 
|             public static bool EnableTracking | 
|             { | 
|                 get { return enableTracking; } | 
|                 set | 
|                 { | 
|                     enableTracking = value; | 
|                     UnityEditor.EditorPrefs.SetBool(EnableTrackingKey, value); | 
|                 } | 
|             } | 
|   | 
|             static bool enableStackTrace; | 
|             public static bool EnableStackTrace | 
|             { | 
|                 get { return enableStackTrace; } | 
|                 set | 
|                 { | 
|                     enableStackTrace = value; | 
|                     UnityEditor.EditorPrefs.SetBool(EnableStackTraceKey, value); | 
|                 } | 
|             } | 
|         } | 
|   | 
| #endif | 
|   | 
|   | 
|         static List<KeyValuePair<IUniTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)>> listPool = new List<KeyValuePair<IUniTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)>>(); | 
|   | 
|         static readonly WeakDictionary<IUniTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)> tracking = new WeakDictionary<IUniTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)>(); | 
|   | 
|         [Conditional("UNITY_EDITOR")] | 
|         public static void TrackActiveTask(IUniTaskSource task, int skipFrame) | 
|         { | 
| #if UNITY_EDITOR | 
|             dirty = true; | 
|             if (!EditorEnableState.EnableTracking) return; | 
|             var stackTrace = EditorEnableState.EnableStackTrace ? new StackTrace(skipFrame, true).CleanupAsyncStackTrace() : ""; | 
|   | 
|             string typeName; | 
|             if (EditorEnableState.EnableStackTrace) | 
|             { | 
|                 var sb = new StringBuilder(); | 
|                 TypeBeautify(task.GetType(), sb); | 
|                 typeName = sb.ToString(); | 
|             } | 
|             else | 
|             { | 
|                 typeName = task.GetType().Name; | 
|             } | 
|             tracking.TryAdd(task, (typeName, Interlocked.Increment(ref trackingId), DateTime.UtcNow, stackTrace)); | 
| #endif | 
|         } | 
|   | 
|         [Conditional("UNITY_EDITOR")] | 
|         public static void RemoveTracking(IUniTaskSource task) | 
|         { | 
| #if UNITY_EDITOR | 
|             dirty = true; | 
|             if (!EditorEnableState.EnableTracking) return; | 
|             var success = tracking.TryRemove(task); | 
| #endif | 
|         } | 
|   | 
|         static bool dirty; | 
|   | 
|         public static bool CheckAndResetDirty() | 
|         { | 
|             var current = dirty; | 
|             dirty = false; | 
|             return current; | 
|         } | 
|   | 
|         /// <summary>(trackingId, awaiterType, awaiterStatus, createdTime, stackTrace)</summary> | 
|         public static void ForEachActiveTask(Action<int, string, UniTaskStatus, DateTime, string> action) | 
|         { | 
|             lock (listPool) | 
|             { | 
|                 var count = tracking.ToList(ref listPool, clear: false); | 
|                 try | 
|                 { | 
|                     for (int i = 0; i < count; i++) | 
|                     { | 
|                         action(listPool[i].Value.trackingId, listPool[i].Value.formattedType, listPool[i].Key.UnsafeGetStatus(), listPool[i].Value.addTime, listPool[i].Value.stackTrace); | 
|                         listPool[i] = default; | 
|                     } | 
|                 } | 
|                 catch | 
|                 { | 
|                     listPool.Clear(); | 
|                     throw; | 
|                 } | 
|             } | 
|         } | 
|   | 
|         static void TypeBeautify(Type type, StringBuilder sb) | 
|         { | 
|             if (type.IsNested) | 
|             { | 
|                 // TypeBeautify(type.DeclaringType, sb); | 
|                 sb.Append(type.DeclaringType.Name.ToString()); | 
|                 sb.Append("."); | 
|             } | 
|   | 
|             if (type.IsGenericType) | 
|             { | 
|                 var genericsStart = type.Name.IndexOf("`"); | 
|                 if (genericsStart != -1) | 
|                 { | 
|                     sb.Append(type.Name.Substring(0, genericsStart)); | 
|                 } | 
|                 else | 
|                 { | 
|                     sb.Append(type.Name); | 
|                 } | 
|                 sb.Append("<"); | 
|                 var first = true; | 
|                 foreach (var item in type.GetGenericArguments()) | 
|                 { | 
|                     if (!first) | 
|                     { | 
|                         sb.Append(", "); | 
|                     } | 
|                     first = false; | 
|                     TypeBeautify(item, sb); | 
|                 } | 
|                 sb.Append(">"); | 
|             } | 
|             else | 
|             { | 
|                 sb.Append(type.Name); | 
|             } | 
|         } | 
|   | 
|         //static string RemoveUniTaskNamespace(string str) | 
|         //{ | 
|         //    return str.Replace("Cysharp.Threading.Tasks.CompilerServices", "") | 
|         //        .Replace("Cysharp.Threading.Tasks.Linq", "") | 
|         //        .Replace("Cysharp.Threading.Tasks", ""); | 
|         //} | 
|     } | 
| } |