13#include "llvm/TargetParser/Triple.h"
21llvm::Expected<MultiArchStaticLibrary>
30 Object *RootObjectPtr = ExpectedJSON->getAsObject();
34 "MultiArchStaticLibrary",
"object")
46 auto ExpectedM = readMultiArchStaticLibraryFromObject(*RootObjectPtr);
53 return std::move(*ExpectedM);
57JSONFormat::readMultiArchStaticLibraryFromObject(
const Object &RootObject) {
58 const Object *NamespaceObject = RootObject.getObject(
"namespace");
59 if (!NamespaceObject) {
62 "BuildNamespace",
"namespace",
"object")
66 auto ExpectedNamespace = buildNamespaceFromJSON(*NamespaceObject);
67 if (!ExpectedNamespace) {
73 if (
getKind(*ExpectedNamespace) !=
76 std::errc::invalid_argument,
85 const Array *MembersArray = RootObject.getArray(
"members");
89 "MultiArchStaticLibrary members",
"members",
95 auto &Members = getMembers(M);
98 for (
const auto &[Index, MemberValue] : llvm::enumerate(*MembersArray)) {
99 const Object *MemberObject = MemberValue.getAsObject();
103 "MultiArchStaticLibrary member", Index,
112 "MultiArchStaticLibrary member", Index)
116 auto ExpectedMember = readStaticLibraryFromObject(*MemberObject);
117 if (!ExpectedMember) {
120 "MultiArchStaticLibrary member", Index)
124 const auto &MemberName =
getName(getNamespace(*ExpectedMember));
130 "MultiArchStaticLibrary member", Index)
134 auto [It, Inserted] = Members.insert(
135 std::make_unique<StaticLibrary>(std::move(*ExpectedMember)));
137 auto MemberTriple = llvm::Triple::normalize(getTargetTriple(**It).str());
140 "MultiArchStaticLibrary member", Index,
151 llvm::StringRef Path) {
156 RootObject[
"namespace"] = buildNamespaceToJSON(getNamespace(M));
159 MembersArray.reserve(getMembers(M).size());
160 for (
const auto &
Member : getMembers(M)) {
161 MembersArray.push_back(staticLibraryToJSON(*
Member));
163 RootObject[
"members"] = std::move(MembersArray);
171 return llvm::Error::success();
static Decl::Kind getKind(const Decl *D)
static ErrorBuilder create(std::error_code EC, const char *Fmt, Args &&...ArgVals)
Create an ErrorBuilder with an error code and formatted message.
ErrorBuilder & context(const char *Msg)
Add context information as a plain string.
llvm::Error build() const
Build and return the final error.
static ErrorBuilder wrap(llvm::Error E)
Wrap an existing error and optionally add context.
Represents a multi-architecture static library.
StringRef getName(const HeaderType T)
constexpr const char * ReadingFromFile
constexpr const char * ReadingFromField
constexpr const char * MismatchedSummaryType
constexpr const char * FailedToReadObjectAtIndex
constexpr const char * FailedToReadObjectAtField
constexpr const char * WritingToFile
constexpr const char * ReadingFromIndex
constexpr const char * FailedInsertionOnDuplication
constexpr const char * FailedToReadObject
constexpr const char * JSONTypeKey
Root-object key naming the summary kind so files are self-describing.
constexpr const char * JSONTypeValueStaticLibrary
Value written to JSONTypeKey for serialized StaticLibrary files.
llvm::json::Object Object
llvm::Expected< Value > readJSON(llvm::StringRef Path)
constexpr const char * JSONTypeValueMultiArchStaticLibrary
Value written to JSONTypeKey for serialized MultiArchStaticLibrary files.
llvm::Error checkSummaryType(const Object &RootObject, llvm::StringRef ExpectedType)
Reads the JSONTypeKey field from the root object and verifies it equals ExpectedType.
llvm::StringRef buildNamespaceKindToJSON(BuildNamespaceKind BNK)
llvm::Error writeJSON(Value &&V, llvm::StringRef Path)
llvm::Expected< DeclarationName > ExpectedName