генерация кода практически завершена

This commit is contained in:
2025-02-04 23:19:24 +03:00
parent cfd68aeac9
commit 2fac34a1ce
12 changed files with 186 additions and 121 deletions
@@ -104,11 +104,72 @@ namespace {Namespace}
// Go through all class members with a particular type (property) to generate method lines. // Go through all class members with a particular type (property) to generate method lines.
var methodBody = classSymbol.GetMembers() var methodBody = classSymbol.GetMembers()
.OfType<IMethodSymbol>(); .OfType<IMethodSymbol>();
methods.AddRange(methodBody.Select(i => (namespaceName + "." + className, i)));
var originalName = className; var originalName = className;
// Build up the source code // Build up the source code
className = className.TrimStart('I') + "RemoteEndpoint"; className = className.TrimStart('I') + "RemoteEndpoint";
var methodsText = new List<string>();
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<FinalCommandExecution>(request.CallRequestId);");
}
else if (method.ReturnType.OriginalDefinition.ToString() == "System.Threading.Tasks.Task<TResult>")
{
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 = $@"// <auto-generated/> var code = $@"// <auto-generated/>
using System; using System;
@@ -120,12 +181,14 @@ namespace {namespaceName};
partial class {className} (int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : {originalName}, IRemoteObject partial class {className} (int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : {originalName}, IRemoteObject
{{ {{
public int Id => id; public int Id => id;
{string.Join("\r\n\t", methodsText)}
}} }}
"; ";
// Add the source code to the compilation. // 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));
} }
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Codegen")] [assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Codegen")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [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.AssemblyProductAttribute("mROA.Codegen")]
[assembly: System.Reflection.AssemblyTitleAttribute("mROA.Codegen")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA.Codegen")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+86 -85
View File
@@ -1,85 +1,86 @@
using System.Text.Json; // using System.Text.Json;
using mROA.Implementation; // using mROA.Implementation;
//
namespace mROA.Example; // namespace mROA.Example;
//
public class TestControllerRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) // public class TestControllerRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule)
: ITestController, IRemoteObject // : ITestController, IRemoteObject
{ // {
// public void A()
public void A() // {
{ // serialisationModule.PostCallRequest(new JsonCallRequest { CommandId = 0, ObjectId = id });
serialisationModule.PostCallRequest(new JsonCallRequest { CommandId = 0, ObjectId = id }); // }
} //
// public async Task AAsync(CancellationToken cancellationToken)
public async Task AAsync(CancellationToken cancellationToken) // {
{ // var request = new JsonCallRequest { CommandId = 1, ObjectId = id };
var request = new JsonCallRequest { CommandId = 1, ObjectId = id }; // serialisationModule.PostCallRequest(request);
serialisationModule.PostCallRequest(request); // await serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId);
await serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId); // }
} //
// public int B()
public int B() // {
{ // TransmissionConfig.SetupBackendRepository();
TransmissionConfig.SetupBackendRepository(); // var request = new JsonCallRequest { CommandId = 2, ObjectId = id };
var request = new JsonCallRequest { CommandId = 2, ObjectId = id }; // serialisationModule.PostCallRequest(request);
serialisationModule.PostCallRequest(request); // var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId) // .GetAwaiter().GetResult();
.GetAwaiter().GetResult(); // TransmissionConfig.SetupFrontendRepository();
TransmissionConfig.SetupFrontendRepository(); // var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!; // return convertation;
return convertation; // }
} //
// public async Task<int> BAsync(CancellationToken cancellationToken)
public async Task<int> BAsync(CancellationToken cancellationToken) // {
{ // var request = new JsonCallRequest { CommandId = 3, ObjectId = id };
TransmissionConfig.SetupBackendRepository(); // serialisationModule.PostCallRequest(request);
var request = new JsonCallRequest { CommandId = 3, ObjectId = id }; // var response = await serialisationModule.GetFinalCommandExecution<int>(request.CallRequestId);
serialisationModule.PostCallRequest(request); // var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
var response = await serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId); // return convertation;
TransmissionConfig.SetupFrontendRepository(); // }
var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!; //
return convertation; // public TransmittedSharedObject<ITestController> SharedObjectTransmitionTest()
} // {
// TransmissionConfig.SetupBackendRepository();
public TransmittedSharedObject<ITestController> SharedObjectTransmitionTest() //
{ // var request = new JsonCallRequest { CommandId = 4, ObjectId = id };
TransmissionConfig.SetupBackendRepository(); // serialisationModule.PostCallRequest(request);
// var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
var request = new JsonCallRequest { CommandId = 4, ObjectId = id }; // .GetAwaiter().GetResult();
serialisationModule.PostCallRequest(request); // TransmissionConfig.SetupFrontendRepository();
var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId) // var convertation = response.Result! is JsonElement e
.GetAwaiter().GetResult(); // ? e.Deserialize<TransmittedSharedObject<ITestController>>()!
TransmissionConfig.SetupFrontendRepository(); // : (TransmittedSharedObject<ITestController>)response.Result!;
var convertation = response.Result! is JsonElement e ? e.Deserialize<TransmittedSharedObject<ITestController>>()! : (TransmittedSharedObject<ITestController>)response.Result!; // return convertation;
return convertation; // }
} //
// public int Parametrized(TestParameter parameter)
public int Parametrized(TestParameter parameter) // {
{ // var request = new JsonCallRequest { CommandId = 5, ObjectId = id, Parameter = parameter };
var request = new JsonCallRequest { CommandId = 5, ObjectId = id, Parameter = parameter }; // TransmissionConfig.SetupBackendRepository();
TransmissionConfig.SetupBackendRepository(); //
// serialisationModule.PostCallRequest(request);
serialisationModule.PostCallRequest(request); // var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId) // .GetAwaiter().GetResult();
.GetAwaiter().GetResult(); //
// TransmissionConfig.SetupFrontendRepository();
TransmissionConfig.SetupFrontendRepository(); // var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!; // return convertation;
return convertation; // }
} //
// public TransmittedSharedObject<ITestParameter> GetTestParameter()
public TransmittedSharedObject<ITestParameter> GetTestParameter() // {
{ // TransmissionConfig.SetupBackendRepository();
TransmissionConfig.SetupBackendRepository(); // var request = new JsonCallRequest { CommandId = 6, ObjectId = id };
var request = new JsonCallRequest { CommandId = 6, ObjectId = id }; // serialisationModule.PostCallRequest(request);
serialisationModule.PostCallRequest(request); // var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId) // .GetAwaiter().GetResult();
.GetAwaiter().GetResult(); // TransmissionConfig.SetupFrontendRepository();
TransmissionConfig.SetupFrontendRepository(); // var convertation = response.Result! is JsonElement e
var convertation = response.Result! is JsonElement e ? e.Deserialize<TransmittedSharedObject<ITestParameter>>() : (TransmittedSharedObject<ITestParameter>)response.Result!; // ? e.Deserialize<TransmittedSharedObject<ITestParameter>>()
return convertation; // : (TransmittedSharedObject<ITestParameter>)response.Result!;
} // return convertation;
// }
public int Id => id; //
} // public int Id => id;
// }
+20 -20
View File
@@ -1,20 +1,20 @@
using System.Text.Json; // using System.Text.Json;
using mROA.Implementation; // using mROA.Implementation;
//
namespace mROA.Example; // namespace mROA.Example;
//
public class TestParameterRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : ITestParameter, IRemoteObject{ // public class TestParameterRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : ITestParameter, IRemoteObject{
public int Test() // public int Test()
{ // {
var request = new JsonCallRequest { CommandId = 7, ObjectId = id }; // var request = new JsonCallRequest { CommandId = 7, ObjectId = id };
serialisationModule.PostCallRequest(request); // serialisationModule.PostCallRequest(request);
var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId) // var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
.GetAwaiter().GetResult(); // .GetAwaiter().GetResult();
TransmissionConfig.SetupFrontendRepository(); // TransmissionConfig.SetupFrontendRepository();
var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!; // var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
TransmissionConfig.SetupBackendRepository(); // TransmissionConfig.SetupBackendRepository();
return convertation; // return convertation;
} // }
//
public int Id => id; // public int Id => id;
} // }
+3 -2
View File
@@ -8,8 +8,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\mROA.Codegen\mROA.Codegen.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/> <ProjectReference Include="..\mROA.Codegen\mROA.Codegen.csproj" OutputItemType="Analyzer"
<ProjectReference Include="..\mROA\mROA.csproj" /> ReferenceOutputAssembly="false"/>
<ProjectReference Include="..\mROA\mROA.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Example")] [assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Example")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [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.AssemblyProductAttribute("mROA.Example")]
[assembly: System.Reflection.AssemblyTitleAttribute("mROA.Example")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA.Example")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+1 -1
View File
@@ -50,7 +50,7 @@ public class StreamTest
tcpClient.Connect(IPAddress.Loopback, 4567); tcpClient.Connect(IPAddress.Loopback, 4567);
_frontendInteractionModule.ServerStream = tcpClient.GetStream(); _frontendInteractionModule.ServerStream = tcpClient.GetStream();
var req = new JsonCallRequest { CommandId = 1, ObjectId = -1 }; var req = new DefaultCallRequest { CommandId = 1, ObjectId = -1 };
_frontendSerialisationModule.PostCallRequest(req); _frontendSerialisationModule.PostCallRequest(req);
var res = ((JsonElement)_frontendSerialisationModule.GetNextCommandExecution<FinalCommandExecution>(req.CallRequestId).GetAwaiter().GetResult().Result!).Deserialize<MockResult>(); var res = ((JsonElement)_frontendSerialisationModule.GetNextCommandExecution<FinalCommandExecution>(req.CallRequestId).GetAwaiter().GetResult().Result!).Deserialize<MockResult>();
isTestNotFinished = false; isTestNotFinished = false;
+5 -5
View File
@@ -97,13 +97,13 @@ public class Tests
); );
_interactionModule.PassCommand(132, Encoding.UTF8.GetBytes( _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") var firstFull = JsonDocument.Parse(_interactionModule.OutputBuffer.Last()).RootElement.GetProperty("Result")
.GetInt32(); .GetInt32();
_interactionModule.PassCommand(132, Encoding.UTF8.GetBytes( _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 = response =
JsonSerializer.Deserialize<TransmittedSharedObject<IContextRepository>>( JsonSerializer.Deserialize<TransmittedSharedObject<IContextRepository>>(
@@ -112,9 +112,9 @@ public class Tests
); );
_interactionModule.PassCommand(132, Encoding.UTF8.GetBytes( _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( _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") var secondFull = JsonDocument.Parse(_interactionModule.OutputBuffer.Last()).RootElement.GetProperty("Result")
.GetInt32(); .GetInt32();
@@ -137,7 +137,7 @@ public class Tests
); );
var x = response.ContextId; var x = response.ContextId;
_interactionModule.PassCommand(132,Encoding.UTF8.GetBytes( _interactionModule.PassCommand(132,Encoding.UTF8.GetBytes(
JsonSerializer.Serialize(new JsonCallRequest JsonSerializer.Serialize(new DefaultCallRequest
{ {
CommandId = 5, CommandId = 5,
Parameter = new TestParameter Parameter = new TestParameter
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Test")] [assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Test")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [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.AssemblyProductAttribute("mROA.Test")]
[assembly: System.Reflection.AssemblyTitleAttribute("mROA.Test")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA.Test")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+1 -1
View File
@@ -8,7 +8,7 @@ public interface ICallRequest
object Parameter { get; } object Parameter { get; }
} }
public class JsonCallRequest : ICallRequest public class DefaultCallRequest : ICallRequest
{ {
public Guid CallRequestId { get; set; } = Guid.NewGuid(); public Guid CallRequestId { get; set; } = Guid.NewGuid();
public int CommandId { get; set; } public int CommandId { get; set; }
@@ -20,7 +20,7 @@ public class JsonSerialisationModule : ISerialisationModule
public void HandleIncomingRequest(int clientId, byte[] command) public void HandleIncomingRequest(int clientId, byte[] command)
{ {
JsonCallRequest request = JsonSerializer.Deserialize<JsonCallRequest>(command); DefaultCallRequest request = JsonSerializer.Deserialize<DefaultCallRequest>(command);
if (request.Parameter is not null) if (request.Parameter is not null)
{ {
+1 -1
View File
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("mROA")] [assembly: System.Reflection.AssemblyCompanyAttribute("mROA")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [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.AssemblyProductAttribute("mROA")]
[assembly: System.Reflection.AssemblyTitleAttribute("mROA")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]