переписано создание интерфейсов на cstmpl
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
namespace <!L namespace>
|
||||||
|
{
|
||||||
|
public partial interface <!L name>
|
||||||
|
{
|
||||||
|
<!I signature r sep signatureSep><!D signatureSep>
|
||||||
|
<!D>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="PartialInterface.cstmpl" />
|
||||||
<EmbeddedResource Include="RemoteEndpoint.cstmpl" />
|
<EmbeddedResource Include="RemoteEndpoint.cstmpl" />
|
||||||
<EmbeddedResource Include="RemoteTypeBinder.cstmpl" />
|
<EmbeddedResource Include="RemoteTypeBinder.cstmpl" />
|
||||||
<None Remove="MethodRepo.cstmpl"/>
|
<None Remove="MethodRepo.cstmpl"/>
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ namespace mROA.Codegen
|
|||||||
private TemplateDocument MethodRepoTemplate;
|
private TemplateDocument MethodRepoTemplate;
|
||||||
private TemplateDocument ClassTemplateOriginal;
|
private TemplateDocument ClassTemplateOriginal;
|
||||||
private TemplateDocument ClassTemplate;
|
private TemplateDocument ClassTemplate;
|
||||||
|
private TemplateDocument InterfaceTemplateOriginal;
|
||||||
|
private TemplateDocument InterfaceTemplate;
|
||||||
private TemplateDocument BinderTemplate;
|
private TemplateDocument BinderTemplate;
|
||||||
|
|
||||||
private static Predicate<IParameterSymbol> ParameterFilter =
|
private static Predicate<IParameterSymbol> ParameterFilter =
|
||||||
@@ -36,6 +38,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");
|
BinderTemplate = TemplateReader.FromEmbeddedResource("RemoteTypeBinder.cstmpl");
|
||||||
|
InterfaceTemplateOriginal = TemplateReader.FromEmbeddedResource("PartialInterface.cstmpl");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Execute(GeneratorExecutionContext context)
|
public void Execute(GeneratorExecutionContext context)
|
||||||
@@ -210,7 +213,9 @@ namespace mROA.Codegen
|
|||||||
if (events.Count == 0)
|
if (events.Count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var additionalSignatures = new List<string>(events.Count);
|
InterfaceTemplate = (TemplateDocument)InterfaceTemplateOriginal.Clone();
|
||||||
|
InterfaceTemplate.AddDefine("name", classSymbol.Name);
|
||||||
|
InterfaceTemplate.AddDefine("namespace", classSymbol.ContainingNamespace.ToDisplayString());
|
||||||
var singleEventBinder = new List<string>(events.Count);
|
var singleEventBinder = new List<string>(events.Count);
|
||||||
for (int i = 0; i < events.Count; i++)
|
for (int i = 0; i < events.Count; i++)
|
||||||
{
|
{
|
||||||
@@ -220,20 +225,12 @@ namespace mROA.Codegen
|
|||||||
ClassTemplate.Insert("methods", additionalMethod);
|
ClassTemplate.Insert("methods", additionalMethod);
|
||||||
|
|
||||||
// declaredMethods.Add(additionalMethod);
|
// declaredMethods.Add(additionalMethod);
|
||||||
additionalSignatures.Add(signature);
|
InterfaceTemplate.Insert("signature", signature);
|
||||||
GenerateEventCode(currentEvent, invokers, classSymbol);
|
GenerateEventCode(currentEvent, invokers, classSymbol);
|
||||||
GenerateBinderCode(currentEvent, invokers, classSymbol, singleEventBinder);
|
GenerateBinderCode(currentEvent, invokers, classSymbol, singleEventBinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
var partialInterface = $@"
|
var partialInterface = InterfaceTemplate.Compile();
|
||||||
namespace {classSymbol.ContainingNamespace.ToDisplayString()}
|
|
||||||
{{
|
|
||||||
public partial interface {classSymbol.Name}
|
|
||||||
{{
|
|
||||||
{string.Join("\r\n", additionalSignatures)}
|
|
||||||
}}
|
|
||||||
}}
|
|
||||||
";
|
|
||||||
var binder = $@"new EventBinder<{classSymbol.ToDisplayString()}>
|
var binder = $@"new EventBinder<{classSymbol.ToDisplayString()}>
|
||||||
{{
|
{{
|
||||||
BindAction = (instance, context, representationProducer, index) =>
|
BindAction = (instance, context, representationProducer, index) =>
|
||||||
@@ -258,7 +255,7 @@ namespace {classSymbol.ContainingNamespace.ToDisplayString()}
|
|||||||
var parametersDeclaration =
|
var parametersDeclaration =
|
||||||
string.Join(", ", parameters.Select(i => $"{i.ToDisplayString()} p{parameterIndex++}"));
|
string.Join(", ", parameters.Select(i => $"{i.ToDisplayString()} p{parameterIndex++}"));
|
||||||
var signature = $@"public void {EventExternalName(eventSymbol)}({parametersDeclaration})";
|
var signature = $@"public void {EventExternalName(eventSymbol)}({parametersDeclaration})";
|
||||||
interfaceSignature = level + signature + ";";
|
interfaceSignature = signature + ";";
|
||||||
var caller = $@"{signature}
|
var caller = $@"{signature}
|
||||||
{level}{{
|
{level}{{
|
||||||
{level} {eventSymbol.Name}?.Invoke({string.Join(", ", Enumerable.Range(0, parameterIndex).Select(i => "p" + i))});
|
{level} {eventSymbol.Name}?.Invoke({string.Join(", ", Enumerable.Range(0, parameterIndex).Select(i => "p" + i))});
|
||||||
|
|||||||
Reference in New Issue
Block a user