123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- // code_generator_command.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
- //
- #include <iostream>
- #include <chrono>
- #include "class_view.hpp"
- static std::string getCode(std::vector<class_view_info> classViews)
- {
- std::string code;
- // 获取当前时间点
- auto now = std::chrono::system_clock::now();
- std::time_t now_c = std::chrono::system_clock::to_time_t(now);
- std::stringstream ss;
- ss << std::put_time(std::localtime(&now_c), "%F %T");
- //头文件
- code += "//生成时间 " + ss.str() + "\n";
- code += "#pragma once\n";
- code += "#include <rttr/registration>\n";
- for (auto& it : classViews) {
- code += "#include \"" + it.include + "\"\n";
- }
- //生成实体类
- code += "\n";
- code += "static void __models_register__()\n";
- code += "{\n";
- for (auto& it : classViews) {
- //生成实体类
- if (it.class_type == 1) {
- std::cout << "生成实体类反射代码,类名:" << it.class_name << std::endl;
- std::cout << " Sql表名:" << it.sql_table_name << std::endl;
- if (!it.is_reflect) {
- std::cout << " 不生成:" << it.sql_table_name << std::endl;
- continue;
- }
- //非模板
- if (!it.is_template) {
- std::string modelCode = "\trttr::registration::class_<struct {0}>(\"{1}\").constructor<>()(rttr::detail::as_object{{}}).\n";
- modelCode = v3::utils::format(modelCode, it.class_name, it.sql_table_name);
- std::vector<std::string> propertyList;
- for (auto& property : it.propertys) {
- std::cout << " 属性:" << property.prop_name << std::endl;
- std::cout << " Sql:" << property.sql_name << std::endl;
- std::cout << " Json:" << property.json_name << std::endl;
- std::cout << " Excel:" << property.excel_name << std::endl;
- 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})))";
- 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"));
- propertyList.push_back(propertyCode);
- }
- code += modelCode + v3::utils::join(propertyList, ".\n") + ";\n\n";
- }
- else {
- std::string modelTemplate;
- for (auto& templateProerty : it.template_parameters) {
- std::string modelCode = "\trttr::registration::class_<struct {0}<{1}>>(\"{2}<{3}>\").constructor<>()(rttr::detail::as_object{{}}).\n";
- modelCode = v3::utils::format(modelCode, it.class_name, templateProerty, it.sql_table_name, templateProerty);
- std::vector<std::string> propertyList;
- for (auto& property : it.propertys) {
- 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})))";
- 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"));
- propertyList.push_back(propertyCode);
- }
- modelTemplate += modelCode + v3::utils::join(propertyList, ".\n") + ";\n\n";
- }
- code += modelTemplate;
- }
- }
- }
- code += "}\n";
- //生成控制器
- code += "\n";
- code += "static void __controllers_register__()\n";
- code += "{\n";
- for (auto& it : classViews) {
- //生成控制器
- if (it.class_type == 0) {
- std::cout << "生成控制器反射代码,类名:" << it.class_name << std::endl;
- std::string controllerCode = "\trttr::registration::class_<class {0}>(\"{1}\").constructor<>()().\n";
- controllerCode = v3::utils::format(controllerCode, it.class_name, it.class_name);
- std::vector<std::string> methodList;
- for (auto& method : it.methods) {
- //无参数
- if (method.parameters.empty()) {
- std::string methodCode = "\t\tmethod(\"{0}\",&{1}::{2})";
- methodCode = v3::utils::format(methodCode, method.name, it.class_name, method.name);
- methodList.push_back(methodCode);
- }
- //有参数
- else {
- std::string methodCode = "\t\tmethod(\"{0}\",&{1}::{2})(rttr::default_arguments({3}),rttr::parameter_names({4}))";
- std::vector<std::string> parameterTypes;
- std::vector<std::string> parameters;
- for (auto& parameter : method.parameters) {
- parameters.push_back("\"" + parameter.name + "\"");
- parameterTypes.push_back(parameter.type + "{}");
- }
- methodCode = v3::utils::format(methodCode, method.name, it.class_name, method.name, v3::utils::join(parameterTypes, ","), v3::utils::join(parameters, ","));
- methodList.push_back(methodCode);
- }
- }
- code += controllerCode + v3::utils::join(methodList, ".\n") + ";\n\n";
- }
- }
- code += "}\n";
- //生成soap
- code += "\n";
- code += "static void __soap_register__()\n";
- code += "{\n";
- for (auto& it : classViews) {
- //生成soap
- if (it.class_type == 2) {
- std::cout << "生成SOPA反射代码,类名:" << it.class_name << std::endl;
- std::string controllerCode = "\trttr::registration::class_<class {0}>(\"{1}\").constructor<>()().\n";
- controllerCode = v3::utils::format(controllerCode, it.class_name, it.class_name);
- std::vector<std::string> methodList;
- for (auto& method : it.soap_methods) {
- //无参数
- if (method.parameters.empty()) {
- std::string methodCode = "\t\tmethod(\"{0}\",&{1}::{2})";
- methodCode = v3::utils::format(methodCode, method.name, it.class_name, method.name);
- methodList.push_back(methodCode);
- }
- //有参数
- else {
- std::string methodCode = "\t\tmethod(\"{0}\",&{1}::{2})(rttr::parameter_names({3}))";
- std::vector<std::string> parameters;
- for (auto& parameter : method.parameters) {
- parameters.push_back("\"" + parameter.parameter_name + "\"");
- }
- methodCode = v3::utils::format(methodCode, method.name, it.class_name, method.name, v3::utils::join(parameters, ","));
- methodList.push_back(methodCode);
- }
- }
- code += controllerCode + v3::utils::join(methodList, ".\n") + ";\n\n";
- }
- }
- code += "}\n";
- //注册控制器
- code += "\n";
- code += "static void __controllers_ioc_register__()\n";
- code += "{\n";
- for (auto& it : classViews) {
- if (it.class_type != 0)
- continue;
- std::cout << "生成控制器Ioc代码,类名:" << it.class_name << std::endl;
- code += " {\n";
- code += " std::shared_ptr<robotics::v3::mvc::controller> controller(new robotics::v3::mvc::controller);\n";
- for (auto& action : it.methods) {
- code += " {\n";
- code += " std::shared_ptr<robotics::v3::mvc::controller_action> action(new robotics::v3::mvc::controller_action);\n";
- for (auto& argument : action.parameters) {
- code += " {\n";
- code += " std::shared_ptr<robotics::v3::mvc::action_argument> argument(new robotics::v3::mvc::action_argument);\n";
- code += " argument->argument_type_ = " + argument.argument_type + ";\n";
- code += " argument->from_storage_type_ = " + argument.from_storage_type + ";\n";
- code += " argument->parameter_name_ = \"" + argument.parameter_name + "\";\n";
- code += " action->arguments.push_back(argument);\n";
- code += " }\n";
- }
- code += " action->action_name = \"" + action.name + "\";\n";
- code += " action->authen = " + (action.authen ? std::string("true") : std::string("false")) + ";\n";
- code += " action->authen_jump = \"" + action.authen_jump + "\";\n";
- code += " action->content_type = \"" + action.content_type + "\";\n";
- code += " action->action_type = \"" + action.action_type + "\";\n";
- code += " action->file_mapping = \"" + action.file_mapping + "\";\n";
- code += " action->method = " + action.method + ";\n";
- code += " action->parent = controller;\n";
- if (action.route.empty()) {
- code += " controller->actions[\"" + it.class_name + "/" + action.name + "\"] = action;\n";
- }
- else {
- code += " controller->actions[\"" + action.route + "\"] = action;\n";
- }
- code += " }\n";
- }
- code += " controller->controller_name = \"" + it.class_name + "\";\n";
- code += " robotics::v3::mvc::ico_controller::attach(controller);\n";
- code += " }\n";
- }
- code += "}\n";
- //注册soap
- code += "\n";
- code += "static void __soap_ioc_register__()\n";
- code += "{\n";
- for (auto& it : classViews) {
- if (it.class_type != 2)
- continue;
- std::cout << "生成SOPAIoc代码,类名:" << it.class_name << std::endl;
- code += " {\n";
- code += " std::shared_ptr<robotics::v3::soap::soap_controller> controller(new robotics::v3::soap::soap_sontroller);\n";
- for (auto& action : it.soap_methods) {
- code += " {\n";
- code += " std::shared_ptr<robotics::v3::soap::soap_controller_action> action(new robotics::v3::soap::soap_sontroller);\n";
- for (auto& argument : action.parameters) {
- code += " {\n";
- code += " std::shared_ptr<robotics::v3::soap::soap_action_argument> argument(new robotics::v3::soap::soap_action_argument);\n";
- code += " argument->argument_type_ = " + argument.argument_type + ";\n";
- code += " argument->parameter_name_ = \"" + argument.parameter_name + "\";\n";
- code += " action->arguments.push_back(argument);\n";
- code += " }\n";
- }
- code += " action->action_name = \"" + action.name + "\";\n";
- code += " controller->actions[\"" + action.action_name + "\"] = action;\n";
- code += " }\n";
- }
- code += " controller->controller_name = \"" + it.class_name + "\";\n";
- code += " controller->wsdl = \"" + it.soap_wsdl + "\";\n";
- code += " controller->route = \"" + it.soap_route + "\";\n";
- code += " controller->namespace_name = \"" + it.soap_namepsace + "\";\n";
- 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";
- code += " robotics::v3::soap::soap_ioc_controller::attach(controller);\n";
- code += " }\n";
- }
- code += "}\n";
- code += "\n";
- code += "RTTR_REGISTRATION\n";
- code += "{\n";
- code += " __models_register__();\n";
- code += " __controllers_register__();\n";
- code += " __soap_register__();\n";
- code += " __controllers_ioc_register__();\n";
- code += " __soap_ioc_register__();\n";
- code += "}\n";
- return code.c_str();
- }
- int main(int argc, char* argv[])
- {
- if (argc <= 0) {
- std::cout << "参数错误!" << std::endl;
- return -1;
- }
- for (int i = 0; i < argc; ++i) {
- std::cout << "参数:"<< argv[i] << std::endl;
- }
- std::string project_path = argv[argc - 1];
- std::string reflect_path;
- if (project_path[project_path.size() - 1] == '/' || project_path[project_path.size() - 1] == '\\') {
- reflect_path = project_path + "reflect.h";
- }
- else {
- reflect_path = project_path + "/reflect.h";
- }
- std::cout << "项目反射文件:" << reflect_path << std::endl;
- std::vector<class_view_info> classViews = code_analysis_core::getClassView(project_path);
- std::string code = getCode(classViews);
- std::cout << "项目反射代码生成完成" << std::endl;
- std::ofstream file(reflect_path, std::ios::out);
- if (!file.is_open()) {
- std::cerr << "无法打开文件" << std::endl;
- return -1;
- }
- file << code;
- file.close();
- return 0;
- }
- // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
- // 调试程序: F5 或调试 >“开始调试”菜单
- // 入门使用技巧:
- // 1. 使用解决方案资源管理器窗口添加/管理文件
- // 2. 使用团队资源管理器窗口连接到源代码管理
- // 3. 使用输出窗口查看生成输出和其他消息
- // 4. 使用错误列表窗口查看错误
- // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
- // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
|