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_friend.hpp>
|
||||||
#include <cppast/cpp_member_function.hpp>
|
#include <cppast/cpp_member_function.hpp>
|
||||||
#include <cppast/cpp_member_variable.hpp>
|
#include <cppast/cpp_member_variable.hpp>
|
||||||
|
#include <cppast/cpp_namespace.hpp>
|
||||||
#include <cppast/cpp_template.hpp>
|
#include <cppast/cpp_template.hpp>
|
||||||
#include <cppast/cpp_type_alias.hpp>
|
#include <cppast/cpp_type_alias.hpp>
|
||||||
#include <cppast/cpp_variable.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) {
|
cppast::visitor_info::container_entity_enter) {
|
||||||
LOG_DBG("========== Visiting '{}' - {}", e.name(),
|
LOG_DBG("========== Visiting '{}' - {}", e.name(),
|
||||||
cppast::to_string(e.kind()));
|
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 {
|
else {
|
||||||
LOG_DBG("========== Leaving '{}' - {}", e.name(),
|
LOG_DBG("========== Leaving '{}' - {}", e.name(),
|
||||||
cppast::to_string(e.kind()));
|
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) {
|
else if (e.kind() == cppast::cpp_entity_kind::class_t) {
|
||||||
|
|||||||
@@ -1,9 +1,15 @@
|
|||||||
namespace clanguml {
|
namespace clanguml {
|
||||||
namespace t00015 {
|
namespace t00015 {
|
||||||
|
|
||||||
namespace ns1::ns2 {
|
namespace ns1 {
|
||||||
|
inline namespace ns2_v1_0_0 {
|
||||||
class A {
|
class A {
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace ns2_v0_9_0 {
|
||||||
|
class [[deprecated]] A {};
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
class Anon final : public A {
|
class Anon final : public A {
|
||||||
@@ -14,7 +20,7 @@ class Anon final : public A {
|
|||||||
namespace ns3 {
|
namespace ns3 {
|
||||||
|
|
||||||
namespace ns1::ns2 {
|
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, StartsWith("@startuml"));
|
||||||
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
||||||
REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::A")));
|
REQUIRE_THAT(puml, IsClass(_A("ns1::A")));
|
||||||
REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::Anon")));
|
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")));
|
REQUIRE_THAT(puml, IsClass(_A("ns3::B")));
|
||||||
|
|
||||||
save_puml(
|
save_puml(
|
||||||
|
|||||||
Reference in New Issue
Block a user