Refactored generator function to common namespace

This commit is contained in:
Bartek Kryza
2022-02-16 21:00:18 +01:00
parent 4eab1e62b5
commit e7afdba19a
13 changed files with 102 additions and 136 deletions

View File

@@ -311,36 +311,4 @@ void generator::generate(std::ostream &ostr) const
ostr << "@enduml" << '\n'; ostr << "@enduml" << '\n';
} }
clanguml::class_diagram::model::diagram generate(
cppast::libclang_compilation_database &db, const std::string &name,
clanguml::config::class_diagram &diagram)
{
LOG_DBG("Generating diagram {}.puml", name);
clanguml::class_diagram::model::diagram d;
d.set_name(name);
// Get all translation units matching the glob from diagram
// configuration
std::vector<std::string> translation_units{};
for (const auto &g : diagram.glob()) {
LOG_DBG("Processing glob: {}", g);
const auto matches = glob::rglob(g);
std::copy(matches.begin(), matches.end(),
std::back_inserter(translation_units));
}
cppast::cpp_entity_index idx;
cppast::simple_file_parser<cppast::libclang_parser> parser{
type_safe::ref(idx)};
// Process all matching translation units
clanguml::class_diagram::visitor::translation_unit_visitor ctx(
idx, d, diagram);
cppast::parse_files(parser, translation_units, db);
for (auto &file : parser.files())
ctx(file);
return d;
}
} }

View File

@@ -69,10 +69,6 @@ public:
void generate(std::ostream &ostr) const override; void generate(std::ostream &ostr) const override;
}; };
clanguml::class_diagram::model::diagram generate(
cppast::libclang_compilation_database &db, const std::string &name,
clanguml::config::class_diagram &diagram);
} }
} }
} }

View File

@@ -21,6 +21,9 @@
#include "util/error.h" #include "util/error.h"
#include "util/util.h" #include "util/util.h"
#include <cppast/libclang_parser.hpp>
#include <glob/glob.hpp>
#include <ostream> #include <ostream>
namespace clanguml::common::generators::plantuml { namespace clanguml::common::generators::plantuml {
@@ -127,4 +130,36 @@ void generator<C, D>::generate_notes(
} }
} }
template <typename DiagramModel, typename DiagramConfig,
typename DiagramVisitor>
DiagramModel generate(cppast::libclang_compilation_database &db,
const std::string &name, DiagramConfig &diagram)
{
LOG_INFO("Generating diagram {}.puml", name);
DiagramModel d;
d.set_name(name);
// Get all translation units matching the glob from diagram
// configuration
std::vector<std::string> translation_units{};
for (const auto &g : diagram.glob()) {
LOG_DBG("Processing glob: {}", g);
const auto matches = glob::rglob(g);
std::copy(matches.begin(), matches.end(),
std::back_inserter(translation_units));
}
cppast::cpp_entity_index idx;
cppast::simple_file_parser<cppast::libclang_parser> parser{
type_safe::ref(idx)};
// Process all matching translation units
DiagramVisitor ctx(idx, d, diagram);
cppast::parse_files(parser, translation_units, db);
for (auto &file : parser.files())
ctx(file);
return d;
}
} }

View File

@@ -113,31 +113,47 @@ int main(int argc, const char *argv[])
ofs.open(path, std::ofstream::out | std::ofstream::trunc); ofs.open(path, std::ofstream::out | std::ofstream::trunc);
if (diagram->type() == diagram_type::class_diagram) { if (diagram->type() == diagram_type::class_diagram) {
using diagram_config = clanguml::config::class_diagram;
using diagram_model = clanguml::class_diagram::model::diagram;
using diagram_visitor =
clanguml::class_diagram::visitor::translation_unit_visitor;
auto model = auto model =
clanguml::class_diagram::generators::plantuml::generate( clanguml::common::generators::plantuml::generate<diagram_model,
db, name, dynamic_cast<class_diagram &>(*diagram)); diagram_config, diagram_visitor>(db, diagram->name,
dynamic_cast<diagram_config &>(*diagram));
ofs << clanguml::class_diagram::generators::plantuml::generator( ofs << clanguml::class_diagram::generators::plantuml::generator(
dynamic_cast<clanguml::config::class_diagram &>(*diagram), dynamic_cast<diagram_config &>(*diagram), model);
model);
} }
else if (diagram->type() == diagram_type::sequence_diagram) { else if (diagram->type() == diagram_type::sequence_diagram) {
using diagram_config = clanguml::config::sequence_diagram;
using diagram_model = clanguml::sequence_diagram::model::diagram;
using diagram_visitor =
clanguml::sequence_diagram::visitor::translation_unit_visitor;
auto model = auto model =
clanguml::sequence_diagram::generators::plantuml::generate( clanguml::common::generators::plantuml::generate<diagram_model,
db, name, dynamic_cast<sequence_diagram &>(*diagram)); diagram_config, diagram_visitor>(db, diagram->name,
dynamic_cast<diagram_config &>(*diagram));
ofs << clanguml::sequence_diagram::generators::plantuml::generator( ofs << clanguml::sequence_diagram::generators::plantuml::generator(
dynamic_cast<clanguml::config::sequence_diagram &>(*diagram), dynamic_cast<clanguml::config::sequence_diagram &>(*diagram),
model); model);
} }
else if (diagram->type() == diagram_type::package_diagram) { else if (diagram->type() == diagram_type::package_diagram) {
using diagram_config = clanguml::config::package_diagram;
using diagram_model = clanguml::package_diagram::model::diagram;
using diagram_visitor =
clanguml::package_diagram::visitor::translation_unit_visitor;
auto model = auto model =
clanguml::package_diagram::generators::plantuml::generate( clanguml::common::generators::plantuml::generate<diagram_model,
db, name, dynamic_cast<package_diagram &>(*diagram)); diagram_config, diagram_visitor>(db, diagram->name,
dynamic_cast<diagram_config &>(*diagram));
ofs << clanguml::package_diagram::generators::plantuml::generator( ofs << clanguml::package_diagram::generators::plantuml::generator(
dynamic_cast<clanguml::config::package_diagram &>(*diagram), dynamic_cast<diagram_config &>(*diagram), model);
model);
} }
LOG_INFO("Written {} diagram to {}", name, path.string()); LOG_INFO("Written {} diagram to {}", name, path.string());

View File

@@ -109,36 +109,4 @@ void generator::generate(std::ostream &ostr) const
ostr << "@enduml" << '\n'; ostr << "@enduml" << '\n';
} }
clanguml::package_diagram::model::diagram generate(
cppast::libclang_compilation_database &db, const std::string &name,
clanguml::config::package_diagram &diagram)
{
LOG_INFO("Generating package diagram {}.puml", name);
clanguml::package_diagram::model::diagram d;
d.set_name(name);
// Get all translation units matching the glob from diagram
// configuration
std::vector<std::string> translation_units{};
for (const auto &g : diagram.glob()) {
LOG_DBG("Processing glob: {}", g);
const auto matches = glob::rglob(g);
std::copy(matches.begin(), matches.end(),
std::back_inserter(translation_units));
}
cppast::cpp_entity_index idx;
cppast::simple_file_parser<cppast::libclang_parser> parser{
type_safe::ref(idx)};
// Process all matching translation units
clanguml::package_diagram::visitor::translation_unit_visitor ctx(
idx, d, diagram);
cppast::parse_files(parser, translation_units, db);
for (auto &file : parser.files())
ctx(file);
return d;
}
} }

View File

@@ -28,7 +28,6 @@
#include <cppast/cpp_entity_index.hpp> #include <cppast/cpp_entity_index.hpp>
#include <cppast/libclang_parser.hpp> #include <cppast/libclang_parser.hpp>
#include <glob/glob.hpp>
#include <filesystem> #include <filesystem>
#include <fstream> #include <fstream>
@@ -65,10 +64,6 @@ public:
void generate(std::ostream &ostr) const; void generate(std::ostream &ostr) const;
}; };
clanguml::package_diagram::model::diagram generate(
cppast::libclang_compilation_database &db, const std::string &name,
clanguml::config::package_diagram &diagram);
} }
} }
} }

View File

@@ -107,35 +107,4 @@ void generator::generate(std::ostream &ostr) const
ostr << "@enduml" << std::endl; ostr << "@enduml" << std::endl;
} }
clanguml::sequence_diagram::model::diagram generate(
cppast::libclang_compilation_database &db, const std::string &name,
clanguml::config::sequence_diagram &diagram)
{
spdlog::info("Generating diagram {}.puml", name);
clanguml::sequence_diagram::model::diagram d;
d.name = name;
cppast::cpp_entity_index idx;
cppast::simple_file_parser<cppast::libclang_parser> parser{
type_safe::ref(idx)};
clanguml::sequence_diagram::visitor::translation_unit_visitor visitor(
idx, d, diagram);
// Get all translation units matching the glob from diagram
// configuration
std::vector<std::string> translation_units{};
for (const auto &g : diagram.glob()) {
spdlog::debug("Processing glob: {}", g);
const auto matches = glob::rglob(g);
std::copy(matches.begin(), matches.end(),
std::back_inserter(translation_units));
}
cppast::parse_files(parser, translation_units, db);
for (auto &file : parser.files())
visitor(file);
return d;
}
} }

View File

@@ -60,10 +60,6 @@ public:
void generate(std::ostream &ostr) const; void generate(std::ostream &ostr) const;
}; };
clanguml::sequence_diagram::model::diagram generate(
cppast::libclang_compilation_database &db, const std::string &name,
clanguml::config::sequence_diagram &diagram);
} }
} }
} }

View File

@@ -29,6 +29,10 @@
namespace clanguml::sequence_diagram::model { namespace clanguml::sequence_diagram::model {
std::string diagram::name() const { return name_; }
void diagram::set_name(const std::string &name) { name_ = name; }
std::string diagram::to_alias(const std::string &full_name) const std::string diagram::to_alias(const std::string &full_name) const
{ {
return full_name; return full_name;

View File

@@ -25,12 +25,18 @@
namespace clanguml::sequence_diagram::model { namespace clanguml::sequence_diagram::model {
struct diagram { struct diagram {
std::string name() const;
void set_name(const std::string &name);
std::string to_alias(const std::string &full_name) const; std::string to_alias(const std::string &full_name) const;
bool started{false}; bool started{false};
std::string name;
std::map<std::uint_least64_t, activity> sequences; std::map<std::uint_least64_t, activity> sequences;
private:
std::string name_;
}; };
} }

View File

@@ -30,7 +30,7 @@ TEST_CASE("t20001", "[test-case][sequence]")
auto model = generate_sequence_diagram(db, diagram); auto model = generate_sequence_diagram(db, diagram);
REQUIRE(model.name == "t20001_sequence"); REQUIRE(model.name() == "t20001_sequence");
auto puml = generate_sequence_puml(diagram, model); auto puml = generate_sequence_puml(diagram, model);

View File

@@ -26,7 +26,7 @@ TEST_CASE("t20002", "[test-case][sequence]")
auto model = generate_sequence_diagram(db, diagram); auto model = generate_sequence_diagram(db, diagram);
REQUIRE(model.name == "t20002_sequence"); REQUIRE(model.name() == "t20002_sequence");
auto puml = generate_sequence_puml(diagram, model); auto puml = generate_sequence_puml(diagram, model);

View File

@@ -16,6 +16,7 @@
* limitations under the License. * limitations under the License.
*/ */
#include "test_cases.h" #include "test_cases.h"
#include "common/generators/plantuml/generator.h"
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
@@ -44,36 +45,48 @@ clanguml::sequence_diagram::model::diagram generate_sequence_diagram(
cppast::libclang_compilation_database &db, cppast::libclang_compilation_database &db,
std::shared_ptr<clanguml::config::diagram> diagram) std::shared_ptr<clanguml::config::diagram> diagram)
{ {
auto diagram_model = using diagram_config = clanguml::config::sequence_diagram;
clanguml::sequence_diagram::generators::plantuml::generate(db, using diagram_model = clanguml::sequence_diagram::model::diagram;
diagram->name, using diagram_visitor =
dynamic_cast<clanguml::config::sequence_diagram &>(*diagram)); clanguml::sequence_diagram::visitor::translation_unit_visitor;
return diagram_model; auto model = clanguml::common::generators::plantuml::generate<diagram_model,
diagram_config, diagram_visitor>(db, diagram->name,
dynamic_cast<clanguml::config::sequence_diagram &>(*diagram));
return model;
} }
clanguml::class_diagram::model::diagram generate_class_diagram( clanguml::class_diagram::model::diagram generate_class_diagram(
cppast::libclang_compilation_database &db, cppast::libclang_compilation_database &db,
std::shared_ptr<clanguml::config::diagram> diagram) std::shared_ptr<clanguml::config::diagram> diagram)
{ {
auto diagram_model = using diagram_config = clanguml::config::class_diagram;
clanguml::class_diagram::generators::plantuml::generate(db, using diagram_model = clanguml::class_diagram::model::diagram;
diagram->name, using diagram_visitor =
dynamic_cast<clanguml::config::class_diagram &>(*diagram)); clanguml::class_diagram::visitor::translation_unit_visitor;
return diagram_model; auto model = clanguml::common::generators::plantuml::generate<diagram_model,
diagram_config, diagram_visitor>(
db, diagram->name, dynamic_cast<diagram_config &>(*diagram));
return model;
} }
clanguml::package_diagram::model::diagram generate_package_diagram( clanguml::package_diagram::model::diagram generate_package_diagram(
cppast::libclang_compilation_database &db, cppast::libclang_compilation_database &db,
std::shared_ptr<clanguml::config::diagram> diagram) std::shared_ptr<clanguml::config::diagram> diagram)
{ {
auto diagram_model = using diagram_config = clanguml::config::package_diagram;
clanguml::package_diagram::generators::plantuml::generate(db, using diagram_model = clanguml::package_diagram::model::diagram;
diagram->name, using diagram_visitor =
dynamic_cast<clanguml::config::package_diagram &>(*diagram)); clanguml::package_diagram::visitor::translation_unit_visitor;
return diagram_model; auto model = clanguml::common::generators::plantuml::generate<diagram_model,
diagram_config, diagram_visitor>(
db, diagram->name, dynamic_cast<diagram_config &>(*diagram));
return model;
} }
std::string generate_sequence_puml( std::string generate_sequence_puml(