From 2fac34a1ceac82d71c748b1421917d8fc2a60fa7 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Tue, 4 Feb 2025 23:19:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SampleIncrementalSourceGenerator.cs | 67 ++++++- .../mROA.Codegen.AssemblyInfo.cs | 2 +- mROA.Example/TestControllerRemoteEndpoint.cs | 171 +++++++++--------- mROA.Example/TestParameterRemoteEndpoint.cs | 40 ++-- mROA.Example/mROA.Example.csproj | 5 +- .../Debug/net9.0/mROA.Example.AssemblyInfo.cs | 2 +- mROA.Test/StreamTest.cs | 2 +- mROA.Test/UnitTest1.cs | 10 +- .../Debug/net9.0/mROA.Test.AssemblyInfo.cs | 2 +- mROA/Implementation/CallRequest.cs | 2 +- .../Implementation/JsonSerialisationModule.cs | 2 +- mROA/obj/Debug/net9.0/mROA.AssemblyInfo.cs | 2 +- 12 files changed, 186 insertions(+), 121 deletions(-) diff --git a/mROA.Codegen/SampleIncrementalSourceGenerator.cs b/mROA.Codegen/SampleIncrementalSourceGenerator.cs index 5d231a8..6d8013a 100644 --- a/mROA.Codegen/SampleIncrementalSourceGenerator.cs +++ b/mROA.Codegen/SampleIncrementalSourceGenerator.cs @@ -104,11 +104,72 @@ namespace {Namespace} // Go through all class members with a particular type (property) to generate method lines. var methodBody = classSymbol.GetMembers() .OfType(); - methods.AddRange(methodBody.Select(i => (namespaceName + "." + className, i))); var originalName = className; // Build up the source code className = className.TrimStart('I') + "RemoteEndpoint"; + + + var methodsText = new List(); + + foreach (var method in methodBody) + { + var index = methods.Count; + methods.Add((namespaceName + "." + className, method)); + var sb = new StringBuilder(); + + //Creating signature + // if (method.Parameters.Length == 0) + // sb.AppendLine($"public {method.ReturnType.ToDisplayString()} {method.Name}(){{"); + // else + + bool isAsync = method.ReturnType.ToDisplayString() == "Task"; + sb.AppendLine("public" + (isAsync + ? " async " + : " ") + + $"{method.ReturnType.ToDisplayString()} {method.Name}({string.Join(", ", method.Parameters.Select(p => p.ToDisplayString()))}){{"); + + //Creating request + if (method.Parameters.Length == 0) + sb.AppendLine( + $"\t\tvar request = new DefaultCallRequest {{ CommandId = {index}, ObjectId = id }};"); + else if (method.Parameters.Length == 1 && method.ReturnType.Name != "Task" || + method.Parameters.Length == 2 && method.ReturnType.Name == "Task") + { + sb.AppendLine( + $"\t\tvar request = new DefaultCallRequest {{ CommandId = {index}, ObjectId = id, Parameter = {method.Parameters.First().Name} }};"); + } + + //Post created request + sb.AppendLine("\t\tserialisationModule.PostCallRequest(request);"); + + + if (method.ReturnType.ToString() == "System.Threading.Tasks.Task") + { + sb.AppendLine( + "\t\tawait serialisationModule.GetNextCommandExecution(request.CallRequestId);"); + } + else if (method.ReturnType.OriginalDefinition.ToString() == "System.Threading.Tasks.Task") + { + var type = method.ReturnType.ToString().Split(['<', '>'], StringSplitOptions.RemoveEmptyEntries) + .Last(); + sb.AppendLine( + $"\t\tvar response = await serialisationModule.GetFinalCommandExecution<{type}>(request.CallRequestId);"); + sb.AppendLine($"\t\treturn ({type})response.Result;"); + } + else if (!isAsync && method.ReturnType.ToDisplayString() != "void") + { + var type = method.ReturnType.ToDisplayString(); + sb.AppendLine( + $"\t\tvar response = serialisationModule.GetFinalCommandExecution<{type}>(request.CallRequestId).GetAwaiter().GetResult();"); + sb.AppendLine($"\t\treturn ({type})response.Result;"); + } + + sb.AppendLine("\t}"); + + methodsText.Add(sb.ToString()); + } + var code = $@"// using System; @@ -120,12 +181,14 @@ namespace {namespaceName}; partial class {className} (int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : {originalName}, IRemoteObject {{ public int Id => id; + + {string.Join("\r\n\t", methodsText)} }} "; // Add the source code to the compilation. - // context.AddSource($"{className}.g.cs", SourceText.From(code, Encoding.UTF8)); + context.AddSource($"{className}.g.cs", SourceText.From(code, Encoding.UTF8)); } diff --git a/mROA.Codegen/obj/Debug/netstandard2.0/mROA.Codegen.AssemblyInfo.cs b/mROA.Codegen/obj/Debug/netstandard2.0/mROA.Codegen.AssemblyInfo.cs index e06c2f4..4fc92e7 100644 --- a/mROA.Codegen/obj/Debug/netstandard2.0/mROA.Codegen.AssemblyInfo.cs +++ b/mROA.Codegen/obj/Debug/netstandard2.0/mROA.Codegen.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Codegen")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f0f8460632a9a837735d6bbfcc5c59708a0c44ad")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cfd68aeac9fca2a50d5524c0e1d6cfce6b35653c")] [assembly: System.Reflection.AssemblyProductAttribute("mROA.Codegen")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA.Codegen")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/mROA.Example/TestControllerRemoteEndpoint.cs b/mROA.Example/TestControllerRemoteEndpoint.cs index dc33dc4..b4965c2 100644 --- a/mROA.Example/TestControllerRemoteEndpoint.cs +++ b/mROA.Example/TestControllerRemoteEndpoint.cs @@ -1,85 +1,86 @@ -using System.Text.Json; -using mROA.Implementation; - -namespace mROA.Example; - -public class TestControllerRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) - : ITestController, IRemoteObject -{ - - public void A() - { - serialisationModule.PostCallRequest(new JsonCallRequest { CommandId = 0, ObjectId = id }); - } - - public async Task AAsync(CancellationToken cancellationToken) - { - var request = new JsonCallRequest { CommandId = 1, ObjectId = id }; - serialisationModule.PostCallRequest(request); - await serialisationModule.GetNextCommandExecution(request.CallRequestId); - } - - public int B() - { - TransmissionConfig.SetupBackendRepository(); - var request = new JsonCallRequest { CommandId = 2, ObjectId = id }; - serialisationModule.PostCallRequest(request); - var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) - .GetAwaiter().GetResult(); - TransmissionConfig.SetupFrontendRepository(); - var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; - return convertation; - } - - public async Task BAsync(CancellationToken cancellationToken) - { - TransmissionConfig.SetupBackendRepository(); - var request = new JsonCallRequest { CommandId = 3, ObjectId = id }; - serialisationModule.PostCallRequest(request); - var response = await serialisationModule.GetNextCommandExecution(request.CallRequestId); - TransmissionConfig.SetupFrontendRepository(); - var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; - return convertation; - } - - public TransmittedSharedObject SharedObjectTransmitionTest() - { - TransmissionConfig.SetupBackendRepository(); - - var request = new JsonCallRequest { CommandId = 4, ObjectId = id }; - serialisationModule.PostCallRequest(request); - var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) - .GetAwaiter().GetResult(); - TransmissionConfig.SetupFrontendRepository(); - var convertation = response.Result! is JsonElement e ? e.Deserialize>()! : (TransmittedSharedObject)response.Result!; - return convertation; - } - - public int Parametrized(TestParameter parameter) - { - var request = new JsonCallRequest { CommandId = 5, ObjectId = id, Parameter = parameter }; - TransmissionConfig.SetupBackendRepository(); - - serialisationModule.PostCallRequest(request); - var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) - .GetAwaiter().GetResult(); - - TransmissionConfig.SetupFrontendRepository(); - var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; - return convertation; - } - - public TransmittedSharedObject GetTestParameter() - { - TransmissionConfig.SetupBackendRepository(); - var request = new JsonCallRequest { CommandId = 6, ObjectId = id }; - serialisationModule.PostCallRequest(request); - var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) - .GetAwaiter().GetResult(); - TransmissionConfig.SetupFrontendRepository(); - var convertation = response.Result! is JsonElement e ? e.Deserialize>() : (TransmittedSharedObject)response.Result!; - return convertation; - } - - public int Id => id; -} \ No newline at end of file +// using System.Text.Json; +// using mROA.Implementation; +// +// namespace mROA.Example; +// +// public class TestControllerRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) +// : ITestController, IRemoteObject +// { +// public void A() +// { +// serialisationModule.PostCallRequest(new JsonCallRequest { CommandId = 0, ObjectId = id }); +// } +// +// public async Task AAsync(CancellationToken cancellationToken) +// { +// var request = new JsonCallRequest { CommandId = 1, ObjectId = id }; +// serialisationModule.PostCallRequest(request); +// await serialisationModule.GetNextCommandExecution(request.CallRequestId); +// } +// +// public int B() +// { +// TransmissionConfig.SetupBackendRepository(); +// var request = new JsonCallRequest { CommandId = 2, ObjectId = id }; +// serialisationModule.PostCallRequest(request); +// var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) +// .GetAwaiter().GetResult(); +// TransmissionConfig.SetupFrontendRepository(); +// var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; +// return convertation; +// } +// +// public async Task BAsync(CancellationToken cancellationToken) +// { +// var request = new JsonCallRequest { CommandId = 3, ObjectId = id }; +// serialisationModule.PostCallRequest(request); +// var response = await serialisationModule.GetFinalCommandExecution(request.CallRequestId); +// var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; +// return convertation; +// } +// +// public TransmittedSharedObject SharedObjectTransmitionTest() +// { +// TransmissionConfig.SetupBackendRepository(); +// +// var request = new JsonCallRequest { CommandId = 4, ObjectId = id }; +// serialisationModule.PostCallRequest(request); +// var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) +// .GetAwaiter().GetResult(); +// TransmissionConfig.SetupFrontendRepository(); +// var convertation = response.Result! is JsonElement e +// ? e.Deserialize>()! +// : (TransmittedSharedObject)response.Result!; +// return convertation; +// } +// +// public int Parametrized(TestParameter parameter) +// { +// var request = new JsonCallRequest { CommandId = 5, ObjectId = id, Parameter = parameter }; +// TransmissionConfig.SetupBackendRepository(); +// +// serialisationModule.PostCallRequest(request); +// var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) +// .GetAwaiter().GetResult(); +// +// TransmissionConfig.SetupFrontendRepository(); +// var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; +// return convertation; +// } +// +// public TransmittedSharedObject GetTestParameter() +// { +// TransmissionConfig.SetupBackendRepository(); +// var request = new JsonCallRequest { CommandId = 6, ObjectId = id }; +// serialisationModule.PostCallRequest(request); +// var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) +// .GetAwaiter().GetResult(); +// TransmissionConfig.SetupFrontendRepository(); +// var convertation = response.Result! is JsonElement e +// ? e.Deserialize>() +// : (TransmittedSharedObject)response.Result!; +// return convertation; +// } +// +// public int Id => id; +// } \ No newline at end of file diff --git a/mROA.Example/TestParameterRemoteEndpoint.cs b/mROA.Example/TestParameterRemoteEndpoint.cs index 777301b..2328739 100644 --- a/mROA.Example/TestParameterRemoteEndpoint.cs +++ b/mROA.Example/TestParameterRemoteEndpoint.cs @@ -1,20 +1,20 @@ -using System.Text.Json; -using mROA.Implementation; - -namespace mROA.Example; - -public class TestParameterRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : ITestParameter, IRemoteObject{ - public int Test() - { - var request = new JsonCallRequest { CommandId = 7, ObjectId = id }; - serialisationModule.PostCallRequest(request); - var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) - .GetAwaiter().GetResult(); - TransmissionConfig.SetupFrontendRepository(); - var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; - TransmissionConfig.SetupBackendRepository(); - return convertation; - } - - public int Id => id; -} \ No newline at end of file +// using System.Text.Json; +// using mROA.Implementation; +// +// namespace mROA.Example; +// +// public class TestParameterRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : ITestParameter, IRemoteObject{ +// public int Test() +// { +// var request = new JsonCallRequest { CommandId = 7, ObjectId = id }; +// serialisationModule.PostCallRequest(request); +// var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) +// .GetAwaiter().GetResult(); +// TransmissionConfig.SetupFrontendRepository(); +// var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; +// TransmissionConfig.SetupBackendRepository(); +// return convertation; +// } +// +// public int Id => id; +// } \ No newline at end of file diff --git a/mROA.Example/mROA.Example.csproj b/mROA.Example/mROA.Example.csproj index 95ea4a5..05728b9 100644 --- a/mROA.Example/mROA.Example.csproj +++ b/mROA.Example/mROA.Example.csproj @@ -8,8 +8,9 @@ - - + + diff --git a/mROA.Example/obj/Debug/net9.0/mROA.Example.AssemblyInfo.cs b/mROA.Example/obj/Debug/net9.0/mROA.Example.AssemblyInfo.cs index f56fbcd..0ba1131 100644 --- a/mROA.Example/obj/Debug/net9.0/mROA.Example.AssemblyInfo.cs +++ b/mROA.Example/obj/Debug/net9.0/mROA.Example.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Example")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f0f8460632a9a837735d6bbfcc5c59708a0c44ad")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cfd68aeac9fca2a50d5524c0e1d6cfce6b35653c")] [assembly: System.Reflection.AssemblyProductAttribute("mROA.Example")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA.Example")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/mROA.Test/StreamTest.cs b/mROA.Test/StreamTest.cs index 2dbce88..418c83b 100644 --- a/mROA.Test/StreamTest.cs +++ b/mROA.Test/StreamTest.cs @@ -50,7 +50,7 @@ public class StreamTest tcpClient.Connect(IPAddress.Loopback, 4567); _frontendInteractionModule.ServerStream = tcpClient.GetStream(); - var req = new JsonCallRequest { CommandId = 1, ObjectId = -1 }; + var req = new DefaultCallRequest { CommandId = 1, ObjectId = -1 }; _frontendSerialisationModule.PostCallRequest(req); var res = ((JsonElement)_frontendSerialisationModule.GetNextCommandExecution(req.CallRequestId).GetAwaiter().GetResult().Result!).Deserialize(); isTestNotFinished = false; diff --git a/mROA.Test/UnitTest1.cs b/mROA.Test/UnitTest1.cs index 8d254d7..113ed4c 100644 --- a/mROA.Test/UnitTest1.cs +++ b/mROA.Test/UnitTest1.cs @@ -97,13 +97,13 @@ public class Tests ); _interactionModule.PassCommand(132, Encoding.UTF8.GetBytes( - JsonSerializer.Serialize(new JsonCallRequest { CommandId = 2, ObjectId = response.ContextId }))); + JsonSerializer.Serialize(new DefaultCallRequest { CommandId = 2, ObjectId = response.ContextId }))); var firstFull = JsonDocument.Parse(_interactionModule.OutputBuffer.Last()).RootElement.GetProperty("Result") .GetInt32(); _interactionModule.PassCommand(132, Encoding.UTF8.GetBytes( - JsonSerializer.Serialize(new JsonCallRequest { CommandId = 4, ObjectId = response.ContextId }))); + JsonSerializer.Serialize(new DefaultCallRequest { CommandId = 4, ObjectId = response.ContextId }))); response = JsonSerializer.Deserialize>( @@ -112,9 +112,9 @@ public class Tests ); _interactionModule.PassCommand(132, Encoding.UTF8.GetBytes( - JsonSerializer.Serialize(new JsonCallRequest { CommandId = 2, ObjectId = response.ContextId }))); + JsonSerializer.Serialize(new DefaultCallRequest { CommandId = 2, ObjectId = response.ContextId }))); _interactionModule.PassCommand(132, Encoding.UTF8.GetBytes( - JsonSerializer.Serialize(new JsonCallRequest { CommandId = 2, ObjectId = response.ContextId }))); + JsonSerializer.Serialize(new DefaultCallRequest { CommandId = 2, ObjectId = response.ContextId }))); var secondFull = JsonDocument.Parse(_interactionModule.OutputBuffer.Last()).RootElement.GetProperty("Result") .GetInt32(); @@ -137,7 +137,7 @@ public class Tests ); var x = response.ContextId; _interactionModule.PassCommand(132,Encoding.UTF8.GetBytes( - JsonSerializer.Serialize(new JsonCallRequest + JsonSerializer.Serialize(new DefaultCallRequest { CommandId = 5, Parameter = new TestParameter diff --git a/mROA.Test/obj/Debug/net9.0/mROA.Test.AssemblyInfo.cs b/mROA.Test/obj/Debug/net9.0/mROA.Test.AssemblyInfo.cs index f2a60f6..de8f1be 100644 --- a/mROA.Test/obj/Debug/net9.0/mROA.Test.AssemblyInfo.cs +++ b/mROA.Test/obj/Debug/net9.0/mROA.Test.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Test")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f0f8460632a9a837735d6bbfcc5c59708a0c44ad")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cfd68aeac9fca2a50d5524c0e1d6cfce6b35653c")] [assembly: System.Reflection.AssemblyProductAttribute("mROA.Test")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA.Test")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/mROA/Implementation/CallRequest.cs b/mROA/Implementation/CallRequest.cs index a772b60..22a921e 100644 --- a/mROA/Implementation/CallRequest.cs +++ b/mROA/Implementation/CallRequest.cs @@ -8,7 +8,7 @@ public interface ICallRequest object Parameter { get; } } -public class JsonCallRequest : ICallRequest +public class DefaultCallRequest : ICallRequest { public Guid CallRequestId { get; set; } = Guid.NewGuid(); public int CommandId { get; set; } diff --git a/mROA/Implementation/JsonSerialisationModule.cs b/mROA/Implementation/JsonSerialisationModule.cs index b547f62..269707e 100644 --- a/mROA/Implementation/JsonSerialisationModule.cs +++ b/mROA/Implementation/JsonSerialisationModule.cs @@ -20,7 +20,7 @@ public class JsonSerialisationModule : ISerialisationModule public void HandleIncomingRequest(int clientId, byte[] command) { - JsonCallRequest request = JsonSerializer.Deserialize(command); + DefaultCallRequest request = JsonSerializer.Deserialize(command); if (request.Parameter is not null) { diff --git a/mROA/obj/Debug/net9.0/mROA.AssemblyInfo.cs b/mROA/obj/Debug/net9.0/mROA.AssemblyInfo.cs index e60d704..8a3d737 100644 --- a/mROA/obj/Debug/net9.0/mROA.AssemblyInfo.cs +++ b/mROA/obj/Debug/net9.0/mROA.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("mROA")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f0f8460632a9a837735d6bbfcc5c59708a0c44ad")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cfd68aeac9fca2a50d5524c0e1d6cfce6b35653c")] [assembly: System.Reflection.AssemblyProductAttribute("mROA")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]