From 5d5c3d1e2b6b266a535ba64292f586c9c920a500 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Wed, 26 Mar 2025 09:58:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BD=D0=B0=20cstmpl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mROA.Codegen/PartialInterface.cstmpl | 8 ++++++++ mROA.Codegen/mROA.Codegen.csproj | 1 + mROA.Codegen/mROASourceGenerator.cs | 23 ++++++++++------------- 3 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 mROA.Codegen/PartialInterface.cstmpl diff --git a/mROA.Codegen/PartialInterface.cstmpl b/mROA.Codegen/PartialInterface.cstmpl new file mode 100644 index 0000000..bf8385a --- /dev/null +++ b/mROA.Codegen/PartialInterface.cstmpl @@ -0,0 +1,8 @@ +namespace +{ + public partial interface + { + + + } +} \ No newline at end of file diff --git a/mROA.Codegen/mROA.Codegen.csproj b/mROA.Codegen/mROA.Codegen.csproj index da1b5ae..5c3dbf2 100644 --- a/mROA.Codegen/mROA.Codegen.csproj +++ b/mROA.Codegen/mROA.Codegen.csproj @@ -34,6 +34,7 @@ + diff --git a/mROA.Codegen/mROASourceGenerator.cs b/mROA.Codegen/mROASourceGenerator.cs index 2b61c78..587183a 100644 --- a/mROA.Codegen/mROASourceGenerator.cs +++ b/mROA.Codegen/mROASourceGenerator.cs @@ -23,6 +23,8 @@ namespace mROA.Codegen private TemplateDocument MethodRepoTemplate; private TemplateDocument ClassTemplateOriginal; private TemplateDocument ClassTemplate; + private TemplateDocument InterfaceTemplateOriginal; + private TemplateDocument InterfaceTemplate; private TemplateDocument BinderTemplate; private static Predicate ParameterFilter = @@ -36,6 +38,7 @@ namespace mROA.Codegen MethodRepoTemplate = TemplateReader.FromEmbeddedResource("MethodRepo.cstmpl"); ClassTemplateOriginal = TemplateReader.FromEmbeddedResource("RemoteEndpoint.cstmpl"); BinderTemplate = TemplateReader.FromEmbeddedResource("RemoteTypeBinder.cstmpl"); + InterfaceTemplateOriginal = TemplateReader.FromEmbeddedResource("PartialInterface.cstmpl"); } public void Execute(GeneratorExecutionContext context) @@ -209,8 +212,10 @@ namespace mROA.Codegen .OfType().ToList(); if (events.Count == 0) return; - - var additionalSignatures = new List(events.Count); + + InterfaceTemplate = (TemplateDocument)InterfaceTemplateOriginal.Clone(); + InterfaceTemplate.AddDefine("name", classSymbol.Name); + InterfaceTemplate.AddDefine("namespace", classSymbol.ContainingNamespace.ToDisplayString()); var singleEventBinder = new List(events.Count); for (int i = 0; i < events.Count; i++) { @@ -220,20 +225,12 @@ namespace mROA.Codegen ClassTemplate.Insert("methods", additionalMethod); // declaredMethods.Add(additionalMethod); - additionalSignatures.Add(signature); + InterfaceTemplate.Insert("signature", signature); GenerateEventCode(currentEvent, invokers, classSymbol); GenerateBinderCode(currentEvent, invokers, classSymbol, singleEventBinder); } - var partialInterface = $@" -namespace {classSymbol.ContainingNamespace.ToDisplayString()} -{{ - public partial interface {classSymbol.Name} - {{ -{string.Join("\r\n", additionalSignatures)} - }} -}} -"; + var partialInterface = InterfaceTemplate.Compile(); var binder = $@"new EventBinder<{classSymbol.ToDisplayString()}> {{ BindAction = (instance, context, representationProducer, index) => @@ -258,7 +255,7 @@ namespace {classSymbol.ContainingNamespace.ToDisplayString()} var parametersDeclaration = string.Join(", ", parameters.Select(i => $"{i.ToDisplayString()} p{parameterIndex++}")); var signature = $@"public void {EventExternalName(eventSymbol)}({parametersDeclaration})"; - interfaceSignature = level + signature + ";"; + interfaceSignature = signature + ";"; var caller = $@"{signature} {level}{{ {level} {eventSymbol.Name}?.Invoke({string.Join(", ", Enumerable.Range(0, parameterIndex).Select(i => "p" + i))});