diff --git a/src/sequence_diagram/model/diagram.cc b/src/sequence_diagram/model/diagram.cc index 5edb4220..03253968 100644 --- a/src/sequence_diagram/model/diagram.cc +++ b/src/sequence_diagram/model/diagram.cc @@ -98,6 +98,11 @@ const activity &diagram::get_activity(common::id_t id) const return sequences_.at(id); } +bool diagram::has_activity(common::id_t id) const +{ + return sequences_.count(id) > 0; +} + activity &diagram::get_activity(common::id_t id) { return sequences_.at(id); } void diagram::add_message(model::message &&message) diff --git a/src/sequence_diagram/model/diagram.h b/src/sequence_diagram/model/diagram.h index 3b485b4d..f8aa3740 100644 --- a/src/sequence_diagram/model/diagram.h +++ b/src/sequence_diagram/model/diagram.h @@ -100,6 +100,14 @@ public: */ void add_active_participant(common::id_t id); + /** + * @brief Check if diagram has activity identified by caller id + * + * @param id Caller id representing the activity + * @return True, if an activity already exists + */ + bool has_activity(common::id_t id) const; + /** * @brief Get reference to current activity of a participant * diff --git a/src/sequence_diagram/visitor/translation_unit_visitor.cc b/src/sequence_diagram/visitor/translation_unit_visitor.cc index cf42cb09..14b5c8e1 100644 --- a/src/sequence_diagram/visitor/translation_unit_visitor.cc +++ b/src/sequence_diagram/visitor/translation_unit_visitor.cc @@ -514,14 +514,14 @@ bool translation_unit_visitor::TraverseCallExpr(clang::CallExpr *expr) if (source_manager().isInSystemHeader(expr->getSourceRange().getBegin())) return true; - LOG_DBG("Entering call expression at {}", + LOG_TRACE("Entering call expression at {}", expr->getBeginLoc().printToString(source_manager())); context().enter_callexpr(expr); RecursiveASTVisitor::TraverseCallExpr(expr); - LOG_DBG("Leaving call expression at {}", + LOG_TRACE("Leaving call expression at {}", expr->getBeginLoc().printToString(source_manager())); context().leave_callexpr(); @@ -537,7 +537,7 @@ bool translation_unit_visitor::TraverseCXXMemberCallExpr( if (source_manager().isInSystemHeader(expr->getSourceRange().getBegin())) return true; - LOG_DBG("Entering member call expression at {}", + LOG_TRACE("Entering member call expression at {}", expr->getBeginLoc().printToString(source_manager())); context().enter_callexpr(expr); @@ -545,7 +545,7 @@ bool translation_unit_visitor::TraverseCXXMemberCallExpr( RecursiveASTVisitor::TraverseCXXMemberCallExpr( expr); - LOG_DBG("Leaving member call expression at {}", + LOG_TRACE("Leaving member call expression at {}", expr->getBeginLoc().printToString(source_manager())); context().leave_callexpr(); @@ -591,7 +591,7 @@ bool translation_unit_visitor::TraverseCXXTemporaryObjectExpr( bool translation_unit_visitor::TraverseCXXConstructExpr( clang::CXXConstructExpr *expr) { - LOG_DBG("Entering cxx construct call expression at {}", + LOG_TRACE("Entering cxx construct call expression at {}", expr->getBeginLoc().printToString(source_manager())); context().enter_callexpr(expr); @@ -601,7 +601,7 @@ bool translation_unit_visitor::TraverseCXXConstructExpr( translation_unit_visitor::VisitCXXConstructExpr(expr); - LOG_DBG("Leaving member call expression at {}", + LOG_TRACE("Leaving member call expression at {}", expr->getBeginLoc().printToString(source_manager())); context().leave_callexpr(); @@ -1918,7 +1918,12 @@ void translation_unit_visitor::pop_message_to_diagram(clang::CallExpr *expr) auto msg = std::move(call_expr_message_map_.at(expr)); auto caller_id = msg.from(); - diagram().get_activity(caller_id).add_message(std::move(msg)); + + if (caller_id == 0) + return; + + if (diagram().has_activity(caller_id)) + diagram().get_activity(caller_id).add_message(std::move(msg)); call_expr_message_map_.erase(expr); } diff --git a/tests/t20012/test_case.h b/tests/t20012/test_case.h index 99adea7b..918a7d96 100644 --- a/tests/t20012/test_case.h +++ b/tests/t20012/test_case.h @@ -69,8 +69,12 @@ TEST_CASE("t20012", "[test-case][sequence]") REQUIRE_THAT(src, HasCall(_A("tmain()::(lambda t20012.cc:86:9)"), _A("C"), "c()")); - // @todo #168 - // REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("D"), "add5(int)")); + REQUIRE_THAT(src, + HasCall(_A("tmain()"), _A("tmain()::(lambda t20012.cc:94:9)"), + "operator()(auto) const")); + REQUIRE_THAT(src, + HasCall(_A("tmain()::(lambda t20012.cc:94:9)"), _A("D"), + "add5(int) const")); save_puml(config.output_directory(), diagram->name + ".puml", src); } @@ -84,19 +88,20 @@ TEST_CASE("t20012", "[test-case][sequence]") FindMessage(j, "tmain()", "tmain()::(lambda t20012.cc:67:20)", "operator()() const"), FindMessage(j, "tmain()::(lambda t20012.cc:67:20)", "A", "a()"), - FindMessage(j, "A", "A", "aa()"), FindMessage(j, "A", "A", "aaa()"), + FindMessage(j, "A", "A", "aa()"), + FindMessage(j, "A", "A", "aaa()"), FindMessage(j, "tmain()::(lambda t20012.cc:67:20)", "B", "b()"), - FindMessage(j, "B", "B", "bb()"), FindMessage(j, "B", "B", "bbb()"), + FindMessage(j, "B", "B", "bb()"), + FindMessage(j, "B", "B", "bbb()"), FindMessage(j, "tmain()::(lambda t20012.cc:80:20)", "C", "c()"), - FindMessage(j, "C", "C", "cc()"), FindMessage(j, "C", "C", "ccc()"), + FindMessage(j, "C", "C", "cc()"), + FindMessage(j, "C", "C", "ccc()"), FindMessage(j, "tmain()::(lambda t20012.cc:80:20)", "tmain()::(lambda t20012.cc:67:20)", "operator()() const"), FindMessage(j, "tmain()", "R<(lambda at t20012.cc:86:9)>", "r()"), FindMessage(j, "R<(lambda at t20012.cc:86:9)>", "tmain()::(lambda t20012.cc:86:9)", "operator()() const"), FindMessage(j, "tmain()::(lambda t20012.cc:86:9)", "C", "c()"), - // @todo #168 - // FindMessage(j, "tmain()", "D", "add5(int)") }; REQUIRE(std::is_sorted(messages.begin(), messages.end())); @@ -141,6 +146,13 @@ TEST_CASE("t20012", "[test-case][sequence]") REQUIRE_THAT(src, HasCall(_A("tmain()::(lambda t20012.cc:86:9)"), _A("C"), "c()")); + REQUIRE_THAT(src, + HasCall(_A("tmain()"), _A("tmain()::(lambda t20012.cc:94:9)"), + "operator()(auto) const")); + REQUIRE_THAT(src, + HasCall(_A("tmain()::(lambda t20012.cc:94:9)"), _A("D"), + "add5(int) const")); + save_mermaid(config.output_directory(), diagram->name + ".mmd", src); } }