diff --git a/src/sequence_diagram/model/diagram.cc b/src/sequence_diagram/model/diagram.cc index de7b7980..a15a9a08 100644 --- a/src/sequence_diagram/model/diagram.cc +++ b/src/sequence_diagram/model/diagram.cc @@ -170,12 +170,7 @@ void diagram::end_loop_stmt( if (sequences_.find(current_caller_id) != sequences_.end()) { auto ¤t_messages = get_activity(current_caller_id).messages(); - if (current_messages.back().type() == loop_type) { - current_messages.pop_back(); - } - else { - current_messages.emplace_back(std::move(m)); - } + fold_or_end_block_statement(std::move(m), loop_type, current_messages); } } @@ -202,25 +197,10 @@ void diagram::end_if_stmt( message m{message_t::kIfEnd, current_caller_id}; if (sequences_.find(current_caller_id) != sequences_.end()) { - auto ¤t_messages = get_activity(current_caller_id).messages(); - // Remove the if/else messages if there were no calls - // added to the diagram between them - auto last_if_it = - std::find_if(current_messages.rbegin(), current_messages.rend(), - [](const message &m) { return m.type() == message_t::kIf; }); - bool last_if_block_is_empty = - std::none_of(current_messages.rbegin(), last_if_it, - [](const message &m) { return m.type() == message_t::kCall; }); - - if (!last_if_block_is_empty) { - current_messages.emplace_back(std::move(m)); - } - else { - current_messages.erase( - (last_if_it + 1).base(), current_messages.end()); - } + fold_or_end_block_statement( + std::move(m), message_t::kIf, current_messages); } } @@ -248,12 +228,8 @@ void diagram::end_try_stmt( if (sequences_.find(current_caller_id) != sequences_.end()) { auto ¤t_messages = get_activity(current_caller_id).messages(); - if (current_messages.back().type() == message_t::kTry) { - current_messages.pop_back(); - } - else { - current_messages.emplace_back(std::move(m)); - } + fold_or_end_block_statement( + std::move(m), message_t::kTry, current_messages); } } @@ -293,17 +269,13 @@ void diagram::end_switch_stmt( { using clanguml::common::model::message_t; - message m{message_t::kTryEnd, current_caller_id}; + message m{message_t::kSwitchEnd, current_caller_id}; if (sequences_.find(current_caller_id) != sequences_.end()) { auto ¤t_messages = get_activity(current_caller_id).messages(); - if (current_messages.back().type() == message_t::kSwitch) { - current_messages.pop_back(); - } - else { - current_messages.emplace_back(std::move(m)); - } + fold_or_end_block_statement( + std::move(m), message_t::kSwitch, current_messages); } } @@ -374,23 +346,17 @@ void diagram::add_conditional_elsestmt( void diagram::end_conditional_stmt( const common::model::diagram_element::id_t current_caller_id) { - using clanguml::common::model::message_t; + using common::model::message_t; message m{message_t::kConditionalEnd, current_caller_id}; if (sequences_.find(current_caller_id) != sequences_.end()) { auto ¤t_messages = get_activity(current_caller_id).messages(); - if (current_messages.at(current_messages.size() - 1).type() == - message_t::kElse && - current_messages.at(current_messages.size() - 2).type() == - message_t::kConditional) { - current_messages.pop_back(); - current_messages.pop_back(); - } - else { - current_messages.emplace_back(std::move(m)); - } + const message_t begin_stmt_message_type{message_t::kConditional}; + + fold_or_end_block_statement( + std::move(m), begin_stmt_message_type, current_messages); } } @@ -475,6 +441,31 @@ void diagram::print() const } } } + +void diagram::fold_or_end_block_statement(message &&m, + const common::model::message_t statement_begin, + std::vector ¤t_messages) const +{ + bool is_empty_statement{true}; + + auto rit = current_messages.rbegin(); + for (; rit != current_messages.rend(); rit++) { + if (rit->type() == statement_begin) { + break; + } + if (rit->type() == common::model::message_t::kCall) { + is_empty_statement = false; + break; + } + } + + if (is_empty_statement) { + current_messages.erase((rit + 1).base(), current_messages.end()); + } + else { + current_messages.emplace_back(std::move(m)); + } +} } namespace clanguml::common::model { diff --git a/src/sequence_diagram/model/diagram.h b/src/sequence_diagram/model/diagram.h index 439bea41..f8904271 100644 --- a/src/sequence_diagram/model/diagram.h +++ b/src/sequence_diagram/model/diagram.h @@ -144,6 +144,10 @@ public: std::string caught_type); private: + void fold_or_end_block_statement(message &&m, + common::model::message_t statement_begin, + std::vector ¤t_messages) const; + bool started_{false}; std::map sequences_; diff --git a/src/sequence_diagram/visitor/translation_unit_visitor.cc b/src/sequence_diagram/visitor/translation_unit_visitor.cc index 2c333632..d9abe5cb 100644 --- a/src/sequence_diagram/visitor/translation_unit_visitor.cc +++ b/src/sequence_diagram/visitor/translation_unit_visitor.cc @@ -2142,7 +2142,6 @@ bool translation_unit_visitor::should_include( const clang::LambdaExpr *expr) const { const auto expr_file = expr->getBeginLoc().printToString(source_manager()); - return diagram().should_include(common::model::source_file{expr_file}); } diff --git a/uml/main_sequence_diagram.yml b/uml/main_sequence_diagram.yml index 88ddf203..6f36228d 100644 --- a/uml/main_sequence_diagram.yml +++ b/uml/main_sequence_diagram.yml @@ -17,7 +17,7 @@ exclude: # Exclude entities and call expressions from irrelevant files paths: - src/util/util.h - - src/common/model/enums.h +# - src/common/model/enums.h using_namespace: - clanguml plantuml: diff --git a/uml/sequence_diagram_visitor_sequence_diagram.yml b/uml/sequence_diagram_visitor_sequence_diagram.yml index bcbbe923..531fe592 100644 --- a/uml/sequence_diagram_visitor_sequence_diagram.yml +++ b/uml/sequence_diagram_visitor_sequence_diagram.yml @@ -1,13 +1,26 @@ type: sequence +# Group free functions into one participant per file +combine_free_functions_into_file_participants: true +# Do not generate method or function arguments +generate_method_arguments: none glob: - src/sequence_diagram/visitor/*.cc - src/sequence_diagram/model/*.cc + - src/common/visitor/*.cc + - src/common/model/*.cc include: namespaces: - - clanguml::sequence_diagram::visitor - - clanguml::sequence_diagram::model + - clanguml + paths: + - . +exclude: + namespaces: + - clanguml::model::tvl + - clanguml::decorators + paths: + - src/common/model/source_location.h using_namespace: - - clanguml::sequence_diagram::visitor + - clanguml plantuml: before: - 'title clang-uml sequence_diagram::visitor::translation_unit_visitor::VisitCXXRecordDecl sequence diagram'