From 5fa10fd17b7b74a73680133a43d387b7581431f6 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Sat, 14 Jan 2023 17:45:21 +0200 Subject: [PATCH 1/2] Allow unsubscribing from managed events multiple times --- .../Bindings/BindingsGenerator.CSharp.cs | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index dc3e09b8f..502dc5324 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -762,7 +762,7 @@ namespace Flax.Build.Bindings CppParamsWrappersCache[i] = result; } - string eventSignature; + string eventType; if (useCustomDelegateSignature) { contents.Append(indent).Append($"/// The delegate for event {eventInfo.Name}.").AppendLine(); @@ -777,24 +777,25 @@ namespace Flax.Build.Bindings contents.Append(CppParamsWrappersCache[i]).Append(" arg").Append(i); } contents.Append(");").AppendLine().AppendLine(); - eventSignature = "event " + eventInfo.Name + "Delegate"; + eventType = eventInfo.Name + "Delegate"; } else { - eventSignature = "event Action"; + eventType = "Action"; if (paramsCount != 0) { - eventSignature += '<'; + eventType += '<'; for (var i = 0; i < paramsCount; i++) { if (i != 0) - eventSignature += ", "; + eventType += ", "; CppParamsWrappersCache[i] = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo); - eventSignature += CppParamsWrappersCache[i]; + eventType += CppParamsWrappersCache[i]; } - eventSignature += '>'; + eventType += '>'; } } + string eventSignature = "event " + eventType; GenerateCSharpComment(contents, indent, eventInfo.Comment, true); GenerateCSharpAttributes(buildData, contents, indent, classInfo, eventInfo, useUnmanaged); @@ -808,11 +809,7 @@ namespace Flax.Build.Bindings indent += " "; var eventInstance = eventInfo.IsStatic ? string.Empty : "__unmanagedPtr, "; contents.Append(indent).Append($"add {{ Internal_{eventInfo.Name} += value; if (Internal_{eventInfo.Name}_Count++ == 0) Internal_{eventInfo.Name}_Bind({eventInstance}true); }}").AppendLine(); - contents.Append(indent).Append("remove { ").AppendLine(); - contents.Append("#if FLAX_EDITOR || BUILD_DEBUG").AppendLine(); - contents.Append(indent).Append($"if (Internal_{eventInfo.Name} != null) {{ bool invalid = true; foreach (Delegate e in Internal_{eventInfo.Name}.GetInvocationList()) {{ if (e == (Delegate)value) {{ invalid = false; break; }} }} if (invalid) throw new Exception(\"Cannot unregister from event if not registered before.\"); }}").AppendLine(); - contents.Append("#endif").AppendLine(); - contents.Append(indent).Append($"Internal_{eventInfo.Name} -= value; if (--Internal_{eventInfo.Name}_Count == 0) Internal_{eventInfo.Name}_Bind({eventInstance}false); }}").AppendLine(); + contents.Append(indent).Append($"remove {{ var __delegate = ({eventType})Delegate.Remove(Internal_{eventInfo.Name}, value); if (__delegate != Internal_{eventInfo.Name}) {{ Internal_{eventInfo.Name} = __delegate; if (--Internal_{eventInfo.Name}_Count == 0) Internal_{eventInfo.Name}_Bind({eventInstance}false); }} }}").AppendLine(); indent = indent.Substring(0, indent.Length - 4); contents.Append(indent).Append('}').AppendLine(); From bf9dbbc79e7ad293f1bd46c75c16f70d89f62af5 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Sat, 14 Jan 2023 18:01:14 +0200 Subject: [PATCH 2/2] Restore disabled compiler warnings of unused events --- Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 502dc5324..93e70c9bd 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -826,6 +826,7 @@ namespace Flax.Build.Bindings contents.Append("static "); contents.Append($"{eventSignature} Internal_{eventInfo.Name};"); contents.AppendLine(); + contents.Append("#pragma warning restore 67").AppendLine(); contents.AppendLine(); contents.Append(indent).Append("internal ");