main.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. // code_generator_command.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. //
  3. #include <iostream>
  4. #include <chrono>
  5. #include "class_view.hpp"
  6. static std::string getCode(std::vector<class_view_info> classViews)
  7. {
  8. std::string code;
  9. // 获取当前时间点
  10. auto now = std::chrono::system_clock::now();
  11. std::time_t now_c = std::chrono::system_clock::to_time_t(now);
  12. std::stringstream ss;
  13. ss << std::put_time(std::localtime(&now_c), "%F %T");
  14. //头文件
  15. code += "//生成时间 " + ss.str() + "\n";
  16. code += "#pragma once\n";
  17. code += "#include <rttr/registration>\n";
  18. for (auto& it : classViews) {
  19. code += "#include \"" + it.include + "\"\n";
  20. }
  21. //生成实体类
  22. code += "\n";
  23. code += "static void __models_register__()\n";
  24. code += "{\n";
  25. for (auto& it : classViews) {
  26. //生成实体类
  27. if (it.class_type == 1) {
  28. std::cout << "生成实体类反射代码,类名:" << it.class_name << std::endl;
  29. std::cout << " Sql表名:" << it.sql_table_name << std::endl;
  30. if (!it.is_reflect) {
  31. std::cout << " 不生成:" << it.sql_table_name << std::endl;
  32. continue;
  33. }
  34. //非模板
  35. if (!it.is_template) {
  36. std::string modelCode = "\trttr::registration::class_<struct {0}>(\"{1}\").constructor<>()(rttr::detail::as_object{{}}).\n";
  37. modelCode = v3::utils::format(modelCode, it.class_name, it.sql_table_name);
  38. std::vector<std::string> propertyList;
  39. for (auto& property : it.propertys) {
  40. std::cout << " 属性:" << property.prop_name << std::endl;
  41. std::cout << " Sql:" << property.sql_name << std::endl;
  42. std::cout << " Json:" << property.json_name << std::endl;
  43. std::cout << " Excel:" << property.excel_name << std::endl;
  44. std::string propertyCode = "\t\tproperty(\"{0}\",&{1}::{2})(rttr::metadata(\"Json\",\"{3}\"),rttr::metadata(\"Sql\",\"{4}\"),rttr::metadata(\"Excel\",R\"({5})\"),rttr::metadata(\"NoJson\",{6}),rttr::metadata(\"NoSql\",{7}),rttr::metadata(\"NoExcel\",{8}),rttr::metadata(\"SqlKey\",{9}),rttr::metadata(\"Offset\",robotics::v3::utils::pointer_cast<int>(&{1}::{2})))";
  45. propertyCode = v3::utils::format(propertyCode, property.prop_name, it.class_name, property.prop_name, property.json_name, property.sql_name, (property.excel_name), (property.no_json ? "true" : "false"), (property.no_sql ? "true" : "false"), (property.no_excel ? "true" : "false"), (property.sql_key ? "true" : "false"));
  46. propertyList.push_back(propertyCode);
  47. }
  48. code += modelCode + v3::utils::join(propertyList, ".\n") + ";\n\n";
  49. }
  50. else {
  51. std::string modelTemplate;
  52. for (auto& templateProerty : it.template_parameters) {
  53. std::string modelCode = "\trttr::registration::class_<struct {0}<{1}>>(\"{2}<{3}>\").constructor<>()(rttr::detail::as_object{{}}).\n";
  54. modelCode = v3::utils::format(modelCode, it.class_name, templateProerty, it.sql_table_name, templateProerty);
  55. std::vector<std::string> propertyList;
  56. for (auto& property : it.propertys) {
  57. std::string propertyCode = "\t\tproperty(\"{0}\",&{1}<{2}>::{3})(rttr::metadata(\"Json\",\"{4}\"),rttr::metadata(\"Sql\",\"{5}\"),rttr::metadata(\"Excel\",R\"({6})\"),rttr::metadata(\"NoJson\",{7}),rttr::metadata(\"NoSql\",{8}),rttr::metadata(\"NoExcel\",{9}),rttr::metadata(\"SqlKey\",{10}),rttr::metadata(\"Offset\",robotics::v3::utils::pointer_cast<int>(&{1}<{2}>::{3})))";
  58. propertyCode = v3::utils::format(propertyCode, property.prop_name, it.class_name, templateProerty, property.prop_name, property.json_name, property.sql_name, (property.excel_name), (property.no_json ? "true" : "false"), (property.no_sql ? "true" : "false"), (property.no_excel ? "true" : "false"), (property.sql_key ? "true" : "false"));
  59. propertyList.push_back(propertyCode);
  60. }
  61. modelTemplate += modelCode + v3::utils::join(propertyList, ".\n") + ";\n\n";
  62. }
  63. code += modelTemplate;
  64. }
  65. }
  66. }
  67. code += "}\n";
  68. //生成控制器
  69. code += "\n";
  70. code += "static void __controllers_register__()\n";
  71. code += "{\n";
  72. for (auto& it : classViews) {
  73. //生成控制器
  74. if (it.class_type == 0) {
  75. std::cout << "生成控制器反射代码,类名:" << it.class_name << std::endl;
  76. std::string controllerCode = "\trttr::registration::class_<class {0}>(\"{1}\").constructor<>()().\n";
  77. controllerCode = v3::utils::format(controllerCode, it.class_name, it.class_name);
  78. std::vector<std::string> methodList;
  79. for (auto& method : it.methods) {
  80. //无参数
  81. if (method.parameters.empty()) {
  82. std::string methodCode = "\t\tmethod(\"{0}\",&{1}::{2})";
  83. methodCode = v3::utils::format(methodCode, method.name, it.class_name, method.name);
  84. methodList.push_back(methodCode);
  85. }
  86. //有参数
  87. else {
  88. std::string methodCode = "\t\tmethod(\"{0}\",&{1}::{2})(rttr::default_arguments({3}),rttr::parameter_names({4}))";
  89. std::vector<std::string> parameterTypes;
  90. std::vector<std::string> parameters;
  91. for (auto& parameter : method.parameters) {
  92. parameters.push_back("\"" + parameter.name + "\"");
  93. parameterTypes.push_back(parameter.type + "{}");
  94. }
  95. methodCode = v3::utils::format(methodCode, method.name, it.class_name, method.name, v3::utils::join(parameterTypes, ","), v3::utils::join(parameters, ","));
  96. methodList.push_back(methodCode);
  97. }
  98. }
  99. code += controllerCode + v3::utils::join(methodList, ".\n") + ";\n\n";
  100. }
  101. }
  102. code += "}\n";
  103. //生成soap
  104. code += "\n";
  105. code += "static void __soap_register__()\n";
  106. code += "{\n";
  107. for (auto& it : classViews) {
  108. //生成soap
  109. if (it.class_type == 2) {
  110. std::cout << "生成SOPA反射代码,类名:" << it.class_name << std::endl;
  111. std::string controllerCode = "\trttr::registration::class_<class {0}>(\"{1}\").constructor<>()().\n";
  112. controllerCode = v3::utils::format(controllerCode, it.class_name, it.class_name);
  113. std::vector<std::string> methodList;
  114. for (auto& method : it.soap_methods) {
  115. //无参数
  116. if (method.parameters.empty()) {
  117. std::string methodCode = "\t\tmethod(\"{0}\",&{1}::{2})";
  118. methodCode = v3::utils::format(methodCode, method.name, it.class_name, method.name);
  119. methodList.push_back(methodCode);
  120. }
  121. //有参数
  122. else {
  123. std::string methodCode = "\t\tmethod(\"{0}\",&{1}::{2})(rttr::parameter_names({3}))";
  124. std::vector<std::string> parameters;
  125. for (auto& parameter : method.parameters) {
  126. parameters.push_back("\"" + parameter.parameter_name + "\"");
  127. }
  128. methodCode = v3::utils::format(methodCode, method.name, it.class_name, method.name, v3::utils::join(parameters, ","));
  129. methodList.push_back(methodCode);
  130. }
  131. }
  132. code += controllerCode + v3::utils::join(methodList, ".\n") + ";\n\n";
  133. }
  134. }
  135. code += "}\n";
  136. //注册控制器
  137. code += "\n";
  138. code += "static void __controllers_ioc_register__()\n";
  139. code += "{\n";
  140. for (auto& it : classViews) {
  141. if (it.class_type != 0)
  142. continue;
  143. std::cout << "生成控制器Ioc代码,类名:" << it.class_name << std::endl;
  144. code += " {\n";
  145. code += " std::shared_ptr<robotics::v3::mvc::controller> controller(new robotics::v3::mvc::controller);\n";
  146. for (auto& action : it.methods) {
  147. code += " {\n";
  148. code += " std::shared_ptr<robotics::v3::mvc::controller_action> action(new robotics::v3::mvc::controller_action);\n";
  149. for (auto& argument : action.parameters) {
  150. code += " {\n";
  151. code += " std::shared_ptr<robotics::v3::mvc::action_argument> argument(new robotics::v3::mvc::action_argument);\n";
  152. code += " argument->argument_type_ = " + argument.argument_type + ";\n";
  153. code += " argument->from_storage_type_ = " + argument.from_storage_type + ";\n";
  154. code += " argument->parameter_name_ = \"" + argument.parameter_name + "\";\n";
  155. code += " action->arguments.push_back(argument);\n";
  156. code += " }\n";
  157. }
  158. code += " action->action_name = \"" + action.name + "\";\n";
  159. code += " action->authen = " + (action.authen ? std::string("true") : std::string("false")) + ";\n";
  160. code += " action->authen_jump = \"" + action.authen_jump + "\";\n";
  161. code += " action->content_type = \"" + action.content_type + "\";\n";
  162. code += " action->action_type = \"" + action.action_type + "\";\n";
  163. code += " action->file_mapping = \"" + action.file_mapping + "\";\n";
  164. code += " action->method = " + action.method + ";\n";
  165. code += " action->parent = controller;\n";
  166. if (action.route.empty()) {
  167. code += " controller->actions[\"" + it.class_name + "/" + action.name + "\"] = action;\n";
  168. }
  169. else {
  170. code += " controller->actions[\"" + action.route + "\"] = action;\n";
  171. }
  172. code += " }\n";
  173. }
  174. code += " controller->controller_name = \"" + it.class_name + "\";\n";
  175. code += " robotics::v3::mvc::ico_controller::attach(controller);\n";
  176. code += " }\n";
  177. }
  178. code += "}\n";
  179. //注册soap
  180. code += "\n";
  181. code += "static void __soap_ioc_register__()\n";
  182. code += "{\n";
  183. for (auto& it : classViews) {
  184. if (it.class_type != 2)
  185. continue;
  186. std::cout << "生成SOPAIoc代码,类名:" << it.class_name << std::endl;
  187. code += " {\n";
  188. code += " std::shared_ptr<robotics::v3::soap::soap_controller> controller(new robotics::v3::soap::soap_sontroller);\n";
  189. for (auto& action : it.soap_methods) {
  190. code += " {\n";
  191. code += " std::shared_ptr<robotics::v3::soap::soap_controller_action> action(new robotics::v3::soap::soap_sontroller);\n";
  192. for (auto& argument : action.parameters) {
  193. code += " {\n";
  194. code += " std::shared_ptr<robotics::v3::soap::soap_action_argument> argument(new robotics::v3::soap::soap_action_argument);\n";
  195. code += " argument->argument_type_ = " + argument.argument_type + ";\n";
  196. code += " argument->parameter_name_ = \"" + argument.parameter_name + "\";\n";
  197. code += " action->arguments.push_back(argument);\n";
  198. code += " }\n";
  199. }
  200. code += " action->action_name = \"" + action.name + "\";\n";
  201. code += " controller->actions[\"" + action.action_name + "\"] = action;\n";
  202. code += " }\n";
  203. }
  204. code += " controller->controller_name = \"" + it.class_name + "\";\n";
  205. code += " controller->wsdl = \"" + it.soap_wsdl + "\";\n";
  206. code += " controller->route = \"" + it.soap_route + "\";\n";
  207. code += " controller->namespace_name = \"" + it.soap_namepsace + "\";\n";
  208. code += " controller->version = " + (it.soap_version == "1.1" ? std::string("robotics::v3::soap::soap_version::VER1_1") : std::string("robotics::v3::soap::soap_version::VER1_2")) + ";\n";
  209. code += " robotics::v3::soap::soap_ioc_controller::attach(controller);\n";
  210. code += " }\n";
  211. }
  212. code += "}\n";
  213. code += "\n";
  214. code += "RTTR_REGISTRATION\n";
  215. code += "{\n";
  216. code += " __models_register__();\n";
  217. code += " __controllers_register__();\n";
  218. code += " __soap_register__();\n";
  219. code += " __controllers_ioc_register__();\n";
  220. code += " __soap_ioc_register__();\n";
  221. code += "}\n";
  222. return code.c_str();
  223. }
  224. int main(int argc, char* argv[])
  225. {
  226. if (argc <= 0) {
  227. std::cout << "参数错误!" << std::endl;
  228. return -1;
  229. }
  230. for (int i = 0; i < argc; ++i) {
  231. std::cout << "参数:"<< argv[i] << std::endl;
  232. }
  233. std::string project_path = argv[argc - 1];
  234. std::string reflect_path;
  235. if (project_path[project_path.size() - 1] == '/' || project_path[project_path.size() - 1] == '\\') {
  236. reflect_path = project_path + "reflect.h";
  237. }
  238. else {
  239. reflect_path = project_path + "/reflect.h";
  240. }
  241. std::cout << "项目反射文件:" << reflect_path << std::endl;
  242. std::vector<class_view_info> classViews = code_analysis_core::getClassView(project_path);
  243. std::string code = getCode(classViews);
  244. std::cout << "项目反射代码生成完成" << std::endl;
  245. std::ofstream file(reflect_path, std::ios::out);
  246. if (!file.is_open()) {
  247. std::cerr << "无法打开文件" << std::endl;
  248. return -1;
  249. }
  250. file << code;
  251. file.close();
  252. return 0;
  253. }
  254. // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
  255. // 调试程序: F5 或调试 >“开始调试”菜单
  256. // 入门使用技巧:
  257. // 1. 使用解决方案资源管理器窗口添加/管理文件
  258. // 2. 使用团队资源管理器窗口连接到源代码管理
  259. // 3. 使用输出窗口查看生成输出和其他消息
  260. // 4. 使用错误列表窗口查看错误
  261. // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
  262. // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件