From b7b2f37e134ea3be151b5db409cc2862605c380f Mon Sep 17 00:00:00 2001 From: alandefreitas Date: Mon, 20 Jan 2025 17:11:58 -0300 Subject: [PATCH] extract dependency base class members #feat --- src/lib/AST/ASTVisitor.cpp | 70 ++++--- src/lib/AST/ASTVisitor.hpp | 62 +++++- src/lib/AST/ClangHelpers.cpp | 6 + src/lib/Metadata/Interface.cpp | 144 +++++++++---- .../symbol-name/excluded-base-class.adoc | 166 +++++++++++++++ .../symbol-name/excluded-base-class.cpp | 32 +++ .../symbol-name/excluded-base-class.html | 195 ++++++++++++++++++ .../symbol-name/excluded-base-class.xml | 38 ++++ .../symbol-name/excluded-base-class.yml | 3 + test-files/golden-tests/javadoc/ref.adoc | 2 +- test-files/golden-tests/javadoc/ref.html | 2 +- test-files/golden-tests/metadata/mem-fn.adoc | 4 +- test-files/golden-tests/metadata/mem-fn.html | 4 +- 13 files changed, 649 insertions(+), 79 deletions(-) create mode 100644 test-files/golden-tests/filters/symbol-name/excluded-base-class.adoc create mode 100644 test-files/golden-tests/filters/symbol-name/excluded-base-class.cpp create mode 100644 test-files/golden-tests/filters/symbol-name/excluded-base-class.html create mode 100644 test-files/golden-tests/filters/symbol-name/excluded-base-class.xml create mode 100644 test-files/golden-tests/filters/symbol-name/excluded-base-class.yml diff --git a/src/lib/AST/ASTVisitor.cpp b/src/lib/AST/ASTVisitor.cpp index 1ab9e0f5a..f4d0aa7b0 100644 --- a/src/lib/AST/ASTVisitor.cpp +++ b/src/lib/AST/ASTVisitor.cpp @@ -160,7 +160,7 @@ ASTVisitor:: traverse(UsingDirectiveDecl* D) { // Find the parent namespace - ScopeExitRestore s1(mode_, ExtractionMode::Dependency); + ScopeExitRestore s1(mode_, TraversalMode::Dependency); Decl* P = getParent(D); MRDOCS_SYMBOL_TRACE(P, context_); Info* PI = findOrTraverse(P); @@ -171,7 +171,7 @@ traverse(UsingDirectiveDecl* D) // Find the nominated namespace Decl* ND = D->getNominatedNamespace(); MRDOCS_SYMBOL_TRACE(ND, context_); - ScopeExitRestore s2(mode_, ExtractionMode::Dependency); + ScopeExitRestore s2(mode_, TraversalMode::Dependency); Info* NDI = findOrTraverse(ND); MRDOCS_CHECK_OR(NDI, nullptr); @@ -205,29 +205,35 @@ traverseMembers(InfoTy& I, DeclTy* DC) std::derived_from) { // We only need members of regular symbols and see-below namespaces - // - SeeBelow symbols (that are not namespaces) are only the - // symbol and the documentation. - // - ImplementationDefined symbols have no pages - // - Dependency symbols only need the names - MRDOCS_CHECK_OR( - I.Extraction == ExtractionMode::Regular || - I.Extraction == ExtractionMode::SeeBelow); + // - If symbol is SeeBelow we want the members if it's a namespace MRDOCS_CHECK_OR( I.Extraction != ExtractionMode::SeeBelow || I.Kind == InfoKind::Namespace); - // Set the context for the members - ScopeExitRestore s(mode_, I.Extraction); + // - If symbol is a Dependency, we only want the members if + // the traversal mode is BaseClass + MRDOCS_CHECK_OR( + I.Extraction != ExtractionMode::Dependency || + mode_ == TraversalMode::BaseClass); - // There are many implicit declarations in the - // translation unit declaration, so we preemtively - // skip them here. + // - If symbol is ImplementationDefined, we only want the members if + // the traversal mode is BaseClass + MRDOCS_CHECK_OR( + I.Extraction != ExtractionMode::ImplementationDefined || + mode_ == TraversalMode::BaseClass); + + // There are many implicit declarations, especially in the + // translation unit declaration, so we preemtively skip them here. auto explicitMembers = std::ranges::views::filter(DC->decls(), [](Decl* D) { return !D->isImplicit() || isa(D); }); for (auto* D : explicitMembers) { + // No matter what happens in the process, we restore the + // traversal mode to the original mode for the next member + ScopeExitRestore s(mode_); + // Traverse the member traverse(D); } } @@ -259,12 +265,11 @@ traverseParents(InfoTy& I, DeclTy* DC) // Check if we haven't already extracted or started // to extract the parent scope - // Traverse the parent scope as a dependency if it // hasn't been extracted yet Info* PI = nullptr; { - ScopeExitRestore s(mode_, ExtractionMode::Dependency); + ScopeExitRestore s(mode_, Dependency); if (PI = findOrTraverse(PD); !PI) { return; @@ -548,7 +553,7 @@ populateInfoBases(InfoTy& I, bool const isNew, DeclTy* D) I.Extraction = ExtractionMode::Regular; // default mode also becomes regular for its // members - mode_ = ExtractionMode::Regular; + mode_ = TraversalMode::Regular; } } @@ -773,7 +778,7 @@ populate( } QualType const BT = B.getType(); - auto BaseType = toTypeInfo(BT); + auto BaseType = toTypeInfo(BT, BaseClass); // CXXBaseSpecifier::getEllipsisLoc indicates whether the // base was a pack expansion; a PackExpansionType is not built @@ -1210,10 +1215,9 @@ populate( I.Qualifier = toNameInfo(D->getQualifier()); for (UsingShadowDecl const* UDS: D->shadows()) { - ScopeExitRestore s(mode_, ExtractionMode::Dependency); + ScopeExitRestore s(mode_, Dependency); Decl* S = UDS->getTargetDecl(); - Info* SI = findOrTraverse(S); - if (SI) + if (Info* SI = findOrTraverse(S)) { I.UsingSymbols.emplace_back(SI->id); } @@ -1647,7 +1651,7 @@ generateJavadoc( std::unique_ptr ASTVisitor:: -toTypeInfo(QualType const qt) +toTypeInfo(QualType const qt, TraversalMode const mode) { MRDOCS_SYMBOL_TRACE(qt, context_); @@ -1655,7 +1659,7 @@ toTypeInfo(QualType const qt) // For library types, can be proved wrong and the Info type promoted // to a regular type later on if the type matches the regular // extraction criteria - ScopeExitRestore s(mode_, ExtractionMode::Dependency); + ScopeExitRestore s(mode_, mode); // Build the TypeInfo representation for the type TypeInfoBuilder Builder(*this); @@ -1674,7 +1678,7 @@ toNameInfo( } MRDOCS_SYMBOL_TRACE(NNS, context_); - ScopeExitRestore scope(mode_,ExtractionMode::Dependency); + ScopeExitRestore scope(mode_, Dependency); std::unique_ptr I = nullptr; if (const Type* T = NNS->getAsType()) { @@ -1763,7 +1767,7 @@ toNameInfo( { return nullptr; } - ScopeExitRestore scope(mode_, ExtractionMode::Dependency); + ScopeExitRestore scope(mode_, Dependency); auto* ID = getInstantiatedFrom(D); if (Info const* info = findOrTraverse(const_cast(ID))) { @@ -2397,7 +2401,7 @@ shouldExtract( MRDOCS_CHECK_OR(!isa(D), true); // Check if this kind of symbol should be extracted. - // This filters symbols supported by mrdocs and + // This filters symbols supported by MrDocs and // symbol types whitelisted in the configuration, // such as private members and anonymous namespaces. MRDOCS_CHECK_OR(checkTypeFilters(D, access), false); @@ -2405,7 +2409,7 @@ shouldExtract( // In dependency mode, we don't need the file and symbol // filters because this is a dependency of another // declaration that passes the filters. - if (mode_ == ExtractionMode::Dependency) + if (mode_ != TraversalMode::Regular) { // If the whole declaration is implicit, we should // not promote the extraction mode to regular @@ -2426,7 +2430,7 @@ shouldExtract( if (checkSymbolFilters(D) && checkFileFilters(D)) { - mode_ = ExtractionMode::Regular; + mode_ = TraversalMode::Regular; } // But we return true either way return true; @@ -2477,7 +2481,7 @@ checkTypeFilters(Decl const* D, AccessSpecifier access) // KRYSTIAN FIXME: is this correct? a namespace should not // be extracted as a dependency (until namespace aliases and // using directives are supported) - MRDOCS_CHECK_OR(mode_ == ExtractionMode::Regular, false); + MRDOCS_CHECK_OR(mode_ == TraversalMode::Regular, false); } return true; @@ -2832,7 +2836,9 @@ upsert(SymbolID const& id) { info = info_.emplace(std::make_unique< InfoTy>(id)).first->get(); - info->Extraction = mostSpecific(info->Extraction, mode_); + auto const minExtract = mode_ == TraversalMode::Regular ? + ExtractionMode::Regular : ExtractionMode::Dependency; + info->Extraction = mostSpecific(info->Extraction, minExtract); } MRDOCS_ASSERT(info->Kind == InfoTy::kind_id); return {static_cast(*info), isNew}; @@ -2873,11 +2879,11 @@ upsert(DeclType* D) // this time. bool const previouslyExtractedAsDependency = !isNew && - mode_ != ExtractionMode::Dependency && + mode_ != TraversalMode::Dependency && I.Extraction == ExtractionMode::Dependency; if (previouslyExtractedAsDependency) { - I.Extraction = mostSpecific(I.Extraction, mode_); + I.Extraction = mostSpecific(I.Extraction, ExtractionMode::Regular); isNew = true; } diff --git a/src/lib/AST/ASTVisitor.hpp b/src/lib/AST/ASTVisitor.hpp index fec2b9aee..16062b8b5 100644 --- a/src/lib/AST/ASTVisitor.hpp +++ b/src/lib/AST/ASTVisitor.hpp @@ -118,9 +118,55 @@ class ASTVisitor */ std::unordered_map files_; - /* The current extraction mode + /* How we should traverse the current node + */ + enum TraversalMode { + /* Only symbols that pass the filters will be extracted + + Excluded symbols are not traversed. All other symbols + are traversed and their appropriate ExtractionMode + is determined. + + Member of these symbols are also traversed. + + */ + Regular, + + /* All symbols are extracted + + Even excluded symbols are traversed. If a sy bol + doesn't pass the filters, it is extracted as a + dependency. + + Members of these dependency symbols are not + traversed. + + This is used when an included symbol makes a + reference to an excluded symbol. + */ + Dependency, + + /* All symbols will be extracted and traversed - This defines the extraction mode assigned to + This mode is used to extract all symbols, including + those that are excluded by the filters. These + excluded symbols are marked as dependencies. + + However, members of these dependency symbols are + also traversed. + + This is used when an included record makes use + of an excluded record as a base class. + In this case, we also need information about the + excluded base class members to populate the + derived class. + */ + BaseClass + }; + + /* The current traversal mode + + This defines the traversal mode assigned to new Info types. A symbol that passes the filters will be @@ -128,7 +174,7 @@ class ASTVisitor If a symbol also passes the see-below or implementation-defined filters, we - change the current extraction mode + change the current traversal mode accordingly so the symbol can be tagged. Members of this symbol types are not extracted. @@ -139,7 +185,7 @@ class ASTVisitor when another symbol makes a reference to it. */ - ExtractionMode mode_ = ExtractionMode::Regular; + TraversalMode mode_ = Regular; public: /** Constructor for ASTVisitor. @@ -573,7 +619,13 @@ class ASTVisitor Decl const* D); std::unique_ptr - toTypeInfo(QualType qt); + toTypeInfo(QualType qt, TraversalMode mode); + + std::unique_ptr + toTypeInfo(QualType qt) + { + return toTypeInfo(qt, TraversalMode::Dependency); + } std::unique_ptr toNameInfo( diff --git a/src/lib/AST/ClangHelpers.cpp b/src/lib/AST/ClangHelpers.cpp index 21101853c..b2cd4391e 100644 --- a/src/lib/AST/ClangHelpers.cpp +++ b/src/lib/AST/ClangHelpers.cpp @@ -334,6 +334,12 @@ isAllImplicit(Decl const* D) { return false; } + else if (auto const* TSD = dynamic_cast(D); + TSD && + TSD->isExplicitSpecialization()) + { + return false; + } auto const* P = getParent(D); return isAllImplicit(P); } diff --git a/src/lib/Metadata/Interface.cpp b/src/lib/Metadata/Interface.cpp index 62ff8387c..e8af6d5a5 100644 --- a/src/lib/Metadata/Interface.cpp +++ b/src/lib/Metadata/Interface.cpp @@ -9,23 +9,24 @@ // Official repository: https://github.com/cppalliance/mrdocs // +#include "lib/Dom/LazyArray.hpp" #include "lib/Lib/ConfigImpl.hpp" #include "lib/Support/Debug.hpp" -#include "lib/Dom/LazyArray.hpp" -#include -#include -#include +#include "mrdocs/Support/ScopeExit.hpp" +#include +#include +#include #include #include +#include #include #include +#include #include #include #include #include -#include -#include -#include +#include namespace clang { namespace mrdocs { @@ -42,6 +43,7 @@ class TrancheBuilder Tranche* private_; bool includePrivate_ = true; + bool buildingFromBase_ = false; Tranche* trancheFor(AccessKind access) { @@ -86,10 +88,43 @@ class TrancheBuilder push( ListTy Tranche::* list, AccessKind access, - const Info& member) + Info const& member) { - if(Tranche* tranche = trancheFor(access)) + if (Tranche* tranche = trancheFor(access)) + { push(tranche->*list, member); + } + } + + void + push( + std::vector& list, + AccessKind access, + FunctionInfo const& member) + { + // When adding a function to the tranche, we have to + // check if the function isn't already overriden by + // a function with the same name and signature. + if (Tranche* tranche = trancheFor(access)) + { + if (buildingFromBase_) + { + // Iterate members of list + for (auto const& id: list) + { + // Get the function info + auto const& I = corpus_.get(id); + // Check if the function is overriden or shadowed + // TODO: We need to improve the function signature comparison + if (I.Name == member.Name) + { + // The function is shadowed, we don't add it + return; + } + } + } + push(list, member); + } } static @@ -98,15 +133,21 @@ class TrancheBuilder AccessKind memberAccess, AccessKind baseAccess) noexcept { - if(memberAccess == AccessKind::None || + if (memberAccess == AccessKind::None || baseAccess == AccessKind::None) + { return AccessKind::None; - if(memberAccess == AccessKind::Private || + } + if (memberAccess == AccessKind::Private || baseAccess == AccessKind::Private) + { return AccessKind::Private; - if(memberAccess == AccessKind::Protected || + } + if (memberAccess == AccessKind::Protected || baseAccess == AccessKind::Protected) + { return AccessKind::Protected; + } return AccessKind::Public; } @@ -121,8 +162,11 @@ class TrancheBuilder const Info* lookThroughTypedefs(const Info* I) { - if(! I || ! I->isTypedef()) + if (!I || + !I->isTypedef()) + { return I; + } auto* TI = static_cast(I); return lookThroughTypedefs( corpus_.find(TI->Type->namedSymbol())); @@ -150,7 +194,7 @@ class TrancheBuilder void add( - const SymbolID& id, + SymbolID const& id, AccessKind baseAccess) { const auto& I = corpus_.get(id); @@ -158,69 +202,93 @@ class TrancheBuilder visit(I, *this, actualAccess); } + // Add members from RecordInfo to the tranches void addFrom( const RecordInfo& I, AccessKind baseAccess) { - for(auto const& B : I.Bases) + for (auto const& id: I.Members) + { + add(id, baseAccess); + } + // Add members from the base classes to the tranches + ScopeExitRestore s(buildingFromBase_, true); + for (auto const& B : I.Bases) { - auto actualAccess = effectiveAccess(baseAccess, B.Access); + auto const actualAccess = + effectiveAccess(baseAccess, B.Access); - if( ! includePrivate_ && + if (!includePrivate_ && actualAccess == AccessKind::Private) + { continue; - const Info* Base = lookThroughTypedefs( + } + Info const* Base = lookThroughTypedefs( corpus_.find(B.Type->namedSymbol())); - if(! Base || Base->id == I.id || - ! Base->isRecord()) + if (!Base || + Base->id == I.id || + !Base->isRecord()) + { continue; + } addFrom(*static_cast< const RecordInfo*>(Base), actualAccess); } - for(auto const& id : I.Members) - add(id, baseAccess); } - void addFrom(const NamespaceInfo& I) + // Add members from RecordInfo to the tranches + void + addFrom(const NamespaceInfo& I) { - for(auto const& id : I.Members) + for (auto const& id: I.Members) + { add(id, AccessKind::None); + } } - void operator()( + // Add a namespace to the tranche + void + operator()( const NamespaceInfo& I, AccessKind access) { push(&Tranche::Namespaces, access, I); } - void operator()( + // Add a record to the tranche + void + operator()( const RecordInfo& I, AccessKind access) { push(&Tranche::Records, access, I); } - void operator()( - const SpecializationInfo&, + void + operator()( + SpecializationInfo const&, AccessKind) { // KRYSTIAN FIXME: currently unimplemented } + // Add a function to the tranche void operator()( const FunctionInfo& I, - AccessKind access) + AccessKind const access) { // do not inherit constructors or destructors - if(parent_.isRecord() && ! isFromParent(I) && - (I.Class == FunctionClass::Constructor || - I.Class == FunctionClass::Destructor)) + if (parent_.isRecord() && !isFromParent(I) + && (I.Class == FunctionClass::Constructor + || I.Class == FunctionClass::Destructor)) + { return; + } - bool isStatic = I.StorageClass == StorageClassKind::Static; - if(! parent_.isRecord() || ! isStatic) + bool const isStatic = I.StorageClass == StorageClassKind::Static; + if (!parent_.isRecord() || + !isStatic) { push(&Tranche::Functions, access, I); push(&Tranche::Overloads, access, I); @@ -324,10 +392,14 @@ buildTranches( Private); visit(I, [&](const InfoTy& II) { - if constexpr(InfoTy::isRecord()) + if constexpr (InfoTy::isRecord()) + { builder.addFrom(II, AccessKind::Public); - if constexpr(InfoTy::isNamespace()) + } + if constexpr (InfoTy::isNamespace()) + { builder.addFrom(II); + } }); } diff --git a/test-files/golden-tests/filters/symbol-name/excluded-base-class.adoc b/test-files/golden-tests/filters/symbol-name/excluded-base-class.adoc new file mode 100644 index 000000000..24f0bb85d --- /dev/null +++ b/test-files/golden-tests/filters/symbol-name/excluded-base-class.adoc @@ -0,0 +1,166 @@ += Reference +:mrdocs: + +[#index] +== Global namespace + + +=== Namespaces + +[cols=1] +|=== +| Name + +| <> +|=== + +[#A] +== A + + +=== Types + +[cols=1] +|=== +| Name + +| <> +| <> +|=== + +[#A-D] +== <>::D + + +=== Synopsis + + +Declared in `<excluded‐base‐class.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +class D + : public B::C; +---- + +=== Member Functions + +[cols=1] +|=== +| Name + +| <> [.small]#[virtual]# +| <> [.small]#[virtual]# +| <> +|=== + + + +[#A-D-g] +== <>::<>::g + + +=== Synopsis + + +Declared in `<excluded‐base‐class.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +virtual +void +g() override; +---- + +[#A-D-h] +== <>::<>::h + + +=== Synopsis + + +Declared in `<excluded‐base‐class.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +virtual +void +h() override; +---- + +[#A-D-i] +== <>::<>::i + + +=== Synopsis + + +Declared in `<excluded‐base‐class.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +i(); +---- + +[#A-E] +== <>::E + + +=== Synopsis + + +Declared in `<excluded‐base‐class.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +class E + : public B::C; +---- + +=== Member Functions + +[cols=1] +|=== +| Name + +| <> [.small]#[virtual]# +| <> +|=== + + + +[#A-E-h] +== <>::<>::h + + +=== Synopsis + + +Declared in `<excluded‐base‐class.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +virtual +void +h() override; +---- + +[#A-E-i] +== <>::<>::i + + +=== Synopsis + + +Declared in `<excluded‐base‐class.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +i(); +---- + + + +[.small]#Created with https://www.mrdocs.com[MrDocs]# diff --git a/test-files/golden-tests/filters/symbol-name/excluded-base-class.cpp b/test-files/golden-tests/filters/symbol-name/excluded-base-class.cpp new file mode 100644 index 000000000..7686f3f53 --- /dev/null +++ b/test-files/golden-tests/filters/symbol-name/excluded-base-class.cpp @@ -0,0 +1,32 @@ +namespace A { + // This namespace and everything in it should be excluded + namespace B { + class C { + public: + void f(); + virtual void g(); + virtual void h() = 0; + }; + } + + // B::C and its members will be extracted as + // dependencies so that this information can + // be used by D. + class D : public B::C { + public: + void g() override; + void h() override; + void i(); + }; + + // B::C and its members will be extracted as + // dependencies so that this information can + // be used by D. + // g() is not defined and is only inherited + // from B::C + class E : public B::C { + public: + void h() override; + void i(); + }; +} diff --git a/test-files/golden-tests/filters/symbol-name/excluded-base-class.html b/test-files/golden-tests/filters/symbol-name/excluded-base-class.html new file mode 100644 index 000000000..48c8f571c --- /dev/null +++ b/test-files/golden-tests/filters/symbol-name/excluded-base-class.html @@ -0,0 +1,195 @@ + + +Reference + + +
+

Reference

+
+
+

Global namespace

+
+

Namespaces

+ + + + + + + + + + +
Name
A
+
+
+
+

A

+
+

Types

+ + + + + + + + + + + +
Name
D
E
+
+
+
+

A::D

+
+
+

Synopsis

+
+Declared in <excluded-base-class.cpp>
+
+
+class D
+    : public B::C;
+
+
+
+

Member Functions

+ + + + + + + + + + + + +
Name
g [virtual]
h [virtual]
i
+ + +
+
+
+

A::D::g

+
+
+

Synopsis

+
+Declared in <excluded-base-class.cpp>
+
+
+virtual
+void
+g() override;
+
+
+
+
+
+
+

A::D::h

+
+
+

Synopsis

+
+Declared in <excluded-base-class.cpp>
+
+
+virtual
+void
+h() override;
+
+
+
+
+
+
+

A::D::i

+
+
+

Synopsis

+
+Declared in <excluded-base-class.cpp>
+
+
+void
+i();
+
+
+
+
+
+
+

A::E

+
+
+

Synopsis

+
+Declared in <excluded-base-class.cpp>
+
+
+class E
+    : public B::C;
+
+
+
+

Member Functions

+ + + + + + + + + + + +
Name
h [virtual]
i
+ + +
+
+
+

A::E::h

+
+
+

Synopsis

+
+Declared in <excluded-base-class.cpp>
+
+
+virtual
+void
+h() override;
+
+
+
+
+
+
+

A::E::i

+
+
+

Synopsis

+
+Declared in <excluded-base-class.cpp>
+
+
+void
+i();
+
+
+
+
+ +
+
+

Created with MrDocs

+
+ + \ No newline at end of file diff --git a/test-files/golden-tests/filters/symbol-name/excluded-base-class.xml b/test-files/golden-tests/filters/symbol-name/excluded-base-class.xml new file mode 100644 index 000000000..884ad6ea2 --- /dev/null +++ b/test-files/golden-tests/filters/symbol-name/excluded-base-class.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test-files/golden-tests/filters/symbol-name/excluded-base-class.yml b/test-files/golden-tests/filters/symbol-name/excluded-base-class.yml new file mode 100644 index 000000000..22984b9c9 --- /dev/null +++ b/test-files/golden-tests/filters/symbol-name/excluded-base-class.yml @@ -0,0 +1,3 @@ +exclude-symbols: + - 'A::B' + - 'A::B::**' \ No newline at end of file diff --git a/test-files/golden-tests/javadoc/ref.adoc b/test-files/golden-tests/javadoc/ref.adoc index e502316c1..5d2b28487 100644 --- a/test-files/golden-tests/javadoc/ref.adoc +++ b/test-files/golden-tests/javadoc/ref.adoc @@ -209,7 +209,7 @@ struct D | Name | <> -| <> +| <> |=== diff --git a/test-files/golden-tests/javadoc/ref.html b/test-files/golden-tests/javadoc/ref.html index 5aceffe2c..180f6b855 100644 --- a/test-files/golden-tests/javadoc/ref.html +++ b/test-files/golden-tests/javadoc/ref.html @@ -249,7 +249,7 @@

Member Functions

f3 -f4 +f4 diff --git a/test-files/golden-tests/metadata/mem-fn.adoc b/test-files/golden-tests/metadata/mem-fn.adoc index 31ecb76ff..5de243d2d 100644 --- a/test-files/golden-tests/metadata/mem-fn.adoc +++ b/test-files/golden-tests/metadata/mem-fn.adoc @@ -657,7 +657,7 @@ struct T17 |=== | Name -| <> [.small]#[virtual]# +| <> [.small]#[virtual]# |=== @@ -783,7 +783,7 @@ struct V | Name | <> -| <> [.small]#[virtual]# +| <> [.small]#[virtual]# |=== === Static Member Functions diff --git a/test-files/golden-tests/metadata/mem-fn.html b/test-files/golden-tests/metadata/mem-fn.html index e030428e8..b2bf6e0e5 100644 --- a/test-files/golden-tests/metadata/mem-fn.html +++ b/test-files/golden-tests/metadata/mem-fn.html @@ -743,7 +743,7 @@

Member Functions

-f [virtual] +f [virtual] @@ -885,7 +885,7 @@

Member Functions

f1 -f3 [virtual] +f3 [virtual]

Static Member Functions