Added option to enable rendering return types in sequence diagrams (fixes #93)

This commit is contained in:
Bartek Kryza
2023-07-04 00:38:42 +02:00
parent d944a2cead
commit 2104d930a8
19 changed files with 274 additions and 29 deletions

View File

@@ -166,7 +166,8 @@ void inheritable_diagram_options::inherit(
relative_to.override(parent.relative_to);
comment_parser.override(parent.comment_parser);
combine_free_functions_into_file_participants.override(
combine_free_functions_into_file_participants);
parent.combine_free_functions_into_file_participants);
generate_return_types.override(parent.generate_return_types);
debug_mode.override(parent.debug_mode);
generate_metadata.override(parent.generate_metadata);
}

View File

@@ -445,6 +445,7 @@ struct inheritable_diagram_options {
"comment_parser", comment_parser_t::plain};
option<bool> combine_free_functions_into_file_participants{
"combine_free_functions_into_file_participants", false};
option<bool> generate_return_types{"generate_return_types", false};
option<std::vector<std::string>> participants_order{"participants_order"};
option<bool> debug_mode{"debug_mode", false};
option<bool> generate_metadata{"generate_metadata", true};

View File

@@ -513,6 +513,7 @@ template <> struct convert<git_config> {
template <typename T> bool decode_diagram(const Node &node, T &rhs)
{
// Decode options common for all diagrams
get_option(node, rhs.glob);
get_option(node, rhs.using_namespace);
get_option(node, rhs.include);
@@ -566,6 +567,7 @@ template <> struct convert<sequence_diagram> {
get_option(node, rhs.start_from);
get_option(node, rhs.combine_free_functions_into_file_participants);
get_option(node, rhs.generate_return_types);
get_option(node, rhs.relative_to);
get_option(node, rhs.participants_order);
get_option(node, rhs.generate_method_arguments);
@@ -752,6 +754,9 @@ template <> struct convert<config> {
get_option(node, rhs.comment_parser);
get_option(node, rhs.debug_mode);
get_option(node, rhs.generate_metadata);
get_option(node, rhs.combine_free_functions_into_file_participants);
get_option(node, rhs.generate_return_types);
rhs.base_directory.set(node["__parent_path"].as<std::string>());
get_option(node, rhs.relative_to);

View File

@@ -289,6 +289,7 @@ YAML::Emitter &operator<<(
}
out << c.comment_parser;
out << c.combine_free_functions_into_file_participants;
out << c.generate_return_types;
out << c.participants_order;
out << c.debug_mode;

View File

@@ -645,16 +645,15 @@ void generator::generate(std::ostream &ostr) const
generate_activity(
m_model.get_activity(start_from), visited_participants);
json_["sequences"].push_back(std::move(sequence));
block_statements_stack_.pop_back();
if (from.value().type_name() == "method" ||
m_config.combine_free_functions_into_file_participants()) {
// TODO
// sequence["return_type"] = from.value().id()
sequence["return_type"] = from.value().return_type();
}
json_["sequences"].push_back(std::move(sequence));
}
else {
// TODO: Add support for other sequence start location types

View File

@@ -128,7 +128,13 @@ void generator::generate_return(const message &m, std::ostream &ostr) const
ostr << to_alias << " "
<< common::generators::plantuml::to_plantuml(message_t::kReturn)
<< " " << from_alias << '\n';
<< " " << from_alias;
if (m_config.generate_return_types()) {
ostr << " : //" << m.return_type() << "//";
}
ostr << '\n';
}
}
@@ -451,7 +457,12 @@ void generator::generate(std::ostream &ostr) const
if (!from.value().is_void()) {
ostr << "[<--"
<< " " << from_alias << std::endl;
<< " " << from_alias;
if (m_config.generate_return_types())
ostr << " : //" << from.value().return_type() << "//";
ostr << '\n';
}
}

View File

@@ -312,6 +312,16 @@ void diagram::finalize()
assert(block_nest_level >= 0);
}
else {
if (m.type() == message_t::kCall) {
// Set the message return type based on the callee return
// type
auto to_participant =
get_participant<sequence_diagram::model::function>(
m.to());
if (to_participant.has_value()) {
m.set_return_type(to_participant.value().return_type());
}
}
block_message_stack.back().push_back(m);
}
}

View File

@@ -147,6 +147,10 @@ bool function::is_operator() const { return is_operator_; }
void function::is_operator(bool o) { is_operator_ = o; }
void function::return_type(const std::string &rt) { return_type_ = rt; }
const std::string &function::return_type() const { return return_type_; }
void function::add_parameter(const std::string &a) { parameters_.push_back(a); }
const std::vector<std::string> &function::parameters() const

View File

@@ -291,6 +291,20 @@ struct function : public participant {
*/
void is_operator(bool o);
/**
* @brief Set functions return type
*
* @param rt Return type
*/
void return_type(const std::string &rt);
/**
* @brief Get function return type
*
* @return Return type
*/
const std::string &return_type() const;
/**
* @brief Add a function parameter
*
@@ -313,6 +327,7 @@ private:
bool is_void_{false};
bool is_static_{false};
bool is_operator_{false};
std::string return_type_;
std::vector<std::string> parameters_;
};

View File

@@ -972,13 +972,6 @@ bool translation_unit_visitor::VisitCallExpr(clang::CallExpr *expr)
}
}
//
// This crashes on LLVM <= 12, for now just return empty type
//
// const auto &return_type =
// function_call_expr->getCallReturnType(current_ast_context);
// m.return_type = return_type.getAsString();
if (m.from() > 0 && m.to() > 0) {
if (diagram().sequences().find(m.from()) ==
diagram().sequences().end()) {
@@ -1550,6 +1543,10 @@ translation_unit_visitor::build_function_template(
process_template_parameters(declaration, *function_template_model_ptr);
function_template_model_ptr->return_type(
common::to_string(declaration.getAsFunction()->getReturnType(),
declaration.getASTContext()));
for (const auto *param : declaration.getTemplatedDecl()->parameters()) {
function_template_model_ptr->add_parameter(
simplify_system_template(common::to_string(
@@ -1612,6 +1609,9 @@ std::unique_ptr<model::function> translation_unit_visitor::build_function_model(
ns.pop_back();
function_model_ptr->set_namespace(ns);
function_model_ptr->return_type(common::to_string(
declaration.getReturnType(), declaration.getASTContext()));
for (const auto *param : declaration.parameters()) {
function_model_ptr->add_parameter(
simplify_system_template(common::to_string(
@@ -2337,6 +2337,9 @@ translation_unit_visitor::create_method_model(clang::CXXMethodDecl *declaration)
"::" + declaration->getNameAsString());
method_model_ptr->is_static(declaration->isStatic());
method_model_ptr->return_type(common::to_string(
declaration->getReturnType(), declaration->getASTContext()));
for (const auto *param : declaration->parameters()) {
method_model_ptr->add_parameter(config().using_namespace().relative(
simplify_system_template(common::to_string(