19llvm::Expected<std::unique_ptr<EntitySummary>>
20JSONFormat::entitySummaryFromJSON(
const SummaryName &SN,
21 const Object &EntitySummaryObject,
23 auto InfoIt = FormatInfos.find(SN);
24 if (InfoIt == FormatInfos.end()) {
26 std::errc::invalid_argument,
31 const auto &InfoEntry = InfoIt->second;
32 assert(InfoEntry.ForSummary == SN);
35 return InfoEntry.Deserialize(EntitySummaryObject, IdTable, Converter);
39JSONFormat::entitySummaryToJSON(
const SummaryName &SN,
41 auto InfoIt = FormatInfos.find(SN);
42 if (InfoIt == FormatInfos.end()) {
44 std::errc::invalid_argument,
49 const auto &InfoEntry = InfoIt->second;
50 assert(InfoEntry.ForSummary == SN);
53 return InfoEntry.Serialize(ES, Converter);
60llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummary>>>
61JSONFormat::entityDataMapEntryFromJSON(
const Object &EntityDataMapEntryObject,
65 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
66 if (!EntityIdIntValue) {
69 "EntityId",
"entity_id",
70 "number (unsigned 64-bit integer)")
74 const std::optional<uint64_t> OptEntityIdInt =
75 EntityIdIntValue->getAsUINT64();
76 if (!OptEntityIdInt) {
79 "EntityId",
"entity_id",
80 "number (unsigned 64-bit integer)")
84 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
86 const Object *OptEntitySummaryObject =
87 EntityDataMapEntryObject.getObject(
"entity_summary");
88 if (!OptEntitySummaryObject) {
91 "EntitySummary",
"entity_summary",
"object")
95 auto ExpectedEntitySummary =
96 entitySummaryFromJSON(SN, *OptEntitySummaryObject, IdTable);
97 if (!ExpectedEntitySummary) {
104 if (*ExpectedEntitySummary ==
nullptr) {
106 std::errc::invalid_argument,
111 auto ActualSN = (*ExpectedEntitySummary)->getSummaryName();
112 if (SN != ActualSN) {
114 std::errc::invalid_argument,
116 FailedToDeserializeEntitySummaryMismatchedSummaryName,
121 return std::make_pair(std::move(EI), std::move(*ExpectedEntitySummary));
124llvm::Expected<Object> JSONFormat::entityDataMapEntryToJSON(
129 Entry[
"entity_id"] = entityIdToJSON(EI);
131 if (!EntitySummary) {
136 const auto ActualSN = EntitySummary->getSummaryName();
137 if (SN != ActualSN) {
143 auto ExpectedEntitySummaryObject = entitySummaryToJSON(SN, *EntitySummary);
144 if (!ExpectedEntitySummaryObject) {
151 Entry[
"entity_summary"] = std::move(*ExpectedEntitySummaryObject);
160llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummary>>>
161JSONFormat::entityDataMapFromJSON(
const SummaryName &SN,
162 const Array &EntityDataArray,
164 std::map<EntityId, std::unique_ptr<EntitySummary>> EntityDataMap;
166 for (
const auto &[Index, EntityDataMapEntryValue] :
167 llvm::enumerate(EntityDataArray)) {
169 const Object *OptEntityDataMapEntryObject =
170 EntityDataMapEntryValue.getAsObject();
171 if (!OptEntityDataMapEntryObject) {
174 "EntitySummary entry", Index,
"object")
178 auto ExpectedEntityDataMapEntry =
179 entityDataMapEntryFromJSON(*OptEntityDataMapEntryObject, SN, IdTable);
180 if (!ExpectedEntityDataMapEntry) {
187 auto [DataIt, DataInserted] =
188 EntityDataMap.insert(std::move(*ExpectedEntityDataMapEntry));
192 "EntitySummary entry", Index, DataIt->first)
197 return std::move(EntityDataMap);
200llvm::Expected<Array> JSONFormat::entityDataMapToJSON(
202 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &EntityDataMap)
205 Result.reserve(EntityDataMap.size());
207 for (
const auto &[Index, EntityDataMapEntry] :
208 llvm::enumerate(EntityDataMap)) {
209 const auto &[EntityId, EntitySummary] = EntityDataMapEntry;
211 auto ExpectedEntityDataMapEntryObject =
212 entityDataMapEntryToJSON(EntityId, EntitySummary, SN);
214 if (!ExpectedEntityDataMapEntryObject) {
220 Result.push_back(std::move(*ExpectedEntityDataMapEntryObject));
231 std::pair<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
232JSONFormat::summaryDataMapEntryFromJSON(
const Object &SummaryDataMapEntryObject,
235 std::optional<llvm::StringRef> OptSummaryNameStr =
236 SummaryDataMapEntryObject.getString(
"summary_name");
237 if (!OptSummaryNameStr) {
240 "SummaryName",
"summary_name",
"string")
246 const Array *OptEntityDataArray =
247 SummaryDataMapEntryObject.getArray(
"summary_data");
248 if (!OptEntityDataArray) {
251 "EntitySummary entries",
"summary_data",
256 auto ExpectedEntityDataMap =
257 entityDataMapFromJSON(SN, *OptEntityDataArray, IdTable);
258 if (!ExpectedEntityDataMap)
264 return std::make_pair(std::move(SN), std::move(*ExpectedEntityDataMap));
267llvm::Expected<Object> JSONFormat::summaryDataMapEntryToJSON(
269 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &SD)
const {
274 auto ExpectedSummaryDataArray = entityDataMapToJSON(SN, SD);
275 if (!ExpectedSummaryDataArray) {
282 Result[
"summary_data"] = std::move(*ExpectedSummaryDataArray);
292 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
293JSONFormat::summaryDataMapFromJSON(
const Array &SummaryDataArray,
295 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>
298 for (
const auto &[Index, SummaryDataMapEntryValue] :
299 llvm::enumerate(SummaryDataArray)) {
301 const Object *OptSummaryDataMapEntryObject =
302 SummaryDataMapEntryValue.getAsObject();
303 if (!OptSummaryDataMapEntryObject) {
306 "SummaryData entry", Index,
"object")
310 auto ExpectedSummaryDataMapEntry =
311 summaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject, IdTable);
312 if (!ExpectedSummaryDataMapEntry) {
318 auto [SummaryIt, SummaryInserted] =
319 SummaryDataMap.emplace(std::move(*ExpectedSummaryDataMapEntry));
320 if (!SummaryInserted) {
323 "SummaryData entry", Index, SummaryIt->first)
328 return std::move(SummaryDataMap);
331llvm::Expected<Array> JSONFormat::summaryDataMapToJSON(
333 std::map<
EntityId, std::unique_ptr<EntitySummary>>>
334 &SummaryDataMap)
const {
336 Result.reserve(SummaryDataMap.size());
338 for (
const auto &[Index, SummaryDataMapEntry] :
339 llvm::enumerate(SummaryDataMap)) {
340 const auto &[SummaryName, DataMap] = SummaryDataMapEntry;
342 auto ExpectedSummaryDataMapObject =
343 summaryDataMapEntryToJSON(SummaryName, DataMap);
344 if (!ExpectedSummaryDataMapObject) {
350 Result.push_back(std::move(*ExpectedSummaryDataMapObject));
368 Object *RootObjectPtr = ExpectedJSON->getAsObject();
369 if (!RootObjectPtr) {
377 const Object &RootObject = *RootObjectPtr;
379 const Object *TUNamespaceObject = RootObject.getObject(
"tu_namespace");
380 if (!TUNamespaceObject) {
383 "BuildNamespace",
"tu_namespace",
"object")
388 auto ExpectedTUNamespace = buildNamespaceFromJSON(*TUNamespaceObject);
389 if (!ExpectedTUNamespace) {
397 TUSummary Summary(std::move(*ExpectedTUNamespace));
400 const Array *IdTableArray = RootObject.getArray(
"id_table");
404 "IdTable",
"id_table",
"array")
409 auto ExpectedIdTable = entityIdTableFromJSON(*IdTableArray);
410 if (!ExpectedIdTable) {
417 getIdTable(Summary) = std::move(*ExpectedIdTable);
421 const Array *LinkageTableArray = RootObject.getArray(
"linkage_table");
422 if (!LinkageTableArray) {
425 "LinkageTable",
"linkage_table",
"array")
430 auto ExpectedIdRange =
431 llvm::make_second_range(getEntities(getIdTable(Summary)));
432 std::set<EntityId> ExpectedIds(ExpectedIdRange.begin(),
433 ExpectedIdRange.end());
437 auto ExpectedLinkageTable =
438 linkageTableFromJSON(*LinkageTableArray, std::move(ExpectedIds));
439 if (!ExpectedLinkageTable) {
447 getLinkageTable(Summary) = std::move(*ExpectedLinkageTable);
451 const Array *SummaryDataArray = RootObject.getArray(
"data");
452 if (!SummaryDataArray) {
455 "SummaryData entries",
"data",
"array")
460 auto ExpectedSummaryDataMap =
461 summaryDataMapFromJSON(*SummaryDataArray, getIdTable(Summary));
462 if (!ExpectedSummaryDataMap) {
470 getData(Summary) = std::move(*ExpectedSummaryDataMap);
473 return std::move(Summary);
477 llvm::StringRef Path) {
480 RootObject[
"tu_namespace"] = buildNamespaceToJSON(getTUNamespace(S));
482 RootObject[
"id_table"] = entityIdTableToJSON(getIdTable(S));
484 RootObject[
"linkage_table"] = linkageTableToJSON(getLinkageTable(S));
486 auto ExpectedDataObject = summaryDataMapToJSON(getData(S));
487 if (!ExpectedDataObject) {
493 RootObject[
"data"] = std::move(*ExpectedDataObject);
501 return llvm::Error::success();
Manages entity name interning and provides efficient EntityId handles.
Lightweight opaque handle representing an entity in an EntityIdTable.
Base class for analysis-specific summary data.
static ErrorBuilder create(std::error_code EC, const char *Fmt, Args &&...ArgVals)
Create an ErrorBuilder with an error code and formatted message.
static void fatal(const char *Fmt, Args &&...ArgVals)
Report a fatal error with formatted message and terminate execution.
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.
Uniquely identifies an analysis summary.
Data extracted for a given translation unit and for a given set of analyses.
constexpr const char * FailedToSerializeEntitySummaryMismatchedSummaryName
constexpr const char * ReadingFromFile
constexpr const char * ReadingFromField
constexpr const char * FailedToReadObjectAtIndex
constexpr const char * FailedToDeserializeEntitySummaryNoFormatInfo
constexpr const char * FailedToReadObjectAtField
constexpr const char * WritingToFile
constexpr const char * ReadingFromIndex
constexpr const char * WritingToField
constexpr const char * FailedInsertionOnDuplication
constexpr const char * FailedToSerializeEntitySummaryMissingData
constexpr const char * FailedToDeserializeEntitySummaryMissingData
constexpr const char * FailedToReadObject
constexpr const char * FailedToSerializeEntitySummaryNoFormatInfo
constexpr const char * WritingToIndex
SummaryName summaryNameFromJSON(llvm::StringRef SummaryNameStr)
llvm::StringRef summaryNameToJSON(const SummaryName &SN)
llvm::Error writeJSON(Value &&Value, llvm::StringRef Path)
llvm::json::Object Object
llvm::Expected< Value > readJSON(llvm::StringRef Path)
@ Result
The result type of a method or function.