/CodeGeneration/CSharp/SaveClassClass.cs

http://skill.codeplex.com · C# · 284 lines · 231 code · 36 blank · 17 comment · 13 complexity · b4dcf2eb6921ebd229a54ca7a9d6b6f5 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Skill.DataModels.IO;
  6. using Skill.DataModels;
  7. namespace Skill.CodeGeneration.CSharp
  8. {
  9. /// <summary>
  10. /// Generate C# code for SaveClass
  11. /// </summary>
  12. class SaveClassClass : Class
  13. {
  14. private SaveClass _SaveClass;
  15. /// <summary>
  16. /// Create an instance of SaveClassClass
  17. /// </summary>
  18. /// <param name="saveClass">SaveClass model</param>
  19. public SaveClassClass(SaveClass saveClass)
  20. : base(saveClass.Name)
  21. {
  22. this._SaveClass = saveClass;
  23. this.IsPartial = false;
  24. AddInherit("Skill.IO.ISavable");
  25. Method constructor = new Method("", Name, "");
  26. constructor.Modifiers = Modifiers.Public;
  27. Add(constructor);
  28. // create static creator method
  29. CreateCreatorMethod();
  30. // create variables and properties
  31. CreateProperties();
  32. CreateXmlSaveMethod();
  33. CreateBinarySaveMethod();
  34. CreateXmlLoadMethods();
  35. CreateBinaryLoadMethod();
  36. }
  37. #region Create static CreatorMethod
  38. private static string GetStaticCreatorMethodName(string clasName) { return string.Format("Create{0}", clasName); }
  39. private void CreateCreatorMethod()
  40. {
  41. Method m = new Method(this.Name, GetStaticCreatorMethodName(this.Name), string.Format("return new {0}();", this.Name)) { IsStatic = true, Modifiers = Modifiers.Public };
  42. Add(m);
  43. }
  44. #endregion
  45. /// <summary>
  46. /// Covert PrimitiveType to valid c# code
  47. /// </summary>
  48. /// <param name="pt">PrimitiveType to conver</param>
  49. /// <returns>PrimitiveType in c# code</returns>
  50. private string ConvertToString(PrimitiveType pt)
  51. {
  52. switch (pt)
  53. {
  54. case PrimitiveType.Int:
  55. case PrimitiveType.Float:
  56. case PrimitiveType.Bool:
  57. case PrimitiveType.String:
  58. return pt.ToString().ToLower();
  59. default:
  60. return pt.ToString();
  61. }
  62. }
  63. /// <summary>
  64. /// Create variables and properties
  65. /// </summary>
  66. private void CreateProperties()
  67. {
  68. foreach (var p in _SaveClass.Properties)
  69. {
  70. switch (p.Type)
  71. {
  72. case PropertyType.Primitive:
  73. PrimitiveProperty pp = p as PrimitiveProperty;
  74. if (p.IsArray)
  75. {
  76. Add(new Variable(string.Format("{0}[]", ConvertToString(pp.PrimitiveType)), p.Name));
  77. Add(new Property(string.Format("{0}[]", ConvertToString(pp.PrimitiveType)), p.Name, Variable.GetName(p.Name)) { Comment = p.Comment });
  78. }
  79. else
  80. {
  81. Add(new Variable(ConvertToString(pp.PrimitiveType), p.Name));
  82. Add(new Property(ConvertToString(pp.PrimitiveType), p.Name, Variable.GetName(p.Name)) { Comment = p.Comment });
  83. }
  84. break;
  85. case PropertyType.Class:
  86. ClassProperty cp = p as ClassProperty;
  87. if (p.IsArray)
  88. {
  89. Add(new Variable(string.Format("{0}[]", cp.ClassName), p.Name, "null"));
  90. Add(new Property(string.Format("{0}[]", cp.ClassName), p.Name, Variable.GetName(p.Name)) { Comment = p.Comment });
  91. }
  92. else
  93. {
  94. Add(new Variable(cp.ClassName, p.Name, "null"));
  95. Add(new Property(cp.ClassName, p.Name, Variable.GetName(p.Name)) { Comment = p.Comment });
  96. }
  97. break;
  98. default:
  99. break;
  100. }
  101. }
  102. }
  103. private void CreateXmlSaveMethod()
  104. {
  105. StringBuilder toXmlElementBody = new StringBuilder();
  106. string variable;
  107. foreach (var p in this._SaveClass.Properties)
  108. {
  109. variable = string.Format("_{0}Element", p.Name);
  110. if (p.Type == PropertyType.Primitive)
  111. toXmlElementBody.AppendLine(string.Format("System.Xml.XmlElement {0} = stream.Create(\"{1}\",{2});", variable, p.Name, Variable.GetName(p.Name)));
  112. else
  113. toXmlElementBody.AppendLine(string.Format("System.Xml.XmlElement {0} = stream.Create<{1}>(\"{2}\",{3});", variable, ((ClassProperty)p).ClassName, p.Name, Variable.GetName(p.Name)));
  114. toXmlElementBody.AppendLine(string.Format("e.AppendChild({0});", variable));
  115. }
  116. Method toXmlElement = new Method("void", "Save", toXmlElementBody.ToString(), "System.Xml.XmlElement e", "Skill.IO.XmlSaveStream stream");
  117. toXmlElement.Modifiers = Modifiers.Public;
  118. Add(toXmlElement);
  119. }
  120. private void CreateBinarySaveMethod()
  121. {
  122. StringBuilder saveBinaryBody = new StringBuilder();
  123. foreach (var p in this._SaveClass.Properties)
  124. {
  125. if (p.Type == PropertyType.Primitive)
  126. saveBinaryBody.AppendLine(string.Format("stream.Write({0});", Variable.GetName(p.Name)));
  127. else
  128. saveBinaryBody.AppendLine(string.Format("stream.Write<{0}>({1});", ((ClassProperty)p).ClassName, Variable.GetName(p.Name)));
  129. }
  130. Method saveMethod = new Method("void", "Save", saveBinaryBody.ToString(), "Skill.IO.BinarySaveStream stream");
  131. saveMethod.Modifiers = Modifiers.Public;
  132. Add(saveMethod);
  133. }
  134. private string GetLoadMethodName(PrimitiveType primitive, bool isArray)
  135. {
  136. string result = "";
  137. switch (primitive)
  138. {
  139. case PrimitiveType.Int:
  140. result = "ReadInt";
  141. break;
  142. case PrimitiveType.Float:
  143. result = "ReadFloat";
  144. break;
  145. case PrimitiveType.Bool:
  146. result = "ReadBoolean";
  147. break;
  148. case PrimitiveType.String:
  149. result = "ReadString";
  150. break;
  151. case PrimitiveType.Bounds:
  152. result = "ReadBounds";
  153. break;
  154. case PrimitiveType.Color:
  155. result = "ReadColor";
  156. break;
  157. case PrimitiveType.Matrix4x4:
  158. result = "ReadMatrix4x4";
  159. break;
  160. case PrimitiveType.Plane:
  161. result = "ReadPlane";
  162. break;
  163. case PrimitiveType.Quaternion:
  164. result = "ReadQuaternion";
  165. break;
  166. case PrimitiveType.Ray:
  167. result = "ReadRay";
  168. break;
  169. case PrimitiveType.Rect:
  170. result = "ReadRect";
  171. break;
  172. case PrimitiveType.Vector2:
  173. result = "ReadVector2";
  174. break;
  175. case PrimitiveType.Vector3:
  176. result = "ReadVector3";
  177. break;
  178. case PrimitiveType.Vector4:
  179. result = "ReadVector4";
  180. break;
  181. }
  182. if (isArray)
  183. result += "Array";
  184. return result;
  185. }
  186. private string GetSavableMethodName(string className, bool isArray)
  187. {
  188. string result = "ReadSavable";
  189. if (isArray)
  190. result += "Array";
  191. return string.Format("{0}<{1}>", result, className);
  192. }
  193. private void CreateXmlLoadMethods()
  194. {
  195. StringBuilder loadXmlBody = new StringBuilder();
  196. loadXmlBody.AppendLine("System.Xml.XmlElement element = e.FirstChild as System.Xml.XmlElement;");
  197. loadXmlBody.AppendLine("while (element != null)");
  198. loadXmlBody.AppendLine("{");
  199. loadXmlBody.AppendLine("switch (element.Name)");
  200. loadXmlBody.AppendLine("{");
  201. foreach (var p in _SaveClass.Properties)
  202. {
  203. loadXmlBody.AppendLine(string.Format("case \"{0}\":", p.Name));
  204. switch (p.Type)
  205. {
  206. case PropertyType.Primitive:
  207. PrimitiveProperty pp = (PrimitiveProperty)p;
  208. loadXmlBody.AppendLine(string.Format("this.{0} = stream.{1}( element );", Variable.GetName(p.Name), GetLoadMethodName(pp.PrimitiveType, pp.IsArray)));
  209. break;
  210. case PropertyType.Class:
  211. ClassProperty cp = (ClassProperty)p;
  212. loadXmlBody.AppendLine(string.Format("this.{0} = stream.{1}( element , {2}.{3} );", Variable.GetName(p.Name),
  213. GetSavableMethodName(cp.ClassName, cp.IsArray), cp.ClassName, GetStaticCreatorMethodName(cp.ClassName)));
  214. break;
  215. }
  216. loadXmlBody.AppendLine("break;");
  217. }
  218. loadXmlBody.AppendLine("}");
  219. loadXmlBody.AppendLine("element = element.NextSibling as System.Xml.XmlElement;");
  220. loadXmlBody.AppendLine("}");
  221. Method loadMethod = new Method("void", "Load", loadXmlBody.ToString(), "System.Xml.XmlElement e", "Skill.IO.XmlLoadStream stream");
  222. loadMethod.Modifiers = Modifiers.Public;
  223. Add(loadMethod);
  224. }
  225. private void CreateBinaryLoadMethod()
  226. {
  227. StringBuilder loadMethodBody = new StringBuilder();
  228. foreach (var p in _SaveClass.Properties)
  229. {
  230. switch (p.Type)
  231. {
  232. case PropertyType.Primitive:
  233. PrimitiveProperty pp = (PrimitiveProperty)p;
  234. loadMethodBody.AppendLine(string.Format("this.{0} = stream.{1}();", Variable.GetName(p.Name), GetLoadMethodName(pp.PrimitiveType, pp.IsArray)));
  235. break;
  236. case PropertyType.Class:
  237. ClassProperty cp = (ClassProperty)p;
  238. loadMethodBody.AppendLine(string.Format("this.{0} = stream.{1}( {2}.{3} );", Variable.GetName(p.Name),
  239. GetSavableMethodName(cp.ClassName, cp.IsArray), cp.ClassName, GetStaticCreatorMethodName(cp.ClassName)));
  240. break;
  241. }
  242. }
  243. Method loadBinaryMethod = new Method("void", "Load", loadMethodBody.ToString(), "BinaryLoadStream stream");
  244. loadBinaryMethod.Modifiers = Modifiers.Public;
  245. Add(loadBinaryMethod);
  246. }
  247. }
  248. }