From c4d9a549422405b009f6bd062cc058d81aec08c3 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Wed, 26 Mar 2025 14:43:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B5=D0=B2=D0=B5=D0=BD?= =?UTF-8?q?=D1=82-=D0=B1=D0=B8=D0=BD=D0=B4=D0=B5=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mROA.Codegen/RemoteTypeBinder.cstmpl | 40 ++++++++-- ...mplatePart.cs => InsertTemplateSection.cs} | 8 +- .../Tools/Reading/InsertSectionReader.cs | 2 +- mROA.Codegen/Tools/TemplateDocument.cs | 2 +- mROA.Codegen/mROASourceGenerator.cs | 80 +++++++------------ 5 files changed, 69 insertions(+), 63 deletions(-) rename mROA.Codegen/Tools/{InsertTemplatePart.cs => InsertTemplateSection.cs} (86%) diff --git a/mROA.Codegen/RemoteTypeBinder.cstmpl b/mROA.Codegen/RemoteTypeBinder.cstmpl index e51cfc4..4e7374b 100644 --- a/mROA.Codegen/RemoteTypeBinder.cstmpl +++ b/mROA.Codegen/RemoteTypeBinder.cstmpl @@ -12,11 +12,41 @@ namespace mROA.Codegen { static RemoteTypeBinder(){ RemoteContextRepository.RemoteTypes = new Dictionary { - , - }; + , + + }; ContextRepository.EventBinders = new object[] { - - }; + + + new EventBinder<> + { + BindAction = (instance, context, representationProducer, index) => + { + var ownerId = context.OwnerId; + var module = representationProducer.Produce(ownerId); + + + + (instance as ). += () => + { + Console.WriteLine($"Try to send to {ownerId} with hash code {context.GetHashCode()}"); + + Console.WriteLine("Sending event..."); + var request = new DefaultCallRequest + { + CommandId = , + ObjectId = new ComplexObjectIdentifier(index, ownerId), + Parameters = new object[] { } + }; + + module.PostCallMessageAsync(request.Id, MessageType.EventRequest, request); + }; + + } + } + + }; } } -} \ No newline at end of file +} + diff --git a/mROA.Codegen/Tools/InsertTemplatePart.cs b/mROA.Codegen/Tools/InsertTemplateSection.cs similarity index 86% rename from mROA.Codegen/Tools/InsertTemplatePart.cs rename to mROA.Codegen/Tools/InsertTemplateSection.cs index 54c4391..aec6572 100644 --- a/mROA.Codegen/Tools/InsertTemplatePart.cs +++ b/mROA.Codegen/Tools/InsertTemplateSection.cs @@ -4,7 +4,7 @@ using System.Linq; namespace mROA.CodegenTools { - public class InsertTemplatePart : ITagged, IBaking + public class InsertTemplateSection : ITagged, IBaking { private object _insertedValue; private string _tag; @@ -12,7 +12,7 @@ namespace mROA.CodegenTools public TemplateDocument Context { get; set; } public readonly List Parameters; - public InsertTemplatePart(string tag, TemplateDocument context, params string[] parameters) + public InsertTemplateSection(string tag, TemplateDocument context, params string[] parameters) { _tag = tag; Parameters = parameters.ToList(); @@ -31,7 +31,7 @@ namespace mROA.CodegenTools private void ProduceInserted(object value) { var currentIndex = Context.Parts.IndexOf(this); - var clone = (InsertTemplatePart)MemberwiseClone(); + var clone = (InsertTemplateSection)MemberwiseClone(); clone._tag += "+"; clone._insertedValue = value; @@ -80,7 +80,7 @@ namespace mROA.CodegenTools public object Clone() { - return new InsertTemplatePart(_tag, Context, Parameters.ToArray()); + return new InsertTemplateSection(_tag, Context, Parameters.ToArray()); } } } \ No newline at end of file diff --git a/mROA.Codegen/Tools/Reading/InsertSectionReader.cs b/mROA.Codegen/Tools/Reading/InsertSectionReader.cs index 8b3ecbf..d4d8c6e 100644 --- a/mROA.Codegen/Tools/Reading/InsertSectionReader.cs +++ b/mROA.Codegen/Tools/Reading/InsertSectionReader.cs @@ -18,7 +18,7 @@ namespace mROA.CodegenTools var tagText = GetTagValue(from, to); var parts = tagText.Split(' '); - return new InsertTemplatePart(parts[0], document, parts.Skip(1).ToArray()); + return new InsertTemplateSection(parts[0], document, parts.Skip(1).ToArray()); } } } \ No newline at end of file diff --git a/mROA.Codegen/Tools/TemplateDocument.cs b/mROA.Codegen/Tools/TemplateDocument.cs index b7ea584..8c5de44 100644 --- a/mROA.Codegen/Tools/TemplateDocument.cs +++ b/mROA.Codegen/Tools/TemplateDocument.cs @@ -14,7 +14,7 @@ namespace mROA.CodegenTools public void Insert(string tag, object value) { var selectedPart = this[tag]; - if (selectedPart is InsertTemplatePart itp) + if (selectedPart is InsertTemplateSection itp) { itp.Setup(value); } diff --git a/mROA.Codegen/mROASourceGenerator.cs b/mROA.Codegen/mROASourceGenerator.cs index 587183a..3d3bb8d 100644 --- a/mROA.Codegen/mROASourceGenerator.cs +++ b/mROA.Codegen/mROASourceGenerator.cs @@ -80,13 +80,8 @@ namespace mROA.Codegen private void GenerateCode(GeneratorExecutionContext context, Compilation compilation, ImmutableArray classes) { - // For future - // var asm = Assembly.GetAssembly(typeof(mROASourceGenerator)); - // var files = asm.GetManifestResourceNames(); - // var test = asm.GetManifestResourceStream("mROA.Codegen.test.tpt"); - // var reader = new StreamReader(test); - // var allText = reader.ReadToEnd(); - + + List totalMethods = new List(); @@ -155,11 +150,13 @@ namespace mROA.Codegen impl = $"public {propertySymbol.Type.ToDisplayString()} {symbol.Name} {{ {getter.Item1} {setter.Item1} }}"; } + ClassTemplate.Insert("methods", impl); // declaredMethods.Add(impl); break; case IEventSymbol eventSymbol: - ClassTemplate.Insert("methods", $"public event {eventSymbol.Type.ToDisplayString()}? {eventSymbol.Name};"); + ClassTemplate.Insert("methods", + $"public event {eventSymbol.Type.ToDisplayString()}? {eventSymbol.Name};"); // declaredMethods.Add( // $"public event {eventSymbol.Type.ToDisplayString()}? {eventSymbol.Name};"); break; @@ -171,7 +168,7 @@ namespace mROA.Codegen ClassTemplate.AddDefine("className", className); ClassTemplate.AddDefine("originalName", originalName); ClassTemplate.AddDefine("namespaceName", namespaceName); - + var code = ClassTemplate.Compile(); @@ -206,17 +203,19 @@ namespace mROA.Codegen } } - private void GenerateEventImplementation(INamedTypeSymbol classSymbol, List invokers, GeneratorExecutionContext context) + private void GenerateEventImplementation(INamedTypeSymbol classSymbol, List invokers, + GeneratorExecutionContext context) { var events = classSymbol.AllInterfaces.Add(classSymbol).SelectMany(i => i.GetMembers()) .OfType().ToList(); if (events.Count == 0) return; - + InterfaceTemplate = (TemplateDocument)InterfaceTemplateOriginal.Clone(); InterfaceTemplate.AddDefine("name", classSymbol.Name); InterfaceTemplate.AddDefine("namespace", classSymbol.ContainingNamespace.ToDisplayString()); var singleEventBinder = new List(events.Count); + var objectBinderTemplate = (TemplateDocument)((InnerTemplateSection)BinderTemplate["objectBinderTemplate"]).InnerTemplate.Clone(); for (int i = 0; i < events.Count; i++) { var currentEvent = events[i]; @@ -227,19 +226,11 @@ namespace mROA.Codegen // declaredMethods.Add(additionalMethod); InterfaceTemplate.Insert("signature", signature); GenerateEventCode(currentEvent, invokers, classSymbol); - GenerateBinderCode(currentEvent, invokers, classSymbol, singleEventBinder); + GenerateBinderCode(currentEvent, invokers, classSymbol, objectBinderTemplate); } - + objectBinderTemplate.AddDefine("type", classSymbol.ToDisplayString()); var partialInterface = InterfaceTemplate.Compile(); - var binder = $@"new EventBinder<{classSymbol.ToDisplayString()}> - {{ - BindAction = (instance, context, representationProducer, index) => - {{ - var ownerId = context.OwnerId; - var module = representationProducer.Produce(ownerId); -{string.Join("\r\n", singleEventBinder)} - }} -}}"; + var binder = objectBinderTemplate.Compile(); BinderTemplate.Insert("eventBinder", binder); #if !DONT_ADD @@ -409,10 +400,12 @@ namespace mROA.Codegen } private void GenerateBinderCode(IEventSymbol eventSymbol, List invokers, INamedTypeSymbol baseType, - List binders) + TemplateDocument document) { + var eventBinderTemplate = (TemplateDocument)((InnerTemplateSection)document["eventBinderTemplate"]!).InnerTemplate.Clone(); + var index = invokers.Count - 1; - var parameters = (eventSymbol.Type as INamedTypeSymbol).TypeArguments.ToList(); + var parameters = (eventSymbol.Type as INamedTypeSymbol)!.TypeArguments.ToList(); int parameterIndex = 0; var parametersDeclaration = string.Join(", ", JoinWithComa(Enumerable.Range(0, parameters.Count).Select(i => "p" + i++))); @@ -421,28 +414,23 @@ namespace mROA.Codegen JoinWithComa(parameters.Where(i => !ParameterFilterForType(i)) .Select(i => "p" + parameters.IndexOf(i))); - var callFilter = ""; + string callFilter; var requestIndex = parameters.FindIndex(i => i.Name == "RequestContext"); if (requestIndex != -1) { callFilter = $"\n\r\t\t\tif(ownerId == p{requestIndex}.OwnerId) return;"; + eventBinderTemplate.AddDefine("callFilter", callFilter); + } - var eventBinderCode = - $@" (instance as {baseType.ToDisplayString()}).{eventSymbol.Name} += ({parametersDeclaration}) => - {{ - Console.WriteLine($""Try to send to {{ownerId}} with hash code {{context.GetHashCode()}}""); - {callFilter} - Console.WriteLine(""Sending event...""); - var request = new DefaultCallRequest - {{ - CommandId = {index}, ObjectId = new ComplexObjectIdentifier(index, ownerId), Parameters = new object[] {{ {transferParameters} }} - }}; - module.PostCallMessageAsync(request.Id, MessageType.EventRequest, request); - }}; -"; - binders.Add(eventBinderCode); + eventBinderTemplate.AddDefine("type", baseType.ToDisplayString()); + eventBinderTemplate.AddDefine("eventName", eventSymbol.Name); + eventBinderTemplate.AddDefine("parametersDeclaration", parametersDeclaration); + eventBinderTemplate.AddDefine("commandId", index.ToString()); + eventBinderTemplate.AddDefine("transferParameters", transferParameters); + var eventBinderCode = eventBinderTemplate.Compile(); + document.Insert("eventBinder", eventBinderCode); } public static string JoinWithComa(IEnumerable parts) => string.Join(", ", parts); @@ -545,20 +533,8 @@ namespace mROA.Codegen var parameterTypes = string.Join(", ", $"{string.Join(", ", method.Parameters.Select(p => $"typeof({p.Type.ToDisplayString()})"))}"); var parameterInserts = string.Join(", ", - method.Parameters.Take(method.Parameters.Length - 1).Select(p => - { - return Caster(p.Type, "parameters[" + method.Parameters.IndexOf(p) + "]"); - // if (!p.Type.IsValueType) - // return "parameters[" + method.Parameters.IndexOf(p) + "] as " + - // p.Type.ToDisplayString(); - // return $"({p.Type.ToDisplayString()})parameters[{method.Parameters.IndexOf(p)}]"; - } - )); + method.Parameters.Take(method.Parameters.Length - 1).Select(p => Caster(p.Type, "parameters[" + method.Parameters.IndexOf(p) + "]"))); - // var valueInsert = !method.Parameters.Last().Type.IsValueType - // ? "parameters[" + (method.Parameters.Length - 1) + "] as " + - // method.Parameters.Last().Type.ToDisplayString() - // : $"({method.Parameters.Last().Type.ToDisplayString()})parameters[{method.Parameters.Length - 1}]"; var valueInsert = Caster(method.Parameters.Last().Type, "parameters[" + (method.Parameters.Length - 1) + "]"); backend = $@"new mROA.Implementation.MethodInvoker