From 0ff6de42507cd41dd02fd988c939d4288d394399 Mon Sep 17 00:00:00 2001 From: FemLolStudio Date: Mon, 30 Jun 2025 11:16:34 +0200 Subject: [PATCH] Fixing `LuaObjectGenerator` when trying to use `async Task` function and adding test --- .../LuaObjectGenerator.Emit.cs | 9 +++++++- tests/Lua.Tests/LuaObjectTests.cs | 23 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs b/src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs index 4772b3ef..d45647a2 100644 --- a/src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs +++ b/src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs @@ -416,7 +416,14 @@ static void EmitMethodFunction(string functionName, string chunkName, TypeMetada if (methodMetadata.HasReturnValue) { - if (SymbolEqualityComparer.Default.Equals(methodMetadata.Symbol.ReturnType, references.LuaValue)) + var returnType = methodMetadata.Symbol.ReturnType; + + if (returnType is INamedTypeSymbol named && named.OriginalDefinition.ToString() == "System.Threading.Tasks.Task") + { + returnType = named.TypeArguments[0]; + } + + if (SymbolEqualityComparer.Default.Equals(returnType, references.LuaValue)) { builder.AppendLine("buffer.Span[0] = result;"); } diff --git a/tests/Lua.Tests/LuaObjectTests.cs b/tests/Lua.Tests/LuaObjectTests.cs index c531d2ee..fbf97c84 100644 --- a/tests/Lua.Tests/LuaObjectTests.cs +++ b/tests/Lua.Tests/LuaObjectTests.cs @@ -23,6 +23,13 @@ public static async Task MethodAsync() await Task.CompletedTask; } + [LuaMember] + public static async Task MethodLuaValueAsync(bool condition) + { + await Task.Yield(); + return condition ? new LuaValue(12) : LuaValue.Nil; + } + [LuaMember] public static double StaticMethodWithReturnValue(double a, double b) { @@ -100,6 +107,22 @@ public async Task Test_MethodAsync() Assert.That(results, Has.Length.EqualTo(0)); } + [Test] + public async Task Test_MethodLuaValueAsync() + { + var userData = new TestUserData(); + + var state = LuaState.Create(); + state.Environment["test"] = userData; + var resultsNumber = await state.DoStringAsync("return test.MethodLuaValueAsync(true)"); + var resultsNill = await state.DoStringAsync("return test.MethodLuaValueAsync(false)"); + + Assert.That(resultsNumber, Has.Length.EqualTo(1)); + Assert.That(resultsNumber[0], Is.EqualTo(new LuaValue(12))); + Assert.That(resultsNill, Has.Length.EqualTo(1)); + Assert.That(resultsNill[0], Is.EqualTo(LuaValue.Nil)); + } + [Test] public async Task Test_StaticMethodWithReturnValue() {