From 35cf1f6e9b6694c6fec50c82bba0020fd7a058a3 Mon Sep 17 00:00:00 2001 From: Alan de Freitas Date: Tue, 28 Oct 2025 12:54:47 -0500 Subject: [PATCH] fix: UsingSymbol is SymbolParent --- include/mrdocs/Metadata/Symbol/Using.hpp | 9 +++++++++ src/lib/AST/ASTVisitor.cpp | 7 +++++++ src/lib/AST/ASTVisitor.hpp | 3 +++ src/lib/Gen/hbs/MultiPageVisitor.cpp | 1 + src/lib/Gen/hbs/SinglePageVisitor.cpp | 1 + src/lib/Support/LegibleNames.cpp | 22 +++++++++++++++++++-- test-files/golden-tests/regression/1057.yml | 1 + 7 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 test-files/golden-tests/regression/1057.yml diff --git a/include/mrdocs/Metadata/Symbol/Using.hpp b/include/mrdocs/Metadata/Symbol/Using.hpp index 59c581bf5d..bc2daca435 100644 --- a/include/mrdocs/Metadata/Symbol/Using.hpp +++ b/include/mrdocs/Metadata/Symbol/Using.hpp @@ -174,6 +174,15 @@ tag_invoke( v = dom::LazyObject(I, domCorpus); } +inline +auto& +allMembers(UsingSymbol const& T) +{ + return T.ShadowDeclarations; +} + +static_assert(SymbolParent); + } // mrdocs #endif // MRDOCS_API_METADATA_SYMBOL_USING_HPP diff --git a/src/lib/AST/ASTVisitor.cpp b/src/lib/AST/ASTVisitor.cpp index 303a8e12ce..f3a0a4c476 100644 --- a/src/lib/AST/ASTVisitor.cpp +++ b/src/lib/AST/ASTVisitor.cpp @@ -1904,6 +1904,13 @@ addMember(OverloadsSymbol& I, Symbol const& Member) const I.Name); } +void +ASTVisitor:: +addMember(UsingSymbol& I, Symbol const& Member) const +{ + addMember(I.ShadowDeclarations, Member); +} + void ASTVisitor:: addMember(std::vector& container, Symbol const& Member) const diff --git a/src/lib/AST/ASTVisitor.hpp b/src/lib/AST/ASTVisitor.hpp index 7d2130f3d0..1b8093a124 100644 --- a/src/lib/AST/ASTVisitor.hpp +++ b/src/lib/AST/ASTVisitor.hpp @@ -759,6 +759,9 @@ class ASTVisitor void addMember(OverloadsSymbol& I, Symbol const& Member) const; + void + addMember(UsingSymbol& I, Symbol const& Member) const; + void addMember(std::vector& container, Symbol const& Member) const; diff --git a/src/lib/Gen/hbs/MultiPageVisitor.cpp b/src/lib/Gen/hbs/MultiPageVisitor.cpp index 5096b3f442..cc44522c65 100644 --- a/src/lib/Gen/hbs/MultiPageVisitor.cpp +++ b/src/lib/Gen/hbs/MultiPageVisitor.cpp @@ -68,6 +68,7 @@ operator()(T const& I) // =================================== // Traverse the symbol members // =================================== + MRDOCS_CHECK_OR_VOID(!I.isUsing()); Corpus::TraverseOptions opts = {.skipInherited = std::same_as}; corpus_.traverse(opts, I, *this); }); diff --git a/src/lib/Gen/hbs/SinglePageVisitor.cpp b/src/lib/Gen/hbs/SinglePageVisitor.cpp index 28cd26a3c9..295d053336 100644 --- a/src/lib/Gen/hbs/SinglePageVisitor.cpp +++ b/src/lib/Gen/hbs/SinglePageVisitor.cpp @@ -38,6 +38,7 @@ operator()(T const& I) } }); } + MRDOCS_CHECK_OR_VOID(!I.isUsing()); Corpus::TraverseOptions opts = {.skipInherited = std::same_as}; corpus_.traverse(opts, I, *this); } diff --git a/src/lib/Support/LegibleNames.cpp b/src/lib/Support/LegibleNames.cpp index c9c91daf1f..bca33e95de 100644 --- a/src/lib/Support/LegibleNames.cpp +++ b/src/lib/Support/LegibleNames.cpp @@ -291,8 +291,26 @@ class LegibleNames::Impl MRDOCS_ASSERT(corpus_.exists(id)); // Find the legible name information for this symbol - auto const it = map_.find(id); - MRDOCS_ASSERT(it != map_.end()); + auto it = map_.find(id); + if (it == map_.end()) + { + // Late-build a legible name for this symbol. + // NOTE: This may not perfectly disambiguate against siblings + // because the per-scope disambiguation_map_ is ephemeral, + // but it avoids a hard crash and produces a stable name. + Symbol const& I = corpus_.get(id); + auto const raw = getRawUnqualified(I); + buildLegibleMember(I, raw); + it = map_.find(I.id); + if (it == map_.end()) + { + // Final, robust fallback: emit the raw SymbolID (legible-ish), + // and return without crashing. + result.append(toBase16(I.id)); + return; + } + } + auto& [unqualified, n_disambig, id_str] = it->second; // Append the unqualified name to the result diff --git a/test-files/golden-tests/regression/1057.yml b/test-files/golden-tests/regression/1057.yml new file mode 100644 index 0000000000..c5464a44cd --- /dev/null +++ b/test-files/golden-tests/regression/1057.yml @@ -0,0 +1 @@ +warn-if-undoc-enum-val: false \ No newline at end of file