// code_generator_command.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include #include #include "class_view.hpp" static std::string getCode(std::vector 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 \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_(\"{1}\").constructor<>()(rttr::detail::as_object{{}}).\n"; modelCode = v3::utils::format(modelCode, it.class_name, it.sql_table_name); std::vector 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(&{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_>(\"{2}<{3}>\").constructor<>()(rttr::detail::as_object{{}}).\n"; modelCode = v3::utils::format(modelCode, it.class_name, templateProerty, it.sql_table_name, templateProerty); std::vector 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(&{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_(\"{1}\").constructor<>()().\n"; controllerCode = v3::utils::format(controllerCode, it.class_name, it.class_name); std::vector 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 parameterTypes; std::vector 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_(\"{1}\").constructor<>()().\n"; controllerCode = v3::utils::format(controllerCode, it.class_name, it.class_name); std::vector 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 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 controller(new robotics::v3::mvc::controller);\n"; for (auto& action : it.methods) { code += " {\n"; code += " std::shared_ptr action(new robotics::v3::mvc::controller_action);\n"; for (auto& argument : action.parameters) { code += " {\n"; code += " std::shared_ptr 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 controller(new robotics::v3::soap::soap_sontroller);\n"; for (auto& action : it.soap_methods) { code += " {\n"; code += " std::shared_ptr action(new robotics::v3::soap::soap_sontroller);\n"; for (auto& argument : action.parameters) { code += " {\n"; code += " std::shared_ptr 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 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 文件