Added option to skip redundant dependency relationships

This commit is contained in:
Bartek Kryza
2023-08-05 17:52:30 +02:00
parent f6efb7941f
commit 2e1013c12f
15 changed files with 108 additions and 34 deletions

View File

@@ -208,6 +208,33 @@ inja::json diagram::context() const
return ctx;
}
void diagram::remove_redundant_dependencies()
{
using common::id_t;
using common::model::relationship;
using common::model::relationship_t;
for (auto &c : element_view<class_>::view()) {
std::set<id_t> dependency_relationships_to_remove;
for (auto &r : c.get().relationships()) {
if (r.type() != relationship_t::kDependency)
dependency_relationships_to_remove.emplace(r.destination());
}
for (const auto &base : c.get().parents()) {
dependency_relationships_to_remove.emplace(base.id());
}
util::erase_if(c.get().relationships(),
[&dependency_relationships_to_remove](const auto &r) {
return r.type() == relationship_t::kDependency &&
dependency_relationships_to_remove.count(r.destination()) >
0;
});
}
}
} // namespace clanguml::class_diagram::model
namespace clanguml::common::model {

View File

@@ -227,6 +227,11 @@ public:
*/
bool has_element(diagram_element::id_t id) const override;
/**
* @brief Remove redundant dependency relationships
*/
void remove_redundant_dependencies();
/**
* @brief Return the elements JSON context for inja templates.
*

View File

@@ -2061,6 +2061,9 @@ void translation_unit_visitor::finalize()
{
add_incomplete_forward_declarations();
resolve_local_to_global_ids();
if (config().skip_redundant_dependencies()) {
diagram().remove_redundant_dependencies();
}
}
void translation_unit_visitor::extract_constrained_template_param_name(

View File

@@ -45,6 +45,13 @@ public:
*/
const reference_vector<T> &view() const { return elements_; }
/**
* @brief Get collection of reference to diagram elements
*
* @return
*/
reference_vector<T> &view() { return elements_; }
/**
* @brief Get typed diagram element by id
* @param id Global id of a diagram element

View File

@@ -189,6 +189,7 @@ void inheritable_diagram_options::inherit(
package_type.override(parent.package_type);
generate_template_argument_dependencies.override(
parent.generate_template_argument_dependencies);
skip_redundant_dependencies.override(parent.skip_redundant_dependencies);
generate_links.override(parent.generate_links);
generate_system_headers.override(parent.generate_system_headers);
git.override(parent.git);

View File

@@ -440,6 +440,8 @@ struct inheritable_diagram_options {
"package_type", package_type_t::kNamespace};
option<bool> generate_template_argument_dependencies{
"generate_template_argument_dependencies", true};
option<bool> skip_redundant_dependencies{
"skip_redundant_dependencies", true};
option<generate_links_config> generate_links{"generate_links"};
option<git_config> git{"git"};
option<layout_hints> layout{"layout"};

View File

@@ -160,6 +160,7 @@ types:
generate_packages: !optional bool
package_type: !optional package_type_t
generate_template_argument_dependencies: !optional bool
skip_redundant_dependencies: !optional bool
member_order: !optional member_order_t
group_methods: !optional bool
type_aliases: !optional map_t<string;string>
@@ -292,6 +293,7 @@ root:
group_methods: !optional bool
package_type: !optional package_type_t
generate_template_argument_dependencies: !optional bool
skip_redundant_dependencies: !optional bool
)";
} // namespace clanguml::config

View File

@@ -552,6 +552,7 @@ template <> struct convert<class_diagram> {
get_option(node, rhs.generate_packages);
get_option(node, rhs.package_type);
get_option(node, rhs.generate_template_argument_dependencies);
get_option(node, rhs.skip_redundant_dependencies);
get_option(node, rhs.relationship_hints);
get_option(node, rhs.type_aliases);
get_option(node, rhs.relative_to);
@@ -757,6 +758,7 @@ template <> struct convert<config> {
get_option(node, rhs.generate_packages);
get_option(node, rhs.package_type);
get_option(node, rhs.generate_template_argument_dependencies);
get_option(node, rhs.skip_redundant_dependencies);
get_option(node, rhs.generate_links);
get_option(node, rhs.generate_system_headers);
get_option(node, rhs.git);

View File

@@ -313,6 +313,7 @@ YAML::Emitter &operator<<(
out << c.member_order;
out << c.package_type;
out << c.generate_template_argument_dependencies;
out << c.skip_redundant_dependencies;
}
else if (dynamic_cast<const sequence_diagram *>(&c) != nullptr) {
out << c.combine_free_functions_into_file_participants;