From e492cf25417bb55bee57e4ade72e99d570e23a2e Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Tue, 18 Feb 2025 00:10:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B3=D0=B5=D0=BD=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=BC=D1=83=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D1=86=D0=B8=D0=BF=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Example.Shared/IPrinterFactory.cs | 4 +- mROA.Codegen/mROASourceGenerator.cs | 113 ++++++++++++++++------------ 2 files changed, 65 insertions(+), 52 deletions(-) diff --git a/Example.Shared/IPrinterFactory.cs b/Example.Shared/IPrinterFactory.cs index e85fc69..36b686e 100644 --- a/Example.Shared/IPrinterFactory.cs +++ b/Example.Shared/IPrinterFactory.cs @@ -1,4 +1,5 @@ using System.Collections.Frozen; +using mROA.Abstract; using mROA.Implementation; using mROA.Implementation.Attributes; @@ -12,5 +13,4 @@ public interface IPrinterFactory SharedObject GetPrinterByName(string printerName); string[] CollectAllNames(); -} - +} \ No newline at end of file diff --git a/mROA.Codegen/mROASourceGenerator.cs b/mROA.Codegen/mROASourceGenerator.cs index 4c505b7..da1f1bb 100644 --- a/mROA.Codegen/mROASourceGenerator.cs +++ b/mROA.Codegen/mROASourceGenerator.cs @@ -118,61 +118,56 @@ namespace {Namespace} methods.Add((namespaceName + "." + originalName, 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.Name == "Task"; + bool isVoid = method.ReturnType.Name == "Void" || method.ReturnType.ToString() == "Task"; + bool isParametrized = method.Parameters.Length == 1 && !isAsync || + method.Parameters.Length == 2 && isAsync; + + + //Creating signature sb.AppendLine("public" + (isAsync ? " async " : " ") + - $"{method.ReturnType.ToDisplayString()} {method.Name}({string.Join(", ", method.Parameters.Select(p => p.ToDisplayString()))}){{"); - - //Creating request - if (method.Parameters.Length == 1 && !isAsync || - method.Parameters.Length == 2 && isAsync) - { - sb.AppendLine( - $"\t\tvar defaultCallRequestCodegen = new DefaultCallRequest {{ CommandId = {index}, ObjectId = id, Parameter = {method.Parameters.First().Name} }};"); - } - else - { - sb.AppendLine( - $"\t\tvar defaultCallRequestCodegen = new DefaultCallRequest {{ CommandId = {index}, ObjectId = id }};"); - } - - //Post created request - sb.AppendLine("\t\tserialisationModule.PostCallRequest(defaultCallRequestCodegen);"); + $"{method.ReturnType.ToDisplayString()} {method.Name}({string.Join(", ", method.Parameters.Select(ToFullString))}){{"); - if (method.ReturnType.ToString() == "System.Threading.Tasks.Task") - { - sb.AppendLine( - "\t\tawait serialisationModule.GetNextCommandExecution(defaultCallRequestCodegen.CallRequestId);"); - } - else if (method.ReturnType.OriginalDefinition.ToString() == "System.Threading.Tasks.Task") - { - var type = method.ReturnType.ToString(); - type = type.Substring(type.IndexOf('<') + 1); - type = type.Substring(0, type.Length - 1); - sb.AppendLine( - $"\t\tvar response = await serialisationModule.GetFinalCommandExecution<{type}>(defaultCallRequestCodegen.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}>(defaultCallRequestCodegen.CallRequestId).GetAwaiter().GetResult();"); - sb.AppendLine($"\t\treturn ({type})response.Result;"); - } - else - { - sb.AppendLine( - "\t\tserialisationModule.GetNextCommandExecution(defaultCallRequestCodegen.CallRequestId).Wait();"); - } + var prefix = isAsync ? "await " : ""; + var postfix = !isAsync ? (isVoid? ".Wait()" : ".GetAwaiter().GetResult()") : ""; + var parameterLink = isParametrized ? ", " + method.Parameters.First().Name : string.Empty; + var caller = isVoid ? $"CallAsync({index}{parameterLink})" : + isAsync ? $"GetResultAsync<{ExtractTaskType(method.ReturnType)}>({index}{parameterLink})" : + $"GetResultAsync<{ToFullString(method.ReturnType)}>({index}{parameterLink})"; + if (!isVoid) + prefix = "return " + prefix; + + // if (method.ReturnType.OriginalDefinition.ToString() == "System.Threading.Tasks.Task") + // { + // var type = method.ReturnType.ToString(); + // type = type.Substring(type.IndexOf('<') + 1); + // type = type.Substring(0, type.Length - 1); + // sb.AppendLine( + // $"\t\tvar response = await serialisationModule.GetFinalCommandExecution<{type}>(defaultCallRequestCodegen.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}>(defaultCallRequestCodegen.CallRequestId).GetAwaiter().GetResult();"); + // sb.AppendLine($"\t\treturn ({type})response.Result;"); + // } + // else + // { + // sb.AppendLine( + // "\t\tserialisationModule.GetNextCommandExecution(defaultCallRequestCodegen.CallRequestId).Wait();"); + // } + // + // sb.AppendLine("\t}"); + + sb.AppendLine("\t\t" + prefix + caller + postfix+ ";"); + sb.AppendLine("\t}"); methodsText.Add(sb.ToString()); @@ -188,10 +183,11 @@ using mROA.Abstract; namespace {namespaceName}; -partial class {className} (int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : {originalName}, IRemoteObject +partial class {className} : RemoteObjectBase, {originalName} {{ - public int Id => id; - public int OwnerId => serialisationModule.ClientId; + public {className}(int id, IRepresentationModule representationModule) : base(id, representationModule) + {{ + }} {string.Join("\r\n\t", methodsText)} }} @@ -270,4 +266,21 @@ public sealed class RemoteTypeBinder context.AddSource("RemoteTypeBinder.g.cs", SourceText.From(fronendRepoCode, Encoding.UTF8)); } } + + private static string ToFullString(IParameterSymbol parameter) + => /*parameter.Type.ContainingNamespace is null*/ + /*?*/ parameter.ToDisplayString(); + /*: $"{parameter.Type.ContainingNamespace.ToDisplayString()}.{parameter.Type.MetadataName} {parameter.Name}";*/ + + private static string ToFullString(ITypeSymbol type) => + // => type.ContainingNamespace is null || type.Name == "Void" + type.ToDisplayString(); + // : $"{type.ContainingNamespace.ToDisplayString()}.{type.MetadataName}"; + + private string ExtractTaskType(ITypeSymbol taskType) + { + var type = taskType.ToString(); + type = type.Substring(type.IndexOf('<') + 1); + return type.Substring(0, type.Length - 1); + } } \ No newline at end of file