Fixed handling of arguments in sequence diagrams
This commit is contained in:
@@ -304,7 +304,7 @@ bool translation_unit_visitor::VisitCXXMethodDecl(clang::CXXMethodDecl *m)
|
|||||||
|
|
||||||
for (const auto *param : m->parameters()) {
|
for (const auto *param : m->parameters()) {
|
||||||
m_ptr->add_parameter(simplify_system_template(
|
m_ptr->add_parameter(simplify_system_template(
|
||||||
common::to_string(param->getType(), m->getASTContext())));
|
common::to_string(param->getType(), m->getASTContext(), false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
set_source_location(*m, *m_ptr);
|
set_source_location(*m, *m_ptr);
|
||||||
@@ -372,8 +372,8 @@ bool translation_unit_visitor::VisitFunctionDecl(clang::FunctionDecl *f)
|
|||||||
f_ptr->set_namespace(ns);
|
f_ptr->set_namespace(ns);
|
||||||
|
|
||||||
for (const auto *param : f->parameters()) {
|
for (const auto *param : f->parameters()) {
|
||||||
f_ptr->add_parameter(simplify_system_template(
|
f_ptr->add_parameter(simplify_system_template(common::to_string(
|
||||||
common::to_string(param->getType(), f->getASTContext())));
|
param->getType(), f->getASTContext(), false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
f_ptr->set_id(common::to_id(f_ptr->full_name(false)));
|
f_ptr->set_id(common::to_id(f_ptr->full_name(false)));
|
||||||
@@ -415,7 +415,7 @@ bool translation_unit_visitor::VisitFunctionTemplateDecl(
|
|||||||
for (const auto *param :
|
for (const auto *param :
|
||||||
function_template->getTemplatedDecl()->parameters()) {
|
function_template->getTemplatedDecl()->parameters()) {
|
||||||
f_ptr->add_parameter(simplify_system_template(common::to_string(
|
f_ptr->add_parameter(simplify_system_template(common::to_string(
|
||||||
param->getType(), function_template->getASTContext())));
|
param->getType(), function_template->getASTContext(), false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
f_ptr->set_id(common::to_id(f_ptr->full_name(false)));
|
f_ptr->set_id(common::to_id(f_ptr->full_name(false)));
|
||||||
@@ -426,7 +426,6 @@ bool translation_unit_visitor::VisitFunctionTemplateDecl(
|
|||||||
|
|
||||||
set_unique_id(function_template->getID(), f_ptr->id());
|
set_unique_id(function_template->getID(), f_ptr->id());
|
||||||
|
|
||||||
// TODO: Handle overloaded functions with different arguments
|
|
||||||
diagram().add_participant(std::move(f_ptr));
|
diagram().add_participant(std::move(f_ptr));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -1657,11 +1656,12 @@ bool translation_unit_visitor::simplify_system_template(
|
|||||||
std::string translation_unit_visitor::simplify_system_template(
|
std::string translation_unit_visitor::simplify_system_template(
|
||||||
const std::string &full_name) const
|
const std::string &full_name) const
|
||||||
{
|
{
|
||||||
if (config().type_aliases().count(full_name) > 0) {
|
std::string result{full_name};
|
||||||
return config().type_aliases().at(full_name);
|
for(const auto& [k, v] : config().type_aliases()) {
|
||||||
|
util::replace_all(result, k, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
return full_name;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string translation_unit_visitor::make_lambda_name(
|
std::string translation_unit_visitor::make_lambda_name(
|
||||||
|
|||||||
@@ -38,30 +38,36 @@ TEST_CASE("t20006", "[test-case][sequence]")
|
|||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a1(int)"));
|
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a1(int)"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)"));
|
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("B<std::string>"), _A("A<std::string>"), "a2"));
|
puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)"));
|
||||||
|
REQUIRE_THAT(puml,
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("BB<int,int>"), "bb1"));
|
HasCall(_A("B<std::string>"), _A("A<std::string>"), "a2(std::string)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("BB<int,int>"), _A("AA<int>"), "aa1"));
|
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("BB<int,int>"), "bb2"));
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("BB<int,int>"), _A("AA<int>"), "aa2"));
|
|
||||||
|
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("tmain()"), _A("BB<int,std::string>"), "bb1"));
|
puml, HasCall(_A("tmain()"), _A("BB<int,int>"), "bb1(int,int)"));
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(puml, HasCall(_A("BB<int,int>"), _A("AA<int>"), "aa1(int)"));
|
||||||
puml, HasCall(_A("BB<int,std::string>"), _A("AA<int>"), "aa2"));
|
|
||||||
|
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("tmain()"), _A("BB<int,std::string>"), "bb2"));
|
puml, HasCall(_A("tmain()"), _A("BB<int,int>"), "bb2(int,int)"));
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(puml, HasCall(_A("BB<int,int>"), _A("AA<int>"), "aa2(int)"));
|
||||||
puml, HasCall(_A("BB<int,std::string>"), _A("AA<int>"), "aa1"));
|
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("BB<int,float>"), "bb1"));
|
REQUIRE_THAT(puml,
|
||||||
|
HasCall(
|
||||||
|
_A("tmain()"), _A("BB<int,std::string>"), "bb1(int,std::string)"));
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("BB<int,float>"), _A("BB<int,float>"), "bb2"));
|
puml, HasCall(_A("BB<int,std::string>"), _A("AA<int>"), "aa2(int)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("BB<int,float>"), _A("AA<int>"), "aa2"));
|
|
||||||
|
REQUIRE_THAT(puml,
|
||||||
|
HasCall(
|
||||||
|
_A("tmain()"), _A("BB<int,std::string>"), "bb2(int,std::string)"));
|
||||||
|
REQUIRE_THAT(
|
||||||
|
puml, HasCall(_A("BB<int,std::string>"), _A("AA<int>"), "aa1(int)"));
|
||||||
|
|
||||||
|
REQUIRE_THAT(
|
||||||
|
puml, HasCall(_A("tmain()"), _A("BB<int,float>"), "bb1(int,float)"));
|
||||||
|
REQUIRE_THAT(puml,
|
||||||
|
HasCall(_A("BB<int,float>"), _A("BB<int,float>"), "bb2(int,float)"));
|
||||||
|
REQUIRE_THAT(puml, HasCall(_A("BB<int,float>"), _A("AA<int>"), "aa2(int)"));
|
||||||
|
|
||||||
save_puml(
|
save_puml(
|
||||||
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||||
|
|||||||
@@ -35,12 +35,14 @@ TEST_CASE("t20007", "[test-case][sequence]")
|
|||||||
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
||||||
|
|
||||||
// Check if all calls exist
|
// Check if all calls exist
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("Adder<int,int>"), "add"));
|
REQUIRE_THAT(puml,
|
||||||
REQUIRE_THAT(
|
HasCall(_A("tmain()"), _A("Adder<int,int>"), "add(int &&,int &&)"));
|
||||||
puml, HasCall(_A("tmain()"), _A("Adder<int,float,double>"), "add"));
|
REQUIRE_THAT(puml,
|
||||||
|
HasCall(_A("tmain()"), _A("Adder<int,float,double>"),
|
||||||
|
"add(int &&,float &&,double &&)"));
|
||||||
REQUIRE_THAT(puml,
|
REQUIRE_THAT(puml,
|
||||||
HasCall(_A("tmain()"), _A("Adder<std::string,std::string,std::string>"),
|
HasCall(_A("tmain()"), _A("Adder<std::string,std::string,std::string>"),
|
||||||
"add"));
|
"add(std::string &&,std::string &&,std::string &&)"));
|
||||||
|
|
||||||
save_puml(
|
save_puml(
|
||||||
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||||
|
|||||||
@@ -35,18 +35,21 @@ TEST_CASE("t20008", "[test-case][sequence]")
|
|||||||
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
||||||
|
|
||||||
// Check if all calls exist
|
// Check if all calls exist
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a1"));
|
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a1(int)"));
|
||||||
REQUIRE_THAT(puml, !HasCall(_A("B<int>"), _A("A<int>"), "a2"));
|
REQUIRE_THAT(puml, !HasCall(_A("B<int>"), _A("A<int>"), "a2(int)"));
|
||||||
REQUIRE_THAT(puml, !HasCall(_A("B<int>"), _A("A<int>"), "a3"));
|
REQUIRE_THAT(puml, !HasCall(_A("B<int>"), _A("A<int>"), "a3(int)"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<const char *>"), "b"));
|
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("B<const char *>"), _A("A<const char *>"), "a2"));
|
puml, HasCall(_A("tmain()"), _A("B<const char *>"), "b(const char *)"));
|
||||||
|
REQUIRE_THAT(puml,
|
||||||
|
HasCall(
|
||||||
|
_A("B<const char *>"), _A("A<const char *>"), "a2(const char *)"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b"));
|
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("B<std::string>"), _A("A<std::string>"), "a3"));
|
puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)"));
|
||||||
|
REQUIRE_THAT(puml,
|
||||||
|
HasCall(_A("B<std::string>"), _A("A<std::string>"), "a3(std::string)"));
|
||||||
|
|
||||||
save_puml(
|
save_puml(
|
||||||
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||||
|
|||||||
@@ -35,15 +35,16 @@ TEST_CASE("t20009", "[test-case][sequence]")
|
|||||||
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
||||||
|
|
||||||
// Check if all calls exist
|
// Check if all calls exist
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b"));
|
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("B<std::string>"), _A("A<std::string>"), "a"));
|
puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)"));
|
||||||
|
REQUIRE_THAT(puml,
|
||||||
|
HasCall(_A("B<std::string>"), _A("A<std::string>"), "a(std::string)"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a"));
|
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a(int)"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<float>"), "b"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<float>"), "b(float)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B<float>"), _A("A<float>"), "a"));
|
REQUIRE_THAT(puml, HasCall(_A("B<float>"), _A("A<float>"), "a(float)"));
|
||||||
save_puml(
|
save_puml(
|
||||||
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||||
}
|
}
|
||||||
@@ -35,17 +35,17 @@ TEST_CASE("t20010", "[test-case][sequence]")
|
|||||||
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
||||||
|
|
||||||
// Check if all calls exist
|
// Check if all calls exist
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b1"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b1()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a1"));
|
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a1()"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b2"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b2()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a2"));
|
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a2()"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b3"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b3()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a3"));
|
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a3()"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b4"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b4()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a4"));
|
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a4()"));
|
||||||
|
|
||||||
save_puml(
|
save_puml(
|
||||||
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||||
|
|||||||
@@ -35,13 +35,13 @@ TEST_CASE("t20011", "[test-case][sequence]")
|
|||||||
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
||||||
|
|
||||||
// Check if all calls exist
|
// Check if all calls exist
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "a"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "a(int)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "a"));
|
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "a(int)"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "b"));
|
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "b(int)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "c"));
|
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "c(int)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "d"));
|
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "d(int)"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "b"));
|
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "b(int)"));
|
||||||
|
|
||||||
save_puml(
|
save_puml(
|
||||||
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||||
|
|||||||
@@ -37,34 +37,34 @@ TEST_CASE("t20012", "[test-case][sequence]")
|
|||||||
// Check if all calls exist
|
// Check if all calls exist
|
||||||
REQUIRE_THAT(puml,
|
REQUIRE_THAT(puml,
|
||||||
HasCall(_A("tmain()"), _A("tmain()::(lambda t20012.cc:49:20)"),
|
HasCall(_A("tmain()"), _A("tmain()::(lambda t20012.cc:49:20)"),
|
||||||
"operator()"));
|
"operator()()"));
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("tmain()::(lambda t20012.cc:49:20)"), _A("A"), "a"));
|
puml, HasCall(_A("tmain()::(lambda t20012.cc:49:20)"), _A("A"), "a()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "aa"));
|
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "aa()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "aaa"));
|
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "aaa()"));
|
||||||
|
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("tmain()::(lambda t20012.cc:49:20)"), _A("B"), "b"));
|
puml, HasCall(_A("tmain()::(lambda t20012.cc:49:20)"), _A("B"), "b()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B"), _A("B"), "bb"));
|
REQUIRE_THAT(puml, HasCall(_A("B"), _A("B"), "bb()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("B"), _A("B"), "bbb"));
|
REQUIRE_THAT(puml, HasCall(_A("B"), _A("B"), "bbb()"));
|
||||||
|
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("tmain()::(lambda t20012.cc:62:20)"), _A("C"), "c"));
|
puml, HasCall(_A("tmain()::(lambda t20012.cc:62:20)"), _A("C"), "c()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("C"), _A("C"), "cc"));
|
REQUIRE_THAT(puml, HasCall(_A("C"), _A("C"), "cc()"));
|
||||||
REQUIRE_THAT(puml, HasCall(_A("C"), _A("C"), "ccc"));
|
REQUIRE_THAT(puml, HasCall(_A("C"), _A("C"), "ccc()"));
|
||||||
REQUIRE_THAT(puml,
|
REQUIRE_THAT(puml,
|
||||||
HasCall(_A("tmain()::(lambda t20012.cc:62:20)"),
|
HasCall(_A("tmain()::(lambda t20012.cc:62:20)"),
|
||||||
_A("tmain()::(lambda t20012.cc:49:20)"), "operator()"));
|
_A("tmain()::(lambda t20012.cc:49:20)"), "operator()()"));
|
||||||
|
|
||||||
REQUIRE_THAT(puml, HasCall(_A("C"), _A("C"), "ccc"));
|
REQUIRE_THAT(puml, HasCall(_A("C"), _A("C"), "ccc()"));
|
||||||
|
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(puml,
|
||||||
puml, HasCall(_A("tmain()"), _A("R<R::(lambda t20012.cc:68:9)>"), "r"));
|
HasCall(_A("tmain()"), _A("R<R::(lambda t20012.cc:68:9)>"), "r()"));
|
||||||
REQUIRE_THAT(puml,
|
REQUIRE_THAT(puml,
|
||||||
HasCall(_A("R<R::(lambda t20012.cc:68:9)>"),
|
HasCall(_A("R<R::(lambda t20012.cc:68:9)>"),
|
||||||
_A("tmain()::(lambda t20012.cc:68:9)"), "operator()"));
|
_A("tmain()::(lambda t20012.cc:68:9)"), "operator()()"));
|
||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
puml, HasCall(_A("tmain()::(lambda t20012.cc:68:9)"), _A("C"), "c"));
|
puml, HasCall(_A("tmain()::(lambda t20012.cc:68:9)"), _A("C"), "c()"));
|
||||||
|
|
||||||
save_puml(
|
save_puml(
|
||||||
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ ContainsMatcher HasCall(std::string const &from, std::string const &to,
|
|||||||
CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
|
CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
|
||||||
{
|
{
|
||||||
return ContainsMatcher(CasedString(
|
return ContainsMatcher(CasedString(
|
||||||
fmt::format("{} -> {} : {}", from, to, message), caseSensitivity));
|
fmt::format("{} -> {} : {}\n", from, to, message), caseSensitivity));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto HasCallWithResponse(std::string const &from, std::string const &to,
|
auto HasCallWithResponse(std::string const &from, std::string const &to,
|
||||||
|
|||||||
Reference in New Issue
Block a user