From 32057849b55f3abd3690d7093eb556072b0eec8d Mon Sep 17 00:00:00 2001 From: Krystian Stasiowski Date: Fri, 9 Jun 2023 16:52:20 -0400 Subject: [PATCH] chore: NamespaceInfo member refs are just symbol IDs --- include/mrdox/Corpus.hpp | 1 - include/mrdox/Metadata.hpp | 2 - include/mrdox/Metadata/Info.hpp | 37 +- include/mrdox/Metadata/Namespace.hpp | 5 +- include/mrdox/Metadata/Record.hpp | 4 +- include/mrdox/Metadata/Reference.hpp | 74 ---- include/mrdox/Metadata/Scope.hpp | 47 --- include/mrdox/Metadata/Type.hpp | 24 +- include/mrdox/MetadataFwd.hpp | 2 - source/-adoc/AdocSinglePageWriter.cpp | 34 +- source/-adoc/AdocSinglePageWriter.hpp | 2 +- source/-adoc/AdocWriter.cpp | 6 +- source/-adoc/AdocWriter.hpp | 2 +- source/AST/ASTVisitor.cpp | 18 +- source/AST/ASTVisitorHelpers.hpp | 26 +- source/AST/AnyBlock.hpp | 384 +++--------------- source/AST/BitcodeIDs.hpp | 26 +- source/AST/BitcodeReader.cpp | 1 - source/AST/BitcodeWriter.cpp | 56 +-- source/AST/BitcodeWriter.hpp | 1 - source/AST/DecodeRecord.hpp | 35 +- source/Corpus.cpp | 36 +- source/CorpusImpl.cpp | 38 +- source/Metadata/Overloads.cpp | 12 +- source/Metadata/Reduce.cpp | 68 +--- source/Metadata/Reduce.hpp | 1 - source/Metadata/Reference.cpp | 18 - source/Support/Debug.cpp | 14 - source/Support/Debug.hpp | 9 - source/Support/SafeNames.cpp | 40 +- test-files/old-tests/alias-template.xml | 14 +- .../old-tests/explicit-deduct-guide.xml | 12 +- test-files/old-tests/function-parm-decay.xml | 8 +- test-files/old-tests/function-tparm-decay.xml | 16 +- test-files/old-tests/static-data-def.xml | 8 +- test-files/old-tests/var-template.xml | 44 +- 36 files changed, 243 insertions(+), 882 deletions(-) delete mode 100644 include/mrdox/Metadata/Reference.hpp delete mode 100644 include/mrdox/Metadata/Scope.hpp delete mode 100644 source/Metadata/Reference.cpp diff --git a/include/mrdox/Corpus.hpp b/include/mrdox/Corpus.hpp index 0a864966a..f76134773 100644 --- a/include/mrdox/Corpus.hpp +++ b/include/mrdox/Corpus.hpp @@ -122,7 +122,6 @@ class MRDOX_VISIBLE MRDOX_DECL bool traverse(Visitor&, RecordInfo const& I) const; MRDOX_DECL bool traverse(Visitor&, SpecializationInfo const& I) const; MRDOX_DECL bool traverse(Visitor&, SymbolID id) const; - MRDOX_DECL bool traverse(Visitor&, std::vector const& R) const; MRDOX_DECL bool traverse(Visitor&, std::vector const& R) const; /** @} */ diff --git a/include/mrdox/Metadata.hpp b/include/mrdox/Metadata.hpp index cd7d1eefa..270b8fbfa 100644 --- a/include/mrdox/Metadata.hpp +++ b/include/mrdox/Metadata.hpp @@ -27,8 +27,6 @@ #include #include #include -#include -#include #include #include #include diff --git a/include/mrdox/Metadata/Info.hpp b/include/mrdox/Metadata/Info.hpp index 1c7bc15d1..f3e4a3aa5 100644 --- a/include/mrdox/Metadata/Info.hpp +++ b/include/mrdox/Metadata/Info.hpp @@ -14,7 +14,6 @@ #include #include -#include #include #include #include @@ -81,15 +80,15 @@ struct MRDOX_VISIBLE std::string_view symbolType() const noexcept; - constexpr bool isDefault() { return Kind == InfoKind::Default; } - constexpr bool isNamespace() { return Kind == InfoKind::Namespace; } - constexpr bool isRecord() { return Kind == InfoKind::Record; } - constexpr bool isFunction() { return Kind == InfoKind::Function; } - constexpr bool isEnum() { return Kind == InfoKind::Enum; } - constexpr bool isTypedef() { return Kind == InfoKind::Typedef; } - constexpr bool isVariable() { return Kind == InfoKind::Variable; } - constexpr bool isField() { return Kind == InfoKind::Field; } - constexpr bool isSpecialization() { return Kind == InfoKind::Specialization; } + constexpr bool isDefault() const noexcept { return Kind == InfoKind::Default; } + constexpr bool isNamespace() const noexcept { return Kind == InfoKind::Namespace; } + constexpr bool isRecord() const noexcept { return Kind == InfoKind::Record; } + constexpr bool isFunction() const noexcept { return Kind == InfoKind::Function; } + constexpr bool isEnum() const noexcept { return Kind == InfoKind::Enum; } + constexpr bool isTypedef() const noexcept { return Kind == InfoKind::Typedef; } + constexpr bool isVariable() const noexcept { return Kind == InfoKind::Variable; } + constexpr bool isField() const noexcept { return Kind == InfoKind::Field; } + constexpr bool isSpecialization() const noexcept { return Kind == InfoKind::Specialization; } }; //------------------------------------------------ @@ -107,15 +106,15 @@ struct IsInfo : Info */ static constexpr InfoKind kind_id = K; - static constexpr bool isDefault() { return K== InfoKind::Default; } - static constexpr bool isNamespace() { return K == InfoKind::Namespace; } - static constexpr bool isRecord() { return K == InfoKind::Record; } - static constexpr bool isFunction() { return K == InfoKind::Function; } - static constexpr bool isEnum() { return K == InfoKind::Enum; } - static constexpr bool isTypedef() { return K == InfoKind::Typedef; } - static constexpr bool isVariable() { return K == InfoKind::Variable; } - static constexpr bool isField() { return K == InfoKind::Field; } - static constexpr bool isSpecialization() { return K == InfoKind::Specialization; } + static constexpr bool isDefault() noexcept { return K== InfoKind::Default; } + static constexpr bool isNamespace() noexcept { return K == InfoKind::Namespace; } + static constexpr bool isRecord() noexcept { return K == InfoKind::Record; } + static constexpr bool isFunction() noexcept { return K == InfoKind::Function; } + static constexpr bool isEnum() noexcept { return K == InfoKind::Enum; } + static constexpr bool isTypedef() noexcept { return K == InfoKind::Typedef; } + static constexpr bool isVariable() noexcept { return K == InfoKind::Variable; } + static constexpr bool isField() noexcept { return K == InfoKind::Field; } + static constexpr bool isSpecialization() noexcept { return K == InfoKind::Specialization; } protected: constexpr IsInfo() diff --git a/include/mrdox/Metadata/Namespace.hpp b/include/mrdox/Metadata/Namespace.hpp index ed36eb3c2..8b34bc1c6 100644 --- a/include/mrdox/Metadata/Namespace.hpp +++ b/include/mrdox/Metadata/Namespace.hpp @@ -14,7 +14,7 @@ #include #include -#include +#include namespace clang { namespace mrdox { @@ -24,7 +24,8 @@ namespace mrdox { struct NamespaceInfo : IsInfo { - Scope Children; + std::vector Members; + std::vector Specializations; //-------------------------------------------- diff --git a/include/mrdox/Metadata/Record.hpp b/include/mrdox/Metadata/Record.hpp index 7c0e89296..9a9e76f20 100644 --- a/include/mrdox/Metadata/Record.hpp +++ b/include/mrdox/Metadata/Record.hpp @@ -14,13 +14,13 @@ #include #include +#include #include #include -#include -#include #include #include #include +#include #include #include #include diff --git a/include/mrdox/Metadata/Reference.hpp b/include/mrdox/Metadata/Reference.hpp deleted file mode 100644 index ca40b34ad..000000000 --- a/include/mrdox/Metadata/Reference.hpp +++ /dev/null @@ -1,74 +0,0 @@ -// -// This is a derivative work. originally part of the LLVM Project. -// Licensed under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// Copyright (c) 2023 Vinnie Falco (vinnie.falco@gmail.com) -// -// Official repository: https://github.com/cppalliance/mrdox -// - -#ifndef MRDOX_API_METADATA_REFERENCE_HPP -#define MRDOX_API_METADATA_REFERENCE_HPP - -#include -#include -#include -#include -#include - -namespace clang { -namespace mrdox { - -struct Reference -{ - /** Unique identifier of the referenced symbol. - */ - SymbolID id = SymbolID::zero; - - // Name of type (possibly unresolved). Not including namespaces or template - // parameters (so for a std::vector this would be "vector"). See also - // QualName. - std::string Name; - - /** The type of the referenced symbol. - */ - InfoKind RefKind = InfoKind::Default; - - //-------------------------------------------- - - // This variant (that takes no qualified name parameter) uses the Name as the - // QualName (very useful in unit tests to reduce verbosity). This can't use an - // empty string to indicate the default because we need to accept the empty - // string as a valid input for the global namespace (it will have - // "GlobalNamespace" as the name, but an empty QualName). - Reference( - SymbolID ID = SymbolID::zero, - std::string_view Name = "", - InfoKind kind = InfoKind::Default) - : id(ID) - , Name(Name) - , RefKind(kind) - { - } - -#if 0 - // VFALCO What was this for? - bool - operator==( - Reference const& Other) const - { - // VFALCO Is this function only needed - // for the old unit tests? - return - std::tie(id, Name, RefKind) == - std::tie(Other.id, Other.Name, Other.RefKind); - } -#endif -}; - -} // mrdox -} // clang - -#endif diff --git a/include/mrdox/Metadata/Scope.hpp b/include/mrdox/Metadata/Scope.hpp deleted file mode 100644 index 291cd7bcb..000000000 --- a/include/mrdox/Metadata/Scope.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// -// This is a derivative work. originally part of the LLVM Project. -// Licensed under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// Copyright (c) 2023 Vinnie Falco (vinnie.falco@gmail.com) -// -// Official repository: https://github.com/cppalliance/mrdox -// - -#ifndef MRDOX_API_METADATA_SCOPE_HPP -#define MRDOX_API_METADATA_SCOPE_HPP - -#include -#include -#include -#include -#include - -namespace clang { -namespace mrdox { - -/** A container for the declaration in a namespace. -*/ -struct Scope -{ - // Namespaces and Records are references because they will be properly - // documented in their own info, while the entirety of Functions and Enums are - // included here because they should not have separate documentation from - // their scope. - // - // Namespaces are not syntactically valid as children of records, but making - // this general for all possible container types reduces code complexity. - std::vector Namespaces; - std::vector Records; - std::vector Functions; - std::vector Typedefs; - std::vector Enums; - std::vector Vars; - std::vector Specializations; -}; - -} // mrdox -} // clang - -#endif diff --git a/include/mrdox/Metadata/Type.hpp b/include/mrdox/Metadata/Type.hpp index a97d63c71..a4afc9610 100644 --- a/include/mrdox/Metadata/Type.hpp +++ b/include/mrdox/Metadata/Type.hpp @@ -13,7 +13,9 @@ #define MRDOX_API_METADATA_TYPE_HPP #include -#include +#include +#include +#include namespace clang { namespace mrdox { @@ -34,24 +36,16 @@ namespace mrdox { @li unsigned long, unsigned long long */ struct TypeInfo - : Reference { - TypeInfo() = default; + SymbolID id; + std::string Name; explicit TypeInfo( - Reference const& R) noexcept - : Reference(R) - { - } - - // Convenience constructor for when there is no symbol ID or info type - // (normally used for built-in types in tests). - explicit - TypeInfo( - std::string_view Name) - : Reference( - SymbolID::zero, Name, InfoKind::Default) + SymbolID ID = SymbolID::zero, + std::string_view name = {}) noexcept + : id(ID) + , Name(name) { } diff --git a/include/mrdox/MetadataFwd.hpp b/include/mrdox/MetadataFwd.hpp index feda8c1b2..9fec06740 100644 --- a/include/mrdox/MetadataFwd.hpp +++ b/include/mrdox/MetadataFwd.hpp @@ -41,8 +41,6 @@ struct NamespaceInfo; struct RecordInfo; struct RecordScope; struct Param; -struct Reference; -struct Scope; struct SpecializationInfo; struct SpecializedMember; struct SymbolInfo; diff --git a/source/-adoc/AdocSinglePageWriter.cpp b/source/-adoc/AdocSinglePageWriter.cpp index 7047fb1e3..889748d01 100644 --- a/source/-adoc/AdocSinglePageWriter.cpp +++ b/source/-adoc/AdocSinglePageWriter.cpp @@ -44,16 +44,24 @@ build() //------------------------------------------------ +// FIXME: we really should sort the members into +// vectors of their respective types in one pass template std::vector AdocSinglePageWriter:: buildSortedList( - std::vector const& from) const + std::vector const& from) const { std::vector result; result.reserve(from.size()); - for(auto const& ref : from) - result.push_back(&corpus_.get(ref.id)); + for(auto const& id : from) + { + const Info* info = corpus_.find(id); + Assert(info); + if(Type::kind_id == info->Kind) + result.push_back( + static_cast(info)); + } llvm::sort(result, [&](Info const* I0, Info const* I1) { @@ -76,20 +84,22 @@ visit( { // build sorted list of namespaces, // this is for visitation not display. - auto namespaceList = buildSortedList(I.Children.Namespaces); - auto recordList = buildSortedList(I.Children.Records); + + // FIXME: sort members in one pass + auto namespaceList = buildSortedList(I.Members); + auto recordList = buildSortedList(I.Members); auto functionOverloads = makeNamespaceOverloads(I, corpus_); - auto typedefList = buildSortedList(I.Children.Typedefs); - auto enumList = buildSortedList(I.Children.Enums); - auto variableList = buildSortedList(I.Children.Vars); + auto typedefList = buildSortedList(I.Members); + auto enumList = buildSortedList(I.Members); + auto variableList = buildSortedList(I.Members); // don't emit empty namespaces, // but still visit child namespaces. - if( ! I.Children.Records.empty() || + if( ! namespaceList.empty() || ! functionOverloads.list.empty() || - ! I.Children.Typedefs.empty() || - ! I.Children.Enums.empty() || - ! I.Children.Vars.empty()) + ! typedefList.empty() || + ! enumList.empty() || + ! variableList.empty()) { std::string s; if(I.id == SymbolID::zero) diff --git a/source/-adoc/AdocSinglePageWriter.hpp b/source/-adoc/AdocSinglePageWriter.hpp index 45339c2d1..b072a8d79 100644 --- a/source/-adoc/AdocSinglePageWriter.hpp +++ b/source/-adoc/AdocSinglePageWriter.hpp @@ -38,7 +38,7 @@ class AdocSinglePageWriter template std::vector buildSortedList( - std::vector const& from) const; + std::vector const& from) const; bool visit(NamespaceInfo const&) override; bool visit(RecordInfo const&) override; diff --git a/source/-adoc/AdocWriter.cpp b/source/-adoc/AdocWriter.cpp index ad06fbe9d..273005b15 100644 --- a/source/-adoc/AdocWriter.cpp +++ b/source/-adoc/AdocWriter.cpp @@ -492,7 +492,7 @@ void AdocWriter:: writeNestedTypes( llvm::StringRef sectionName, - std::vector const& list, + std::vector const& list, AccessSpecifier access) { if(list.empty()) @@ -504,9 +504,9 @@ writeNestedTypes( "|===\n" << "|Name |Description\n" << "\n"; - for(auto const& ref : list) + for(auto const& id : list) { - auto& I = corpus_.get(ref.id); + auto& I = corpus_.get(id); #if 0 if(it->Access != access) continue; diff --git a/source/-adoc/AdocWriter.hpp b/source/-adoc/AdocWriter.hpp index 5435158b1..bdbcda20b 100644 --- a/source/-adoc/AdocWriter.hpp +++ b/source/-adoc/AdocWriter.hpp @@ -101,7 +101,7 @@ class AdocWriter void writeBase(BaseInfo const& I); void writeNestedTypes( llvm::StringRef sectionName, - std::vector const& list, + std::vector const& list, AccessSpecifier access); void writeFunctionDeclaration( diff --git a/source/AST/ASTVisitor.cpp b/source/AST/ASTVisitor.cpp index d57a1ffb4..20a0f5254 100644 --- a/source/AST/ASTVisitor.cpp +++ b/source/AST/ASTVisitor.cpp @@ -195,19 +195,10 @@ getTypeInfoForType( SymbolID id = SymbolID::zero; if(const TagDecl* TD = getTagDeclForType(T)) { - InfoKind kind; - if(isa(TD)) - kind = InfoKind::Enum; - else if(isa(TD)) - kind = InfoKind::Record; - else - kind = InfoKind::Default; extractSymbolID(TD, id); - return TypeInfo(Reference( - id, TD->getNameAsString(), kind)); + return TypeInfo(id, TD->getNameAsString()); } - return TypeInfo(Reference(id, - getTypeAsString(T))); + return TypeInfo(id, getTypeAsString(T)); } void @@ -480,8 +471,7 @@ writeParent( case AccessSpecifier::AS_none: { NamespaceInfo P(I.Namespace.front()); - insertChild(P.Children, - I.id, I.Name, Child::kind_id); + insertChild(P, I.id); return writeBitcode(P); } case AccessSpecifier::AS_public: @@ -1040,7 +1030,7 @@ buildEnum( if(D->isFixed()) { auto Name = getTypeAsString(D->getIntegerType()); - I.BaseType = TypeInfo(Name); + I.BaseType = TypeInfo(SymbolID::zero, Name); } parseEnumerators(I, D); diff --git a/source/AST/ASTVisitorHelpers.hpp b/source/AST/ASTVisitorHelpers.hpp index ac5a7ef5f..35562bdfa 100644 --- a/source/AST/ASTVisitorHelpers.hpp +++ b/source/AST/ASTVisitorHelpers.hpp @@ -14,35 +14,23 @@ #include #include #include -#include +#include #include namespace clang { namespace mrdox { - template -void insertChild(Scope& P, Args&&... args) +void insertChild(NamespaceInfo& I, Args&&... args) { - if constexpr(std::is_constructible_v) + if constexpr(std::is_constructible_v) { - if constexpr(T::isNamespace()) - P.Namespaces.emplace_back(std::forward(args)...); - else if constexpr(T::isRecord()) - P.Records.emplace_back(std::forward(args)...); - else if constexpr(T::isFunction()) - P.Functions.emplace_back(std::forward(args)...); - else if constexpr(T::isTypedef()) - P.Typedefs.emplace_back(std::forward(args)...); - else if constexpr(T::isEnum()) - P.Enums.emplace_back(std::forward(args)...); - else if constexpr(T::isVariable()) - P.Vars.emplace_back(std::forward(args)...); + if constexpr(T::isField()) + llvm_unreachable("invalid namespace member"); else if constexpr(T::isSpecialization()) - P.Specializations.emplace_back(std::forward(args)...); + I.Specializations.emplace_back(std::forward(args)...); else - // KRYSTIAN NOTE: Child should *never* be FieldInfo - llvm_unreachable("invalid Scope child"); + I.Members.emplace_back(std::forward(args)...); } else { diff --git a/source/AST/AnyBlock.hpp b/source/AST/AnyBlock.hpp index 7503d4130..29743143a 100644 --- a/source/AST/AnyBlock.hpp +++ b/source/AST/AnyBlock.hpp @@ -44,13 +44,6 @@ struct BitcodeReader::AnyBlock { return Error("unexpected sub-block with ID={}", ID); } - - Error - makeWrongFieldError(FieldId F) - { - return Error("unexpected FieldId"); - //static_cast>(F)); - } }; //------------------------------------------------ @@ -81,80 +74,6 @@ class VersionBlock //------------------------------------------------ -class ReferenceBlock - : public BitcodeReader::AnyBlock -{ -protected: - BitcodeReader& br_; - -public: - Reference I; - FieldId F; - - explicit - ReferenceBlock( - BitcodeReader& br) noexcept - : br_(br) - { - } - - Error - parseRecord(Record const& R, - unsigned ID, llvm::StringRef Blob) override - { - switch(ID) - { - case REFERENCE_USR: - return decodeRecord(R, I.id, Blob); - case REFERENCE_NAME: - return decodeRecord(R, I.Name, Blob); - case REFERENCE_KIND: - return decodeRecord(R, I.RefKind, Blob); - case REFERENCE_FIELD: - return decodeRecord(R, F, Blob); - default: - return AnyBlock::parseRecord(R, ID, Blob); - } - } -}; - -//------------------------------------------------ - -template -class ReferencesBlock - : public BitcodeReader::AnyBlock -{ -protected: - BitcodeReader& br_; - Container& C_; - FieldId F_; - Reference I; - -public: - ReferencesBlock( - Container& C, - BitcodeReader& br) noexcept - : br_(br) - , C_(C) - { - } - - Error - parseRecord(Record const& R, - unsigned ID, llvm::StringRef Blob) override - { - ReferenceBlock B(br_); - if(auto err = br_.readBlock(B, ID)) - return err; - //if(B.F != F_) - //return makeWrongFieldError(B.F); - C_.emplace_back(B.I); - return Error::success(); - } -}; - -//------------------------------------------------ - /** An AnyNodeList */ class JavadocNodesBlock @@ -341,9 +260,8 @@ class InfoPartBlock return br_.readBlock(B, ID); } default: - break; + return AnyBlock::readSubBlock(ID); } - return AnyBlock::readSubBlock(ID); } }; @@ -391,8 +309,6 @@ class TypeBlock TypeInfo& I_; public: - FieldId F; - TypeBlock( TypeInfo& I, BitcodeReader& br) noexcept @@ -402,23 +318,19 @@ class TypeBlock } Error - readSubBlock( - unsigned ID) override + parseRecord( + Record const& R, + unsigned ID, + llvm::StringRef Blob) override { switch(ID) { - case BI_REFERENCE_BLOCK_ID: - { - ReferenceBlock B(br_); - if(auto err = br_.readBlock(B, ID)) - return err; - F = B.F; - static_cast(I_) = - std::move(B.I); - return Error::success(); - } + case TYPE_ID: + return decodeRecord(R, I_.id, Blob); + case TYPE_NAME: + return decodeRecord(R, I_.Name, Blob); default: - return AnyBlock::readSubBlock(ID); + return AnyBlock::parseRecord(R, ID, Blob); } } }; @@ -559,7 +471,6 @@ class TemplateParamBlock return Error("invalid template parameter kind"); } } - default: return AnyBlock::parseRecord(R, ID, Blob); } @@ -576,9 +487,7 @@ class TemplateParamBlock if(I_.Kind != TParamKind::Template) return Error("only TemplateTParam may have template parameters"); TemplateParamBlock P(I_.get().Params.emplace_back(), br_); - if(auto err = br_.readBlock(P, ID)) - return err; - return Error::success(); + return br_.readBlock(P, ID); } case BI_TYPE_BLOCK_ID: { @@ -595,23 +504,11 @@ class TemplateParamBlock return Error("invalid TypeInfo block in TParam"); } TypeBlock B(*t, br_); - if(auto err = br_.readBlock(B, ID)) - return err; - // KRYSTIAN NOTE: is this check correct? - // copied from a function with TypeInfo sub-block - switch(B.F) - { - case FieldId::F_type: - break; - default: - return makeWrongFieldError(B.F); - } - return Error::success(); + return br_.readBlock(B, ID); } default: - break; + return AnyBlock::readSubBlock(ID); } - return AnyBlock::readSubBlock(ID); } }; @@ -656,17 +553,13 @@ class TemplateBlock { TemplateArgBlock A( I_.Args.emplace_back()); - if(auto err = br_.readBlock(A, ID)) - return err; - return Error::success(); + return br_.readBlock(A, ID); } case BI_TEMPLATE_PARAM_BLOCK_ID: { TemplateParamBlock P( I_.Params.emplace_back(), br_); - if(auto err = br_.readBlock(P, ID)) - return err; - return Error::success(); + return br_.readBlock(P, ID); } default: return AnyBlock::readSubBlock(ID); @@ -700,18 +593,12 @@ class FunctionParamBlock switch(ID) { case FUNCTION_PARAM_NAME: - { return decodeRecord(R, I_.Name, Blob); - } case FUNCTION_PARAM_DEFAULT: - { return decodeRecord(R, I_.Default, Blob); - } /* case FUNCTION_PARAM_IS_PACK: - { return decodeRecord(R, I_.IsParameterPack, Blob); - } */ default: return AnyBlock::parseRecord(R, ID, Blob); @@ -727,18 +614,7 @@ class FunctionParamBlock case BI_TYPE_BLOCK_ID: { TypeBlock B(I_.Type, br_); - if(auto err = br_.readBlock(B, ID)) - return err; - // KRYSTIAN NOTE: is this check correct? - // copied from a function with TypeInfo sub-block - switch(B.F) - { - case FieldId::F_type: - break; - default: - return makeWrongFieldError(B.F); - } - return Error::success(); + return br_.readBlock(B, ID); } default: break; @@ -768,100 +644,6 @@ class TopLevelBlock { } - #if 0 - Error - insertChild( - Reference&& R, FieldId Id) - { - switch(Id) - { - case FieldId::F_child_namespace: - { - // Record can't have namespace - if constexpr( - std::derived_from) - { - I->Children.Namespaces.emplace_back(std::move(R)); - return Error::success(); - } - break; - } - case FieldId::F_child_record: - { - if constexpr( - std::derived_from || - std::derived_from) - { - I->Children.Records.emplace_back(std::move(R)); - return Error::success(); - } - break; - } - case FieldId::F_child_function: - { - if constexpr( - std::derived_from || - std::derived_from) - { - I->Children.Functions.emplace_back(std::move(R)); - return Error::success(); - } - break; - } - case FieldId::F_child_typedef: - { - if constexpr( - std::derived_from || - std::derived_from) - { - I->Children.Typedefs.emplace_back(std::move(R)); - return Error::success(); - } - break; - } - case FieldId::F_child_enum: - { - if constexpr( - std::derived_from || - std::derived_from) - { - I->Children.Enums.emplace_back(std::move(R)); - return Error::success(); - } - break; - } - case FieldId::F_child_variable: - { - if constexpr( - std::derived_from || - std::derived_from) - { - I->Children.Vars.emplace_back(std::move(R)); - return Error::success(); - } - break; - } - // KRYSTIAN FIXME: i am 90% sure that this isn't needed. - // we don't use Scope for storing Record members - case FieldId::F_child_field: - { - // Namespace can't have fields - if constexpr( - std::derived_from) - { - Assert("RecordInfo doesn't use Scope"); - return Error::success(); - } - break; - } - default: - return makeWrongFieldError(Id); - } - return Error("unknown type"); - } - #endif - - Error readChild(Scope& I, unsigned ID); Error readSubBlock(unsigned ID) override; }; @@ -878,6 +660,23 @@ class NamespaceBlock : TopLevelBlock(br) { } + + Error + parseRecord( + Record const& R, + unsigned ID, + llvm::StringRef Blob) override + { + switch(ID) + { + case NAMESPACE_MEMBERS: + return decodeRecord(R, I->Members, Blob); + case NAMESPACE_SPECIALIZATIONS: + return decodeRecord(R, I->Specializations, Blob); + default: + return TopLevelBlock::parseRecord(R, ID, Blob); + } + } }; //------------------------------------------------ @@ -894,8 +693,10 @@ class RecordBlock } Error - parseRecord(Record const& R, - unsigned ID, llvm::StringRef Blob) override + parseRecord( + Record const& R, + unsigned ID, + llvm::StringRef Blob) override { switch(ID) { @@ -985,16 +786,7 @@ class FunctionBlock case BI_TYPE_BLOCK_ID: { TypeBlock B(I->ReturnType, br_); - if(auto err = br_.readBlock(B, ID)) - return err; - switch(B.F) - { - case FieldId::F_type: - break; - default: - return makeWrongFieldError(B.F); - } - return Error::success(); + return br_.readBlock(B, ID); } case BI_FUNCTION_PARAM_BLOCK_ID: { @@ -1008,9 +800,8 @@ class FunctionBlock return br_.readBlock(B, ID); } default: - break; + return TopLevelBlock::readSubBlock(ID); } - return TopLevelBlock::readSubBlock(ID); } }; @@ -1037,9 +828,8 @@ class TypedefBlock case TYPEDEF_IS_USING: return decodeRecord(R, I->IsUsing, Blob); default: - break; + return TopLevelBlock::parseRecord(R, ID, Blob); } - return TopLevelBlock::parseRecord(R, ID, Blob); } Error @@ -1051,16 +841,7 @@ class TypedefBlock case BI_TYPE_BLOCK_ID: { TypeBlock B(I->Underlying, br_); - if(auto err = br_.readBlock(B, ID)) - return err; - switch(B.F) - { - case FieldId::F_type: - break; - default: - return makeWrongFieldError(B.F); - } - return Error::success(); + return br_.readBlock(B, ID); } case BI_TEMPLATE_BLOCK_ID: { @@ -1069,9 +850,8 @@ class TypedefBlock return br_.readBlock(B, ID); } default: - break; + return TopLevelBlock::readSubBlock(ID); } - return TopLevelBlock::readSubBlock(ID); } }; @@ -1126,9 +906,8 @@ class EnumBlock case ENUM_SCOPED: return decodeRecord(R, I->Scoped, Blob); default: - break; + return TopLevelBlock::parseRecord(R, ID, Blob); } - return TopLevelBlock::parseRecord(R, ID, Blob); } Error @@ -1147,14 +926,11 @@ class EnumBlock { I->Members.emplace_back(); EnumValueBlock B(I->Members.back()); - if(auto err = br_.readBlock(B, ID)) - return err; - return Error::success(); + return br_.readBlock(B, ID); } default: - break; + return TopLevelBlock::readSubBlock(ID); } - return TopLevelBlock::readSubBlock(ID); } }; @@ -1181,9 +957,8 @@ class VarBlock case VARIABLE_BITS: return decodeRecord(R, {&I->specs.raw}, Blob); default: - break; + return TopLevelBlock::parseRecord(R, ID, Blob); } - return TopLevelBlock::parseRecord(R, ID, Blob); } Error @@ -1204,9 +979,8 @@ class VarBlock return br_.readBlock(B, ID); } default: - break; + return TopLevelBlock::readSubBlock(ID); } - return TopLevelBlock::readSubBlock(ID); } }; @@ -1254,9 +1028,8 @@ class FieldBlock return br_.readBlock(B, ID); } default: - break; + return TopLevelBlock::readSubBlock(ID); } - return TopLevelBlock::readSubBlock(ID); } }; @@ -1291,12 +1064,10 @@ class SpecializationBlock for(std::size_t i = 0; i < members.size(); i += 2) I->Members.emplace_back(members[i + 0], members[i + 1]); return Error::success(); - } default: - break; + return TopLevelBlock::parseRecord(R, ID, Blob); } - return TopLevelBlock::parseRecord(R, ID, Blob); } Error @@ -1311,52 +1082,13 @@ class SpecializationBlock return br_.readBlock(B, ID); } default: - break; + return TopLevelBlock::readSubBlock(ID); } - return TopLevelBlock::readSubBlock(ID); } }; //------------------------------------------------ -template -Error -TopLevelBlock:: -readChild( - Scope& I, unsigned ID) -{ - ReferenceBlock B(br_); - if(auto err = br_.readBlock(B, ID)) - return err; - switch(B.F) - { - case FieldId::F_child_namespace: - I.Namespaces.emplace_back(B.I); - break; - case FieldId::F_child_record: - I.Records.emplace_back(B.I); - break; - case FieldId::F_child_function: - I.Functions.emplace_back(B.I); - break; - case FieldId::F_child_typedef: - I.Typedefs.emplace_back(B.I); - break; - case FieldId::F_child_enum: - I.Enums.emplace_back(B.I); - break; - case FieldId::F_child_variable: - I.Vars.emplace_back(B.I); - break; - case FieldId::F_child_specialization: - I.Specializations.emplace_back(B.I); - break; - default: - return makeWrongFieldError(B.F); - } - return Error::success(); -} - template Error TopLevelBlock:: @@ -1370,9 +1102,7 @@ readSubBlock( if constexpr(std::derived_from) { InfoPartBlock B(*I.get(), br_); - if(auto err = br_.readBlock(B, ID)) - return err; - return Error::success(); + return br_.readBlock(B, ID); } break; } @@ -1381,17 +1111,7 @@ readSubBlock( if constexpr(std::derived_from) { SymbolPartBlock B(*I.get(), br_); - if(auto err = br_.readBlock(B, ID)) - return err; - return Error::success(); - } - break; - } - case BI_REFERENCE_BLOCK_ID: - { - if constexpr(std::derived_from) - { - return readChild(I->Children, ID); + return br_.readBlock(B, ID); } break; } diff --git a/source/AST/BitcodeIDs.hpp b/source/AST/BitcodeIDs.hpp index fa5ebc1c1..50676d117 100644 --- a/source/AST/BitcodeIDs.hpp +++ b/source/AST/BitcodeIDs.hpp @@ -34,7 +34,6 @@ struct BitCodeConstants static constexpr unsigned StringLengthSize = 16U; // up to 32767 chars static constexpr unsigned FilenameLengthSize = 16U; static constexpr unsigned LineNumberSize = 32U; - static constexpr unsigned ReferenceTypeSize = 8U; static constexpr unsigned USRLengthSize = 6U; static constexpr unsigned USRBitLengthSize = 8U; static constexpr unsigned USRHashSize = 20; @@ -65,7 +64,6 @@ enum BlockID BI_JAVADOC_NODE_BLOCK_ID, BI_NAMESPACE_BLOCK_ID, BI_RECORD_BLOCK_ID, - BI_REFERENCE_BLOCK_ID, BI_TEMPLATE_ARG_BLOCK_ID, BI_TEMPLATE_BLOCK_ID, BI_TEMPLATE_PARAM_BLOCK_ID, @@ -88,6 +86,10 @@ enum RecordID INFO_PART_PARENTS, SYMBOL_PART_DEFLOC, SYMBOL_PART_LOC, + NAMESPACE_MEMBERS, + NAMESPACE_SPECIALIZATIONS, + TYPE_ID, + TYPE_NAME, BASE_ACCESS, BASE_ID, BASE_IS_VIRTUAL, @@ -112,10 +114,6 @@ enum RecordID RECORD_FRIENDS, RECORD_IS_TYPE_DEF, RECORD_KEY_KIND, - REFERENCE_FIELD, - REFERENCE_NAME, - REFERENCE_KIND, - REFERENCE_USR, RECORD_ENUMS, RECORD_FUNCTIONS, RECORD_RECORDS, @@ -140,22 +138,6 @@ enum RecordID static constexpr unsigned BlockIdCount = BI_LAST - BI_FIRST; static constexpr unsigned RecordIDCount = RI_LAST - RI_FIRST; -// Identifiers for differentiating between subblocks -enum class FieldId -{ - F_default, - F_namespace, - F_vparent, - F_type, - F_child_namespace, - F_child_record, - F_child_function, - F_child_typedef, - F_child_enum, - F_child_variable, - F_child_specialization -}; - } // mrdox } // clang diff --git a/source/AST/BitcodeReader.cpp b/source/AST/BitcodeReader.cpp index 1573ac2b0..ca1471116 100644 --- a/source/AST/BitcodeReader.cpp +++ b/source/AST/BitcodeReader.cpp @@ -126,7 +126,6 @@ getInfos() case BI_JAVADOC_BLOCK_ID: case BI_JAVADOC_LIST_BLOCK_ID: case BI_JAVADOC_NODE_BLOCK_ID: - case BI_REFERENCE_BLOCK_ID: return Error("invalid top level block"); case llvm::bitc::BLOCKINFO_BLOCK_ID: if (auto err = readBlockInfoBlock()) diff --git a/source/AST/BitcodeWriter.cpp b/source/AST/BitcodeWriter.cpp index 1a115e348..cab76ca45 100644 --- a/source/AST/BitcodeWriter.cpp +++ b/source/AST/BitcodeWriter.cpp @@ -219,7 +219,6 @@ BlockIdNameMap = []() {BI_JAVADOC_BLOCK_ID, "JavadocBlock"}, {BI_JAVADOC_LIST_BLOCK_ID, "JavadocListBlock"}, {BI_JAVADOC_NODE_BLOCK_ID, "JavadocNodeBlock"}, - {BI_REFERENCE_BLOCK_ID, "ReferenceBlock"}, {BI_TEMPLATE_ARG_BLOCK_ID, "TemplateArgBlock"}, {BI_TEMPLATE_BLOCK_ID, "TemplateBlock"}, {BI_TEMPLATE_PARAM_BLOCK_ID, "TemplateParamBlock"}, @@ -267,14 +266,12 @@ RecordIDNameMap = []() {JAVADOC_NODE_STYLE, {"JavadocNodeStyle", &Integer32Abbrev}}, {JAVADOC_NODE_ADMONISH, {"JavadocNodeAdmonish", &Integer32Abbrev}}, {JAVADOC_PARAM_DIRECTION, {"JavadocParamDirection", &Integer32Abbrev}}, + {NAMESPACE_MEMBERS, {"NamespaceMembers", &SymbolIDsAbbrev}}, + {NAMESPACE_SPECIALIZATIONS, {"NamespaceSpecializations", &SymbolIDsAbbrev}}, {RECORD_KEY_KIND, {"KeyKind", &Integer32Abbrev}}, {RECORD_IS_TYPE_DEF, {"IsTypeDef", &BoolAbbrev}}, {RECORD_BITS, {"Bits", &Integer32ArrayAbbrev}}, {RECORD_FRIENDS, {"Friends", &SymbolIDsAbbrev}}, - {REFERENCE_USR, {"USR", &SymbolIDAbbrev}}, - {REFERENCE_NAME, {"Name", &StringAbbrev}}, - {REFERENCE_KIND, {"RefKind", &Integer32Abbrev}}, - {REFERENCE_FIELD, {"Field", &Integer32Abbrev}}, {RECORD_ENUMS, {"RecordEnums", &MemberRefsAbbrev}}, {RECORD_FUNCTIONS, {"RecordFunctions", &MemberRefsAbbrev}}, {RECORD_RECORDS, {"RecordRecords", &MemberRefsAbbrev}}, @@ -282,6 +279,8 @@ RecordIDNameMap = []() {RECORD_VARS, {"RecordVars", &MemberRefsAbbrev}}, {RECORD_FIELDS, {"RecordFields", &MemberRefsAbbrev}}, {RECORD_SPECIALIZATIONS,{"RecordSpecializations", &SymbolIDsAbbrev}}, + {SPECIALIZATION_PRIMARY, {"SpecializationPrimary", &SymbolIDAbbrev}}, + {SPECIALIZATION_MEMBERS, {"SpecializationMembers", &SymbolIDsAbbrev}}, {SYMBOL_PART_DEFLOC, {"SymbolDefLoc", &LocationAbbrev}}, {SYMBOL_PART_LOC, {"SymbolLoc", &LocationAbbrev}}, {TEMPLATE_PRIMARY_USR, {"Primary", &SymbolIDAbbrev}}, @@ -290,8 +289,8 @@ RecordIDNameMap = []() {TEMPLATE_PARAM_NAME, {"Name", &StringAbbrev}}, {TEMPLATE_PARAM_IS_PACK, {"IsPack", &BoolAbbrev}}, {TEMPLATE_PARAM_DEFAULT, {"Default", &StringAbbrev}}, - {SPECIALIZATION_PRIMARY, {"SpecializationPrimary", &SymbolIDAbbrev}}, - {SPECIALIZATION_MEMBERS, {"SpecializationMembers", &SymbolIDsAbbrev}}, + {TYPE_ID, {"TypeID", &SymbolIDAbbrev}}, + {TYPE_NAME, {"TypeName", &StringAbbrev}}, {TYPEDEF_IS_USING, {"IsUsing", &BoolAbbrev}}, {VARIABLE_BITS, {"Bits", &Integer32ArrayAbbrev}} }; @@ -348,16 +347,13 @@ RecordsByBlock{ JAVADOC_NODE_ADMONISH, JAVADOC_PARAM_DIRECTION}}, // NamespaceInfo {BI_NAMESPACE_BLOCK_ID, - {}}, + {NAMESPACE_MEMBERS, NAMESPACE_SPECIALIZATIONS}}, // RecordInfo {BI_RECORD_BLOCK_ID, {RECORD_KEY_KIND, RECORD_IS_TYPE_DEF, RECORD_BITS, RECORD_FRIENDS, RECORD_ENUMS, RECORD_FUNCTIONS, RECORD_RECORDS, RECORD_TYPES, RECORD_VARS, RECORD_FIELDS, RECORD_SPECIALIZATIONS}}, - // std::vector - {BI_REFERENCE_BLOCK_ID, - {REFERENCE_USR, REFERENCE_NAME, REFERENCE_KIND, REFERENCE_FIELD}}, // TArg {BI_TEMPLATE_ARG_BLOCK_ID, {TEMPLATE_ARG_VALUE}}, @@ -372,7 +368,8 @@ RecordsByBlock{ {BI_SPECIALIZATION_BLOCK_ID, {SPECIALIZATION_PRIMARY, SPECIALIZATION_MEMBERS}}, // TypeInfo - {BI_TYPE_BLOCK_ID, {}}, + {BI_TYPE_BLOCK_ID, + {TYPE_ID, TYPE_NAME}}, // TypedefInfo {BI_TYPEDEF_BLOCK_ID, {TYPEDEF_IS_USING}}, @@ -974,20 +971,8 @@ emitBlock( { StreamSubBlockGuard Block(Stream, BI_NAMESPACE_BLOCK_ID); emitInfoPart(I); - for (const auto& ref : I.Children.Namespaces) - emitBlock(ref, FieldId::F_child_namespace); - for (const auto& ref : I.Children.Records) - emitBlock(ref, FieldId::F_child_record); - for (auto const& ref : I.Children.Functions) - emitBlock(ref, FieldId::F_child_function); - for (const auto& ref : I.Children.Typedefs) - emitBlock(ref, FieldId::F_child_typedef); - for (const auto& ref : I.Children.Enums) - emitBlock(ref, FieldId::F_child_enum); - for (const auto& ref : I.Children.Vars) - emitBlock(ref, FieldId::F_child_variable); - for (const auto& ref : I.Children.Specializations) - emitBlock(ref, FieldId::F_child_specialization); + emitRecord(I.Members, NAMESPACE_MEMBERS); + emitRecord(I.Specializations, NAMESPACE_SPECIALIZATIONS); } void @@ -1015,20 +1000,6 @@ emitBlock( emitRecord(I.Friends, RECORD_FRIENDS); } -void -BitcodeWriter:: -emitBlock( - Reference const& R, FieldId Field) -{ - if (R.id == SymbolID::zero && R.Name.empty()) - return; - StreamSubBlockGuard Block(Stream, BI_REFERENCE_BLOCK_ID); - emitRecord(R.id, REFERENCE_USR); - emitRecord(R.Name, REFERENCE_NAME); - emitRecord((unsigned)R.RefKind, REFERENCE_KIND); - emitRecord((unsigned)Field, REFERENCE_FIELD); -} - void BitcodeWriter:: emitBlock( @@ -1131,8 +1102,11 @@ BitcodeWriter:: emitBlock( TypeInfo const& T) { + if (T.id == SymbolID::zero && T.Name.empty()) + return; StreamSubBlockGuard Block(Stream, BI_TYPE_BLOCK_ID); - emitBlock(static_cast(T), FieldId::F_type); + emitRecord(T.id, TYPE_ID); + emitRecord(T.Name, TYPE_NAME); } void diff --git a/source/AST/BitcodeWriter.hpp b/source/AST/BitcodeWriter.hpp index e0eeb83c6..3dead66bb 100644 --- a/source/AST/BitcodeWriter.hpp +++ b/source/AST/BitcodeWriter.hpp @@ -128,7 +128,6 @@ class BitcodeWriter void emitBlock(Javadoc::Node const& I); void emitBlock(NamespaceInfo const& I); void emitBlock(RecordInfo const& I); - void emitBlock(Reference const& B, FieldId F); void emitBlock(SpecializationInfo const& T); void emitBlock(TemplateInfo const& T); void emitBlock(TParam const& T); diff --git a/source/AST/DecodeRecord.hpp b/source/AST/DecodeRecord.hpp index 1d5a87d62..e37966b52 100644 --- a/source/AST/DecodeRecord.hpp +++ b/source/AST/DecodeRecord.hpp @@ -160,7 +160,7 @@ inline Error decodeRecord( Record const& R, - InfoKind& Field, + InfoKind& Kind, llvm::StringRef Blob) { switch(auto kind = static_cast(R[0])) @@ -171,43 +171,16 @@ decodeRecord( case InfoKind::Enum: case InfoKind::Typedef: case InfoKind::Variable: + case InfoKind::Field: case InfoKind::Specialization: - Field = kind; + Kind = kind; return Error::success(); default: - Field = InfoKind::Default; + Kind = InfoKind::Default; return Error("InfoKind is invalid"); } } -inline -Error -decodeRecord( - Record const& R, - FieldId& Field, - llvm::StringRef Blob) -{ - auto F = static_cast(R[0]); - switch(F) - { - case FieldId::F_namespace: - case FieldId::F_vparent: - case FieldId::F_type: - case FieldId::F_child_namespace: - case FieldId::F_child_record: - case FieldId::F_child_function: - case FieldId::F_child_typedef: - case FieldId::F_child_enum: - case FieldId::F_child_variable: - case FieldId::F_child_specialization: - case FieldId::F_default: - Field = F; - return Error::success(); - } - Field = FieldId::F_default; - return Error("FieldId is invalid"); -} - inline Error decodeRecord( diff --git a/source/Corpus.cpp b/source/Corpus.cpp index f22358c7b..332da00cd 100644 --- a/source/Corpus.cpp +++ b/source/Corpus.cpp @@ -138,7 +138,6 @@ traverse( return f.visit(static_cast(I)); case InfoKind::Variable: return f.visit(static_cast(I)); - // KRYSTIAN FIXME: is this correct? case InfoKind::Field: return f.visit(static_cast(I)); case InfoKind::Specialization: @@ -154,26 +153,11 @@ traverse( Visitor& f, NamespaceInfo const& I) const { - for(auto const& ref : I.Children.Namespaces) - if(! f.visit(get(ref.id))) + for(auto const& id : I.Members) + if(! this->traverse(f, id)) return false; - for(auto const& ref : I.Children.Records) - if(! f.visit(get(ref.id))) - return false; - for(auto const& ref : I.Children.Functions) - if(! f.visit(get(ref.id))) - return false; - for(auto const& ref : I.Children.Typedefs) - if(! f.visit(get(ref.id))) - return false; - for(auto const& ref : I.Children.Enums) - if(! f.visit(get(ref.id))) - return false; - for(auto const& ref : I.Children.Vars) - if(! f.visit(get(ref.id))) - return false; - for(auto const& ref : I.Children.Specializations) - if(! f.visit(get(ref.id))) + for(auto const& id : I.Specializations) + if(! f.visit(get(id))) return false; return true; } @@ -240,18 +224,6 @@ traverse(Visitor& f, SymbolID id) const return traverse(f, get(id)); } -bool -Corpus:: -traverse( - Visitor& f, - std::vector const& R) const -{ - for(auto const& ref : R) - if(! traverse(f, get(ref.id))) - return false; - return true; -} - bool Corpus:: traverse( diff --git a/source/CorpusImpl.cpp b/source/CorpusImpl.cpp index 4385a3f57..40a58b924 100644 --- a/source/CorpusImpl.cpp +++ b/source/CorpusImpl.cpp @@ -229,18 +229,9 @@ traverse( MutableVisitor& f, NamespaceInfo& I) { - for(auto const& ref : I.Children.Namespaces) - f.visit(get(ref.id)); - for(auto const& ref : I.Children.Records) - f.visit(get(ref.id)); - for(auto const& ref : I.Children.Functions) - f.visit(get(ref.id)); - for(auto const& ref : I.Children.Typedefs) - f.visit(get(ref.id)); - for(auto const& ref : I.Children.Enums) - f.visit(get(ref.id)); - for(auto const& ref : I.Children.Vars) - f.visit(get(ref.id)); + for(auto const& id : I.Members) + this->traverse(f, id); + // KRYSTIAN FIXME: should we traverse specializations? } void @@ -261,6 +252,7 @@ traverse( f.visit(get(t.id)); for(auto const& t : I.Members.Vars) f.visit(get(t.id)); + // KRYSTIAN FIXME: should we traverse specializations? } void @@ -291,12 +283,11 @@ class CorpusImpl:: void visit(NamespaceInfo& I) override { postProcess(I); - canonicalize(I.Children.Namespaces); - canonicalize(I.Children.Records); - canonicalize(I.Children.Functions); - canonicalize(I.Children.Typedefs); - canonicalize(I.Children.Enums); - canonicalize(I.Children.Vars); + canonicalize(I.Members); + // KRYSTIAN FIXME: should we canonicalize specializations? + // we shouldn't canonicalize anything if we intend to + // preserve declaration order. + corpus_.traverse(*this, I); } @@ -343,17 +334,6 @@ class CorpusImpl:: //-------------------------------------------- - void canonicalize(std::vector& list) noexcept - { - // Sort by symbol ID - llvm::sort(list, - [&](Reference const& ref0, - Reference const& ref1) noexcept - { - return ref0.id < ref1.id; - }); - } - void canonicalize(std::vector& list) noexcept { // Sort by symbol ID diff --git a/source/Metadata/Overloads.cpp b/source/Metadata/Overloads.cpp index cdf20061d..d429e0457 100644 --- a/source/Metadata/Overloads.cpp +++ b/source/Metadata/Overloads.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include namespace clang { @@ -57,11 +56,14 @@ makeNamespaceOverloads( Corpus const& corpus) { std::vector data; - data.reserve(I.Children.Functions.size()); - for(auto const& ref : I.Children.Functions) + for(auto const& id : I.Members) { - auto const& I = corpus.get(ref.id); - data.push_back(&I); + if(const Info* info = corpus.find(id); + info && info->isFunction()) + { + data.push_back(static_cast< + const FunctionInfo*>(info)); + } } return NamespaceOverloads(I, std::move(data)); diff --git a/source/Metadata/Reduce.cpp b/source/Metadata/Reduce.cpp index e4af53cd0..c772c57bc 100644 --- a/source/Metadata/Reduce.cpp +++ b/source/Metadata/Reduce.cpp @@ -57,13 +57,6 @@ static bool canMerge(Info const& I, Info const& Other) I.Kind == Other.Kind && I.id == Other.id; } - -static bool canMerge(Reference const& I, Reference const& Other) -{ - return - I.RefKind == Other.RefKind && - I.id == Other.id; -} #endif static void merge(Javadoc& I, Javadoc&& other) @@ -110,17 +103,20 @@ static void mergeSymbolInfo( I.Loc.erase(Last, I.Loc.end()); } -void merge(NamespaceInfo& I, NamespaceInfo&& Other) + +static +void +reduceRefs( + std::vector& list, + std::vector&& otherList) { - Assert(canMerge(I, Other)); - reduceChildren(I.Children.Namespaces, std::move(Other.Children.Namespaces)); - reduceChildren(I.Children.Records, std::move(Other.Children.Records)); - reduceChildren(I.Children.Functions, std::move(Other.Children.Functions)); - reduceChildren(I.Children.Typedefs, std::move(Other.Children.Typedefs)); - reduceChildren(I.Children.Enums, std::move(Other.Children.Enums)); - reduceChildren(I.Children.Vars, std::move(Other.Children.Vars)); - reduceChildren(I.Children.Specializations, std::move(Other.Children.Specializations)); - mergeInfo(I, std::move(Other)); + for(auto const& id : otherList) + { + auto it = llvm::find(list, id); + if(it != list.end()) + continue; + list.push_back(id); + } } static @@ -146,29 +142,6 @@ reduceMemberRefs( } } -static -void -reduceRefs( - std::vector& list, - std::vector&& otherList) -{ - for(auto const& id : otherList) - { - auto it = llvm::find(list, id); -#if 0 - auto it = llvm::find_if( - list, - [ref](SymbolID const& other) noexcept - { - return other.id == ref.id; - }); -#endif - if(it != list.end()) - continue; - list.push_back(id); - } -} - static void reduceSpecializedMembers( @@ -189,6 +162,14 @@ reduceSpecializedMembers( } } +void merge(NamespaceInfo& I, NamespaceInfo&& Other) +{ + Assert(canMerge(I, Other)); + reduceRefs(I.Members, std::move(Other.Members)); + reduceRefs(I.Specializations, std::move(Other.Specializations)); + mergeInfo(I, std::move(Other)); +} + void merge(RecordInfo& I, RecordInfo&& Other) { Assert(canMerge(I, Other)); @@ -296,13 +277,6 @@ void merge(VarInfo& I, VarInfo&& Other) I.specs.raw.value |= Other.specs.raw.value; } -void merge(Reference& I, Reference&& Other) -{ - Assert(canMerge(I, Other)); - if (I.Name.empty()) - I.Name = Other.Name; -} - void merge(SpecializationInfo& I, SpecializationInfo&& Other) { Assert(canMerge(I, Other)); diff --git a/source/Metadata/Reduce.hpp b/source/Metadata/Reduce.hpp index 2cccc578c..4343b82f2 100644 --- a/source/Metadata/Reduce.hpp +++ b/source/Metadata/Reduce.hpp @@ -28,7 +28,6 @@ void merge(TypedefInfo& I, TypedefInfo&& Other); void merge(EnumInfo& I, EnumInfo&& Other); void merge(FieldInfo& I, FieldInfo&& Other); void merge(VarInfo& I, VarInfo&& Other); -void merge(Reference& I, Reference&& Other); void merge(SpecializationInfo& I, SpecializationInfo&& Other); // diff --git a/source/Metadata/Reference.cpp b/source/Metadata/Reference.cpp deleted file mode 100644 index b0e63edc5..000000000 --- a/source/Metadata/Reference.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// -// This is a derivative work. originally part of the LLVM Project. -// Licensed under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// Copyright (c) 2023 Vinnie Falco (vinnie.falco@gmail.com) -// -// Official repository: https://github.com/cppalliance/mrdox -// - -#include - -namespace clang { -namespace mrdox { - -} // mrdox -} // clang diff --git a/source/Support/Debug.cpp b/source/Support/Debug.cpp index a0e188aae..c10678466 100644 --- a/source/Support/Debug.cpp +++ b/source/Support/Debug.cpp @@ -13,7 +13,6 @@ #include "Support/Radix.hpp" #include #include -#include #include #include #include @@ -218,19 +217,6 @@ format( return fmt::formatter::format(str, ctx); } -fmt::format_context::iterator -fmt::formatter:: -format( - const clang::mrdox::Reference& r, - fmt::format_context& ctx) const -{ - std::string str = fmt::format("Reference: kind = {}", r.RefKind); - if(! r.Name.empty()) - str += fmt::format(", name = '{}'", std::string(r.Name)); - str += fmt::format(", ID = {}", r.id); - return fmt::formatter::format(std::move(str), ctx); -} - fmt::format_context::iterator fmt::formatter:: format( diff --git a/source/Support/Debug.hpp b/source/Support/Debug.hpp index 0aca647fc..424176bd1 100644 --- a/source/Support/Debug.hpp +++ b/source/Support/Debug.hpp @@ -58,15 +58,6 @@ struct fmt::formatter fmt::format_context& ctx) const; }; -template<> -struct fmt::formatter - : fmt::formatter -{ - fmt::format_context::iterator format( - const clang::mrdox::Reference& r, - fmt::format_context& ctx) const; -}; - template<> struct fmt::formatter : fmt::formatter diff --git a/source/Support/SafeNames.cpp b/source/Support/SafeNames.cpp index d63c309f3..01febc10e 100644 --- a/source/Support/SafeNames.cpp +++ b/source/Support/SafeNames.cpp @@ -76,28 +76,13 @@ class PrettyBuilder : public Corpus::Visitor ScopeInfos buildScope( - Scope const& scope) + NamespaceInfo const& I) { ScopeInfos infos; - infos.reserve( - scope.Namespaces.size() + - scope.Records.size() + - scope.Functions.size() + - scope.Typedefs.size() + - scope.Enums.size() + - scope.Vars.size()); - for(auto const& ref : scope.Namespaces) - infos.emplace_back(corpus_.find(ref.id)); - for(auto const& ref : scope.Records) - infos.emplace_back(corpus_.find(ref.id)); - for(auto const& ref : scope.Functions) - infos.emplace_back(corpus_.find(ref.id)); - for(auto const& ref : scope.Typedefs) - infos.emplace_back(corpus_.find(ref.id)); - for(auto const& ref : scope.Enums) - infos.emplace_back(corpus_.find(ref.id)); - for(auto const& ref : scope.Vars) - infos.emplace_back(corpus_.find(ref.id)); + infos.reserve(I.Members.size()); + for(auto const& id : I.Members) + infos.emplace_back(corpus_.find(id)); + // KRYSTIAN FIXME: include specializations if(infos.size() < 2) return infos; std::string s0, s1; @@ -225,19 +210,6 @@ class PrettyBuilder : public Corpus::Visitor } } - void visitScope(Scope const& scope) - { - auto const n0 = prefix_.size(); - for(auto const& ref : scope.Namespaces) - { - Info const& J(corpus_.get(ref.id)); - prefix_.append(getSafe(J)); - prefix_.push_back('-'); - corpus_.traverse(*this, J); - prefix_.resize(n0); - } - } - void visitInfos(ScopeInfos const& infos) { auto const n0 = prefix_.size(); @@ -254,7 +226,7 @@ class PrettyBuilder : public Corpus::Visitor bool visit(NamespaceInfo const& I) override { - auto infos = buildScope(I.Children); + auto infos = buildScope(I); insertScope(infos); visitInfos(infos); return true; diff --git a/test-files/old-tests/alias-template.xml b/test-files/old-tests/alias-template.xml index a6dcf5349..03b18d80f 100644 --- a/test-files/old-tests/alias-template.xml +++ b/test-files/old-tests/alias-template.xml @@ -2,6 +2,13 @@ + - diff --git a/test-files/old-tests/explicit-deduct-guide.xml b/test-files/old-tests/explicit-deduct-guide.xml index e9f5ae2c6..23f7cdd39 100644 --- a/test-files/old-tests/explicit-deduct-guide.xml +++ b/test-files/old-tests/explicit-deduct-guide.xml @@ -2,12 +2,6 @@ - @@ -39,5 +33,11 @@ + diff --git a/test-files/old-tests/function-parm-decay.xml b/test-files/old-tests/function-parm-decay.xml index 928ee584e..db66f507d 100644 --- a/test-files/old-tests/function-parm-decay.xml +++ b/test-files/old-tests/function-parm-decay.xml @@ -16,6 +16,10 @@ + + + + @@ -30,10 +34,6 @@ - - - - diff --git a/test-files/old-tests/function-tparm-decay.xml b/test-files/old-tests/function-tparm-decay.xml index 4c005996d..2ded25d47 100644 --- a/test-files/old-tests/function-tparm-decay.xml +++ b/test-files/old-tests/function-tparm-decay.xml @@ -2,6 +2,10 @@ + + + + + + + + - - - - - - - - diff --git a/test-files/old-tests/static-data-def.xml b/test-files/old-tests/static-data-def.xml index df2f94d4c..4af759c95 100644 --- a/test-files/old-tests/static-data-def.xml +++ b/test-files/old-tests/static-data-def.xml @@ -2,6 +2,10 @@ + + + + - - - - diff --git a/test-files/old-tests/var-template.xml b/test-files/old-tests/var-template.xml index f508ed8a0..7e8af991a 100644 --- a/test-files/old-tests/var-template.xml +++ b/test-files/old-tests/var-template.xml @@ -2,6 +2,28 @@ + + + - - -