using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; namespace FlutterCodeGenerator { internal class MethodMap { public List ParameterModeTypes; public ModelType ReturnParameterModelType { get; set; } private readonly string _methodName; public MethodMap(MethodInfo method) { ParameterModeTypes = new List(); _methodName = method.Name; Type returnParameterType; if (!method.ReturnType.IsGenericType) { returnParameterType = typeof(void); } else { returnParameterType = method.ReturnType.GetGenericArguments()[0]; } ReturnParameterModelType = ModelTypeGenerator.Create(returnParameterType, "", true); var parameters = method.GetParameters(); foreach (var parameter in parameters) { var parameterType = parameter.ParameterType; var parameterModeType = ModelTypeGenerator.Create(parameterType, parameter.Name, true); ParameterModeTypes.Add(parameterModeType); } } public string GetMethodDartString() { var dartString = new StringBuilder(); var parameterNames = string.Join(",", ParameterModeTypes.Select(r => r.GetFlutterTypeName() + " " + r.Name_Lower)); var argumentNames = string.Join(",", ParameterModeTypes.Select(r => r.Name_Lower)); if (ParameterModeTypes.Count > 1) { argumentNames = "[" + argumentNames + "]"; } dartString.AppendLine($"\tFuture<{ReturnParameterModelType.GetFlutterTypeName()}> {LetterConverterHelper.FirstCharToLower(_methodName)}({parameterNames}) async {{"); if (ReturnParameterModelType is VoidModelType) { dartString.AppendLine($"\t\tawait call(\"{_methodName}\", {argumentNames});"); } else { dartString.AppendLine($"\t\tvar rpcRst = await call(\"{_methodName}\", {argumentNames});"); if (ReturnParameterModelType is SimpleModelType && !(ReturnParameterModelType is ListModelType) && !(ReturnParameterModelType is DictionaryModelType) && !(ReturnParameterModelType is ArrayModelType)) { dartString.AppendLine("\t\treturn rpcRst;"); } else if (ReturnParameterModelType is UserDefinedModeType || ReturnParameterModelType is UserDefinedGenericModelType || ReturnParameterModelType is UserDefinedDerivedModelType) { dartString.AppendLine($"\t\tvar result = {ReturnParameterModelType.GetFlutterTypeName()}.fromJson(rpcRst as Map);"); dartString.AppendLine("\t\treturn result;"); } else if (ReturnParameterModelType is ListModelType genericModelType) { if (genericModelType.GenericArgumentModelType is SimpleModelType simpleModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();"); dartString.AppendLine("\t\treturn result;"); } else if (genericModelType.GenericArgumentModelType is EnumModeType enumModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{enumModelType.GetFlutterTypeName()}.values.firstWhere((i) => i.index == e)).toList();"); dartString.AppendLine("\t\treturn result;"); } else if (genericModelType.GenericArgumentModelType is UserDefinedModeType userDefinedComplexModeType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModeType.GetFlutterTypeName()}.fromJson(e as Map)).toList();"); dartString.AppendLine("\t\treturn result;"); } else if (genericModelType.GenericArgumentModelType is UserDefinedDerivedModelType userDefinedDerivedModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedDerivedModelType.GetFlutterTypeName()}.fromJson(e as Map)).toList();"); dartString.AppendLine("\t\treturn result;"); } } else if (ReturnParameterModelType is ArrayModelType arrayModelType) { if (arrayModelType.Child is SimpleModelType simpleModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();"); dartString.AppendLine("\t\treturn result;"); } else if (arrayModelType.Child is EnumModeType enumModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{enumModelType.GetFlutterTypeName()}.values.firstWhere((i) => i.index == e)).toList();"); dartString.AppendLine("\t\treturn result;"); } else if (arrayModelType.Child is UserDefinedModeType userDefinedComplexModeType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModeType.GetFlutterTypeName()}.fromJson(e as Map)).toList();"); dartString.AppendLine("\t\treturn result;"); } else if (arrayModelType.Child is UserDefinedDerivedModelType userDefinedDerivedModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedDerivedModelType.GetFlutterTypeName()}.fromJson(e as Map)).toList();"); dartString.AppendLine("\t\treturn result;"); } } else if (ReturnParameterModelType is DictionaryModelType dictionaryModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as Map).cast<{dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName()},{dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName()}>();"); dartString.AppendLine("\t\treturn result;"); } } dartString.AppendLine("\t}"); return dartString.ToString(); } } }