https://github.com/aviralg updated https://github.com/llvm/llvm-project/pull/183390
>From 05cff5c9bcec4ddfa6f49c0efa7f2f78d1150c2a Mon Sep 17 00:00:00 2001 From: Aviral Goel <[email protected]> Date: Wed, 25 Feb 2026 13:03:29 -0800 Subject: [PATCH] Fix messages and make things consistent --- .../Analysis/Scalable/Model/BuildNamespace.h | 5 +- .../Analysis/Scalable/Model/EntityLinkage.h | 23 +- .../Scalable/Serialization/JSONFormat.h | 3 - .../Scalable/Support/FormatProviders.h | 14 + .../Scalable/EntityLinker/EntityLinker.cpp | 18 +- .../Scalable/Model/BuildNamespace.cpp | 25 +- .../Analysis/Scalable/Model/EntityLinkage.cpp | 31 +- .../Scalable/ModelStringConversions.h | 87 ++++++ .../Scalable/Serialization/JSONFormat.cpp | 129 ++++----- .../Analysis/Scalable/BuildNamespaceTest.cpp | 65 +++-- .../Analysis/Scalable/CMakeLists.txt | 5 + .../Analysis/Scalable/EntityIdTest.cpp | 14 + .../Analysis/Scalable/EntityLinkageTest.cpp | 44 ++- .../Analysis/Scalable/EntityLinkerTest.cpp | 8 +- .../Analysis/Scalable/EntityNameTest.cpp | 16 +- .../Scalable/ModelStringConversionsTest.cpp | 100 +++++++ .../JSONFormatTest/TUSummaryTest.cpp | 274 +++++++++--------- .../Analysis/Scalable/SummaryNameTest.cpp | 7 + 18 files changed, 565 insertions(+), 303 deletions(-) create mode 100644 clang/lib/Analysis/Scalable/ModelStringConversions.h create mode 100644 clang/unittests/Analysis/Scalable/ModelStringConversionsTest.cpp diff --git a/clang/include/clang/Analysis/Scalable/Model/BuildNamespace.h b/clang/include/clang/Analysis/Scalable/Model/BuildNamespace.h index 61c767e7953dc..39307d976e986 100644 --- a/clang/include/clang/Analysis/Scalable/Model/BuildNamespace.h +++ b/clang/include/clang/Analysis/Scalable/Model/BuildNamespace.h @@ -29,10 +29,6 @@ namespace clang::ssaf { enum class BuildNamespaceKind : unsigned short { CompilationUnit, LinkUnit }; -llvm::StringRef toString(BuildNamespaceKind BNK); - -std::optional<BuildNamespaceKind> parseBuildNamespaceKind(llvm::StringRef Str); - /// Represents a single namespace in the build process. /// /// A BuildNamespace groups program entities, such as those belonging to a @@ -123,6 +119,7 @@ class NestedBuildNamespace { const NestedBuildNamespace &NBN); }; +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, BuildNamespaceKind BNK); llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const BuildNamespace &BN); llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const NestedBuildNamespace &NBN); diff --git a/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h b/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h index 0d52a70ae7f92..3e9374d6ddab3 100644 --- a/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h +++ b/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h @@ -14,6 +14,12 @@ namespace clang::ssaf { +enum class EntityLinkageType { + None, ///< local variables, function parameters + Internal, ///< static functions/variables, anonymous namespace + External ///< globally visible across translation units +}; + /// Represents the linkage properties of an entity in the program model. /// /// EntityLinkage captures whether an entity has no linkage, internal linkage, @@ -24,26 +30,19 @@ class EntityLinkage { friend class TestFixture; public: - enum class LinkageType { - None, ///< local variables, function parameters - Internal, ///< static functions/variables, anonymous namespace - External ///< globally visible across translation units - }; + constexpr explicit EntityLinkage(EntityLinkageType L) : Linkage(L) {} - constexpr explicit EntityLinkage(LinkageType L) : Linkage(L) {} - - LinkageType getLinkage() const { return Linkage; } + EntityLinkageType getLinkage() const { return Linkage; } bool operator==(const EntityLinkage &Other) const; bool operator!=(const EntityLinkage &Other) const; private: - LinkageType Linkage; + EntityLinkageType Linkage; }; -/// Returns a string representation of the linkage type. -llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, - EntityLinkage::LinkageType Linkage); +/// Writes a string representation of the linkage type to the stream. +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, EntityLinkageType Linkage); llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const EntityLinkage &Linkage); diff --git a/clang/include/clang/Analysis/Scalable/Serialization/JSONFormat.h b/clang/include/clang/Analysis/Scalable/Serialization/JSONFormat.h index 8d46bbf29863a..30dfa305238f6 100644 --- a/clang/include/clang/Analysis/Scalable/Serialization/JSONFormat.h +++ b/clang/include/clang/Analysis/Scalable/Serialization/JSONFormat.h @@ -69,9 +69,6 @@ class JSONFormat final : public SerializationFormat { EntityId entityIdFromJSON(const uint64_t EntityIdIndex) const; uint64_t entityIdToJSON(EntityId EI) const; - llvm::Expected<BuildNamespaceKind> - buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr) const; - llvm::Expected<BuildNamespace> buildNamespaceFromJSON(const Object &BuildNamespaceObject) const; Object buildNamespaceToJSON(const BuildNamespace &BN) const; diff --git a/clang/include/clang/Analysis/Scalable/Support/FormatProviders.h b/clang/include/clang/Analysis/Scalable/Support/FormatProviders.h index 3610a3b2d0074..80bbf79bbdb37 100644 --- a/clang/include/clang/Analysis/Scalable/Support/FormatProviders.h +++ b/clang/include/clang/Analysis/Scalable/Support/FormatProviders.h @@ -31,6 +31,13 @@ template <> struct format_provider<clang::ssaf::EntityId> { } }; +template <> struct format_provider<clang::ssaf::EntityLinkageType> { + static void format(clang::ssaf::EntityLinkageType Val, raw_ostream &OS, + StringRef Style) { + OS << Val; + } +}; + template <> struct format_provider<clang::ssaf::EntityLinkage> { static void format(clang::ssaf::EntityLinkage Val, raw_ostream &OS, StringRef Style) { @@ -38,6 +45,13 @@ template <> struct format_provider<clang::ssaf::EntityLinkage> { } }; +template <> struct format_provider<clang::ssaf::BuildNamespaceKind> { + static void format(clang::ssaf::BuildNamespaceKind Val, raw_ostream &OS, + StringRef Style) { + OS << Val; + } +}; + template <> struct format_provider<clang::ssaf::BuildNamespace> { static void format(const clang::ssaf::BuildNamespace &Val, raw_ostream &OS, StringRef Style) { diff --git a/clang/lib/Analysis/Scalable/EntityLinker/EntityLinker.cpp b/clang/lib/Analysis/Scalable/EntityLinker/EntityLinker.cpp index 1860a76db67aa..cd0c83a38a377 100644 --- a/clang/lib/Analysis/Scalable/EntityLinker/EntityLinker.cpp +++ b/clang/lib/Analysis/Scalable/EntityLinker/EntityLinker.cpp @@ -49,16 +49,16 @@ static constexpr const char *DuplicateTUNamespace = static NestedBuildNamespace resolveNamespace(const NestedBuildNamespace &LUNamespace, const NestedBuildNamespace &EntityNamespace, - EntityLinkage::LinkageType Linkage) { + EntityLinkageType Linkage) { switch (Linkage) { - case EntityLinkage::LinkageType::None: - case EntityLinkage::LinkageType::Internal: + case EntityLinkageType::None: + case EntityLinkageType::Internal: return EntityNamespace.makeQualified(LUNamespace); - case EntityLinkage::LinkageType::External: + case EntityLinkageType::External: return NestedBuildNamespace(LUNamespace); } - llvm_unreachable("Unhandled EntityLinkage::LinkageType variant"); + llvm_unreachable("Unhandled EntityLinkageType variant"); } EntityId EntityLinker::resolveEntity(const EntityName &OldName, @@ -79,8 +79,8 @@ EntityId EntityLinker::resolveEntity(const EntityName &OldName, // Insertion failure for `None` and `Internal` linkage is a fatal error // because these entities have unique namespaces and should never collide. // `External` linkage entities may collide. - if (Linkage.getLinkage() == EntityLinkage::LinkageType::None || - Linkage.getLinkage() == EntityLinkage::LinkageType::Internal) { + if (Linkage.getLinkage() == EntityLinkageType::None || + Linkage.getLinkage() == EntityLinkageType::Internal) { ErrorBuilder::fatal(ErrorMessages::EntityAlreadyExistsInLinkageTable, ErrorMessages::EntityLinkerFatalErrorPrefix, NewId, Linkage); @@ -144,8 +144,8 @@ EntityLinker::merge(TUSummaryEncoding &Summary, // Insertion should never fail for `None` and `Internal` linkage // entities because these entities will have different namespaces across // TUs even if their names match. - if (Linkage.getLinkage() == EntityLinkage::LinkageType::None || - Linkage.getLinkage() == EntityLinkage::LinkageType::Internal) { + if (Linkage.getLinkage() == EntityLinkageType::None || + Linkage.getLinkage() == EntityLinkageType::Internal) { ErrorBuilder::fatal( ErrorMessages::FailedToInsertEntityIntoOutputSummary, ErrorMessages::EntityLinkerFatalErrorPrefix, NewId, Linkage, SN); diff --git a/clang/lib/Analysis/Scalable/Model/BuildNamespace.cpp b/clang/lib/Analysis/Scalable/Model/BuildNamespace.cpp index bdb2d03b3e7c1..b74ac7dcf80c8 100644 --- a/clang/lib/Analysis/Scalable/Model/BuildNamespace.cpp +++ b/clang/lib/Analysis/Scalable/Model/BuildNamespace.cpp @@ -7,30 +7,13 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/Scalable/Model/BuildNamespace.h" +#include "../ModelStringConversions.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/ErrorHandling.h" #include <tuple> namespace clang::ssaf { -llvm::StringRef toString(BuildNamespaceKind BNK) { - switch (BNK) { - case BuildNamespaceKind::CompilationUnit: - return "compilation_unit"; - case BuildNamespaceKind::LinkUnit: - return "link_unit"; - } - llvm_unreachable("Unknown BuildNamespaceKind"); -} - -std::optional<BuildNamespaceKind> parseBuildNamespaceKind(llvm::StringRef Str) { - if (Str == "compilation_unit") - return BuildNamespaceKind::CompilationUnit; - if (Str == "link_unit") - return BuildNamespaceKind::LinkUnit; - return std::nullopt; -} - BuildNamespace BuildNamespace::makeCompilationUnit(llvm::StringRef CompilationId) { return BuildNamespace{BuildNamespaceKind::CompilationUnit, @@ -71,8 +54,12 @@ bool NestedBuildNamespace::operator<(const NestedBuildNamespace &Other) const { return Namespaces < Other.Namespaces; } +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, BuildNamespaceKind BNK) { + return OS << buildNamespaceKindToString(BNK); +} + llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const BuildNamespace &BN) { - return OS << "BuildNamespace(" << toString(BN.Kind) << ", " << BN.Name << ")"; + return OS << "BuildNamespace(" << BN.Kind << ", " << BN.Name << ")"; } llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, diff --git a/clang/lib/Analysis/Scalable/Model/EntityLinkage.cpp b/clang/lib/Analysis/Scalable/Model/EntityLinkage.cpp index 16cd78ee84943..d0c0654b5d5f6 100644 --- a/clang/lib/Analysis/Scalable/Model/EntityLinkage.cpp +++ b/clang/lib/Analysis/Scalable/Model/EntityLinkage.cpp @@ -7,27 +7,10 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/Scalable/Model/EntityLinkage.h" -#include "llvm/Support/ErrorHandling.h" -namespace clang::ssaf { +#include "../ModelStringConversions.h" -llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, - EntityLinkage::LinkageType Linkage) { - switch (Linkage) { - case EntityLinkage::LinkageType::None: - return OS << "None"; - case EntityLinkage::LinkageType::Internal: - return OS << "Internal"; - case EntityLinkage::LinkageType::External: - return OS << "External"; - } - llvm_unreachable("Unhandled EntityLinkage::LinkageType variant"); -} - -llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, - const EntityLinkage &Linkage) { - return OS << "EntityLinkage(" << Linkage.getLinkage() << ")"; -} +namespace clang::ssaf { bool EntityLinkage::operator==(const EntityLinkage &Other) const { return Linkage == Other.Linkage; @@ -37,4 +20,14 @@ bool EntityLinkage::operator!=(const EntityLinkage &Other) const { return !(*this == Other); } +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, + EntityLinkageType Linkage) { + return OS << entityLinkageTypeToString(Linkage); +} + +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, + const EntityLinkage &Linkage) { + return OS << "EntityLinkage(" << Linkage.getLinkage() << ")"; +} + } // namespace clang::ssaf diff --git a/clang/lib/Analysis/Scalable/ModelStringConversions.h b/clang/lib/Analysis/Scalable/ModelStringConversions.h new file mode 100644 index 0000000000000..7042b08e7198e --- /dev/null +++ b/clang/lib/Analysis/Scalable/ModelStringConversions.h @@ -0,0 +1,87 @@ +//===- ModelStringConversions.h -------------------------------------------===// +// +// Part of the LLVM Project, 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 +// +//===----------------------------------------------------------------------===// +// +// Internal string conversion utilities for SSAF model types. +// +// These functions are shared by the model .cpp files (for operator<<) and +// JSONFormat.cpp (for serialization). They are not part of the public API. +// +//===----------------------------------------------------------------------===// + +#ifndef CLANG_LIB_ANALYSIS_SCALABLE_MODELSTRINGCONVERSIONS_H +#define CLANG_LIB_ANALYSIS_SCALABLE_MODELSTRINGCONVERSIONS_H + +#include "clang/Analysis/Scalable/Model/BuildNamespace.h" +#include "clang/Analysis/Scalable/Model/EntityLinkage.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/Support/ErrorHandling.h" +#include <optional> + +namespace clang::ssaf { + +//===----------------------------------------------------------------------===// +// BuildNamespaceKind +//===----------------------------------------------------------------------===// + +/// Returns the canonical string representation of \p BNK used for +/// serialization and display (e.g. "CompilationUnit", "LinkUnit"). +inline llvm::StringRef buildNamespaceKindToString(BuildNamespaceKind BNK) { + switch (BNK) { + case BuildNamespaceKind::CompilationUnit: + return "CompilationUnit"; + case BuildNamespaceKind::LinkUnit: + return "LinkUnit"; + } + llvm_unreachable("Unhandled BuildNamespaceKind variant"); +} + +/// Parses a string produced by buildNamespaceKindToString(). Returns +/// std::nullopt if \p Str does not match any known BuildNamespaceKind value. +inline std::optional<BuildNamespaceKind> +buildNamespaceKindFromString(llvm::StringRef Str) { + if (Str == "CompilationUnit") + return BuildNamespaceKind::CompilationUnit; + if (Str == "LinkUnit") + return BuildNamespaceKind::LinkUnit; + return std::nullopt; +} + +//===----------------------------------------------------------------------===// +// EntityLinkageType +//===----------------------------------------------------------------------===// + +/// Returns the canonical string representation of \p LT used for +/// serialization and display (e.g. "None", "Internal", "External"). +inline llvm::StringRef entityLinkageTypeToString(EntityLinkageType LT) { + switch (LT) { + case EntityLinkageType::None: + return "None"; + case EntityLinkageType::Internal: + return "Internal"; + case EntityLinkageType::External: + return "External"; + } + llvm_unreachable("Unhandled EntityLinkageType variant"); +} + +/// Parses a string produced by entityLinkageTypeToString(). Returns +/// std::nullopt if \p Str does not match any known EntityLinkageType value. +inline std::optional<EntityLinkageType> +entityLinkageTypeFromString(llvm::StringRef Str) { + if (Str == "None") + return EntityLinkageType::None; + if (Str == "Internal") + return EntityLinkageType::Internal; + if (Str == "External") + return EntityLinkageType::External; + return std::nullopt; +} + +} // namespace clang::ssaf + +#endif // CLANG_LIB_ANALYSIS_SCALABLE_MODELSTRINGCONVERSIONS_H diff --git a/clang/lib/Analysis/Scalable/Serialization/JSONFormat.cpp b/clang/lib/Analysis/Scalable/Serialization/JSONFormat.cpp index e2eda695a4eee..02c3b9b51da3e 100644 --- a/clang/lib/Analysis/Scalable/Serialization/JSONFormat.cpp +++ b/clang/lib/Analysis/Scalable/Serialization/JSONFormat.cpp @@ -1,6 +1,10 @@ #include "clang/Analysis/Scalable/Serialization/JSONFormat.h" + +#include "../ModelStringConversions.h" + #include "clang/Analysis/Scalable/Model/EntityLinkage.h" #include "clang/Analysis/Scalable/Support/ErrorBuilder.h" +#include "clang/Analysis/Scalable/Support/FormatProviders.h" #include "clang/Analysis/Scalable/TUSummary/TUSummary.h" #include "llvm/ADT/STLExtras.h" @@ -56,7 +60,7 @@ constexpr const char *ReadingFromFile = "reading {0} from file '{1}'"; constexpr const char *WritingToFile = "writing {0} to file '{1}'"; constexpr const char *FailedInsertionOnDuplication = - "failed to insert {0} at index '{1}': encountered duplicate {2} '{3}'"; + "failed to insert {0} at index '{1}': encountered duplicate '{2}'"; constexpr const char *FailedToReadObject = "failed to read {0}: expected JSON {1}"; @@ -66,24 +70,20 @@ constexpr const char *FailedToReadObjectAtIndex = "failed to read {0} from index '{1}': expected JSON {2}"; constexpr const char *FailedToDeserializeEntitySummaryNoFormatInfo = - "failed to deserialize EntitySummary: no FormatInfo registered for summary " - "'{0}'"; + "failed to deserialize EntitySummary: no FormatInfo registered for '{0}'"; constexpr const char *FailedToSerializeEntitySummaryNoFormatInfo = - "failed to serialize EntitySummary: no FormatInfo registered for summary " - "'{0}'"; + "failed to serialize EntitySummary: no FormatInfo registered for '{0}'"; constexpr const char *FailedToDeserializeEntitySummaryMissingData = - "failed to deserialize EntitySummary: null EntitySummary data for summary " - "'{0}'"; + "failed to deserialize EntitySummary: null EntitySummary data for '{0}'"; constexpr const char *FailedToSerializeEntitySummaryMissingData = - "JSONFormat - null EntitySummary data for summary '{0}'"; + "JSONFormat - null EntitySummary data for '{0}'"; constexpr const char *FailedToDeserializeEntitySummaryMismatchedSummaryName = - "failed to deserialize EntitySummary: EntitySummary data for summary '{0}' " - "reports mismatched summary '{1}'"; + "failed to deserialize EntitySummary: EntitySummary data for '{0}' reports " + "mismatched '{1}'"; constexpr const char *FailedToSerializeEntitySummaryMismatchedSummaryName = - "JSONFormat - EntitySummary data for summary '{0}' reports mismatched " - "summary '{1}'"; + "JSONFormat - EntitySummary data for '{0}' reports mismatched '{1}'"; constexpr const char *InvalidBuildNamespaceKind = "invalid 'kind' BuildNamespaceKind value '{0}'"; @@ -92,12 +92,10 @@ constexpr const char *InvalidEntityLinkageType = "invalid 'type' EntityLinkageType value '{0}'"; constexpr const char *FailedToDeserializeLinkageTableExtraId = - "failed to deserialize LinkageTable: extra EntityId '{0}' not present in " - "IdTable"; + "failed to deserialize LinkageTable: extra '{0}' not present in IdTable"; constexpr const char *FailedToDeserializeLinkageTableMissingId = - "failed to deserialize LinkageTable: missing EntityId '{0}' present in " - "IdTable"; + "failed to deserialize LinkageTable: missing '{0}' present in IdTable"; } // namespace ErrorMessages @@ -239,23 +237,24 @@ uint64_t JSONFormat::entityIdToJSON(EntityId EI) const { // BuildNamespaceKind //---------------------------------------------------------------------------- -llvm::Expected<BuildNamespaceKind> JSONFormat::buildNamespaceKindFromJSON( - llvm::StringRef BuildNamespaceKindStr) const { - auto OptBuildNamespaceKind = parseBuildNamespaceKind(BuildNamespaceKindStr); +namespace { + +llvm::Expected<BuildNamespaceKind> +buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr) { + auto OptBuildNamespaceKind = + buildNamespaceKindFromString(BuildNamespaceKindStr); if (!OptBuildNamespaceKind) { return ErrorBuilder::create(std::errc::invalid_argument, ErrorMessages::InvalidBuildNamespaceKind, BuildNamespaceKindStr) .build(); } - return *OptBuildNamespaceKind; } -namespace { - +// Provided for consistency with respect to rest of the codebase. llvm::StringRef buildNamespaceKindToJSON(BuildNamespaceKind BNK) { - return toString(BNK); + return buildNamespaceKindToString(BNK); } } // namespace @@ -275,10 +274,11 @@ JSONFormat::buildNamespaceFromJSON(const Object &BuildNamespaceObject) const { } auto ExpectedKind = buildNamespaceKindFromJSON(*OptBuildNamespaceKindStr); - if (!ExpectedKind) + if (!ExpectedKind) { return ErrorBuilder::wrap(ExpectedKind.takeError()) .context(ErrorMessages::ReadingFromField, "BuildNamespaceKind", "kind") .build(); + } auto OptNameStr = BuildNamespaceObject.getString("name"); if (!OptNameStr) { @@ -401,27 +401,21 @@ Object JSONFormat::entityNameToJSON(const EntityName &EN) const { namespace { -std::optional<EntityLinkage::LinkageType> -parseEntityLinkageType(llvm::StringRef S) { - if (S == "none") - return EntityLinkage::LinkageType::None; - if (S == "internal") - return EntityLinkage::LinkageType::Internal; - if (S == "external") - return EntityLinkage::LinkageType::External; - return std::nullopt; +llvm::Expected<EntityLinkageType> +entityLinkageTypeFromJSON(llvm::StringRef EntityLinkageTypeStr) { + auto OptEntityLinkageType = entityLinkageTypeFromString(EntityLinkageTypeStr); + if (!OptEntityLinkageType) { + return ErrorBuilder::create(std::errc::invalid_argument, + ErrorMessages::InvalidEntityLinkageType, + EntityLinkageTypeStr) + .build(); + } + return *OptEntityLinkageType; } -llvm::StringRef entityLinkageTypeToJSON(EntityLinkage::LinkageType LT) { - switch (LT) { - case EntityLinkage::LinkageType::None: - return "none"; - case EntityLinkage::LinkageType::Internal: - return "internal"; - case EntityLinkage::LinkageType::External: - return "external"; - } - llvm_unreachable("Unhandled EntityLinkage::LinkageType variant"); +// Provided for consistency with respect to rest of the codebase. +llvm::StringRef entityLinkageTypeToJSON(EntityLinkageType LT) { + return entityLinkageTypeToString(LT); } } // namespace @@ -440,15 +434,14 @@ JSONFormat::entityLinkageFromJSON(const Object &EntityLinkageObject) const { .build(); } - auto OptLinkageType = parseEntityLinkageType(*OptLinkageStr); - if (!OptLinkageType) { - return ErrorBuilder::create(std::errc::invalid_argument, - ErrorMessages::InvalidEntityLinkageType, - *OptLinkageStr) + auto ExpectedLinkageType = entityLinkageTypeFromJSON(*OptLinkageStr); + if (!ExpectedLinkageType) { + return ErrorBuilder::wrap(ExpectedLinkageType.takeError()) + .context(ErrorMessages::ReadingFromField, "EntityLinkageType", "type") .build(); } - return EntityLinkage(*OptLinkageType); + return EntityLinkage(*ExpectedLinkageType); } Object JSONFormat::entityLinkageToJSON(const EntityLinkage &EL) const { @@ -547,8 +540,8 @@ JSONFormat::entityIdTableFromJSON(const Array &EntityIdTableArray) const { if (!EntityInserted) { return ErrorBuilder::create(std::errc::invalid_argument, ErrorMessages::FailedInsertionOnDuplication, - "EntityIdTable entry", Index, "EntityId", - getIndex(EntityIt->second)) + "EntityIdTable entry", Index, + EntityIt->second) .build(); } } @@ -663,16 +656,14 @@ JSONFormat::linkageTableFromJSON(const Array &LinkageTableArray, if (!Inserted) { return ErrorBuilder::create(std::errc::invalid_argument, ErrorMessages::FailedInsertionOnDuplication, - "LinkageTable entry", Index, "EntityId", - getIndex(It->first)) + "LinkageTable entry", Index, It->first) .build(); } if (ExpectedIds.erase(EI) == 0) { return ErrorBuilder::create( std::errc::invalid_argument, - ErrorMessages::FailedToDeserializeLinkageTableExtraId, - getIndex(EI)) + ErrorMessages::FailedToDeserializeLinkageTableExtraId, EI) .context(ErrorMessages::ReadingFromIndex, "LinkageTable entry", Index) .build(); } @@ -682,7 +673,7 @@ JSONFormat::linkageTableFromJSON(const Array &LinkageTableArray, return ErrorBuilder::create( std::errc::invalid_argument, ErrorMessages::FailedToDeserializeLinkageTableMissingId, - getIndex(*ExpectedIds.begin())) + *ExpectedIds.begin()) .build(); } @@ -713,8 +704,7 @@ JSONFormat::entitySummaryFromJSON(const SummaryName &SN, if (InfoIt == FormatInfos.end()) { return ErrorBuilder::create( std::errc::invalid_argument, - ErrorMessages::FailedToDeserializeEntitySummaryNoFormatInfo, - SN.str()) + ErrorMessages::FailedToDeserializeEntitySummaryNoFormatInfo, SN) .build(); } @@ -732,8 +722,7 @@ JSONFormat::entitySummaryToJSON(const SummaryName &SN, if (InfoIt == FormatInfos.end()) { return ErrorBuilder::create( std::errc::invalid_argument, - ErrorMessages::FailedToSerializeEntitySummaryNoFormatInfo, - SN.str()) + ErrorMessages::FailedToSerializeEntitySummaryNoFormatInfo, SN) .build(); } @@ -767,7 +756,8 @@ JSONFormat::entityDataMapEntryFromJSON(const Object &EntityDataMapEntryObject, if (!OptEntityIdInt) { return ErrorBuilder::create(std::errc::invalid_argument, ErrorMessages::FailedToReadObjectAtField, - "EntityId", "entity_id", "integer") + "EntityId", "entity_id", + "number (unsigned 64-bit integer)") .build(); } @@ -794,8 +784,7 @@ JSONFormat::entityDataMapEntryFromJSON(const Object &EntityDataMapEntryObject, if (*ExpectedEntitySummary == nullptr) { return ErrorBuilder::create( std::errc::invalid_argument, - ErrorMessages::FailedToDeserializeEntitySummaryMissingData, - SN.str()) + ErrorMessages::FailedToDeserializeEntitySummaryMissingData, SN) .build(); } @@ -805,7 +794,7 @@ JSONFormat::entityDataMapEntryFromJSON(const Object &EntityDataMapEntryObject, std::errc::invalid_argument, ErrorMessages:: FailedToDeserializeEntitySummaryMismatchedSummaryName, - SN.str(), ActualSN.str()) + SN, ActualSN) .build(); } @@ -821,14 +810,14 @@ llvm::Expected<Object> JSONFormat::entityDataMapEntryToJSON( if (!EntitySummary) { ErrorBuilder::fatal( - ErrorMessages::FailedToSerializeEntitySummaryMissingData, SN.str()); + ErrorMessages::FailedToSerializeEntitySummaryMissingData, SN); } const auto ActualSN = EntitySummary->getSummaryName(); if (SN != ActualSN) { ErrorBuilder::fatal( - ErrorMessages::FailedToSerializeEntitySummaryMismatchedSummaryName, - SN.str(), ActualSN.str()); + ErrorMessages::FailedToSerializeEntitySummaryMismatchedSummaryName, SN, + ActualSN); } auto ExpectedEntitySummaryObject = entitySummaryToJSON(SN, *EntitySummary); @@ -880,8 +869,7 @@ JSONFormat::entityDataMapFromJSON(const SummaryName &SN, if (!DataInserted) { return ErrorBuilder::create(std::errc::invalid_argument, ErrorMessages::FailedInsertionOnDuplication, - "EntitySummary entry", Index, "EntityId", - getIndex(DataIt->first)) + "EntitySummary entry", Index, DataIt->first) .build(); } } @@ -1012,8 +1000,7 @@ JSONFormat::summaryDataMapFromJSON(const Array &SummaryDataArray, if (!SummaryInserted) { return ErrorBuilder::create(std::errc::invalid_argument, ErrorMessages::FailedInsertionOnDuplication, - "SummaryData entry", Index, "SummaryName", - SummaryIt->first.str()) + "SummaryData entry", Index, SummaryIt->first) .build(); } } diff --git a/clang/unittests/Analysis/Scalable/BuildNamespaceTest.cpp b/clang/unittests/Analysis/Scalable/BuildNamespaceTest.cpp index 58b186074df42..383937fe53372 100644 --- a/clang/unittests/Analysis/Scalable/BuildNamespaceTest.cpp +++ b/clang/unittests/Analysis/Scalable/BuildNamespaceTest.cpp @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/Scalable/Model/BuildNamespace.h" +#include "clang/Analysis/Scalable/Support/FormatProviders.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/Support/raw_ostream.h" #include "gtest/gtest.h" @@ -29,24 +31,6 @@ TEST(BuildNamespaceTest, DifferentKinds) { EXPECT_NE(CU, LU); } -TEST(BuildNamespaceTest, ToStringRoundtripCompilationUnit) { - auto Kind = BuildNamespaceKind::CompilationUnit; - auto Str = toString(Kind); - auto Parsed = parseBuildNamespaceKind(Str); - - ASSERT_TRUE(Parsed.has_value()); - EXPECT_EQ(Kind, *Parsed); -} - -TEST(BuildNamespaceTest, ToStringRoundtripLinkUnit) { - auto Kind = BuildNamespaceKind::LinkUnit; - auto Str = toString(Kind); - auto Parsed = parseBuildNamespaceKind(Str); - - ASSERT_TRUE(Parsed.has_value()); - EXPECT_EQ(Kind, *Parsed); -} - // NestedBuildNamespace Tests TEST(NestedBuildNamespaceTest, DefaultConstruction) { @@ -94,18 +78,53 @@ TEST(NestedBuildNamespaceTest, EmptyQualified) { EXPECT_EQ(Qualified, NBN); } +TEST(BuildNamespaceKindTest, FormatProvider) { + EXPECT_EQ(llvm::formatv("{0}", BuildNamespaceKind::CompilationUnit).str(), + "CompilationUnit"); + EXPECT_EQ(llvm::formatv("{0}", BuildNamespaceKind::LinkUnit).str(), + "LinkUnit"); +} + +TEST(BuildNamespaceKindTest, StreamOutputCompilationUnit) { + std::string S; + llvm::raw_string_ostream(S) << BuildNamespaceKind::CompilationUnit; + EXPECT_EQ(S, "CompilationUnit"); +} + +TEST(BuildNamespaceKindTest, StreamOutputLinkUnit) { + std::string S; + llvm::raw_string_ostream(S) << BuildNamespaceKind::LinkUnit; + EXPECT_EQ(S, "LinkUnit"); +} + +TEST(BuildNamespaceTest, FormatProvider) { + EXPECT_EQ( + llvm::formatv("{0}", BuildNamespace(BuildNamespaceKind::CompilationUnit, + "test.cpp")) + .str(), + "BuildNamespace(CompilationUnit, test.cpp)"); +} + +TEST(NestedBuildNamespaceTest, FormatProvider) { + NestedBuildNamespace NBN( + BuildNamespace(BuildNamespaceKind::CompilationUnit, "test.cpp")); + EXPECT_EQ( + llvm::formatv("{0}", NBN).str(), + "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)])"); +} + TEST(BuildNamespaceTest, StreamOutputCompilationUnit) { BuildNamespace BN(BuildNamespaceKind::CompilationUnit, "test.cpp"); std::string S; llvm::raw_string_ostream(S) << BN; - EXPECT_EQ(S, "BuildNamespace(compilation_unit, test.cpp)"); + EXPECT_EQ(S, "BuildNamespace(CompilationUnit, test.cpp)"); } TEST(BuildNamespaceTest, StreamOutputLinkUnit) { BuildNamespace BN(BuildNamespaceKind::LinkUnit, "app"); std::string S; llvm::raw_string_ostream(S) << BN; - EXPECT_EQ(S, "BuildNamespace(link_unit, app)"); + EXPECT_EQ(S, "BuildNamespace(LinkUnit, app)"); } TEST(NestedBuildNamespaceTest, StreamOutputEmpty) { @@ -121,7 +140,7 @@ TEST(NestedBuildNamespaceTest, StreamOutputSingle) { std::string S; llvm::raw_string_ostream(S) << NBN; EXPECT_EQ( - S, "NestedBuildNamespace([BuildNamespace(compilation_unit, test.cpp)])"); + S, "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)])"); } TEST(NestedBuildNamespaceTest, StreamOutputMultiple) { @@ -131,8 +150,8 @@ TEST(NestedBuildNamespaceTest, StreamOutputMultiple) { BuildNamespace(BuildNamespaceKind::LinkUnit, "app"))); std::string S; llvm::raw_string_ostream(S) << NBN; - EXPECT_EQ(S, "NestedBuildNamespace([BuildNamespace(compilation_unit, " - "test.cpp), BuildNamespace(link_unit, app)])"); + EXPECT_EQ(S, "NestedBuildNamespace([BuildNamespace(CompilationUnit, " + "test.cpp), BuildNamespace(LinkUnit, app)])"); } } // namespace diff --git a/clang/unittests/Analysis/Scalable/CMakeLists.txt b/clang/unittests/Analysis/Scalable/CMakeLists.txt index df98d265a0251..178977872f728 100644 --- a/clang/unittests/Analysis/Scalable/CMakeLists.txt +++ b/clang/unittests/Analysis/Scalable/CMakeLists.txt @@ -8,6 +8,7 @@ add_distinct_clang_unittest(ClangScalableAnalysisTests EntityLinkerTest.cpp EntityNameTest.cpp ErrorBuilderTest.cpp + ModelStringConversionsTest.cpp Registries/FancyAnalysisData.cpp Registries/MockSerializationFormat.cpp Registries/MockSummaryExtractor1.cpp @@ -34,3 +35,7 @@ add_distinct_clang_unittest(ClangScalableAnalysisTests FrontendOpenMP Support ) + +target_include_directories(ClangScalableAnalysisTests PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/Analysis/Scalable + ) diff --git a/clang/unittests/Analysis/Scalable/EntityIdTest.cpp b/clang/unittests/Analysis/Scalable/EntityIdTest.cpp index 2761aaefa8504..36526cc308ccd 100644 --- a/clang/unittests/Analysis/Scalable/EntityIdTest.cpp +++ b/clang/unittests/Analysis/Scalable/EntityIdTest.cpp @@ -9,6 +9,8 @@ #include "clang/Analysis/Scalable/Model/EntityId.h" #include "clang/Analysis/Scalable/Model/EntityIdTable.h" #include "clang/Analysis/Scalable/Model/EntityName.h" +#include "clang/Analysis/Scalable/Support/FormatProviders.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/Support/raw_ostream.h" #include "gtest/gtest.h" #include <cctype> @@ -68,6 +70,18 @@ TEST(EntityIdTest, Transitivity) { EXPECT_TRUE(Ids[0] < Ids[1] && Ids[1] < Ids[2]); } +TEST(EntityIdTest, FormatProvider) { + EntityIdTable Table; + EntityName Entity("c:@F@foo", "", {}); + EntityId Id = Table.getId(Entity); + + std::string S = llvm::formatv("{0}", Id).str(); + llvm::StringRef Ref(S); + ASSERT_TRUE(Ref.consume_front("EntityId(")); + ASSERT_TRUE(Ref.consume_back(")")); + EXPECT_TRUE(isNonNegativeInteger(Ref)); +} + TEST(EntityIdTest, StreamOutput) { EntityIdTable Table; EntityName Entity("c:@F@foo", "", {}); diff --git a/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp b/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp index 8764b0dcf0bda..74cdb859d72a2 100644 --- a/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp +++ b/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp @@ -7,16 +7,19 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/Scalable/Model/EntityLinkage.h" +#include "clang/Analysis/Scalable/Support/FormatProviders.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/Support/raw_ostream.h" #include "gtest/gtest.h" using clang::ssaf::EntityLinkage; +using clang::ssaf::EntityLinkageType; namespace { -constexpr inline auto None = EntityLinkage::LinkageType::None; -constexpr inline auto Internal = EntityLinkage::LinkageType::Internal; -constexpr inline auto External = EntityLinkage::LinkageType::External; +constexpr inline auto None = EntityLinkageType::None; +constexpr inline auto Internal = EntityLinkageType::Internal; +constexpr inline auto External = EntityLinkageType::External; TEST(EntityLinkageTest, Constructor) { EntityLinkage NoneLinkage(None); @@ -58,6 +61,41 @@ TEST(EntityLinkageTest, EqualityOperatorDistinct) { EXPECT_NE(EntityLinkage(Internal), EntityLinkage(External)); } +TEST(EntityLinkageTypeTest, FormatProvider) { + EXPECT_EQ(llvm::formatv("{0}", EntityLinkageType::None).str(), "None"); + EXPECT_EQ(llvm::formatv("{0}", EntityLinkageType::Internal).str(), + "Internal"); + EXPECT_EQ(llvm::formatv("{0}", EntityLinkageType::External).str(), + "External"); +} + +TEST(EntityLinkageTypeTest, StreamOutputNone) { + std::string S; + llvm::raw_string_ostream(S) << EntityLinkageType::None; + EXPECT_EQ(S, "None"); +} + +TEST(EntityLinkageTypeTest, StreamOutputInternal) { + std::string S; + llvm::raw_string_ostream(S) << EntityLinkageType::Internal; + EXPECT_EQ(S, "Internal"); +} + +TEST(EntityLinkageTypeTest, StreamOutputExternal) { + std::string S; + llvm::raw_string_ostream(S) << EntityLinkageType::External; + EXPECT_EQ(S, "External"); +} + +TEST(EntityLinkageTest, FormatProvider) { + EXPECT_EQ(llvm::formatv("{0}", EntityLinkage(None)).str(), + "EntityLinkage(None)"); + EXPECT_EQ(llvm::formatv("{0}", EntityLinkage(Internal)).str(), + "EntityLinkage(Internal)"); + EXPECT_EQ(llvm::formatv("{0}", EntityLinkage(External)).str(), + "EntityLinkage(External)"); +} + TEST(EntityLinkageTest, StreamOutputNone) { std::string S; llvm::raw_string_ostream(S) << EntityLinkage(None); diff --git a/clang/unittests/Analysis/Scalable/EntityLinkerTest.cpp b/clang/unittests/Analysis/Scalable/EntityLinkerTest.cpp index b228bc5389307..b6d28f701fb6f 100644 --- a/clang/unittests/Analysis/Scalable/EntityLinkerTest.cpp +++ b/clang/unittests/Analysis/Scalable/EntityLinkerTest.cpp @@ -57,11 +57,11 @@ size_t MockEntitySummaryEncoding::Index = 0; class EntityLinkerTest : public TestFixture { protected: static constexpr EntityLinkage NoneLinkage = - EntityLinkage(EntityLinkage::LinkageType::None); + EntityLinkage(EntityLinkageType::None); static constexpr EntityLinkage InternalLinkage = - EntityLinkage(EntityLinkage::LinkageType::Internal); + EntityLinkage(EntityLinkageType::Internal); static constexpr EntityLinkage ExternalLinkage = - EntityLinkage(EntityLinkage::LinkageType::External); + EntityLinkage(EntityLinkageType::External); void SetUp() override { // This ensures that the MockEntitySummary id assignment does not @@ -628,7 +628,7 @@ TEST_F(EntityLinkerTest, RejectsDuplicateTUSummary) { ASSERT_THAT_ERROR(Linker.link(std::move(TU2)), llvm::FailedWithMessage( HasSubstr("failed to link TU summary: duplicate " - "BuildNamespace(compilation_unit, TU)"))); + "BuildNamespace(CompilationUnit, TU)"))); } } // namespace diff --git a/clang/unittests/Analysis/Scalable/EntityNameTest.cpp b/clang/unittests/Analysis/Scalable/EntityNameTest.cpp index c49b51b248ec6..a1a1f9ea24fda 100644 --- a/clang/unittests/Analysis/Scalable/EntityNameTest.cpp +++ b/clang/unittests/Analysis/Scalable/EntityNameTest.cpp @@ -8,6 +8,8 @@ #include "clang/Analysis/Scalable/Model/EntityName.h" #include "clang/Analysis/Scalable/Model/BuildNamespace.h" +#include "clang/Analysis/Scalable/Support/FormatProviders.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/Support/raw_ostream.h" #include "gtest/gtest.h" @@ -57,6 +59,16 @@ TEST(EntityNameTest, MakeQualified) { EXPECT_NE(Qualified, EN); } +TEST(EntityNameTest, FormatProvider) { + NestedBuildNamespace NBN( + BuildNamespace(BuildNamespaceKind::CompilationUnit, "test.cpp")); + EntityName EN("c:@F@foo", "", NBN); + EXPECT_EQ( + llvm::formatv("{0}", EN).str(), + "EntityName(c:@F@foo, , " + "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)]))"); +} + TEST(EntityNameTest, StreamOutputNoSuffix) { NestedBuildNamespace NBN( BuildNamespace(BuildNamespaceKind::CompilationUnit, "test.cpp")); @@ -65,7 +77,7 @@ TEST(EntityNameTest, StreamOutputNoSuffix) { llvm::raw_string_ostream(S) << EN; EXPECT_EQ( S, "EntityName(c:@F@foo, , " - "NestedBuildNamespace([BuildNamespace(compilation_unit, test.cpp)]))"); + "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)]))"); } TEST(EntityNameTest, StreamOutputWithSuffix) { @@ -76,7 +88,7 @@ TEST(EntityNameTest, StreamOutputWithSuffix) { llvm::raw_string_ostream(S) << EN; EXPECT_EQ( S, "EntityName(c:@F@foo, 1, " - "NestedBuildNamespace([BuildNamespace(compilation_unit, test.cpp)]))"); + "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)]))"); } } // namespace diff --git a/clang/unittests/Analysis/Scalable/ModelStringConversionsTest.cpp b/clang/unittests/Analysis/Scalable/ModelStringConversionsTest.cpp new file mode 100644 index 0000000000000..a7d4128020524 --- /dev/null +++ b/clang/unittests/Analysis/Scalable/ModelStringConversionsTest.cpp @@ -0,0 +1,100 @@ +//===- ModelStringConversionsTest.cpp -------------------------------------===// +// +// Part of the LLVM Project, 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 +// +//===----------------------------------------------------------------------===// + +#include "ModelStringConversions.h" +#include "gtest/gtest.h" + +using namespace clang::ssaf; + +namespace { + +//===----------------------------------------------------------------------===// +// BuildNamespaceKind +//===----------------------------------------------------------------------===// + +TEST(BuildNamespaceKindStringTest, ToStringCompilationUnit) { + EXPECT_EQ(buildNamespaceKindToString(BuildNamespaceKind::CompilationUnit), + "CompilationUnit"); +} + +TEST(BuildNamespaceKindStringTest, ToStringLinkUnit) { + EXPECT_EQ(buildNamespaceKindToString(BuildNamespaceKind::LinkUnit), + "LinkUnit"); +} + +TEST(BuildNamespaceKindStringTest, FromStringCompilationUnit) { + EXPECT_EQ(buildNamespaceKindFromString("CompilationUnit"), + BuildNamespaceKind::CompilationUnit); +} + +TEST(BuildNamespaceKindStringTest, FromStringLinkUnit) { + EXPECT_EQ(buildNamespaceKindFromString("LinkUnit"), + BuildNamespaceKind::LinkUnit); +} + +TEST(BuildNamespaceKindStringTest, FromStringUnknown) { + EXPECT_EQ(buildNamespaceKindFromString("compilation_unit"), std::nullopt); + EXPECT_EQ(buildNamespaceKindFromString("link_unit"), std::nullopt); + EXPECT_EQ(buildNamespaceKindFromString(""), std::nullopt); + EXPECT_EQ(buildNamespaceKindFromString("unknown"), std::nullopt); +} + +TEST(BuildNamespaceKindStringTest, RoundTrip) { + for (auto Kind : + {BuildNamespaceKind::CompilationUnit, BuildNamespaceKind::LinkUnit}) { + EXPECT_EQ(buildNamespaceKindFromString(buildNamespaceKindToString(Kind)), + Kind); + } +} + +//===----------------------------------------------------------------------===// +// EntityLinkageType +//===----------------------------------------------------------------------===// + +TEST(EntityLinkageTypeStringTest, ToStringNone) { + EXPECT_EQ(entityLinkageTypeToString(EntityLinkageType::None), "None"); +} + +TEST(EntityLinkageTypeStringTest, ToStringInternal) { + EXPECT_EQ(entityLinkageTypeToString(EntityLinkageType::Internal), "Internal"); +} + +TEST(EntityLinkageTypeStringTest, ToStringExternal) { + EXPECT_EQ(entityLinkageTypeToString(EntityLinkageType::External), "External"); +} + +TEST(EntityLinkageTypeStringTest, FromStringNone) { + EXPECT_EQ(entityLinkageTypeFromString("None"), EntityLinkageType::None); +} + +TEST(EntityLinkageTypeStringTest, FromStringInternal) { + EXPECT_EQ(entityLinkageTypeFromString("Internal"), + EntityLinkageType::Internal); +} + +TEST(EntityLinkageTypeStringTest, FromStringExternal) { + EXPECT_EQ(entityLinkageTypeFromString("External"), + EntityLinkageType::External); +} + +TEST(EntityLinkageTypeStringTest, FromStringUnknown) { + EXPECT_EQ(entityLinkageTypeFromString("none"), std::nullopt); + EXPECT_EQ(entityLinkageTypeFromString("internal"), std::nullopt); + EXPECT_EQ(entityLinkageTypeFromString("external"), std::nullopt); + EXPECT_EQ(entityLinkageTypeFromString(""), std::nullopt); + EXPECT_EQ(entityLinkageTypeFromString("unknown"), std::nullopt); +} + +TEST(EntityLinkageTypeStringTest, RoundTrip) { + for (auto LT : {EntityLinkageType::None, EntityLinkageType::Internal, + EntityLinkageType::External}) { + EXPECT_EQ(entityLinkageTypeFromString(entityLinkageTypeToString(LT)), LT); + } +} + +} // namespace diff --git a/clang/unittests/Analysis/Scalable/Serialization/JSONFormatTest/TUSummaryTest.cpp b/clang/unittests/Analysis/Scalable/Serialization/JSONFormatTest/TUSummaryTest.cpp index 3ece18d2f724d..612ca58419a12 100644 --- a/clang/unittests/Analysis/Scalable/Serialization/JSONFormatTest/TUSummaryTest.cpp +++ b/clang/unittests/Analysis/Scalable/Serialization/JSONFormatTest/TUSummaryTest.cpp @@ -586,7 +586,7 @@ TEST_F(JSONFormatTUSummaryTest, NoReadPermission) { auto ExpectedFilePath = writeJSON(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -635,7 +635,7 @@ TEST_F(JSONFormatTUSummaryTest, NotObject) { TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryLinkageMissingType) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -662,7 +662,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryLinkageMissingType) { TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryLinkageInvalidType) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -692,13 +692,13 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryLinkageInvalidType) { TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryMissingId) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], "linkage_table": [ { - "linkage": { "type": "external" } + "linkage": { "type": "External" } } ], "data": [] @@ -717,14 +717,14 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryMissingId) { TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryIdNotUInt64) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], "linkage_table": [ { "id": "not_a_number", - "linkage": { "type": "external" } + "linkage": { "type": "External" } } ], "data": [] @@ -743,7 +743,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryIdNotUInt64) { TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryMissingLinkage) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -772,7 +772,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryMissingLinkage) { TEST_F(JSONFormatTUSummaryTest, LinkageTableNotArray) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -791,7 +791,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableNotArray) { TEST_F(JSONFormatTUSummaryTest, LinkageTableElementNotObject) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -810,14 +810,14 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableElementNotObject) { TEST_F(JSONFormatTUSummaryTest, LinkageTableExtraId) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], "linkage_table": [ { "id": 0, - "linkage": { "type": "external" } + "linkage": { "type": "External" } } ], "data": [] @@ -829,13 +829,13 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableExtraId) { HasSubstr("reading LinkageTable from field 'linkage_table'"), HasSubstr("reading LinkageTable entry from index '0'"), HasSubstr("failed to deserialize LinkageTable"), - HasSubstr("extra EntityId '0' not present in IdTable")))); + HasSubstr("extra 'EntityId(0)' not present in IdTable")))); } TEST_F(JSONFormatTUSummaryTest, LinkageTableMissingId) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -846,7 +846,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableMissingId) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -862,13 +862,13 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableMissingId) { HasSubstr("reading TUSummary from file"), HasSubstr("reading LinkageTable from field 'linkage_table'"), HasSubstr("failed to deserialize LinkageTable"), - HasSubstr("missing EntityId '0' present in IdTable")))); + HasSubstr("missing 'EntityId(0)' present in IdTable")))); } TEST_F(JSONFormatTUSummaryTest, LinkageTableDuplicateId) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -879,7 +879,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableDuplicateId) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -889,11 +889,11 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableDuplicateId) { "linkage_table": [ { "id": 0, - "linkage": { "type": "external" } + "linkage": { "type": "External" } }, { "id": 0, - "linkage": { "type": "internal" } + "linkage": { "type": "Internal" } } ], "data": [] @@ -904,7 +904,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableDuplicateId) { HasSubstr("reading TUSummary from file"), HasSubstr("reading LinkageTable from field 'linkage_table'"), HasSubstr("failed to insert LinkageTable entry at index '1'"), - HasSubstr("encountered duplicate EntityId '0'")))); + HasSubstr("encountered duplicate 'EntityId(0)'")))); } // ============================================================================ @@ -958,7 +958,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingKind) { TEST_F(JSONFormatTUSummaryTest, MissingName) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit" + "kind": "CompilationUnit" }, "id_table": [], "linkage_table": [], @@ -981,7 +981,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingName) { TEST_F(JSONFormatTUSummaryTest, NamespaceElementNotObject) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -997,7 +997,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementNotObject) { "linkage_table": [ { "id": 0, - "linkage": { "type": "none" } + "linkage": { "type": "None" } } ], "data": [] @@ -1018,7 +1018,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementNotObject) { TEST_F(JSONFormatTUSummaryTest, NamespaceElementMissingKind) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1038,7 +1038,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementMissingKind) { "linkage_table": [ { "id": 0, - "linkage": { "type": "internal" } + "linkage": { "type": "Internal" } } ], "data": [] @@ -1060,7 +1060,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementMissingKind) { TEST_F(JSONFormatTUSummaryTest, NamespaceElementInvalidKind) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1081,7 +1081,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementInvalidKind) { "linkage_table": [ { "id": 0, - "linkage": { "type": "external" } + "linkage": { "type": "External" } } ], "data": [] @@ -1104,7 +1104,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementInvalidKind) { TEST_F(JSONFormatTUSummaryTest, NamespaceElementMissingName) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1115,7 +1115,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementMissingName) { "suffix": "", "namespace": [ { - "kind": "compilation_unit" + "kind": "CompilationUnit" } ] } @@ -1124,7 +1124,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementMissingName) { "linkage_table": [ { "id": 0, - "linkage": { "type": "none" } + "linkage": { "type": "None" } } ], "data": [] @@ -1150,7 +1150,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementMissingName) { TEST_F(JSONFormatTUSummaryTest, EntityNameMissingUSR) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1165,7 +1165,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingUSR) { "linkage_table": [ { "id": 0, - "linkage": { "type": "internal" } + "linkage": { "type": "Internal" } } ], "data": [] @@ -1184,7 +1184,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingUSR) { TEST_F(JSONFormatTUSummaryTest, EntityNameMissingSuffix) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1199,7 +1199,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingSuffix) { "linkage_table": [ { "id": 0, - "linkage": { "type": "external" } + "linkage": { "type": "External" } } ], "data": [] @@ -1218,7 +1218,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingSuffix) { TEST_F(JSONFormatTUSummaryTest, EntityNameMissingNamespace) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1233,7 +1233,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingNamespace) { "linkage_table": [ { "id": 0, - "linkage": { "type": "none" } + "linkage": { "type": "None" } } ], "data": [] @@ -1258,7 +1258,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingNamespace) { TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingID) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1287,7 +1287,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingID) { TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingName) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1298,7 +1298,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingName) { "linkage_table": [ { "id": 0, - "linkage": { "type": "none" } + "linkage": { "type": "None" } } ], "data": [] @@ -1316,7 +1316,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingName) { TEST_F(JSONFormatTUSummaryTest, IDTableEntryIDNotUInt64) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1350,7 +1350,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableEntryIDNotUInt64) { TEST_F(JSONFormatTUSummaryTest, IDTableNotArray) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": {}, @@ -1368,7 +1368,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableNotArray) { TEST_F(JSONFormatTUSummaryTest, IDTableElementNotObject) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [123], @@ -1388,7 +1388,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableElementNotObject) { TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -1399,7 +1399,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -1412,7 +1412,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -1422,11 +1422,11 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) { "linkage_table": [ { "id": 0, - "linkage": { "type": "internal" } + "linkage": { "type": "Internal" } }, { "id": 1, - "linkage": { "type": "external" } + "linkage": { "type": "External" } } ], "data": [] @@ -1438,7 +1438,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) { AllOf(HasSubstr("reading TUSummary from file"), HasSubstr("reading IdTable from field 'id_table'"), HasSubstr("failed to insert EntityIdTable entry at index '1'"), - HasSubstr("encountered duplicate EntityId '0'")))); + HasSubstr("encountered duplicate 'EntityId(0)'")))); } // ============================================================================ @@ -1448,7 +1448,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) { TEST_F(JSONFormatTUSummaryTest, ReadEntitySummaryNoFormatInfo) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1476,8 +1476,9 @@ TEST_F(JSONFormatTUSummaryTest, ReadEntitySummaryNoFormatInfo) { HasSubstr("reading EntitySummary entry from index '0'"), HasSubstr("reading EntitySummary from field 'entity_summary'"), HasSubstr("failed to deserialize EntitySummary"), - HasSubstr("no FormatInfo registered for summary " - "'UnregisteredEntitySummaryForJSONFormatTest'")))); + HasSubstr( + "no FormatInfo registered for " + "'SummaryName(UnregisteredEntitySummaryForJSONFormatTest)'")))); } // ============================================================================ @@ -1488,7 +1489,7 @@ TEST_F(JSONFormatTUSummaryTest, PairsEntitySummaryForJSONFormatTestMissingPairsField) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1522,7 +1523,7 @@ TEST_F(JSONFormatTUSummaryTest, PairsEntitySummaryForJSONFormatTestInvalidPairsFieldType) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1558,7 +1559,7 @@ TEST_F(JSONFormatTUSummaryTest, PairsEntitySummaryForJSONFormatTestPairsElementNotObject) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1594,7 +1595,7 @@ TEST_F(JSONFormatTUSummaryTest, PairsEntitySummaryForJSONFormatTestMissingFirstField) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1634,7 +1635,7 @@ TEST_F(JSONFormatTUSummaryTest, PairsEntitySummaryForJSONFormatTestInvalidFirstField) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1675,7 +1676,7 @@ TEST_F(JSONFormatTUSummaryTest, PairsEntitySummaryForJSONFormatTestMissingSecondField) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1715,7 +1716,7 @@ TEST_F(JSONFormatTUSummaryTest, PairsEntitySummaryForJSONFormatTestInvalidSecondField) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1759,7 +1760,7 @@ TEST_F(JSONFormatTUSummaryTest, TEST_F(JSONFormatTUSummaryTest, EntityDataMissingEntityID) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1791,7 +1792,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityDataMissingEntityID) { TEST_F(JSONFormatTUSummaryTest, EntityDataMissingEntitySummary) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1823,7 +1824,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityDataMissingEntitySummary) { TEST_F(JSONFormatTUSummaryTest, EntityIDNotUInt64) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1850,13 +1851,13 @@ TEST_F(JSONFormatTUSummaryTest, EntityIDNotUInt64) { HasSubstr("reading EntitySummary entries from field 'summary_data'"), HasSubstr("reading EntitySummary entry from index '0'"), HasSubstr("failed to read EntityId from field 'entity_id'"), - HasSubstr("expected JSON integer")))); + HasSubstr("expected JSON number (unsigned 64-bit integer)")))); } TEST_F(JSONFormatTUSummaryTest, ReadEntitySummaryMissingData) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1883,14 +1884,14 @@ TEST_F(JSONFormatTUSummaryTest, ReadEntitySummaryMissingData) { HasSubstr("reading EntitySummary entries from field 'summary_data'"), HasSubstr("reading EntitySummary entry from index '0'"), HasSubstr("failed to deserialize EntitySummary"), - HasSubstr("null EntitySummary data for summary " - "'NullEntitySummaryForJSONFormatTest'")))); + HasSubstr("null EntitySummary data for " + "'SummaryName(NullEntitySummaryForJSONFormatTest)'")))); } TEST_F(JSONFormatTUSummaryTest, ReadEntitySummaryMismatchedSummaryName) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -1917,10 +1918,12 @@ TEST_F(JSONFormatTUSummaryTest, ReadEntitySummaryMismatchedSummaryName) { HasSubstr("reading EntitySummary entries from field 'summary_data'"), HasSubstr("reading EntitySummary entry from index '0'"), HasSubstr("failed to deserialize EntitySummary"), - HasSubstr("EntitySummary data for summary " - "'MismatchedEntitySummaryForJSONFormatTest' reports " - "mismatched summary " - "'MismatchedEntitySummaryForJSONFormatTest_WrongName'")))); + HasSubstr( + "EntitySummary data for " + "'SummaryName(MismatchedEntitySummaryForJSONFormatTest)' reports " + "mismatched " + "'SummaryName(MismatchedEntitySummaryForJSONFormatTest_WrongName)" + "'")))); } // ============================================================================ @@ -1941,8 +1944,8 @@ TEST_F(JSONFormatTUSummaryTest, WriteEntitySummaryMissingData) { EXPECT_DEATH( { (void)writeTUSummary(Summary, "output.json"); }, - "JSONFormat - null EntitySummary data for summary " - "'NullEntitySummaryForJSONFormatTest'"); + "JSONFormat - null EntitySummary data for " + "'SummaryName\\(NullEntitySummaryForJSONFormatTest\\)'"); } TEST_F(JSONFormatTUSummaryTest, WriteEntitySummaryMismatchedSummaryName) { @@ -1960,10 +1963,10 @@ TEST_F(JSONFormatTUSummaryTest, WriteEntitySummaryMismatchedSummaryName) { EXPECT_DEATH( { (void)writeTUSummary(Summary, "output.json"); }, - "JSONFormat - EntitySummary data for summary " - "'MismatchedEntitySummaryForJSONFormatTest' reports " - "mismatched summary " - "'MismatchedEntitySummaryForJSONFormatTest_WrongName'"); + "JSONFormat - EntitySummary data for " + "'SummaryName\\(MismatchedEntitySummaryForJSONFormatTest\\)' reports " + "mismatched " + "'SummaryName\\(MismatchedEntitySummaryForJSONFormatTest_WrongName\\)'"); } // ============================================================================ @@ -1973,7 +1976,7 @@ TEST_F(JSONFormatTUSummaryTest, WriteEntitySummaryMismatchedSummaryName) { TEST_F(JSONFormatTUSummaryTest, EntityDataElementNotObject) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2000,7 +2003,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityDataElementNotObject) { TEST_F(JSONFormatTUSummaryTest, DuplicateEntityIdInDataMap) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -2017,7 +2020,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntityIdInDataMap) { { "id": 0, "linkage": { - "type": "none" + "type": "None" } } ], @@ -2050,7 +2053,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntityIdInDataMap) { HasSubstr("reading SummaryData entry from index '0'"), HasSubstr("reading EntitySummary entries from field 'summary_data'"), HasSubstr("failed to insert EntitySummary entry at index '1'"), - HasSubstr("encountered duplicate EntityId '0'")))); + HasSubstr("encountered duplicate 'EntityId(0)'")))); } // ============================================================================ @@ -2060,7 +2063,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntityIdInDataMap) { TEST_F(JSONFormatTUSummaryTest, DataEntryMissingSummaryName) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2085,7 +2088,7 @@ TEST_F(JSONFormatTUSummaryTest, DataEntryMissingSummaryName) { TEST_F(JSONFormatTUSummaryTest, DataEntryMissingData) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2115,7 +2118,7 @@ TEST_F(JSONFormatTUSummaryTest, DataEntryMissingData) { TEST_F(JSONFormatTUSummaryTest, DataNotArray) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2134,7 +2137,7 @@ TEST_F(JSONFormatTUSummaryTest, DataNotArray) { TEST_F(JSONFormatTUSummaryTest, DataElementNotObject) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2153,7 +2156,7 @@ TEST_F(JSONFormatTUSummaryTest, DataElementNotObject) { TEST_F(JSONFormatTUSummaryTest, DuplicateSummaryName) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2171,12 +2174,13 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateSummaryName) { })"); EXPECT_THAT_EXPECTED( - Result, FailedWithMessage(AllOf( - HasSubstr("reading TUSummary from file"), - HasSubstr("reading SummaryData entries from field 'data'"), - HasSubstr("failed to insert SummaryData entry at index '1'"), - HasSubstr("encountered duplicate SummaryName " - "'PairsEntitySummaryForJSONFormatTest'")))); + Result, + FailedWithMessage(AllOf( + HasSubstr("reading TUSummary from file"), + HasSubstr("reading SummaryData entries from field 'data'"), + HasSubstr("failed to insert SummaryData entry at index '1'"), + HasSubstr("encountered duplicate " + "'SummaryName(PairsEntitySummaryForJSONFormatTest)'")))); } // ============================================================================ @@ -2201,7 +2205,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingTUNamespace) { TEST_F(JSONFormatTUSummaryTest, MissingIDTable) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "data": [] @@ -2217,7 +2221,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingIDTable) { TEST_F(JSONFormatTUSummaryTest, MissingLinkageTable) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2235,7 +2239,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingLinkageTable) { TEST_F(JSONFormatTUSummaryTest, MissingData) { auto Result = readTUSummaryFromString(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2355,15 +2359,17 @@ TEST_F(JSONFormatTUSummaryTest, WriteEntitySummaryNoFormatInfo) { EXPECT_THAT_ERROR( std::move(Result), - FailedWithMessage( - AllOf(HasSubstr("writing TUSummary to file"), - HasSubstr("writing SummaryData entry to index '0'"), - HasSubstr("writing EntitySummary entries to field " - "'summary_data'"), - HasSubstr("writing EntitySummary entry to index '0'"), - HasSubstr("failed to serialize EntitySummary"), - HasSubstr("no FormatInfo registered for summary " - "'UnregisteredEntitySummaryForJSONFormatTest'")))); + FailedWithMessage(AllOf( + HasSubstr("writing TUSummary to file"), + HasSubstr("writing SummaryData entry to index '0'"), + HasSubstr("writing EntitySummary entries to field " + "'summary_data'"), + HasSubstr("writing EntitySummary entry to index '0'"), + HasSubstr("writing EntitySummary to field 'entity_summary'"), + HasSubstr("failed to serialize EntitySummary"), + HasSubstr( + "no FormatInfo registered for " + "'SummaryName(UnregisteredEntitySummaryForJSONFormatTest)'")))); } // ============================================================================ @@ -2373,7 +2379,7 @@ TEST_F(JSONFormatTUSummaryTest, WriteEntitySummaryNoFormatInfo) { TEST_F(JSONFormatTUSummaryTest, RoundTripEmpty) { readWriteCompareTUSummary(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2385,7 +2391,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripEmpty) { TEST_F(JSONFormatTUSummaryTest, RoundTripWithTwoSummaryTypes) { readWriteCompareTUSummary(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -2396,7 +2402,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripWithTwoSummaryTypes) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2409,7 +2415,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripWithTwoSummaryTypes) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2422,7 +2428,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripWithTwoSummaryTypes) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2435,7 +2441,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripWithTwoSummaryTypes) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2448,7 +2454,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripWithTwoSummaryTypes) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2458,23 +2464,23 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripWithTwoSummaryTypes) { "linkage_table": [ { "id": 3, - "linkage": { "type": "internal" } + "linkage": { "type": "Internal" } }, { "id": 1, - "linkage": { "type": "none" } + "linkage": { "type": "None" } }, { "id": 4, - "linkage": { "type": "external" } + "linkage": { "type": "External" } }, { "id": 0, - "linkage": { "type": "none" } + "linkage": { "type": "None" } }, { "id": 2, - "linkage": { "type": "internal" } + "linkage": { "type": "Internal" } } ], "data": [ @@ -2555,7 +2561,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripWithTwoSummaryTypes) { TEST_F(JSONFormatTUSummaryTest, RoundTripLinkUnit) { readWriteCompareTUSummary(R"({ "tu_namespace": { - "kind": "link_unit", + "kind": "LinkUnit", "name": "libtest.so" }, "id_table": [], @@ -2567,7 +2573,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkUnit) { TEST_F(JSONFormatTUSummaryTest, RoundTripWithEmptyDataEntry) { readWriteCompareTUSummary(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [], @@ -2584,7 +2590,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripWithEmptyDataEntry) { TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithNoneLinkage) { readWriteCompareTUSummary(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -2595,7 +2601,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithNoneLinkage) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2605,7 +2611,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithNoneLinkage) { "linkage_table": [ { "id": 0, - "linkage": { "type": "none" } + "linkage": { "type": "None" } } ], "data": [] @@ -2615,7 +2621,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithNoneLinkage) { TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithInternalLinkage) { readWriteCompareTUSummary(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -2626,7 +2632,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithInternalLinkage) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2636,7 +2642,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithInternalLinkage) { "linkage_table": [ { "id": 0, - "linkage": { "type": "internal" } + "linkage": { "type": "Internal" } } ], "data": [] @@ -2646,7 +2652,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithInternalLinkage) { TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithExternalLinkage) { readWriteCompareTUSummary(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -2657,7 +2663,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithExternalLinkage) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2667,7 +2673,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithExternalLinkage) { "linkage_table": [ { "id": 0, - "linkage": { "type": "external" } + "linkage": { "type": "External" } } ], "data": [] @@ -2677,7 +2683,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithExternalLinkage) { TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithMultipleEntries) { readWriteCompareTUSummary(R"({ "tu_namespace": { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" }, "id_table": [ @@ -2688,7 +2694,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithMultipleEntries) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2701,7 +2707,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithMultipleEntries) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2714,7 +2720,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithMultipleEntries) { "suffix": "", "namespace": [ { - "kind": "compilation_unit", + "kind": "CompilationUnit", "name": "test.cpp" } ] @@ -2724,15 +2730,15 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithMultipleEntries) { "linkage_table": [ { "id": 0, - "linkage": { "type": "none" } + "linkage": { "type": "None" } }, { "id": 1, - "linkage": { "type": "internal" } + "linkage": { "type": "Internal" } }, { "id": 2, - "linkage": { "type": "external" } + "linkage": { "type": "External" } } ], "data": [] diff --git a/clang/unittests/Analysis/Scalable/SummaryNameTest.cpp b/clang/unittests/Analysis/Scalable/SummaryNameTest.cpp index d7b52ed6298a9..51fa12d46664c 100644 --- a/clang/unittests/Analysis/Scalable/SummaryNameTest.cpp +++ b/clang/unittests/Analysis/Scalable/SummaryNameTest.cpp @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/Scalable/Model/SummaryName.h" +#include "clang/Analysis/Scalable/Support/FormatProviders.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/Support/raw_ostream.h" #include "gtest/gtest.h" @@ -51,6 +53,11 @@ TEST(SummaryNameTest, Str) { EXPECT_EQ(Handle3.str(), "TestAnalysis2"); } +TEST(SummaryNameTest, FormatProvider) { + EXPECT_EQ(llvm::formatv("{0}", SummaryName("MyAnalysis")).str(), + "SummaryName(MyAnalysis)"); +} + TEST(SummaryNameTest, StreamOutput) { std::string S; llvm::raw_string_ostream(S) << SummaryName("MyAnalysis"); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
