diff --git a/docs/test_cases/t30001.md b/docs/test_cases/t30001.md index 8ebf3588..87bf01a4 100644 --- a/docs/test_cases/t30001.md +++ b/docs/test_cases/t30001.md @@ -25,7 +25,6 @@ diagrams: ## Source code File t30001.cc ```cpp - namespace clanguml { namespace t30001 { namespace A { @@ -48,8 +47,8 @@ namespace BBB { namespace BB { } // namespace BB } // namespace B -} -} +} // namespace t30001 +} // namespace clanguml ``` ## Generated UML diagrams diff --git a/docs/test_cases/t30001_package.png b/docs/test_cases/t30001_package.png index 4fcac29d..3b1bb436 100644 Binary files a/docs/test_cases/t30001_package.png and b/docs/test_cases/t30001_package.png differ diff --git a/src/package_diagram/generators/plantuml/package_diagram_generator.cc b/src/package_diagram/generators/plantuml/package_diagram_generator.cc index 6aa4b146..7545466e 100644 --- a/src/package_diagram/generators/plantuml/package_diagram_generator.cc +++ b/src/package_diagram/generators/plantuml/package_diagram_generator.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/generators/plantuml/class_diagram_generator.cc + * src/package_diagram/generators/plantuml/package_diagram_generator.cc * * Copyright (c) 2021-2022 Bartek Kryza * @@ -79,7 +79,8 @@ std::string generator::name(relationship_t r) const } } -void generator::generate(const package &p, std::ostream &ostr) const +void generator::generate( + const package &p, std::ostream &ostr) const { const auto uns = m_config.using_namespace; @@ -143,12 +144,8 @@ void generator::generate(std::ostream &ostr) const std::string note{b}; std::tuple alias_match; while (util::find_element_alias(note, alias_match)) { - auto full_name = - fmt::format("{}::{}", fmt::join(m_config.using_namespace, "::"), - ns_relative( - m_config.using_namespace, std::get<0>(alias_match))); - - auto alias = m_model.to_alias(full_name); + auto alias = m_model.to_alias(ns_relative( + m_config.using_namespace, std::get<0>(alias_match))); note.replace( std::get<1>(alias_match), std::get<2>(alias_match), alias); } diff --git a/src/package_diagram/visitor/translation_unit_visitor.cc b/src/package_diagram/visitor/translation_unit_visitor.cc index 2c5b660e..6a8c428b 100644 --- a/src/package_diagram/visitor/translation_unit_visitor.cc +++ b/src/package_diagram/visitor/translation_unit_visitor.cc @@ -90,12 +90,23 @@ void translation_unit_visitor::operator()(const cppast::cpp_entity &file) if (!ns_declaration.is_anonymous() && !ns_declaration.is_inline()) { - auto p = std::make_unique( - ctx.config().using_namespace); - p->set_name(e.name()); - p->set_namespace(ctx.get_namespace()); - ctx.diagram().add_package( - ctx.get_namespace(), std::move(p)); + auto package_path = ctx.get_namespace(); + package_path.push_back(e.name()); + + auto usn = + util::split(ctx.config().using_namespace[0], "::"); + + if (!starts_with(usn, package_path)) { + auto p = std::make_unique( + ctx.config().using_namespace); + remove_prefix(package_path, usn); + package_path.pop_back(); + + p->set_name(e.name()); + p->set_namespace(package_path); + ctx.diagram().add_package( + package_path, std::move(p)); + } ctx.push_namespace(e.name()); } diff --git a/src/util/util.h b/src/util/util.h index f773823a..da9f2544 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -145,4 +145,13 @@ bool starts_with(const std::vector &col, const std::vector &prefix) return std::vector(prefix.begin(), prefix.end()) == std::vector(col.begin(), col.begin() + prefix.size()); } + +template +void remove_prefix(std::vector &col, const std::vector &prefix) +{ + if(!starts_with(col, prefix)) + return; + + col = std::vector(col.begin()+prefix.size(), col.end()); +} }