|
|
|
@@ -1,6 +1,8 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
using Syntriax.Engine.Core.Debug;
|
|
|
|
|
|
|
|
|
|
namespace Syntriax.Engine.Core;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@@ -48,6 +50,9 @@ public class Event
|
|
|
|
|
// We use Ascending order because draw calls are running from last to first
|
|
|
|
|
private static readonly Comparer<ListenerData> SortByAscendingPriority = Comparer<ListenerData>.Create((x, y) => x.Priority.CompareTo(y.Priority));
|
|
|
|
|
|
|
|
|
|
private ILogger _logger = new ConsoleLogger();
|
|
|
|
|
public ILogger Logger { get => _logger; set => _logger = value ?? new ConsoleLogger(); }
|
|
|
|
|
|
|
|
|
|
private readonly List<ListenerData> listeners = null!;
|
|
|
|
|
private readonly List<ListenerData> onceListeners = null!;
|
|
|
|
|
|
|
|
|
@@ -126,7 +131,7 @@ public class Event
|
|
|
|
|
catch (Exception exception)
|
|
|
|
|
{
|
|
|
|
|
string methodCallRepresentation = $"{listeners[i].Callback.Method.DeclaringType?.FullName}.{listeners[i].Callback.Method.Name}()";
|
|
|
|
|
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
|
|
|
|
|
EventHelpers.LogInvocationException(listeners[i].Callback.Target ?? this, Logger, exception, methodCallRepresentation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = onceListeners.Count - 1; i >= 0; i--)
|
|
|
|
@@ -135,7 +140,7 @@ public class Event
|
|
|
|
|
catch (Exception exception)
|
|
|
|
|
{
|
|
|
|
|
string methodCallRepresentation = $"{onceListeners[i].Callback.Method.DeclaringType?.FullName}.{onceListeners[i].Callback.Method.Name}()";
|
|
|
|
|
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
|
|
|
|
|
EventHelpers.LogInvocationException(onceListeners[i].Callback.Target ?? this, Logger, exception, methodCallRepresentation);
|
|
|
|
|
}
|
|
|
|
|
onceListeners.RemoveAt(i);
|
|
|
|
|
}
|
|
|
|
@@ -199,11 +204,14 @@ public class Event
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="TSender">Sender type</typeparam>
|
|
|
|
|
public class Event<TSender>
|
|
|
|
|
public class Event<TSender> where TSender : class
|
|
|
|
|
{
|
|
|
|
|
// We use Ascending order because draw calls are running from last to first
|
|
|
|
|
private static readonly Comparer<ListenerData> SortByAscendingPriority = Comparer<ListenerData>.Create((x, y) => x.Priority.CompareTo(y.Priority));
|
|
|
|
|
|
|
|
|
|
private ILogger _logger = new ConsoleLogger();
|
|
|
|
|
public ILogger Logger { get => _logger; set => _logger = value ?? new ConsoleLogger(); }
|
|
|
|
|
|
|
|
|
|
private readonly List<ListenerData> listeners = null!;
|
|
|
|
|
private readonly List<ListenerData> onceListeners = null!;
|
|
|
|
|
|
|
|
|
@@ -283,7 +291,7 @@ public class Event<TSender>
|
|
|
|
|
catch (Exception exception)
|
|
|
|
|
{
|
|
|
|
|
string methodCallRepresentation = $"{listeners[i].Callback.Method.DeclaringType?.FullName}.{listeners[i].Callback.Method.Name}({sender})";
|
|
|
|
|
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
|
|
|
|
|
EventHelpers.LogInvocationException(listeners[i].Callback.Target ?? sender, Logger, exception, methodCallRepresentation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = onceListeners.Count - 1; i >= 0; i--)
|
|
|
|
@@ -292,7 +300,7 @@ public class Event<TSender>
|
|
|
|
|
catch (Exception exception)
|
|
|
|
|
{
|
|
|
|
|
string methodCallRepresentation = $"{onceListeners[i].Callback.Method.DeclaringType?.FullName}.{onceListeners[i].Callback.Method.Name}({sender})";
|
|
|
|
|
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
|
|
|
|
|
EventHelpers.LogInvocationException(onceListeners[i].Callback.Target ?? sender, Logger, exception, methodCallRepresentation);
|
|
|
|
|
}
|
|
|
|
|
onceListeners.RemoveAt(i);
|
|
|
|
|
}
|
|
|
|
@@ -363,11 +371,14 @@ public class Event<TSender>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="TSender">Sender type</typeparam>
|
|
|
|
|
public class Event<TSender, TArguments>
|
|
|
|
|
public class Event<TSender, TArguments> where TSender : class
|
|
|
|
|
{
|
|
|
|
|
// We use Ascending order because draw calls are running from last to first
|
|
|
|
|
private static readonly Comparer<ListenerData> SortByAscendingPriority = Comparer<ListenerData>.Create((x, y) => x.Priority.CompareTo(y.Priority));
|
|
|
|
|
|
|
|
|
|
private ILogger _logger = new ConsoleLogger();
|
|
|
|
|
public ILogger Logger { get => _logger; set => _logger = value ?? new ConsoleLogger(); }
|
|
|
|
|
|
|
|
|
|
private readonly List<ListenerData> listeners = null!;
|
|
|
|
|
private readonly List<ListenerData> onceListeners = null!;
|
|
|
|
|
|
|
|
|
@@ -447,8 +458,8 @@ public class Event<TSender, TArguments>
|
|
|
|
|
try { listeners[i].Callback.Invoke(sender, args); }
|
|
|
|
|
catch (Exception exception)
|
|
|
|
|
{
|
|
|
|
|
string methodCallRepresentation = $"{listeners[i].Callback.Method.DeclaringType?.FullName}.{listeners[i].Callback.Method.Name}({string.Join(", ", sender, args)})";
|
|
|
|
|
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
|
|
|
|
|
string methodCallRepresentation = $"{listeners[i].Callback.Method.DeclaringType?.FullName}.{listeners[i].Callback.Method.Name}({sender}, {args})";
|
|
|
|
|
EventHelpers.LogInvocationException(listeners[i].Callback.Target ?? sender, Logger, exception, methodCallRepresentation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = onceListeners.Count - 1; i >= 0; i--)
|
|
|
|
@@ -456,8 +467,8 @@ public class Event<TSender, TArguments>
|
|
|
|
|
try { onceListeners[i].Callback.Invoke(sender, args); }
|
|
|
|
|
catch (Exception exception)
|
|
|
|
|
{
|
|
|
|
|
string methodCallRepresentation = $"{onceListeners[i].Callback.Method.DeclaringType?.FullName}.{onceListeners[i].Callback.Method.Name}({string.Join(", ", sender, args)})";
|
|
|
|
|
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
|
|
|
|
|
string methodCallRepresentation = $"{onceListeners[i].Callback.Method.DeclaringType?.FullName}.{onceListeners[i].Callback.Method.Name}({sender}, {args})";
|
|
|
|
|
EventHelpers.LogInvocationException(onceListeners[i].Callback.Target ?? sender, Logger, exception, methodCallRepresentation);
|
|
|
|
|
}
|
|
|
|
|
onceListeners.RemoveAt(i);
|
|
|
|
|
}
|
|
|
|
@@ -478,3 +489,12 @@ public class Event<TSender, TArguments>
|
|
|
|
|
public delegate void EventHandler(TSender sender, TArguments args);
|
|
|
|
|
private record struct ListenerData(EventHandler Callback, int Priority);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static class EventHelpers
|
|
|
|
|
{
|
|
|
|
|
public static void LogInvocationException(object sender, ILogger logger, Exception exception, string methodCallRepresentation)
|
|
|
|
|
{
|
|
|
|
|
logger.LogException(sender, exception);
|
|
|
|
|
logger.LogError(sender, $"Unexpected exception on invocation of method {methodCallRepresentation}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|