diff --git a/src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs b/src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs index 71567e3b..84f09d53 100644 --- a/src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs +++ b/src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs @@ -1,5 +1,6 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; namespace Lua.SourceGenerator; @@ -361,7 +362,32 @@ static void EmitMethodFunction(string functionName, string chunkName, TypeMetada foreach (var parameter in methodMetadata.Symbol.Parameters) { - builder.AppendLine($"var arg{index} = context.GetArgument<{parameter.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>({index});"); + var isParameterLuaValue = SymbolEqualityComparer.Default.Equals(parameter.Type, references.LuaValue); + + if (parameter.HasExplicitDefaultValue) + { + var syntax = (ParameterSyntax)parameter.DeclaringSyntaxReferences[0].GetSyntax(); + + if (isParameterLuaValue) + { + builder.AppendLine($"var arg{index} = context.HasArgument({index}) ? context.GetArgument({index}) : {syntax.Default!.Value.ToFullString()};"); + } + else + { + builder.AppendLine($"var arg{index} = context.HasArgument({index}) ? context.GetArgument<{parameter.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>({index}) : {syntax.Default!.Value.ToFullString()};"); + } + } + else + { + if (isParameterLuaValue) + { + builder.AppendLine($"var arg{index} = context.GetArgument({index});"); + } + else + { + builder.AppendLine($"var arg{index} = context.GetArgument<{parameter.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>({index});"); + } + } index++; } @@ -398,7 +424,7 @@ static void EmitMethodFunction(string functionName, string chunkName, TypeMetada { builder.AppendLine("buffer.Span[0] = new global::Lua.LuaValue(result);"); } - + builder.AppendLine($"return {(methodMetadata.IsAsync ? "1" : "new(1)")};"); } else diff --git a/src/Lua/LuaValue.cs b/src/Lua/LuaValue.cs index 960fcd09..f8354db0 100644 --- a/src/Lua/LuaValue.cs +++ b/src/Lua/LuaValue.cs @@ -46,6 +46,18 @@ public bool TryRead(out T result) result = Unsafe.As(ref v); return true; } + else if (t == typeof(int)) + { + var v = (int)value; + result = Unsafe.As(ref v); + return true; + } + else if (t == typeof(long)) + { + var v = (long)value; + result = Unsafe.As(ref v); + return true; + } else if (t == typeof(object)) { result = (T)(object)value;