ComplexModelType.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. using FlutterCodeGenerator.Helper;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace FlutterCodeGenerator.ModelTypes
  6. {
  7. internal class ComplexModelType : ModelType
  8. {
  9. public List<ModelType> Children { get; set; }
  10. public ComplexModelType(Type type, string name) : base(type, name)
  11. {
  12. Children = new List<ModelType>();
  13. }
  14. protected virtual string ToJson(List<ModelType> Children)
  15. {
  16. var source = new StringBuilder();
  17. source.AppendLine("\tMap<String, dynamic> toJson() {");
  18. source.AppendLine("\t\tfinal map = Map<String, dynamic>();");
  19. foreach (var child in Children)
  20. {
  21. if (child is EnumModelType)
  22. {
  23. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
  24. }
  25. else if (child is EnumNullableModelType)
  26. {
  27. source.AppendLine($"\t\tif ({child.Name_Lower} != null)");
  28. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}?.index;");
  29. }
  30. else if (child.DefaultValue != null)
  31. {
  32. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  33. }
  34. else if (child is DateTimeModelType)
  35. {
  36. source.AppendLine($"\t\tif ({child.Name_Lower} != null)");
  37. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);");
  38. }
  39. else if (child is ListModelType listModelType)
  40. {
  41. if (listModelType.GenericArgumentModelType is EnumModelType)
  42. {
  43. source.AppendLine($"\t\tif ({child.Name_Lower} != null) {{");
  44. source.AppendLine($"\t\t\tList<int> {child.Name_Lower}List = [];");
  45. source.AppendLine($"\t\t\t{child.Name_Lower}!.forEach((e) => {child.Name_Lower}List.add(e.index));");
  46. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}List;");
  47. source.AppendLine($"\t\t}}");
  48. }
  49. else
  50. {
  51. source.AppendLine($"\t\tif ({child.Name_Lower} != null)");
  52. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  53. }
  54. }
  55. else
  56. {
  57. source.AppendLine($"\t\tif ({child.Name_Lower} != null)");
  58. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  59. }
  60. }
  61. source.AppendLine("\t\treturn map;");
  62. source.AppendLine("\t}");
  63. return source.ToString();
  64. }
  65. protected virtual string FromJson(List<ModelType> Children)
  66. {
  67. var source = new StringBuilder();
  68. string flutterTypeName = null;
  69. if (this is UserDefinedGenericModelType)
  70. {
  71. flutterTypeName = GetFlutterTypeName(false, false, true);
  72. }
  73. else
  74. {
  75. flutterTypeName = GetFlutterTypeName();
  76. }
  77. source.AppendLine($"\tfactory {flutterTypeName}.fromJson(Map<String, dynamic> map) {{");
  78. foreach (var child in Children)
  79. {
  80. if (child is ArrayModelType)
  81. {
  82. source.AppendLine($"\t\tfinal {child.Name_Lower}Data = map['{child.Name_Upper}'];");
  83. }
  84. else if (child is ListModelType listModelType)
  85. {
  86. if (this is UserDefinedGenericModelType type)
  87. {
  88. if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  89. {
  90. source.AppendLine($"\t\tList<T> {listModelType.Name_Lower}List = [];");
  91. source.AppendLine($"\t\tif (map['{listModelType.Name_Upper}'] != null) {{");
  92. source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll(");
  93. source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
  94. source.AppendLine($"\t\t}}");
  95. }
  96. }
  97. else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType)
  98. {
  99. if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  100. {
  101. source.AppendLine($"\t\tList<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}> {listModelType.Name_Lower}List = [];");
  102. source.AppendLine($"\t\tif (map['{listModelType.Name_Upper}'] != null) {{");
  103. source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll(");
  104. source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}>(e)!));");
  105. source.AppendLine($"\t\t}}");
  106. }
  107. }
  108. }
  109. else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType)
  110. {
  111. if (this is UserDefinedGenericModelType type)
  112. {
  113. if (type.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
  114. {
  115. source.AppendLine($"\t\tList<T> {userDefinedGenericComplexModelType.Name_Lower}List = [];");
  116. source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Upper}'] != null) {{");
  117. source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll(");
  118. source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
  119. source.AppendLine($"\t\t}}");
  120. }
  121. else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType)
  122. {
  123. if (baseType.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
  124. {
  125. source.AppendLine($"\t\tList<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}> {userDefinedGenericComplexModelType.Name_Lower}List = [];");
  126. source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Upper}'] != null) {{");
  127. source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll(");
  128. source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}>(e)!));");
  129. source.AppendLine($"\t\t}}");
  130. }
  131. }
  132. }
  133. }
  134. else if (child is DictionaryModelType dictionaryModelType)
  135. {
  136. var argumentName1 = dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName();
  137. var argumentName2 = dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName();
  138. if (dictionaryModelType.GenericArgumentModelTypeList[0] is SimpleModelType && dictionaryModelType.GenericArgumentModelTypeList[1] is SimpleModelType)
  139. {
  140. }
  141. else
  142. {
  143. source.AppendLine($"\t\tfinal {child.Name_Lower}Map= <{argumentName1},{argumentName2}>{{}};");
  144. source.AppendLine($"\t\tfinal Map<{argumentName1}, dynamic> json{child.Name_Lower}Map = jsonDecode(map['{child.Name_Upper}']);");
  145. source.AppendLine($"\t\tfor (var key in json{child.Name_Lower}Map.keys) {{");
  146. source.AppendLine($"\t\t\t{child.Name_Lower}Map[key] = {argumentName2}.fromJson(json{child.Name_Lower}Map[key]);");
  147. source.AppendLine($"\t\t}}");
  148. }
  149. }
  150. }
  151. source.AppendLine($"\t\treturn {flutterTypeName}( ");
  152. foreach (var child in Children)
  153. {
  154. if (child is EnumModelType)
  155. {
  156. source.AppendLine($"\t\t\t{child.Name_Lower}: {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']),");
  157. }
  158. else if (child is EnumNullableModelType)
  159. {
  160. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']) : null,");
  161. }
  162. else if (child is ArrayModelType)
  163. {
  164. var arrayTypeName = child.ParameterType.FullName.Replace("[]", string.Empty);
  165. var arrayType = child.ParameterType.Assembly.GetType(arrayTypeName);
  166. var modelType = ModelTypeGenerator.Create(arrayType, "");
  167. if (modelType is ByteModelType)
  168. {
  169. source.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => e as int).toList(): null,");
  170. }
  171. else if (modelType is SimpleModelType && (modelType is ExtraObjectModelType))
  172. {
  173. source.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => e as {child.ParameterType.Name.Replace("[]", string.Empty)}).toList(): null,");
  174. }
  175. else if (modelType is SimpleModelType)
  176. {
  177. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Lower}']?.cast<{child.ParameterType.Name.Replace("[]", string.Empty)}>().toList(),");
  178. }
  179. else
  180. {
  181. source.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => {child.ParameterType.Name.Replace("[]", string.Empty)}.fromJson(e)).toList(): null,");
  182. }
  183. }
  184. else if (child is DateTimeModelType)
  185. {
  186. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? DateTime.parse(map['{child.Name_Upper}']) : null,");
  187. }
  188. else if (child is ListModelType listModelType)
  189. {
  190. if (this is UserDefinedGenericModelType type)
  191. {
  192. if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  193. {
  194. source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
  195. }
  196. else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  197. {
  198. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  199. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  200. }
  201. else if (listModelType.GenericArgumentModelType is EnumModelType)
  202. {
  203. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  204. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
  205. }
  206. else
  207. {
  208. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  209. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList() : null,");
  210. }
  211. }
  212. else if (this is UserDefinedDerivedModelType definedDerivedModelType && definedDerivedModelType.BaseType is UserDefinedGenericModelType baseType)
  213. {
  214. if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  215. {
  216. source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
  217. }
  218. else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  219. {
  220. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  221. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  222. }
  223. else if (listModelType.GenericArgumentModelType is EnumModelType)
  224. {
  225. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  226. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
  227. }
  228. else
  229. {
  230. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  231. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList() : null,");
  232. }
  233. }
  234. else if (this is UserDefinedModelType || this is UserDefinedDerivedModelType)
  235. {
  236. if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  237. {
  238. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  239. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  240. }
  241. else if (listModelType.GenericArgumentModelType is EnumModelType)
  242. {
  243. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  244. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
  245. }
  246. else
  247. {
  248. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  249. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList() : null,");
  250. }
  251. }
  252. }
  253. else if (child is DictionaryModelType dictionaryModelType)
  254. {
  255. var argumentName1 = dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName();
  256. var argumentName2 = dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName();
  257. if(dictionaryModelType.GenericArgumentModelTypeList[0] is SimpleModelType && dictionaryModelType.GenericArgumentModelTypeList[1] is SimpleModelType)
  258. {
  259. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{argumentName1},{argumentName2}>(),");
  260. }
  261. else
  262. {
  263. source.AppendLine($"\t\t\t {child.Name_Lower} : {child.Name_Lower}Map");
  264. }
  265. }
  266. else if (child is UserDefinedGenericModelType userDefinedGenericModelType)
  267. {
  268. if (this is UserDefinedGenericModelType type)
  269. {
  270. if (type.GenericArgumentModelType.ParameterType == userDefinedGenericModelType.GenericArgumentModelType.ParameterType)
  271. {
  272. source.AppendLine($"\t\t\t{child.Name_Lower}: {userDefinedGenericModelType.Name_Lower}List,");
  273. }
  274. else if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType))
  275. {
  276. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  277. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  278. }
  279. else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
  280. {
  281. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  282. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
  283. }
  284. else
  285. {
  286. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  287. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList() : null,");
  288. }
  289. }
  290. else if (this is UserDefinedModelType)
  291. {
  292. if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType))
  293. {
  294. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  295. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  296. }
  297. else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
  298. {
  299. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  300. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
  301. }
  302. else
  303. {
  304. var model = userDefinedGenericModelType.GetFlutterTypeName();
  305. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {model}.fromJson(map['{child.Name_Upper}'] as Map<String,dynamic>) : null,");
  306. }
  307. }
  308. }
  309. else if (child is UserDefinedModelType || child is UserDefinedDerivedModelType || child is ExtraObjectModelType)
  310. {
  311. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {child.GetFlutterTypeName()}.fromJson(map['{child.Name_Upper}']) : null,");
  312. }
  313. else if (child is DoubleModelType)
  314. {
  315. source.AppendLine($"\t\t\t{child.Name_Lower}: double.parse(map['{child.Name_Upper}'].toString()),");
  316. }
  317. else
  318. {
  319. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'],");
  320. }
  321. }
  322. source.AppendLine("\t\t);");
  323. source.AppendLine("\t}");
  324. source.AppendLine();
  325. return source.ToString();
  326. }
  327. }
  328. }