Skip to content

Commit b12f7b2

Browse files
authored
Merge pull request #315 from bkryza/fix-advanced-filter-with-paths
Fixed anyof advanced filter with paths filter (#314)
2 parents 88ea786 + 97da7c5 commit b12f7b2

File tree

6 files changed

+78
-4
lines changed

6 files changed

+78
-4
lines changed

src/common/model/diagram.cc

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,20 @@ bool diagram::should_include(const element &e) const
7474
if (filter_.get() == nullptr)
7575
return true;
7676

77-
if (!complete()) {
77+
// In the basic mode, apply the paths filter as soon as possible
78+
// to limit processing unnecessary files
79+
if (filter_->mode() == filter_mode_t::basic) {
7880
return filter_->should_include(
7981
dynamic_cast<const source_location &>(e));
8082
}
8183

82-
return filter_->should_include(e) &&
83-
filter_->should_include(dynamic_cast<const source_location &>(e));
84+
// In advanced mode, we have to wait until the diagram model is complete
85+
// before we can filter anything out
86+
if (filter_->mode() == filter_mode_t::advanced && !complete()) {
87+
return true;
88+
}
89+
90+
return filter_->should_include(e);
8491
}
8592

8693
bool diagram::should_include(const namespace_ &ns) const

src/common/model/filters/diagram_filter.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -983,6 +983,12 @@ tvl::value_t paths_filter::match(
983983
return false;
984984
}
985985

986+
tvl::value_t paths_filter::match(
987+
const diagram &d, const common::model::element &e) const
988+
{
989+
return match(d, dynamic_cast<const common::model::source_location &>(e));
990+
}
991+
986992
class_method_filter::class_method_filter(filter_t type,
987993
std::unique_ptr<access_filter> af, std::unique_ptr<method_type_filter> mtf)
988994
: filter_visitor{type}
@@ -1052,6 +1058,10 @@ bool diagram_filter::should_include(
10521058
return false;
10531059
}
10541060

1061+
filter_mode_t diagram_filter::mode() const { return mode_; }
1062+
1063+
void diagram_filter::set_mode(filter_mode_t mode) { mode_ = mode; }
1064+
10551065
template <>
10561066
bool diagram_filter::should_include<std::string>(const std::string &name) const
10571067
{

src/common/model/filters/diagram_filter.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,9 @@ struct paths_filter : public filter_visitor {
692692
tvl::value_t match(const diagram &d,
693693
const common::model::source_location &sl) const override;
694694

695+
tvl::value_t match(
696+
const diagram &d, const common::model::element &e) const override;
697+
695698
private:
696699
std::vector<std::filesystem::path> paths_;
697700
std::filesystem::path root_;
@@ -802,6 +805,10 @@ class diagram_filter {
802805
return static_cast<bool>(tvl::is_undefined(inc) || tvl::is_true(inc));
803806
}
804807

808+
filter_mode_t mode() const;
809+
810+
void set_mode(filter_mode_t mode);
811+
805812
friend class diagram_filter_factory;
806813

807814
private:
@@ -813,6 +820,8 @@ class diagram_filter {
813820

814821
/*! Reference to the diagram model */
815822
const common::model::diagram &diagram_;
823+
824+
filter_mode_t mode_{filter_mode_t::basic};
816825
};
817826

818827
template <typename Collection>

src/common/model/filters/diagram_filter_factory.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ class diagram_filter_factory {
110110
auto filter = std::make_unique<diagram_filter>(
111111
d, c, diagram_filter::private_constructor_tag_t{});
112112

113-
if (c.filter_mode() == config::filter_mode_t::basic) {
113+
filter->set_mode(c.filter_mode());
114+
115+
if (filter->mode() == config::filter_mode_t::basic) {
114116
basic_diagram_filter_initializer init{c, *filter};
115117
init.initialize();
116118
}

tests/test_config_data/filters_advanced.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ diagrams:
3737
anyof:
3838
namespaces:
3939
- ns1::ns2::detail
40+
anyof_paths_test:
41+
type: class
42+
relative_to: ../../../src
43+
glob:
44+
- src/**/*.cc
45+
- src/**/*.h
46+
include:
47+
anyof:
48+
paths:
49+
- .
50+
elements:
51+
- std::thread
4052
modules_test:
4153
type: class
4254
include:

tests/test_filters_advanced.cc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,40 @@ TEST_CASE("Test advanced diagram filter anyof")
9191
CHECK_FALSE(filter.should_include(namespace_{"ns1::ns2::detail"}));
9292
}
9393

94+
TEST_CASE("Test advanced diagram filter anyof with paths")
95+
{
96+
auto cfg =
97+
clanguml::config::load("./test_config_data/filters_advanced.yml");
98+
99+
auto &config = *cfg.diagrams["anyof_paths_test"];
100+
clanguml::include_diagram::model::diagram diagram;
101+
102+
diagram.set_complete(true);
103+
104+
auto filter_ptr = diagram_filter_factory::create(diagram, config);
105+
diagram_filter &filter = *filter_ptr;
106+
107+
CHECK(config.filter_mode() == filter_mode_t::advanced);
108+
109+
clanguml::common::model::element std_thread{{}};
110+
std_thread.set_namespace(namespace_{"std"});
111+
std_thread.set_name("thread");
112+
std_thread.set_file("/usr/include/thread");
113+
CHECK(filter.should_include(std_thread));
114+
115+
std_thread.set_name("jthread");
116+
CHECK_FALSE(filter.should_include(std_thread));
117+
118+
clanguml::common::model::element myclass{{}};
119+
myclass.set_namespace(namespace_{"myns"});
120+
myclass.set_name("myclass");
121+
122+
auto myclass_path = config.root_directory() / "include/myclass.h";
123+
124+
myclass.set_file(weakly_canonical(myclass_path).string());
125+
CHECK(filter.should_include(myclass));
126+
}
127+
94128
TEST_CASE("Test advanced diagram filter modules")
95129
{
96130
auto cfg =

0 commit comments

Comments
 (0)