генерация кода практически завершена
This commit is contained in:
@@ -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")]
|
||||
|
||||
@@ -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;
|
||||
// }
|
||||
@@ -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;
|
||||
// }
|
||||
@@ -8,7 +8,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\mROA.Codegen\mROA.Codegen.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
|
||||
<ProjectReference Include="..\mROA.Codegen\mROA.Codegen.csproj" OutputItemType="Analyzer"
|
||||
ReferenceOutputAssembly="false"/>
|
||||
<ProjectReference Include="..\mROA\mROA.csproj"/>
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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")]
|
||||
|
||||
Reference in New Issue
Block a user