diff --git a/Example.Backend/PrinterFactory.cs b/Example.Backend/PrinterFactory.cs index efc3975..c79888f 100644 --- a/Example.Backend/PrinterFactory.cs +++ b/Example.Backend/PrinterFactory.cs @@ -9,7 +9,7 @@ namespace Example.Backend [SharedObjectSingleton] public class PrinterFactory : IPrinterFactory { - private List _printers = new List(); + private readonly List _printers = new(); public IPrinter Create(string printerName) { diff --git a/mROA.Codegen/MethodRepo.cstmpl b/mROA.Codegen/MethodRepo.cstmpl index b20123c..b1c4a93 100644 --- a/mROA.Codegen/MethodRepo.cstmpl +++ b/mROA.Codegen/MethodRepo.cstmpl @@ -13,6 +13,24 @@ namespace mROA.Codegen private readonly List _methods = new () { , + + new mROA.Implementation.AsyncMethodInvoker + { + IsVoid = , + ReturnType = typeof(), + ParameterTypes = new Type[] { }, + SuitableType = typeof(), + Invoking = (i, parameters, special, post) => , + } + + new mROA.Implementation.MethodInvoker + { + IsVoid = , + ReturnType = typeof(), + ParameterTypes = new Type[] { }, + SuitableType = typeof(), + Invoking = (i, parameters, special) => , + } }; public IMethodInvoker GetMethod(int id) diff --git a/mROA.Codegen/Tools/TemplateDocument.cs b/mROA.Codegen/Tools/TemplateDocument.cs index 8c5de44..7c4b8e8 100644 --- a/mROA.Codegen/Tools/TemplateDocument.cs +++ b/mROA.Codegen/Tools/TemplateDocument.cs @@ -55,5 +55,7 @@ namespace mROA.CodegenTools { 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/mROASourceGenerator.cs b/mROA.Codegen/mROASourceGenerator.cs index 3d3bb8d..833954c 100644 --- a/mROA.Codegen/mROASourceGenerator.cs +++ b/mROA.Codegen/mROASourceGenerator.cs @@ -80,8 +80,6 @@ namespace mROA.Codegen private void GenerateCode(GeneratorExecutionContext context, Compilation compilation, ImmutableArray classes) { - - List totalMethods = new List(); @@ -215,7 +213,8 @@ namespace mROA.Codegen 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(); + var objectBinderTemplate = + (TemplateDocument)((InnerTemplateSection)BinderTemplate["objectBinderTemplate"]).InnerTemplate.Clone(); for (int i = 0; i < events.Count; i++) { var currentEvent = events[i]; @@ -228,6 +227,7 @@ namespace mROA.Codegen GenerateEventCode(currentEvent, invokers, classSymbol); GenerateBinderCode(currentEvent, invokers, classSymbol, objectBinderTemplate); } + objectBinderTemplate.AddDefine("type", classSymbol.ToDisplayString()); var partialInterface = InterfaceTemplate.Compile(); var binder = objectBinderTemplate.Compile(); @@ -377,23 +377,26 @@ namespace mROA.Codegen } if (isAsync) - backend = $@"new mROA.Implementation.AsyncMethodInvoker -{level}{{ -{level} IsVoid = {isVoid.ToString().ToLower()}, -{(isVoid ? String.Empty : (level + "\t" + "ReturnType = typeof(" + ExtractTaskType(method.ReturnType)) + "),")} -{level} ParameterTypes = new Type[] {{ {parameterTypes} }}, -{level} SuitableType = typeof({baseInterace.ToDisplayString()}), -{level} Invoking = (i, parameters, special, post) => {funcInvoking}, -{level}}}"; + { + var invokerTemplate = (TemplateDocument)((InnerTemplateSection)MethodRepoTemplate["asyncInvoker"]).InnerTemplate.Clone(); + invokerTemplate.AddDefine("isVoid", isVoid.ToString().ToLower()); + invokerTemplate.AddDefine("returnType", ExtractTaskType(method.ReturnType)); + invokerTemplate.AddDefine("parametersType", parameterTypes); + invokerTemplate.AddDefine("suitableType", baseInterace.ToDisplayString()); + invokerTemplate.AddDefine("funcInvoking", funcInvoking); + backend = invokerTemplate.Compile(); + } else - backend = $@"new mROA.Implementation.MethodInvoker -{level}{{ -{level} IsVoid = {isVoid.ToString().ToLower()}, -{level} ReturnType = typeof({method.ReturnType.ToDisplayString()}), -{level} ParameterTypes = new Type[] {{ {parameterTypes} }}, -{level} SuitableType = typeof({baseInterace.ToDisplayString()}), -{level} Invoking = (i, parameters, special) => {funcInvoking} -{level}}}"; + { + var invokerTemplate = (TemplateDocument)((InnerTemplateSection)MethodRepoTemplate["syncInvoker"]).InnerTemplate.Clone(); + invokerTemplate.AddDefine("isVoid", isVoid.ToString().ToLower()); + invokerTemplate.AddDefine("returnType", isVoid ? "void" : method.ReturnType.ToDisplayString()); + invokerTemplate.AddDefine("parametersType", parameterTypes); + invokerTemplate.AddDefine("suitableType", baseInterace.ToDisplayString()); + invokerTemplate.AddDefine("funcInvoking", funcInvoking); + backend = invokerTemplate.Compile(); + } + MethodRepoTemplate.Insert("invoker", backend); invokers.Add(backend); @@ -402,8 +405,9 @@ namespace mROA.Codegen private void GenerateBinderCode(IEventSymbol eventSymbol, List invokers, INamedTypeSymbol baseType, TemplateDocument document) { - var eventBinderTemplate = (TemplateDocument)((InnerTemplateSection)document["eventBinderTemplate"]!).InnerTemplate.Clone(); - + var eventBinderTemplate = + (TemplateDocument)((InnerTemplateSection)document["eventBinderTemplate"]!).InnerTemplate.Clone(); + var index = invokers.Count - 1; var parameters = (eventSymbol.Type as INamedTypeSymbol)!.TypeArguments.ToList(); int parameterIndex = 0; @@ -421,7 +425,6 @@ namespace mROA.Codegen { callFilter = $"\n\r\t\t\tif(ownerId == p{requestIndex}.OwnerId) return;"; eventBinderTemplate.AddDefine("callFilter", callFilter); - } eventBinderTemplate.AddDefine("type", baseType.ToDisplayString()); @@ -533,7 +536,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 => Caster(p.Type, "parameters[" + method.Parameters.IndexOf(p) + "]"))); + method.Parameters.Take(method.Parameters.Length - 1).Select(p => + Caster(p.Type, "parameters[" + method.Parameters.IndexOf(p) + "]"))); var valueInsert = Caster(method.Parameters.Last().Type, "parameters[" + (method.Parameters.Length - 1) + "]"); @@ -578,7 +582,8 @@ namespace mROA.Codegen private string ExtractTaskType(ITypeSymbol taskType) { - return (taskType as INamedTypeSymbol).TypeArguments[0].ToDisplayString(); + var generics = ((INamedTypeSymbol)taskType).TypeArguments; + return generics.Length == 0 ? "void" : generics[0].ToDisplayString(); } private bool ContainsSOIAttribute(SyntaxList attributes, GeneratorExecutionContext context,