Browse Source

Add: support passing CancellationToken in parameter by LuaObjectGenerator

Akeit0 7 months ago
parent
commit
e5e7121fe1

+ 33 - 6
src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs

@@ -177,9 +177,14 @@ partial class LuaObjectGenerator
             }
 
         PARAMETERS:
-            foreach (var typeSymbol in method.Symbol.Parameters
-                         .Select(x => x.Type))
+            for (int index = 0; index < method.Symbol.Parameters.Length; index++)
             {
+                IParameterSymbol? parameterSymbol = method.Symbol.Parameters[index];
+                var typeSymbol = parameterSymbol.Type;
+                if(index == method.Symbol.Parameters.Length - 1 && SymbolEqualityComparer.Default.Equals(typeSymbol, references.CancellationToken))
+                {
+                    continue;
+                }
                 if (SymbolEqualityComparer.Default.Equals(typeSymbol, references.LuaValue)) continue;
                 if (SymbolEqualityComparer.Default.Equals(typeSymbol, typeMetadata.Symbol)) continue;
 
@@ -359,10 +364,20 @@ partial class LuaObjectGenerator
                 builder.AppendLine($"var userData = context.GetArgument<{typeMetadata.FullTypeName}>(0);");
                 index++;
             }
+            
+            bool hasCancellationToken = false;
 
-            foreach (var parameter in methodMetadata.Symbol.Parameters)
+            for (int i = 0; i < methodMetadata.Symbol.Parameters.Length; i++)
             {
-                var isParameterLuaValue = SymbolEqualityComparer.Default.Equals(parameter.Type, references.LuaValue);
+                IParameterSymbol? parameter = methodMetadata.Symbol.Parameters[i];
+                var parameterType = parameter.Type;
+                var isParameterLuaValue = SymbolEqualityComparer.Default.Equals(parameterType, references.LuaValue);
+
+                if (i == methodMetadata.Symbol.Parameters.Length - 1 && SymbolEqualityComparer.Default.Equals(parameterType, references.CancellationToken))
+                {
+                    hasCancellationToken = true;
+                    break;
+                }
 
                 if (parameter.HasExplicitDefaultValue)
                 {
@@ -374,7 +389,7 @@ partial class LuaObjectGenerator
                     }
                     else
                     {
-                        builder.AppendLine($"var arg{index} = context.HasArgument({index}) ?  context.GetArgument<{parameter.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>({index}) : {syntax.Default!.Value.ToFullString()};");
+                        builder.AppendLine($"var arg{index} = context.HasArgument({index}) ?  context.GetArgument<{parameterType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>({index}) : {syntax.Default!.Value.ToFullString()};");
                     }
                 }
                 else
@@ -385,7 +400,7 @@ partial class LuaObjectGenerator
                     }
                     else
                     {
-                        builder.AppendLine($"var arg{index} = context.GetArgument<{parameter.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>({index});");
+                        builder.AppendLine($"var arg{index} = context.GetArgument<{parameterType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>({index});");
                     }
                 }
 
@@ -406,12 +421,24 @@ partial class LuaObjectGenerator
             {
                 builder.Append($"{typeMetadata.FullTypeName}.{methodMetadata.Symbol.Name}(", false);
                 builder.Append(string.Join(",", Enumerable.Range(0, index).Select(x => $"arg{x}")), false);
+
+                if (hasCancellationToken)
+                {
+                    builder.Append(index > 0?",ct":"ct", false);
+                }
+
                 builder.AppendLine(");", false);
             }
             else
             {
                 builder.Append($"userData.{methodMetadata.Symbol.Name}(");
                 builder.Append(string.Join(",", Enumerable.Range(1, index - 1).Select(x => $"arg{x}")), false);
+
+                if (hasCancellationToken)
+                {
+                    builder.Append(index > 1 ? ",ct" : "ct", false);
+                }
+
                 builder.AppendLine(");", false);
             }
 

+ 2 - 0
src/Lua.SourceGenerator/SymbolReferences.cs

@@ -16,6 +16,7 @@ public sealed class SymbolReferences
             LuaIgnoreMemberAttribute = compilation.GetTypeByMetadataName("Lua.LuaIgnoreMemberAttribute")!,
             LuaMetamethodAttribute = compilation.GetTypeByMetadataName("Lua.LuaMetamethodAttribute")!,
             LuaValue = compilation.GetTypeByMetadataName("Lua.LuaValue")!,
+            CancellationToken = compilation.GetTypeByMetadataName("System.Threading.CancellationToken")!
         };
     }
 
@@ -24,4 +25,5 @@ public sealed class SymbolReferences
     public INamedTypeSymbol LuaIgnoreMemberAttribute { get; private set; } = default!;
     public INamedTypeSymbol LuaMetamethodAttribute { get; private set; } = default!;
     public INamedTypeSymbol LuaValue { get; private set; } = default!;
+    public INamedTypeSymbol CancellationToken { get; private set; } = default!;
 }