Refactored test case diagram visitor and generator selection based on traits

This commit is contained in:
Bartek Kryza
2023-03-25 21:14:07 +01:00
parent 9e7c290685
commit a797a992b4

View File

@@ -56,196 +56,160 @@ load_config(const std::string &test_name)
return std::make_pair(std::move(config), std::move(compilation_database)); return std::make_pair(std::move(config), std::move(compilation_database));
} }
std::unique_ptr<clanguml::sequence_diagram::model::diagram> namespace detail {
generate_sequence_diagram(clang::tooling::CompilationDatabase &db, template <typename DiagramConfig>
auto generate_diagram_impl(clang::tooling::CompilationDatabase &db,
std::shared_ptr<clanguml::config::diagram> diagram) std::shared_ptr<clanguml::config::diagram> diagram)
{ {
using diagram_config = clanguml::config::sequence_diagram; using diagram_config = DiagramConfig;
using diagram_model = clanguml::sequence_diagram::model::diagram; using diagram_model =
typename clanguml::common::generators::diagram_model_t<
diagram_config>::type;
using diagram_visitor = using diagram_visitor =
clanguml::sequence_diagram::visitor::translation_unit_visitor; typename clanguml::common::generators::diagram_visitor_t<
diagram_config>::type;
inject_diagram_options(diagram); inject_diagram_options(diagram);
auto model = clanguml::common::generators::generate<diagram_model, auto model = clanguml::common::generators::generate<diagram_model,
diagram_config, diagram_visitor>(db, diagram->name, diagram_config, diagram_visitor>(db, diagram->name,
dynamic_cast<clanguml::config::sequence_diagram &>(*diagram), dynamic_cast<diagram_config &>(*diagram),
diagram->get_translation_units()); diagram->get_translation_units());
return model; return model;
} }
template <typename DiagramConfig, typename DiagramModel>
auto generate_diagram_puml(
std::shared_ptr<clanguml::config::diagram> config, DiagramModel &model)
{
using diagram_config = DiagramConfig;
using diagram_model = DiagramModel;
using diagram_generator =
typename clanguml::common::generators::diagram_generator_t<
DiagramConfig,
clanguml::common::generators::plantuml_generator_tag>::type;
std::stringstream ss;
ss << diagram_generator(dynamic_cast<diagram_config &>(*config), model);
return ss.str();
}
template <typename DiagramConfig, typename DiagramModel>
auto generate_diagram_json(
std::shared_ptr<clanguml::config::diagram> config, DiagramModel &model)
{
using diagram_config = DiagramConfig;
using diagram_model = DiagramModel;
using diagram_generator =
typename clanguml::common::generators::diagram_generator_t<
DiagramConfig,
clanguml::common::generators::json_generator_tag>::type;
std::stringstream ss;
ss << diagram_generator(dynamic_cast<diagram_config &>(*config), model);
return nlohmann::json::parse(ss.str());
}
}
std::unique_ptr<clanguml::class_diagram::model::diagram> generate_class_diagram( std::unique_ptr<clanguml::class_diagram::model::diagram> generate_class_diagram(
clang::tooling::CompilationDatabase &db, clang::tooling::CompilationDatabase &db,
std::shared_ptr<clanguml::config::diagram> diagram) std::shared_ptr<clanguml::config::diagram> diagram)
{ {
using diagram_config = clanguml::config::class_diagram; return detail::generate_diagram_impl<clanguml::config::class_diagram>(
using diagram_model = clanguml::class_diagram::model::diagram; db, diagram);
using diagram_visitor = }
clanguml::class_diagram::visitor::translation_unit_visitor;
inject_diagram_options(diagram); std::unique_ptr<clanguml::sequence_diagram::model::diagram>
generate_sequence_diagram(clang::tooling::CompilationDatabase &db,
auto model = clanguml::common::generators::generate<diagram_model, std::shared_ptr<clanguml::config::diagram> diagram)
diagram_config, diagram_visitor>(db, diagram->name, {
dynamic_cast<diagram_config &>(*diagram), return detail::generate_diagram_impl<clanguml::config::sequence_diagram>(
diagram->get_translation_units()); db, diagram);
return model;
} }
std::unique_ptr<clanguml::package_diagram::model::diagram> std::unique_ptr<clanguml::package_diagram::model::diagram>
generate_package_diagram(clang::tooling::CompilationDatabase &db, generate_package_diagram(clang::tooling::CompilationDatabase &db,
std::shared_ptr<clanguml::config::diagram> diagram) std::shared_ptr<clanguml::config::diagram> diagram)
{ {
using diagram_config = clanguml::config::package_diagram; return detail::generate_diagram_impl<clanguml::config::package_diagram>(
using diagram_model = clanguml::package_diagram::model::diagram; db, diagram);
using diagram_visitor =
clanguml::package_diagram::visitor::translation_unit_visitor;
inject_diagram_options(diagram);
return clanguml::common::generators::generate<diagram_model, diagram_config,
diagram_visitor>(db, diagram->name,
dynamic_cast<diagram_config &>(*diagram),
diagram->get_translation_units());
} }
std::unique_ptr<clanguml::include_diagram::model::diagram> std::unique_ptr<clanguml::include_diagram::model::diagram>
generate_include_diagram(clang::tooling::CompilationDatabase &db, generate_include_diagram(clang::tooling::CompilationDatabase &db,
std::shared_ptr<clanguml::config::diagram> diagram) std::shared_ptr<clanguml::config::diagram> diagram)
{ {
using diagram_config = clanguml::config::include_diagram; return detail::generate_diagram_impl<clanguml::config::include_diagram>(
using diagram_model = clanguml::include_diagram::model::diagram; db, diagram);
using diagram_visitor =
clanguml::include_diagram::visitor::translation_unit_visitor;
inject_diagram_options(diagram);
return clanguml::common::generators::generate<diagram_model, diagram_config,
diagram_visitor>(db, diagram->name,
dynamic_cast<diagram_config &>(*diagram),
diagram->get_translation_units());
}
std::string generate_sequence_puml(
std::shared_ptr<clanguml::config::diagram> config,
clanguml::sequence_diagram::model::diagram &model)
{
using namespace clanguml::sequence_diagram::generators::plantuml;
std::stringstream ss;
ss << generator(
dynamic_cast<clanguml::config::sequence_diagram &>(*config), model);
return ss.str();
}
nlohmann::json generate_sequence_json(
std::shared_ptr<clanguml::config::diagram> config,
clanguml::sequence_diagram::model::diagram &model)
{
using namespace clanguml::sequence_diagram::generators::json;
std::stringstream ss;
ss << generator(
dynamic_cast<clanguml::config::sequence_diagram &>(*config), model);
return nlohmann::json::parse(ss.str());
} }
std::string generate_class_puml( std::string generate_class_puml(
std::shared_ptr<clanguml::config::diagram> config, std::shared_ptr<clanguml::config::diagram> config,
clanguml::class_diagram::model::diagram &model) clanguml::class_diagram::model::diagram &model)
{ {
using namespace clanguml::class_diagram::generators::plantuml; return detail::generate_diagram_puml<clanguml::config::class_diagram>(
config, model);
std::stringstream ss;
ss << generator(
dynamic_cast<clanguml::config::class_diagram &>(*config), model);
return ss.str();
} }
nlohmann::json generate_class_json( std::string generate_sequence_puml(
std::shared_ptr<clanguml::config::diagram> config, std::shared_ptr<clanguml::config::diagram> config,
clanguml::class_diagram::model::diagram &model) clanguml::sequence_diagram::model::diagram &model)
{ {
using namespace clanguml::class_diagram::generators::json; return detail::generate_diagram_puml<clanguml::config::sequence_diagram>(
config, model);
std::stringstream ss;
ss << generator(
dynamic_cast<clanguml::config::class_diagram &>(*config), model);
return nlohmann::json::parse(ss.str());
} }
std::string generate_package_puml( std::string generate_package_puml(
std::shared_ptr<clanguml::config::diagram> config, std::shared_ptr<clanguml::config::diagram> config,
clanguml::package_diagram::model::diagram &model) clanguml::package_diagram::model::diagram &model)
{ {
using namespace clanguml::package_diagram::generators::plantuml; return detail::generate_diagram_puml<clanguml::config::package_diagram>(
config, model);
std::stringstream ss;
assert(config.get() != nullptr);
ss << generator(
dynamic_cast<clanguml::config::package_diagram &>(*config), model);
return ss.str();
}
nlohmann::json generate_package_json(
std::shared_ptr<clanguml::config::diagram> config,
clanguml::package_diagram::model::diagram &model)
{
using namespace clanguml::package_diagram::generators::json;
std::stringstream ss;
assert(config.get() != nullptr);
ss << generator(
dynamic_cast<clanguml::config::package_diagram &>(*config), model);
return nlohmann::json::parse(ss.str());
} }
std::string generate_include_puml( std::string generate_include_puml(
std::shared_ptr<clanguml::config::diagram> config, std::shared_ptr<clanguml::config::diagram> config,
clanguml::include_diagram::model::diagram &model) clanguml::include_diagram::model::diagram &model)
{ {
using namespace clanguml::include_diagram::generators::plantuml; return detail::generate_diagram_puml<clanguml::config::include_diagram>(
config, model);
}
std::stringstream ss; nlohmann::json generate_class_json(
std::shared_ptr<clanguml::config::diagram> config,
clanguml::class_diagram::model::diagram &model)
{
return detail::generate_diagram_json<clanguml::config::class_diagram>(
config, model);
}
assert(config.get() != nullptr); nlohmann::json generate_sequence_json(
std::shared_ptr<clanguml::config::diagram> config,
clanguml::sequence_diagram::model::diagram &model)
{
return detail::generate_diagram_json<clanguml::config::sequence_diagram>(
config, model);
}
ss << generator( nlohmann::json generate_package_json(
dynamic_cast<clanguml::config::include_diagram &>(*config), model); std::shared_ptr<clanguml::config::diagram> config,
clanguml::package_diagram::model::diagram &model)
return ss.str(); {
return detail::generate_diagram_json<clanguml::config::package_diagram>(
config, model);
} }
nlohmann::json generate_include_json( nlohmann::json generate_include_json(
std::shared_ptr<clanguml::config::diagram> config, std::shared_ptr<clanguml::config::diagram> config,
clanguml::include_diagram::model::diagram &model) clanguml::include_diagram::model::diagram &model)
{ {
using namespace clanguml::include_diagram::generators::json; return detail::generate_diagram_json<clanguml::config::include_diagram>(
config, model);
std::stringstream ss;
assert(config.get() != nullptr);
ss << generator(
dynamic_cast<clanguml::config::include_diagram &>(*config), model);
return nlohmann::json::parse(ss.str());
} }
void save_puml(const std::string &path, const std::string &puml) void save_puml(const std::string &path, const std::string &puml)