Added handling of inline namespaces

This commit is contained in:
Bartek Kryza
2021-05-02 21:02:05 +02:00
parent cf1bdabeec
commit d6552dc629
5 changed files with 79 additions and 6 deletions

54
docs/test_cases/t00015.md Normal file
View File

@@ -0,0 +1,54 @@
# t00015 - Namespace fun
## Config
```yaml
compilation_database_dir: ..
output_directory: puml
diagrams:
t00015_class:
type: class
glob:
- ../../tests/t00015/t00015.cc
using_namespace:
- clanguml::t00015
include:
namespaces:
- clanguml::t00015
```
## Source code
```cpp
namespace clanguml {
namespace t00015 {
namespace ns1 {
inline namespace ns2_v1_0_0 {
class A {
};
}
namespace ns2_v0_9_0 {
class [[deprecated]] A {};
}
namespace {
class Anon final : public A {
};
}
}
namespace ns3 {
namespace ns1::ns2 {
class Anon : public t00015::ns1::A {
};
}
class B : public ns1::ns2::Anon {
};
}
}
}
```
## Generated UML diagrams
![t00015_class](./t00015_class.png "Namespace fun")

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -25,6 +25,7 @@
#include <cppast/cpp_friend.hpp>
#include <cppast/cpp_member_function.hpp>
#include <cppast/cpp_member_variable.hpp>
#include <cppast/cpp_namespace.hpp>
#include <cppast/cpp_template.hpp>
#include <cppast/cpp_type_alias.hpp>
#include <cppast/cpp_variable.hpp>
@@ -78,12 +79,22 @@ void tu_visitor::operator()(const cppast::cpp_entity &file)
cppast::visitor_info::container_entity_enter) {
LOG_DBG("========== Visiting '{}' - {}", e.name(),
cppast::to_string(e.kind()));
ctx.namespace_.push_back(e.name());
const auto &ns_declaration =
static_cast<const cppast::cpp_namespace &>(e);
if (!ns_declaration.is_anonymous() &&
!ns_declaration.is_inline())
ctx.namespace_.push_back(e.name());
}
else {
LOG_DBG("========== Leaving '{}' - {}", e.name(),
cppast::to_string(e.kind()));
ctx.namespace_.pop_back();
const auto &ns_declaration =
static_cast<const cppast::cpp_namespace &>(e);
if (!ns_declaration.is_anonymous() &&
!ns_declaration.is_inline())
ctx.namespace_.pop_back();
}
}
else if (e.kind() == cppast::cpp_entity_kind::class_t) {

View File

@@ -1,9 +1,15 @@
namespace clanguml {
namespace t00015 {
namespace ns1::ns2 {
namespace ns1 {
inline namespace ns2_v1_0_0 {
class A {
};
}
namespace ns2_v0_9_0 {
class [[deprecated]] A {};
}
namespace {
class Anon final : public A {
@@ -14,7 +20,7 @@ class Anon final : public A {
namespace ns3 {
namespace ns1::ns2 {
class Anon : public t00015::ns1::ns2::A {
class Anon : public t00015::ns1::A {
};
}

View File

@@ -41,8 +41,10 @@ TEST_CASE("t00015", "[test-case][class]")
REQUIRE_THAT(puml, StartsWith("@startuml"));
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::A")));
REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::Anon")));
REQUIRE_THAT(puml, IsClass(_A("ns1::A")));
REQUIRE_THAT(puml, IsClass(_A("ns1::ns2_v0_9_0::A")));
REQUIRE_THAT(puml, IsClass(_A("ns1::Anon")));
REQUIRE_THAT(puml, IsClass(_A("ns3::ns1::ns2::Anon")));
REQUIRE_THAT(puml, IsClass(_A("ns3::B")));
save_puml(