diff options
author | Ignacio Roldán Etcheverry <ignalfonsore@gmail.com> | 2022-07-28 17:41:47 +0200 |
---|---|---|
committer | Ignacio Roldán Etcheverry <ignalfonsore@gmail.com> | 2022-08-22 03:36:52 +0200 |
commit | 97713ff77a339faa72d54bd596e3d8c2b8520ce0 (patch) | |
tree | 22e97aa97c7ff55d5e3cd92c3cc4130a041aa6ef /modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs | |
parent | f033764ffe5892f963a9416e8cbcfd0fb5225103 (diff) | |
download | redot-engine-97713ff77a339faa72d54bd596e3d8c2b8520ce0.tar.gz |
C#: Add source generator for signals as events
Changed the signal declaration signal to:
```
// The following generates a MySignal event
[Signal] public delegate void MySignalEventHandler(int param);
```
Diffstat (limited to 'modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs')
-rw-r--r-- | modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs index c218212f04..bac4708165 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs @@ -174,46 +174,60 @@ namespace Godot.SourceGenerators public static bool IsGodotExportAttribute(this INamedTypeSymbol symbol) => symbol.ToString() == GodotClasses.ExportAttr; + public static bool IsGodotSignalAttribute(this INamedTypeSymbol symbol) + => symbol.ToString() == GodotClasses.SignalAttr; + public static bool IsGodotClassNameAttribute(this INamedTypeSymbol symbol) => symbol.ToString() == GodotClasses.GodotClassNameAttr; public static bool IsSystemFlagsAttribute(this INamedTypeSymbol symbol) => symbol.ToString() == GodotClasses.SystemFlagsAttr; - public static IEnumerable<GodotMethodData> WhereHasGodotCompatibleSignature( - this IEnumerable<IMethodSymbol> methods, + public static GodotMethodData? HasGodotCompatibleSignature( + this IMethodSymbol method, MarshalUtils.TypeCache typeCache ) { - foreach (var method in methods) - { - if (method.IsGenericMethod) - continue; + if (method.IsGenericMethod) + return null; - var retSymbol = method.ReturnType; - var retType = method.ReturnsVoid ? - null : - MarshalUtils.ConvertManagedTypeToMarshalType(method.ReturnType, typeCache); + var retSymbol = method.ReturnType; + var retType = method.ReturnsVoid ? + null : + MarshalUtils.ConvertManagedTypeToMarshalType(method.ReturnType, typeCache); - if (retType == null && !method.ReturnsVoid) - continue; + if (retType == null && !method.ReturnsVoid) + return null; - var parameters = method.Parameters; + var parameters = method.Parameters; - var paramTypes = parameters - // Currently we don't support `ref`, `out`, `in`, `ref readonly` parameters (and we never may) - .Where(p => p.RefKind == RefKind.None) - // Attempt to determine the variant type - .Select(p => MarshalUtils.ConvertManagedTypeToMarshalType(p.Type, typeCache)) - // Discard parameter types that couldn't be determined (null entries) - .Where(t => t != null).Cast<MarshalType>().ToImmutableArray(); + var paramTypes = parameters + // Currently we don't support `ref`, `out`, `in`, `ref readonly` parameters (and we never may) + .Where(p => p.RefKind == RefKind.None) + // Attempt to determine the variant type + .Select(p => MarshalUtils.ConvertManagedTypeToMarshalType(p.Type, typeCache)) + // Discard parameter types that couldn't be determined (null entries) + .Where(t => t != null).Cast<MarshalType>().ToImmutableArray(); - // If any parameter type was incompatible, it was discarded so the length won't match - if (parameters.Length > paramTypes.Length) - continue; + // If any parameter type was incompatible, it was discarded so the length won't match + if (parameters.Length > paramTypes.Length) + return null; // Ignore incompatible method + + return new GodotMethodData(method, paramTypes, parameters + .Select(p => p.Type).ToImmutableArray(), retType, retSymbol); + } + + public static IEnumerable<GodotMethodData> WhereHasGodotCompatibleSignature( + this IEnumerable<IMethodSymbol> methods, + MarshalUtils.TypeCache typeCache + ) + { + foreach (var method in methods) + { + var methodData = HasGodotCompatibleSignature(method, typeCache); - yield return new GodotMethodData(method, paramTypes, parameters - .Select(p => p.Type).ToImmutableArray(), retType, retSymbol); + if (methodData != null) + yield return methodData.Value; } } |