From 24085f6d84d4bc3b061b9142406f544418d58a2d Mon Sep 17 00:00:00 2001 From: Erick Velez Date: Fri, 10 Oct 2025 09:52:49 -0700 Subject: [PATCH] [clang-doc] create namespace names according to their paths Namespace filenames didn't consider their paths, so foo::tools would use the same file as bar::tools. Now we consider their paths to avoid that problem. --- clang-tools-extra/clang-doc/JSONGenerator.cpp | 10 +++++++++- .../clang-doc/json/multiple-namespaces.cpp | 20 +++++++++++++++++++ .../test/clang-doc/json/nested-namespace.cpp | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 clang-tools-extra/test/clang-doc/json/multiple-namespaces.cpp diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 6fba2114b8c38..b17cc80bdba34 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -584,12 +584,20 @@ static SmallString<16> determineFileName(Info *I, SmallString<128> &Path) { FileName = RecordSymbolInfo->MangledName; } else if (I->USR == GlobalNamespaceID) FileName = "index"; - else + else if (I->IT == InfoType::IT_namespace) { + for (const auto &NS : I->Namespace) { + FileName += NS.Name; + FileName += "_"; + } + FileName += I->Name; + } else FileName = I->Name; sys::path::append(Path, FileName + ".json"); return FileName; } +// FIXME: Revert back to creating nested directories for namespaces instead of +// putting everything in a flat directory structure. Error JSONGenerator::generateDocs( StringRef RootDir, llvm::StringMap> Infos, const ClangDocContext &CDCtx) { diff --git a/clang-tools-extra/test/clang-doc/json/multiple-namespaces.cpp b/clang-tools-extra/test/clang-doc/json/multiple-namespaces.cpp new file mode 100644 index 0000000000000..04fcfc1dc0a85 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/json/multiple-namespaces.cpp @@ -0,0 +1,20 @@ +// RUN: rm -rf %t && mkdir -p %t +// RUN: clang-doc --output=%t --format=json --executor=standalone %s +// RUN: FileCheck %s < %t/json/foo_tools.json --check-prefix=CHECK-FOO +// RUN: FileCheck %s < %t/json/bar_tools.json --check-prefix=CHECK-BAR + +namespace foo { + namespace tools { + class FooTools {}; + } // namespace tools +} // namespace foo + +namespace bar { + namespace tools { + class BarTools {}; + } // namespace tools +} // namespace bar + +// CHECK-FOO: "Name": "tools" + +// CHECK-BAR: "Name": "tools" diff --git a/clang-tools-extra/test/clang-doc/json/nested-namespace.cpp b/clang-tools-extra/test/clang-doc/json/nested-namespace.cpp index b19afc1885104..cf19e1e34a818 100644 --- a/clang-tools-extra/test/clang-doc/json/nested-namespace.cpp +++ b/clang-tools-extra/test/clang-doc/json/nested-namespace.cpp @@ -1,7 +1,7 @@ // RUN: rm -rf %t && mkdir -p %t // RUN: clang-doc --output=%t --format=json --executor=standalone %s // RUN: FileCheck %s < %t/json/nested.json --check-prefix=NESTED -// RUN: FileCheck %s < %t/json/inner.json --check-prefix=INNER +// RUN: FileCheck %s < %t/json/nested_inner.json --check-prefix=INNER namespace nested { int Global;