Added option to skip redundant dependency relationships
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"};
|
||||
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user