< Summary

Information
Class: Hertzole.ScriptableValues.Helpers.EventHelper
Assembly: Hertzole.ScriptableValues
File(s): ./Packages/se.hertzole.scriptable-values/Runtime/Helpers/EventHelper.cs
Tag: 52_28197466029
Line coverage
93%
Covered lines: 44
Uncovered lines: 3
Coverable lines: 47
Total lines: 95
Line coverage: 93.6%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
WarnIfLeftOverSubscribers[T](...)0%330100%
CreateWarning(...)0%330100%
WriteDelegates(...)0%3.073080%
WriteParameters(...)0%440100%

File(s)

./Packages/se.hertzole.scriptable-values/Runtime/Helpers/EventHelper.cs

#LineLine coverage
 1#nullable enable
 2
 3using System;
 4using System.Diagnostics;
 5using Object = UnityEngine.Object;
 6#if DEBUG
 7using System.Reflection;
 8using System.Text;
 9using Debug = UnityEngine.Debug;
 10#endif
 11
 12namespace Hertzole.ScriptableValues.Helpers
 13{
 14    /// <summary>
 15    ///     Debug only helper methods for events.
 16    /// </summary>
 17    public static class EventHelper
 18    {
 19        /// <summary>
 20        ///     Helper method that warns if the given delegate has any subscribers left.
 21        ///     <para>This method is removed in non-debug builds, but you don't need to explicitly remove it yourself.</
 22        /// </summary>
 23        /// <remarks>This method only does something in DEBUG builds.</remarks>
 24        /// <param name="action">The delegate to check.</param>
 25        /// <param name="parameterName">The name of the delegate that will be used in the message.</param>
 26        /// <param name="targetObject">Optional target object to ping when the log is selected.</param>
 27        /// <typeparam name="T">The type of the delegate.</typeparam>
 28        [Conditional("DEBUG")]
 29        public static void WarnIfLeftOverSubscribers<T>(T action, string parameterName, Object? targetObject = null)
 11846530        {
 31#if DEBUG
 11846532            if (typeof(T).IsSubclassOf(typeof(Delegate)) && action != null)
 32433            {
 32434                Delegate del = (Delegate) (object) action;
 35
 32436                CreateWarning(del.GetInvocationList().AsSpan(), parameterName, targetObject);
 32437            }
 38#endif
 11846539        }
 40
 41#if DEBUG
 42        private static void CreateWarning(ReadOnlySpan<Delegate> delegates, string parameterName, Object? targetObject)
 32443        {
 32444            StringBuilder sb = new StringBuilder();
 32445            sb.Append($"{parameterName}");
 32446            if (targetObject != null)
 32447            {
 32448                sb.Append($" in object {targetObject.name} ({targetObject.GetType().FullName})");
 32449            }
 50
 32451            sb.AppendLine(" has some leftover subscribers:");
 32452            WriteDelegates(sb, delegates);
 53
 32454            Debug.LogWarning(sb.ToString(), targetObject);
 32455        }
 56
 57        private static void WriteDelegates(StringBuilder sb, in ReadOnlySpan<Delegate> delegates)
 32458        {
 129659            for (int i = 0; i < delegates.Length; i++)
 32460            {
 32461                sb.Append(delegates[i].Method.DeclaringType);
 32462                sb.Append('.');
 32463                sb.Append(delegates[i].Method.Name);
 64
 32465                WriteParameters(sb, delegates[i]);
 66
 32467                if (i < delegates.Length - 1)
 068                {
 069                    sb.AppendLine();
 070                }
 32471            }
 32472        }
 73
 74        private static void WriteParameters(StringBuilder sb, Delegate del)
 32475        {
 32476            ParameterInfo[] parameters = del.Method.GetParameters();
 32477            if (parameters.Length > 0)
 32478            {
 32479                sb.Append('(');
 80
 189681                for (int i = 0; i < parameters.Length; i++)
 62482                {
 62483                    sb.Append(parameters[i].Name);
 62484                    if (i < parameters.Length - 1)
 30085                    {
 30086                        sb.Append(", ");
 30087                    }
 62488                }
 89
 32490                sb.Append(')');
 32491            }
 32492        }
 93#endif
 94    }
 95}