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

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.
var methodBody = classSymbol.GetMembers()
.OfType<IMethodSymbol>();
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<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/>
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));
}
@@ -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")]
+86 -85
View File
@@ -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<FinalCommandExecution>(request.CallRequestId);
}
public int B()
{
TransmissionConfig.SetupBackendRepository();
var request = new JsonCallRequest { CommandId = 2, ObjectId = id };
serialisationModule.PostCallRequest(request);
var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
.GetAwaiter().GetResult();
TransmissionConfig.SetupFrontendRepository();
var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
return convertation;
}
public async Task<int> BAsync(CancellationToken cancellationToken)
{
TransmissionConfig.SetupBackendRepository();
var request = new JsonCallRequest { CommandId = 3, ObjectId = id };
serialisationModule.PostCallRequest(request);
var response = await serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId);
TransmissionConfig.SetupFrontendRepository();
var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
return convertation;
}
public TransmittedSharedObject<ITestController> SharedObjectTransmitionTest()
{
TransmissionConfig.SetupBackendRepository();
var request = new JsonCallRequest { CommandId = 4, ObjectId = id };
serialisationModule.PostCallRequest(request);
var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
.GetAwaiter().GetResult();
TransmissionConfig.SetupFrontendRepository();
var convertation = response.Result! is JsonElement e ? e.Deserialize<TransmittedSharedObject<ITestController>>()! : (TransmittedSharedObject<ITestController>)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<FinalCommandExecution>(request.CallRequestId)
.GetAwaiter().GetResult();
TransmissionConfig.SetupFrontendRepository();
var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
return convertation;
}
public TransmittedSharedObject<ITestParameter> GetTestParameter()
{
TransmissionConfig.SetupBackendRepository();
var request = new JsonCallRequest { CommandId = 6, ObjectId = id };
serialisationModule.PostCallRequest(request);
var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
.GetAwaiter().GetResult();
TransmissionConfig.SetupFrontendRepository();
var convertation = response.Result! is JsonElement e ? e.Deserialize<TransmittedSharedObject<ITestParameter>>() : (TransmittedSharedObject<ITestParameter>)response.Result!;
return convertation;
}
public int Id => id;
}
// 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<FinalCommandExecution>(request.CallRequestId);
// }
//
// public int B()
// {
// TransmissionConfig.SetupBackendRepository();
// var request = new JsonCallRequest { CommandId = 2, ObjectId = id };
// serialisationModule.PostCallRequest(request);
// var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
// .GetAwaiter().GetResult();
// TransmissionConfig.SetupFrontendRepository();
// var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
// return convertation;
// }
//
// public async Task<int> BAsync(CancellationToken cancellationToken)
// {
// var request = new JsonCallRequest { CommandId = 3, ObjectId = id };
// serialisationModule.PostCallRequest(request);
// var response = await serialisationModule.GetFinalCommandExecution<int>(request.CallRequestId);
// var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
// return convertation;
// }
//
// public TransmittedSharedObject<ITestController> SharedObjectTransmitionTest()
// {
// TransmissionConfig.SetupBackendRepository();
//
// var request = new JsonCallRequest { CommandId = 4, ObjectId = id };
// serialisationModule.PostCallRequest(request);
// var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
// .GetAwaiter().GetResult();
// TransmissionConfig.SetupFrontendRepository();
// var convertation = response.Result! is JsonElement e
// ? e.Deserialize<TransmittedSharedObject<ITestController>>()!
// : (TransmittedSharedObject<ITestController>)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<FinalCommandExecution>(request.CallRequestId)
// .GetAwaiter().GetResult();
//
// TransmissionConfig.SetupFrontendRepository();
// var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
// return convertation;
// }
//
// public TransmittedSharedObject<ITestParameter> GetTestParameter()
// {
// TransmissionConfig.SetupBackendRepository();
// var request = new JsonCallRequest { CommandId = 6, ObjectId = id };
// serialisationModule.PostCallRequest(request);
// var response = serialisationModule.GetNextCommandExecution<FinalCommandExecution>(request.CallRequestId)
// .GetAwaiter().GetResult();
// TransmissionConfig.SetupFrontendRepository();
// var convertation = response.Result! is JsonElement e
// ? e.Deserialize<TransmittedSharedObject<ITestParameter>>()
// : (TransmittedSharedObject<ITestParameter>)response.Result!;
// return convertation;
// }
//
// public int Id => id;
// }
+20 -20
View File
@@ -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<FinalCommandExecution>(request.CallRequestId)
.GetAwaiter().GetResult();
TransmissionConfig.SetupFrontendRepository();
var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
TransmissionConfig.SetupBackendRepository();
return convertation;
}
public int Id => id;
}
// 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<FinalCommandExecution>(request.CallRequestId)
// .GetAwaiter().GetResult();
// TransmissionConfig.SetupFrontendRepository();
// var convertation = response.Result! is JsonElement e ? e.Deserialize<int>() : (int)response.Result!;
// TransmissionConfig.SetupBackendRepository();
// return convertation;
// }
//
// public int Id => id;
// }
+3 -2
View File
@@ -8,8 +8,9 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\mROA.Codegen\mROA.Codegen.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
<ProjectReference Include="..\mROA\mROA.csproj" />
<ProjectReference Include="..\mROA.Codegen\mROA.Codegen.csproj" OutputItemType="Analyzer"
ReferenceOutputAssembly="false"/>
<ProjectReference Include="..\mROA\mROA.csproj"/>
</ItemGroup>
</Project>
@@ -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")]
+1 -1
View File
@@ -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<FinalCommandExecution>(req.CallRequestId).GetAwaiter().GetResult().Result!).Deserialize<MockResult>();
isTestNotFinished = false;
+5 -5
View File
@@ -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<TransmittedSharedObject<IContextRepository>>(
@@ -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
@@ -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")]
+1 -1
View File
@@ -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; }
@@ -20,7 +20,7 @@ public class JsonSerialisationModule : ISerialisationModule
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)
{
+1 -1
View File
@@ -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")]