Refactored generator function to common namespace
This commit is contained in:
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
36
src/main.cc
36
src/main.cc
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user