From f31ddf16043bc6109d08dd695758768028dc8aff Mon Sep 17 00:00:00 2001 From: Mitrofanov Mikhail Date: Fri, 27 Jun 2025 16:12:38 +0300 Subject: [PATCH] Including tools into codegen --- Example.Shared/Example.Shared.csproj | 4 + Example.Shared/ILoadTest.cs | 32 +++++++ mROA.Codegen/Tools/DefineTemplateSection.cs | 30 ------- mROA.Codegen/Tools/ITemplateSection.cs | 20 ----- mROA.Codegen/Tools/InnerTemplateSection.cs | 24 ------ mROA.Codegen/Tools/InsertTemplateSection.cs | 86 ------------------- mROA.Codegen/Tools/LinkTemplateSection.cs | 39 --------- mROA.Codegen/Tools/LiteralTemplateSection.cs | 31 ------- mROA.Codegen/Tools/ProgrammableTextSection.cs | 29 ------- .../Tools/Reading/DefineSectionReader.cs | 24 ------ mROA.Codegen/Tools/Reading/ISectionReader.cs | 9 -- .../Reading/InnerTemplateSectionReader.cs | 39 --------- .../Tools/Reading/InsertSectionReader.cs | 24 ------ .../Tools/Reading/LeadingTextSectionReader.cs | 41 --------- .../Tools/Reading/LinkSectionReader.cs | 20 ----- mROA.Codegen/Tools/Reading/TemplateReader.cs | 82 ------------------ mROA.Codegen/Tools/TemplateDocument.cs | 61 ------------- mROA.Codegen/mROA.Codegen.csproj | 13 ++- mROA.Codegen/mROASourceGenerator.cs | 25 ++++-- .../Reading/LeadingTextSectionReader.cs | 5 +- mROA.CodegenTools/mROA.CodegenTools.csproj | 7 +- .../RemoteInstanceRepository.cs | 7 +- 22 files changed, 78 insertions(+), 574 deletions(-) delete mode 100644 mROA.Codegen/Tools/DefineTemplateSection.cs delete mode 100644 mROA.Codegen/Tools/ITemplateSection.cs delete mode 100644 mROA.Codegen/Tools/InnerTemplateSection.cs delete mode 100644 mROA.Codegen/Tools/InsertTemplateSection.cs delete mode 100644 mROA.Codegen/Tools/LinkTemplateSection.cs delete mode 100644 mROA.Codegen/Tools/LiteralTemplateSection.cs delete mode 100644 mROA.Codegen/Tools/ProgrammableTextSection.cs delete mode 100644 mROA.Codegen/Tools/Reading/DefineSectionReader.cs delete mode 100644 mROA.Codegen/Tools/Reading/ISectionReader.cs delete mode 100644 mROA.Codegen/Tools/Reading/InnerTemplateSectionReader.cs delete mode 100644 mROA.Codegen/Tools/Reading/InsertSectionReader.cs delete mode 100644 mROA.Codegen/Tools/Reading/LeadingTextSectionReader.cs delete mode 100644 mROA.Codegen/Tools/Reading/LinkSectionReader.cs delete mode 100644 mROA.Codegen/Tools/Reading/TemplateReader.cs delete mode 100644 mROA.Codegen/Tools/TemplateDocument.cs diff --git a/Example.Shared/Example.Shared.csproj b/Example.Shared/Example.Shared.csproj index 40a196f..db58133 100644 --- a/Example.Shared/Example.Shared.csproj +++ b/Example.Shared/Example.Shared.csproj @@ -13,4 +13,8 @@ + + + + diff --git a/Example.Shared/ILoadTest.cs b/Example.Shared/ILoadTest.cs index 227af99..a6b8d15 100644 --- a/Example.Shared/ILoadTest.cs +++ b/Example.Shared/ILoadTest.cs @@ -1,5 +1,6 @@ using System.Threading; using System.Threading.Tasks; +using mROA.Abstract; using mROA.Implementation; using mROA.Implementation.Attributes; @@ -15,4 +16,35 @@ namespace Example.Shared Task AsyncTest(CancellationToken token = default); } + + partial class LoadTestRemoteEndpoint2 + : RemoteObjectBase, ILoadTest + { + public LoadTestRemoteEndpoint2(int id, IRepresentationModule representationModule, IEndPointContext context) + : base(id, representationModule, context) + { + } + + public void A(){ + CallAsync(0).Wait(); + } + + public async System.Threading.Tasks.Task AsyncTest(System.Threading.CancellationToken token){ + await CallAsync(1, cancellationToken : token); + } + + public void C(){ + CallAsync(2).Wait(); + } + + public System.Int32 Last(System.Int32 next){ + return GetResultAsync(3, new System.Object[] { next }).GetAwaiter().GetResult(); + } + + public System.Int32 Next(System.Int32 last){ + return GetResultAsync(4, new System.Object[] { last }).GetAwaiter().GetResult(); + } + + + } } \ No newline at end of file diff --git a/mROA.Codegen/Tools/DefineTemplateSection.cs b/mROA.Codegen/Tools/DefineTemplateSection.cs deleted file mode 100644 index e572e70..0000000 --- a/mROA.Codegen/Tools/DefineTemplateSection.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace mROA.Codegen.Tools -{ - public class DefineTemplateSection : ITagged - { - public DefineTemplateSection(string storedText, string tag, TemplateDocument context) - { - StoredText = storedText; - Tag = tag; - Context = context; - } - - public string StoredText { get; } - public TemplateDocument Context { get; set; } - - public string Tag { get; } - - public int TargetLength => StoredText.Length; - - public object Clone() - { - return new DefineTemplateSection(StoredText, Tag, Context); - } - - - public override string ToString() - { - return StoredText; - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/ITemplateSection.cs b/mROA.Codegen/Tools/ITemplateSection.cs deleted file mode 100644 index 24a8e47..0000000 --- a/mROA.Codegen/Tools/ITemplateSection.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace mROA.Codegen.Tools -{ - public interface ITemplateSection : ICloneable - { - TemplateDocument Context { get; set; } - int TargetLength { get; } - } - - public interface IBaking - { - string Bake(); - } - - public interface ITagged : ITemplateSection - { - string Tag { get; } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/InnerTemplateSection.cs b/mROA.Codegen/Tools/InnerTemplateSection.cs deleted file mode 100644 index 56308cb..0000000 --- a/mROA.Codegen/Tools/InnerTemplateSection.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace mROA.Codegen.Tools -{ - public class InnerTemplateSection : ITemplateSection, ITagged - { - public InnerTemplateSection(string tag, TemplateDocument innerTemplate, TemplateDocument context) - { - Tag = tag; - Context = context; - InnerTemplate = innerTemplate; - } - - public TemplateDocument InnerTemplate { get; } - - public string Tag { get; } - - public TemplateDocument Context { get; set; } - public int TargetLength => 0; - - public object Clone() - { - return new InnerTemplateSection(Tag, InnerTemplate, Context); - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/InsertTemplateSection.cs b/mROA.Codegen/Tools/InsertTemplateSection.cs deleted file mode 100644 index 097a8e8..0000000 --- a/mROA.Codegen/Tools/InsertTemplateSection.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -namespace mROA.Codegen.Tools -{ - public class InsertTemplateSection : ITagged, IBaking - { - public readonly List Parameters; - private object _insertedValue; - - public InsertTemplateSection(string tag, TemplateDocument context, params string[] parameters) - { - Tag = tag; - Parameters = parameters.ToList(); - Context = context; - } - - public string Bake() - { - switch (_insertedValue) - { - case null: - return string.Empty; - case string s: - return s; - default: - return ((ITemplateSection)_insertedValue).ToString(); - } - } - - public string Tag { get; private set; } - - public TemplateDocument Context { get; set; } - - - public int TargetLength => 0; - - public object Clone() - { - return new InsertTemplateSection(Tag, Context, Parameters.ToArray()); - } - - private bool IsInserted(object value) - { - if (Parameters.IndexOf("r") == -1) return false; - - ProduceInserted(value); - - return true; - } - - private void ProduceInserted(object value) - { - var currentIndex = Context.Parts.IndexOf(this); - var clone = (InsertTemplateSection)MemberwiseClone(); - clone.Tag += "+"; - - clone._insertedValue = value; - - Context.Parts.Insert(currentIndex, clone); - - InsertSeparator(currentIndex + 1); - } - - private void InsertSeparator(int currentIndex) - { - var sepIndex = Parameters.IndexOf("sep"); - if (sepIndex == -1) - return; - - Context.Parts.Insert(currentIndex, - new LiteralTemplateSection(Context[Parameters[sepIndex + 1]].ToString(), Context)); - } - - - public void Setup(object value) - { - if (!(value is string) && !(value is ITemplateSection)) - return; - if (IsInserted(value)) - return; - - _insertedValue = value; - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/LinkTemplateSection.cs b/mROA.Codegen/Tools/LinkTemplateSection.cs deleted file mode 100644 index af9e255..0000000 --- a/mROA.Codegen/Tools/LinkTemplateSection.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace mROA.Codegen.Tools -{ - public class LinkTemplateSection : ITemplateSection, IBaking - { - public LinkTemplateSection(string linkedTag, TemplateDocument context) - { - LinkedTag = linkedTag; - Context = context; - } - - public string LinkedTag { get; } - - public string Bake() - { - return Context[LinkedTag]?.ToString(); - } - - public TemplateDocument Context { get; set; } - - public int TargetLength - { - get - { - var attached = Context[LinkedTag]; - return attached?.TargetLength ?? 0; - } - } - - public object Clone() - { - return new LinkTemplateSection(LinkedTag, Context); - } - - public override string ToString() - { - return $"{nameof(LinkedTag)}: {LinkedTag}"; - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/LiteralTemplateSection.cs b/mROA.Codegen/Tools/LiteralTemplateSection.cs deleted file mode 100644 index e55cd9c..0000000 --- a/mROA.Codegen/Tools/LiteralTemplateSection.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace mROA.Codegen.Tools -{ - public class LiteralTemplateSection : ITemplateSection, IBaking - { - private readonly string _internalText; - - public LiteralTemplateSection(string internalText, TemplateDocument context) - { - _internalText = internalText; - Context = context; - } - - public string Bake() - { - return ToString(); - } - - public TemplateDocument Context { get; set; } - public int TargetLength => _internalText.Length; - - public object Clone() - { - return new LiteralTemplateSection(_internalText, Context); - } - - public override string ToString() - { - return _internalText; - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/ProgrammableTextSection.cs b/mROA.Codegen/Tools/ProgrammableTextSection.cs deleted file mode 100644 index 11eb037..0000000 --- a/mROA.Codegen/Tools/ProgrammableTextSection.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; - -namespace mROA.Codegen.Tools -{ - public class ProgrammableTextSection : ITemplateSection, IBaking - { - private readonly Func _bakeFunc; - - public ProgrammableTextSection(Func bakeFunc, TemplateDocument context) - { - _bakeFunc = bakeFunc; - Context = context; - } - - - public string Bake() - { - return _bakeFunc(Context.AdditionalContext); - } - - public TemplateDocument Context { get; set; } - public int TargetLength => 0; - - public object Clone() - { - return new ProgrammableTextSection(_bakeFunc, Context); - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/Reading/DefineSectionReader.cs b/mROA.Codegen/Tools/Reading/DefineSectionReader.cs deleted file mode 100644 index 1da5c39..0000000 --- a/mROA.Codegen/Tools/Reading/DefineSectionReader.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -namespace mROA.Codegen.Tools.Reading -{ - public class DefineSectionReader : LeadingTextSectionReader - { - public DefineSectionReader() : base("", index, StringComparison.Ordinal); - var sectionName = GetTagValue(index, tagEnd); - tagEnd += 1; - var endIndex = TemplateText.IndexOf("", tagEnd, StringComparison.Ordinal); - var storedText = TemplateText.Substring(tagEnd, endIndex - tagEnd); - index = endIndex + 4; - PassCaretToCloseSymbol(); - PassCaretToCloseSymbol(); - return new DefineTemplateSection(storedText, sectionName, document); - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/Reading/ISectionReader.cs b/mROA.Codegen/Tools/Reading/ISectionReader.cs deleted file mode 100644 index fdab5e2..0000000 --- a/mROA.Codegen/Tools/Reading/ISectionReader.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace mROA.Codegen.Tools.Reading -{ - public interface ISectionReader - { - string TemplateText { get; set; } - int GetNextSectionIndex(int currentIndex); - ITemplateSection ExtractSection(ref int index, TemplateDocument document); - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/Reading/InnerTemplateSectionReader.cs b/mROA.Codegen/Tools/Reading/InnerTemplateSectionReader.cs deleted file mode 100644 index f6baefe..0000000 --- a/mROA.Codegen/Tools/Reading/InnerTemplateSectionReader.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; - -namespace mROA.Codegen.Tools.Reading -{ - public class InnerTemplateSectionReader : LeadingTextSectionReader - { - public InnerTemplateSectionReader() - : base("", start, StringComparison.Ordinal); - var innerStartSymbol = TemplateText.IndexOf("", _currentCaretPosition, StringComparison.Ordinal) + 1; - return _currentCaretPosition; - } - - protected string GetTagValue(int from, int to) - { - var realStart = from + 4; - var span = TemplateText.AsSpan(); - var slice = span.Slice(realStart, to - realStart); - return new string(slice.ToArray()); - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/Reading/LinkSectionReader.cs b/mROA.Codegen/Tools/Reading/LinkSectionReader.cs deleted file mode 100644 index 3d0bd31..0000000 --- a/mROA.Codegen/Tools/Reading/LinkSectionReader.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace mROA.Codegen.Tools.Reading -{ - public class LinkSectionReader : LeadingTextSectionReader - { - public LinkSectionReader() : base(" ReaderTypes = new() - { - typeof(DefineSectionReader), - typeof(InsertSectionReader), - typeof(LinkSectionReader), - typeof(InnerTemplateSectionReader) - }; - - public static TemplateDocument Parse(string templateText) - { - var currentIndex = 0; - var activeReaders = new List(); - - foreach (var readerType in ReaderTypes) - { - var reader = Activator.CreateInstance(readerType) as ISectionReader; - reader.TemplateText = templateText; - activeReaders.Add(reader); - } - - var doc = new TemplateDocument(); - - while (currentIndex < templateText.Length) - { - List<(ISectionReader reader, int index)> indices = activeReaders - .Select(i => ((ISectionReader Readers, int index))(i, i.GetNextSectionIndex(currentIndex))) - .Where(i => i.index > -1).ToList(); - var minIndex = templateText.Length; - ISectionReader minReader = null; - if (indices.Count != 0) - { - minIndex = indices.Min(i => i.index); - minReader = indices.FirstOrDefault(i => i.index == minIndex).reader; - - if (indices.Count != activeReaders.Count) activeReaders = indices.Select(i => i.reader).ToList(); - } - - - if (currentIndex != minIndex) - { - var literalText = templateText.Substring(currentIndex, minIndex - currentIndex); - var literal = - new LiteralTemplateSection(literalText, doc); - doc.Parts.Add(literal); - currentIndex = minIndex; - } - - if (indices.Count != 0) - { - var section = minReader.ExtractSection(ref currentIndex, doc); - doc.Parts.Add(section); - } - } - - return doc; - } - - public static TemplateDocument FromEmbeddedResource(string resourceName) - { - return FromEmbeddedResource(resourceName, Assembly.GetCallingAssembly()); - } - - public static TemplateDocument FromEmbeddedResource(string resourceName, Assembly assembly) - { - var fileName = assembly.GetManifestResourceNames().First(n => n.EndsWith(resourceName)); - var res = assembly.GetManifestResourceStream(fileName); - var reader = new StreamReader(res); - var templateText = reader.ReadToEnd(); - return Parse(templateText); - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/Tools/TemplateDocument.cs b/mROA.Codegen/Tools/TemplateDocument.cs deleted file mode 100644 index 70f8b48..0000000 --- a/mROA.Codegen/Tools/TemplateDocument.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace mROA.Codegen.Tools -{ - public class TemplateDocument : ICloneable - { - public List Parts { get; set; } = new(); - public object AdditionalContext { get; set; } - public ITagged? this[string tag] => Parts.OfType().FirstOrDefault(i => i.Tag == tag); - - public object Clone() - { - var cloneDoc = new TemplateDocument - { - AdditionalContext = AdditionalContext is ICloneable c ? c.Clone() : AdditionalContext - }; - - cloneDoc.Parts = Parts.Select(i => - { - var clone = i.Clone() as ITemplateSection; - clone.Context = cloneDoc; - return clone; - }).ToList(); - - return cloneDoc; - } - - public void Insert(string tag, object value) - { - var selectedPart = this[tag]; - if (selectedPart is InsertTemplateSection itp) itp.Setup(value); - } - - public string Compile() - { - var approximatelyLength = Parts.Sum(i => i.TargetLength); - var stringBuilder = new StringBuilder(approximatelyLength); - - foreach (var part in Parts.OfType()) - { - var baked = part.Bake(); - stringBuilder.Append(baked); - } - - return stringBuilder.ToString(); - } - - public void AddDefine(string tag, string text) - { - Parts.Add(new DefineTemplateSection(text, tag, this)); - } - - public void AddDefine(string tag, object value) - { - AddDefine(tag, value.ToString()); - } - } -} \ No newline at end of file diff --git a/mROA.Codegen/mROA.Codegen.csproj b/mROA.Codegen/mROA.Codegen.csproj index b92d3ea..cc508dc 100644 --- a/mROA.Codegen/mROA.Codegen.csproj +++ b/mROA.Codegen/mROA.Codegen.csproj @@ -17,7 +17,7 @@ https://github.com/YaslePoy/mROA git True - 2.0.3 + 2.0.4 @@ -26,6 +26,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + @@ -41,5 +42,15 @@ + + $(GetTargetPathDependsOn);GetDependencyTargetPaths + + + + + + + + diff --git a/mROA.Codegen/mROASourceGenerator.cs b/mROA.Codegen/mROASourceGenerator.cs index 8e3fafc..723974a 100644 --- a/mROA.Codegen/mROASourceGenerator.cs +++ b/mROA.Codegen/mROASourceGenerator.cs @@ -8,8 +8,8 @@ using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; -using mROA.Codegen.Tools; -using mROA.Codegen.Tools.Reading; +using mROA.CodegenTools; +using mROA.CodegenTools.Reading; #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. @@ -40,16 +40,25 @@ namespace mROA.Codegen public void Initialize(GeneratorInitializationContext context) { - _methodRepoTemplate = TemplateReader.FromEmbeddedResource("MethodRepo.cstmpl"); - _methodInvokerOriginal = - ((InnerTemplateSection)_methodRepoTemplate["syncInvoker"]!).InnerTemplate; - _classTemplateOriginal = TemplateReader.FromEmbeddedResource("RemoteEndpoint.cstmpl"); - _binderTemplate = TemplateReader.FromEmbeddedResource("RemoteTypeBinder.cstmpl"); - _interfaceTemplateOriginal = TemplateReader.FromEmbeddedResource("PartialInterface.cstmpl"); + try + { + + _methodRepoTemplate = TemplateReader.FromEmbeddedResource("MethodRepo.cstmpl"); + _methodInvokerOriginal = + ((InnerTemplateSection)_methodRepoTemplate["syncInvoker"]!).InnerTemplate; + _classTemplateOriginal = TemplateReader.FromEmbeddedResource("RemoteEndpoint.cstmpl"); + _binderTemplate = TemplateReader.FromEmbeddedResource("RemoteTypeBinder.cstmpl"); + _interfaceTemplateOriginal = TemplateReader.FromEmbeddedResource("PartialInterface.cstmpl"); + } + catch (Exception e) + { + Console.WriteLine(e); + } } public void Execute(GeneratorExecutionContext context) { + // return; try { var trees = context.Compilation.SyntaxTrees; diff --git a/mROA.CodegenTools/Reading/LeadingTextSectionReader.cs b/mROA.CodegenTools/Reading/LeadingTextSectionReader.cs index 78964a8..2367ccd 100644 --- a/mROA.CodegenTools/Reading/LeadingTextSectionReader.cs +++ b/mROA.CodegenTools/Reading/LeadingTextSectionReader.cs @@ -33,9 +33,8 @@ namespace mROA.CodegenTools.Reading protected string GetTagValue(int from, int to) { var realStart = from + 4; - var span = TemplateText.AsSpan(); - var slice = span.Slice(realStart, to - realStart); - return new string(slice.ToArray()); + var span = TemplateText.Substring(realStart, to - realStart); + return span; } } } \ No newline at end of file diff --git a/mROA.CodegenTools/mROA.CodegenTools.csproj b/mROA.CodegenTools/mROA.CodegenTools.csproj index 4924533..fd5de02 100644 --- a/mROA.CodegenTools/mROA.CodegenTools.csproj +++ b/mROA.CodegenTools/mROA.CodegenTools.csproj @@ -1,9 +1,14 @@  - netstandard2.1 + netstandard2.0 enable 9 + mROA.CodegenTools + true + mROA.CodegenTools + Tools for codegen + MIT diff --git a/mROA/Implementation/RemoteInstanceRepository.cs b/mROA/Implementation/RemoteInstanceRepository.cs index 39ae9ef..e8a4fca 100644 --- a/mROA/Implementation/RemoteInstanceRepository.cs +++ b/mROA/Implementation/RemoteInstanceRepository.cs @@ -55,8 +55,11 @@ namespace mROA.Implementation var representationModule = _representationProducer.Produce(context.OwnerId); - _producedRemoteEndpoints.Add((Activator.CreateInstance(RemoteTypes[type], -1, - representationModule, context) as RemoteObjectBase)!); + var instance = Activator.CreateInstance(RemoteTypes[type], -1, representationModule, context); + + var remoteObjectBase = (RemoteObjectBase)instance; + + _producedRemoteEndpoints.Add(remoteObjectBase); return _producedRemoteEndpoints.Last(); }