Added handling of inline namespaces
This commit is contained in:
54
docs/test_cases/t00015.md
Normal file
54
docs/test_cases/t00015.md
Normal 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
|
||||

|
||||
BIN
docs/test_cases/t00015_class.png
Normal file
BIN
docs/test_cases/t00015_class.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user