From 7b9fe2ee2d8bd8ec4a806be58639d75b509e9fe5 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Fri, 30 Jul 2021 00:39:43 +0200 Subject: [PATCH] Added decorator diagram scope --- docs/test_cases/t00028.md | 80 +++++++++++++++++++++++ docs/test_cases/t00028_class.png | Bin 0 -> 42427 bytes src/puml/class_diagram_generator.h | 4 +- src/uml/decorators.cc | 100 +++++++++++++++++------------ src/uml/decorators.h | 15 +++++ tests/t00028/t00028.cc | 8 ++- tests/t00028/test_case.h | 1 + tests/test_decorator_parser.cc | 28 ++++++++ 8 files changed, 191 insertions(+), 45 deletions(-) create mode 100644 docs/test_cases/t00028.md create mode 100644 docs/test_cases/t00028_class.png diff --git a/docs/test_cases/t00028.md b/docs/test_cases/t00028.md new file mode 100644 index 00000000..b1cdf941 --- /dev/null +++ b/docs/test_cases/t00028.md @@ -0,0 +1,80 @@ +# t00028 - PlantUML note decorator test case +## Config +```yaml +compilation_database_dir: .. +output_directory: puml +diagrams: + t00028_class: + type: class + glob: + - ../../tests/t00028/t00028.cc + using_namespace: + - clanguml::t00028 + include: + namespaces: + - clanguml::t00028 + +``` +## Source code +File t00028.cc +```cpp +#include +#include + +namespace clanguml { +namespace t00028 { + +/// \clanguml{note[top] A class note.} +class A { +}; + +/// \clanguml{note[] B class note.} +class B { +}; + +/// +/// @clanguml{note:t00028_class[bottom] C class note.} +/// This is class C. +class C { +}; + +/// \clanguml{note +/// D +/// class +/// note.} +class D { +}; + +/// \clanguml{note E template class note.} +template class E { + T param; +}; + +/// \clanguml{note:other_diagram[left] G class note.} +class G { +}; + +/// @clanguml{note[ bottom ] F enum note.} +enum class F { one, two, three }; + +/// \clanguml{note[right] R class note.} +class R { + A aaa; + + B *bbb; + + C &ccc; + + std::vector> ddd; + + E eee; + + G **ggg; +}; + +} // namespace t00028 +} // namespace clanguml + +``` +## Generated UML diagrams +![t00028_class](./t00028_class.png "PlantUML note decorator test case") diff --git a/docs/test_cases/t00028_class.png b/docs/test_cases/t00028_class.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8f81957510d7df8c89d5375e8eef76b049e3c9 GIT binary patch literal 42427 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 - if (note) { + if (note && note->applies_to_diagram(m_config.name)) { ostr << "note " << note->position << " of " << c.alias() << '\n' << note->text << '\n' << "end note\n"; @@ -355,7 +355,7 @@ public: // for (auto decorator : e.decorators) { auto note = std::dynamic_pointer_cast(decorator); - if (note) { + if (note && note->applies_to_diagram(m_config.name)) { ostr << "note " << note->position << " of " << e.alias() << '\n' << note->text << '\n' << "end note\n"; diff --git a/src/uml/decorators.cc b/src/uml/decorators.cc index ea358d1d..404fe623 100644 --- a/src/uml/decorators.cc +++ b/src/uml/decorators.cc @@ -52,66 +52,90 @@ std::shared_ptr decorator::from_string(std::string_view c) return {}; } -std::shared_ptr note::from_string(std::string_view c) +bool decorator::applies_to_diagram(std::string name) { - auto res = std::make_shared(); + return diagrams.empty() || + (std::find(diagrams.begin(), diagrams.end(), name) != diagrams.end()); +} + +decorator_toks decorator::tokenize(const std::string &label, std::string_view c) +{ + decorator_toks res; + res.label = label; + size_t pos{}; auto it = c.begin(); - std::advance(it, note::label.size()); + std::advance(it, label.size()); + + if (*it == ':') { + std::advance(it, 1); + + pos = std::distance(c.begin(), it); + // If the diagram list is provided after ':', [] is mandatory + // even if empty + auto d = c.substr(pos, c.find("[", pos) - pos); + if (!d.empty()) { + std::string d_str{d}; + d_str.erase(std::remove_if(d_str.begin(), d_str.end(), + (int (*)(int))std::isspace), + d_str.end()); + res.diagrams = util::split(d_str, ","); + } + + std::advance(it, d.size()); + } if (*it == '[') { std::advance(it, 1); - auto pos = std::distance(c.begin(), it); - auto note_position = c.substr(pos, c.find("]", pos) - pos); - if (!note_position.empty()) - res->position = note_position; + pos = std::distance(c.begin(), it); + res.param = c.substr(pos, c.find("]", pos) - pos); - std::advance(it, note_position.size() + 1); + std::advance(it, res.param.size() + 1); } else if (std::isspace(*it)) { std::advance(it, 1); } - else { - LOG_WARN("Invalid note decorator: {}", c); - return {}; - } - auto pos = std::distance(c.begin(), it); - res->text = c.substr(pos, c.find("}", pos) - pos); + pos = std::distance(c.begin(), it); + res.text = c.substr(pos, c.find("}", pos) - pos); + res.text = util::trim(res.text); + res.param = util::trim(res.param); - res->position = util::trim(res->position); - res->text = util::trim(res->text); + return res; +} + +std::shared_ptr note::from_string(std::string_view c) +{ + auto res = std::make_shared(); + auto toks = res->tokenize(note::label, c); + + res->diagrams = toks.diagrams; + + if (!toks.param.empty()) + res->position = toks.param; + + res->text = toks.text; return res; } std::shared_ptr skip::from_string(std::string_view c) { - auto res = std::make_shared(); - return res; + return std::make_shared(); } std::shared_ptr skip_relationship::from_string(std::string_view c) { - auto res = std::make_shared(); - return res; + return std::make_shared(); } std::shared_ptr style::from_string(std::string_view c) { auto res = std::make_shared