Частично переписан RemoteTypeBinder
This commit is contained in:
@@ -7,9 +7,11 @@ using mROA.Abstract;
|
|||||||
|
|
||||||
namespace <!L namespaceName>
|
namespace <!L namespaceName>
|
||||||
{
|
{
|
||||||
partial class <!L className> : RemoteObjectBase, <!L originalName>
|
partial class <!L className>
|
||||||
|
: RemoteObjectBase, <!L originalName>
|
||||||
{
|
{
|
||||||
public <!L className>(int id, IRepresentationModule representationModule) : base(id, representationModule)
|
public <!L className>(int id, IRepresentationModule representationModule)
|
||||||
|
: base(id, representationModule)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
// <auto-generated/>
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
using System;
|
||||||
|
using mROA.Abstract;
|
||||||
|
using mROA.Implementation.Backend;
|
||||||
|
using mROA.Implementation;
|
||||||
|
|
||||||
|
namespace mROA.Codegen
|
||||||
|
{
|
||||||
|
public sealed class RemoteTypeBinder
|
||||||
|
{
|
||||||
|
static RemoteTypeBinder(){
|
||||||
|
RemoteContextRepository.RemoteTypes = new Dictionary<Type, Type> {
|
||||||
|
<!I remoteTypePair r sep typesSep><!D typesSep>,
|
||||||
|
<!D>};
|
||||||
|
ContextRepository.EventBinders = new object[] {
|
||||||
|
<!I eventBinder r sep typesSep>
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ namespace mROA.CodegenTools
|
|||||||
{
|
{
|
||||||
public List<ITemplateSection> Parts { get; set; } = new List<ITemplateSection>();
|
public List<ITemplateSection> Parts { get; set; } = new List<ITemplateSection>();
|
||||||
public object AdditionalContext { get; set; }
|
public object AdditionalContext { get; set; }
|
||||||
public ITagged this[string tag] => Parts.OfType<ITagged>().FirstOrDefault(i => i.Tag == tag);
|
public ITagged? this[string tag] => Parts.OfType<ITagged>().FirstOrDefault(i => i.Tag == tag);
|
||||||
|
|
||||||
public void Insert(string tag, object value)
|
public void Insert(string tag, object value)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="RemoteEndpoint.cstmpl" />
|
<EmbeddedResource Include="RemoteEndpoint.cstmpl" />
|
||||||
|
<EmbeddedResource Include="RemoteTypeBinder.cstmpl" />
|
||||||
<None Remove="MethodRepo.cstmpl"/>
|
<None Remove="MethodRepo.cstmpl"/>
|
||||||
<EmbeddedResource Include="MethodRepo.cstmpl"/>
|
<EmbeddedResource Include="MethodRepo.cstmpl"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace mROA.Codegen
|
|||||||
private TemplateDocument MethodRepoTemplate;
|
private TemplateDocument MethodRepoTemplate;
|
||||||
private TemplateDocument ClassTemplateOriginal;
|
private TemplateDocument ClassTemplateOriginal;
|
||||||
private TemplateDocument ClassTemplate;
|
private TemplateDocument ClassTemplate;
|
||||||
|
private TemplateDocument BinderTemplate;
|
||||||
|
|
||||||
private static Predicate<IParameterSymbol> ParameterFilter =
|
private static Predicate<IParameterSymbol> ParameterFilter =
|
||||||
i => i.Type.Name is "CancellationToken" or "RequestContext";
|
i => i.Type.Name is "CancellationToken" or "RequestContext";
|
||||||
@@ -34,6 +35,7 @@ namespace mROA.Codegen
|
|||||||
{
|
{
|
||||||
MethodRepoTemplate = TemplateReader.FromEmbeddedResource("MethodRepo.cstmpl");
|
MethodRepoTemplate = TemplateReader.FromEmbeddedResource("MethodRepo.cstmpl");
|
||||||
ClassTemplateOriginal = TemplateReader.FromEmbeddedResource("RemoteEndpoint.cstmpl");
|
ClassTemplateOriginal = TemplateReader.FromEmbeddedResource("RemoteEndpoint.cstmpl");
|
||||||
|
BinderTemplate = TemplateReader.FromEmbeddedResource("RemoteTypeBinder.cstmpl");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Execute(GeneratorExecutionContext context)
|
public void Execute(GeneratorExecutionContext context)
|
||||||
@@ -66,7 +68,7 @@ namespace mROA.Codegen
|
|||||||
|
|
||||||
GenerateCode(context, context.Compilation, interfaces.ToImmutableArray());
|
GenerateCode(context, context.Compilation, interfaces.ToImmutableArray());
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Console.WriteLine("ERROR: Unable to load method repository");
|
Console.WriteLine("ERROR: Unable to load method repository");
|
||||||
}
|
}
|
||||||
@@ -81,8 +83,7 @@ namespace mROA.Codegen
|
|||||||
// var test = asm.GetManifestResourceStream("mROA.Codegen.test.tpt");
|
// var test = asm.GetManifestResourceStream("mROA.Codegen.test.tpt");
|
||||||
// var reader = new StreamReader(test);
|
// var reader = new StreamReader(test);
|
||||||
// var allText = reader.ReadToEnd();
|
// var allText = reader.ReadToEnd();
|
||||||
var frontendContextRepo = new List<string>();
|
|
||||||
var eventBinders = new List<string>();
|
|
||||||
List<IMethodSymbol> totalMethods = new List<IMethodSymbol>();
|
List<IMethodSymbol> totalMethods = new List<IMethodSymbol>();
|
||||||
|
|
||||||
|
|
||||||
@@ -162,7 +163,7 @@ namespace mROA.Codegen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GenerateEventImplementation(classSymbol, invokers, declaredMethods, context, eventBinders);
|
GenerateEventImplementation(classSymbol, invokers, context);
|
||||||
|
|
||||||
ClassTemplate.AddDefine("className", className);
|
ClassTemplate.AddDefine("className", className);
|
||||||
ClassTemplate.AddDefine("originalName", originalName);
|
ClassTemplate.AddDefine("originalName", originalName);
|
||||||
@@ -175,7 +176,7 @@ namespace mROA.Codegen
|
|||||||
#if !DONT_ADD
|
#if !DONT_ADD
|
||||||
context.AddSource($"{className}.g.cs", SourceText.From(code, Encoding.UTF8));
|
context.AddSource($"{className}.g.cs", SourceText.From(code, Encoding.UTF8));
|
||||||
#endif
|
#endif
|
||||||
frontendContextRepo.Add(
|
BinderTemplate.Insert("remoteTypePair",
|
||||||
$"{{ typeof({classSymbol.ToDisplayString()}), typeof({namespaceName}.{className}) }}");
|
$"{{ typeof({classSymbol.ToDisplayString()}), typeof({namespaceName}.{className}) }}");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,37 +194,16 @@ namespace mROA.Codegen
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frontendContextRepo.Count != 0)
|
if (BinderTemplate["remoteTypePair+"] != null)
|
||||||
{
|
{
|
||||||
var fronendRepoCode = @$"// <auto-generated/>
|
var fronendRepoCode = BinderTemplate.Compile();
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Reflection;
|
|
||||||
using System;
|
|
||||||
using mROA.Abstract;
|
|
||||||
using mROA.Implementation.Backend;
|
|
||||||
using mROA.Implementation;
|
|
||||||
|
|
||||||
namespace mROA.Codegen
|
|
||||||
{{
|
|
||||||
public sealed class RemoteTypeBinder
|
|
||||||
{{
|
|
||||||
static RemoteTypeBinder(){{
|
|
||||||
RemoteContextRepository.RemoteTypes = new Dictionary<Type, Type> {{
|
|
||||||
{string.Join(", \r\n\t\t\t", frontendContextRepo)}}};
|
|
||||||
ContextRepository.EventBinders = new object[] {{
|
|
||||||
{string.Join(",\r\n\t\t\t", eventBinders)}}};
|
|
||||||
}}
|
|
||||||
}}
|
|
||||||
}}
|
|
||||||
";
|
|
||||||
#if !DONT_ADD
|
#if !DONT_ADD
|
||||||
context.AddSource("RemoteTypeBinder.g.cs", SourceText.From(fronendRepoCode, Encoding.UTF8));
|
context.AddSource("RemoteTypeBinder.g.cs", SourceText.From(fronendRepoCode, Encoding.UTF8));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GenerateEventImplementation(INamedTypeSymbol classSymbol, List<string> invokers,
|
private void GenerateEventImplementation(INamedTypeSymbol classSymbol, List<string> invokers, GeneratorExecutionContext context)
|
||||||
List<string> declaredMethods, GeneratorExecutionContext context, List<string> binders)
|
|
||||||
{
|
{
|
||||||
var events = classSymbol.AllInterfaces.Add(classSymbol).SelectMany(i => i.GetMembers())
|
var events = classSymbol.AllInterfaces.Add(classSymbol).SelectMany(i => i.GetMembers())
|
||||||
.OfType<IEventSymbol>().ToList();
|
.OfType<IEventSymbol>().ToList();
|
||||||
@@ -263,7 +243,8 @@ namespace {classSymbol.ContainingNamespace.ToDisplayString()}
|
|||||||
{string.Join("\r\n", singleEventBinder)}
|
{string.Join("\r\n", singleEventBinder)}
|
||||||
}}
|
}}
|
||||||
}}";
|
}}";
|
||||||
binders.Add(binder);
|
BinderTemplate.Insert("eventBinder", binder);
|
||||||
|
|
||||||
#if !DONT_ADD
|
#if !DONT_ADD
|
||||||
context.AddSource($"{classSymbol.Name}.g.cs", SourceText.From(partialInterface, Encoding.UTF8));
|
context.AddSource($"{classSymbol.Name}.g.cs", SourceText.From(partialInterface, Encoding.UTF8));
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user