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';
}
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;
};
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/util.h"
#include <cppast/libclang_parser.hpp>
#include <glob/glob.hpp>
#include <ostream>
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);
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 =
clanguml::class_diagram::generators::plantuml::generate(
db, name, dynamic_cast<class_diagram &>(*diagram));
clanguml::common::generators::plantuml::generate<diagram_model,
diagram_config, diagram_visitor>(db, diagram->name,
dynamic_cast<diagram_config &>(*diagram));
ofs << clanguml::class_diagram::generators::plantuml::generator(
dynamic_cast<clanguml::config::class_diagram &>(*diagram),
model);
dynamic_cast<diagram_config &>(*diagram), model);
}
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 =
clanguml::sequence_diagram::generators::plantuml::generate(
db, name, dynamic_cast<sequence_diagram &>(*diagram));
clanguml::common::generators::plantuml::generate<diagram_model,
diagram_config, diagram_visitor>(db, diagram->name,
dynamic_cast<diagram_config &>(*diagram));
ofs << clanguml::sequence_diagram::generators::plantuml::generator(
dynamic_cast<clanguml::config::sequence_diagram &>(*diagram),
model);
}
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 =
clanguml::package_diagram::generators::plantuml::generate(
db, name, dynamic_cast<package_diagram &>(*diagram));
clanguml::common::generators::plantuml::generate<diagram_model,
diagram_config, diagram_visitor>(db, diagram->name,
dynamic_cast<diagram_config &>(*diagram));
ofs << clanguml::package_diagram::generators::plantuml::generator(
dynamic_cast<clanguml::config::package_diagram &>(*diagram),
model);
dynamic_cast<diagram_config &>(*diagram), model);
}
LOG_INFO("Written {} diagram to {}", name, path.string());

View File

@@ -109,36 +109,4 @@ void generator::generate(std::ostream &ostr) const
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/libclang_parser.hpp>
#include <glob/glob.hpp>
#include <filesystem>
#include <fstream>
@@ -65,10 +64,6 @@ public:
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;
}
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;
};
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 {
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
{
return full_name;

View File

@@ -25,12 +25,18 @@
namespace clanguml::sequence_diagram::model {
struct diagram {
std::string name() const;
void set_name(const std::string &name);
std::string to_alias(const std::string &full_name) const;
bool started{false};
std::string name;
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);
REQUIRE(model.name == "t20001_sequence");
REQUIRE(model.name() == "t20001_sequence");
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);
REQUIRE(model.name == "t20002_sequence");
REQUIRE(model.name() == "t20002_sequence");
auto puml = generate_sequence_puml(diagram, model);

View File

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