Improved folding empty control statements in sequence diagrams
This commit is contained in:
@@ -170,12 +170,7 @@ void diagram::end_loop_stmt(
|
|||||||
if (sequences_.find(current_caller_id) != sequences_.end()) {
|
if (sequences_.find(current_caller_id) != sequences_.end()) {
|
||||||
auto ¤t_messages = get_activity(current_caller_id).messages();
|
auto ¤t_messages = get_activity(current_caller_id).messages();
|
||||||
|
|
||||||
if (current_messages.back().type() == loop_type) {
|
fold_or_end_block_statement(std::move(m), loop_type, current_messages);
|
||||||
current_messages.pop_back();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
current_messages.emplace_back(std::move(m));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,25 +197,10 @@ void diagram::end_if_stmt(
|
|||||||
message m{message_t::kIfEnd, current_caller_id};
|
message m{message_t::kIfEnd, current_caller_id};
|
||||||
|
|
||||||
if (sequences_.find(current_caller_id) != sequences_.end()) {
|
if (sequences_.find(current_caller_id) != sequences_.end()) {
|
||||||
|
|
||||||
auto ¤t_messages = get_activity(current_caller_id).messages();
|
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 =
|
fold_or_end_block_statement(
|
||||||
std::none_of(current_messages.rbegin(), last_if_it,
|
std::move(m), message_t::kIf, current_messages);
|
||||||
[](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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -248,12 +228,8 @@ void diagram::end_try_stmt(
|
|||||||
if (sequences_.find(current_caller_id) != sequences_.end()) {
|
if (sequences_.find(current_caller_id) != sequences_.end()) {
|
||||||
auto ¤t_messages = get_activity(current_caller_id).messages();
|
auto ¤t_messages = get_activity(current_caller_id).messages();
|
||||||
|
|
||||||
if (current_messages.back().type() == message_t::kTry) {
|
fold_or_end_block_statement(
|
||||||
current_messages.pop_back();
|
std::move(m), message_t::kTry, current_messages);
|
||||||
}
|
|
||||||
else {
|
|
||||||
current_messages.emplace_back(std::move(m));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,17 +269,13 @@ void diagram::end_switch_stmt(
|
|||||||
{
|
{
|
||||||
using clanguml::common::model::message_t;
|
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()) {
|
if (sequences_.find(current_caller_id) != sequences_.end()) {
|
||||||
auto ¤t_messages = get_activity(current_caller_id).messages();
|
auto ¤t_messages = get_activity(current_caller_id).messages();
|
||||||
|
|
||||||
if (current_messages.back().type() == message_t::kSwitch) {
|
fold_or_end_block_statement(
|
||||||
current_messages.pop_back();
|
std::move(m), message_t::kSwitch, current_messages);
|
||||||
}
|
|
||||||
else {
|
|
||||||
current_messages.emplace_back(std::move(m));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -374,23 +346,17 @@ void diagram::add_conditional_elsestmt(
|
|||||||
void diagram::end_conditional_stmt(
|
void diagram::end_conditional_stmt(
|
||||||
const common::model::diagram_element::id_t current_caller_id)
|
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};
|
message m{message_t::kConditionalEnd, current_caller_id};
|
||||||
|
|
||||||
if (sequences_.find(current_caller_id) != sequences_.end()) {
|
if (sequences_.find(current_caller_id) != sequences_.end()) {
|
||||||
auto ¤t_messages = get_activity(current_caller_id).messages();
|
auto ¤t_messages = get_activity(current_caller_id).messages();
|
||||||
|
|
||||||
if (current_messages.at(current_messages.size() - 1).type() ==
|
const message_t begin_stmt_message_type{message_t::kConditional};
|
||||||
message_t::kElse &&
|
|
||||||
current_messages.at(current_messages.size() - 2).type() ==
|
fold_or_end_block_statement(
|
||||||
message_t::kConditional) {
|
std::move(m), begin_stmt_message_type, current_messages);
|
||||||
current_messages.pop_back();
|
|
||||||
current_messages.pop_back();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
current_messages.emplace_back(std::move(m));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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<message> ¤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 {
|
namespace clanguml::common::model {
|
||||||
|
|||||||
@@ -144,6 +144,10 @@ public:
|
|||||||
std::string caught_type);
|
std::string caught_type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void fold_or_end_block_statement(message &&m,
|
||||||
|
common::model::message_t statement_begin,
|
||||||
|
std::vector<message> ¤t_messages) const;
|
||||||
|
|
||||||
bool started_{false};
|
bool started_{false};
|
||||||
|
|
||||||
std::map<common::model::diagram_element::id_t, activity> sequences_;
|
std::map<common::model::diagram_element::id_t, activity> sequences_;
|
||||||
|
|||||||
@@ -2142,7 +2142,6 @@ bool translation_unit_visitor::should_include(
|
|||||||
const clang::LambdaExpr *expr) const
|
const clang::LambdaExpr *expr) const
|
||||||
{
|
{
|
||||||
const auto expr_file = expr->getBeginLoc().printToString(source_manager());
|
const auto expr_file = expr->getBeginLoc().printToString(source_manager());
|
||||||
|
|
||||||
return diagram().should_include(common::model::source_file{expr_file});
|
return diagram().should_include(common::model::source_file{expr_file});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ exclude:
|
|||||||
# Exclude entities and call expressions from irrelevant files
|
# Exclude entities and call expressions from irrelevant files
|
||||||
paths:
|
paths:
|
||||||
- src/util/util.h
|
- src/util/util.h
|
||||||
- src/common/model/enums.h
|
# - src/common/model/enums.h
|
||||||
using_namespace:
|
using_namespace:
|
||||||
- clanguml
|
- clanguml
|
||||||
plantuml:
|
plantuml:
|
||||||
|
|||||||
@@ -1,13 +1,26 @@
|
|||||||
type: sequence
|
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:
|
glob:
|
||||||
- src/sequence_diagram/visitor/*.cc
|
- src/sequence_diagram/visitor/*.cc
|
||||||
- src/sequence_diagram/model/*.cc
|
- src/sequence_diagram/model/*.cc
|
||||||
|
- src/common/visitor/*.cc
|
||||||
|
- src/common/model/*.cc
|
||||||
include:
|
include:
|
||||||
namespaces:
|
namespaces:
|
||||||
- clanguml::sequence_diagram::visitor
|
- clanguml
|
||||||
- clanguml::sequence_diagram::model
|
paths:
|
||||||
|
- .
|
||||||
|
exclude:
|
||||||
|
namespaces:
|
||||||
|
- clanguml::model::tvl
|
||||||
|
- clanguml::decorators
|
||||||
|
paths:
|
||||||
|
- src/common/model/source_location.h
|
||||||
using_namespace:
|
using_namespace:
|
||||||
- clanguml::sequence_diagram::visitor
|
- clanguml
|
||||||
plantuml:
|
plantuml:
|
||||||
before:
|
before:
|
||||||
- 'title clang-uml sequence_diagram::visitor::translation_unit_visitor::VisitCXXRecordDecl sequence diagram'
|
- 'title clang-uml sequence_diagram::visitor::translation_unit_visitor::VisitCXXRecordDecl sequence diagram'
|
||||||
|
|||||||
Reference in New Issue
Block a user