12#include "llvm/Support/Registry.h"
17LLVM_DEFINE_REGISTRY(llvm::Registry<JSONFormat::FormatInfo>)
18LLVM_DEFINE_REGISTRY(llvm::Registry<JSONFormat::AnalysisResultRegistry::Codec>)
20static SerializationFormatRegistry::Add<JSONFormat>
33 if (!llvm::sys::fs::exists(Path)) {
40 if (llvm::sys::fs::is_directory(Path)) {
55 auto BufferOrError = llvm::MemoryBuffer::getFile(Path);
57 const std::error_code EC = BufferOrError.getError();
63 return llvm::json::parse(BufferOrError.get()->getBuffer());
67 if (llvm::sys::fs::exists(Path)) {
74 llvm::StringRef Dir = llvm::sys::path::parent_path(Path);
75 if (!Dir.empty() && !llvm::sys::fs::is_directory(Dir)) {
91 llvm::raw_fd_ostream OutStream(Path, EC, llvm::sys::fs::OF_Text);
99 OutStream << llvm::formatv(
"{0:2}\n",
V);
105 if (OutStream.has_error()) {
108 OutStream.error().message())
112 return llvm::Error::success();
119std::map<SummaryName, JSONFormat::FormatInfo> JSONFormat::initFormatInfos() {
120 std::map<SummaryName, FormatInfo> FormatInfos;
121 for (
const auto &
FormatInfoEntry : llvm::Registry<FormatInfo>::entries()) {
123 bool Inserted = FormatInfos.try_emplace(Info->ForSummary, *Info).second;
125 llvm::report_fatal_error(
126 "FormatInfo is already registered for summary: " +
127 Info->ForSummary.str());
134 llvm::function_ref<
void(llvm::StringRef, llvm::StringRef)> Callback)
const {
135 for (
const auto &Entry : llvm::Registry<FormatInfo>::entries())
136 Callback(Entry.getName(), Entry.getDesc());
163EntityId JSONFormat::entityIdFromJSON(
const uint64_t EntityIdIndex)
const {
164 return makeEntityId(
static_cast<size_t>(EntityIdIndex));
167uint64_t JSONFormat::entityIdToJSON(
EntityId EI)
const {
168 return static_cast<uint64_t
>(
getIndex(EI));
171llvm::Expected<EntityId>
172JSONFormat::entityIdFromJSONObject(
const Object &EntityIdObject) {
173 if (EntityIdObject.size() != 1) {
188 std::optional<uint64_t> OptEntityIdIndex = AtVal->getAsUINT64();
189 if (!OptEntityIdIndex) {
196 return makeEntityId(
static_cast<size_t>(*OptEntityIdIndex));
209llvm::Expected<BuildNamespaceKind>
211 auto OptBuildNamespaceKind =
213 if (!OptBuildNamespaceKind) {
216 BuildNamespaceKindStr)
219 return *OptBuildNamespaceKind;
232JSONFormat::buildNamespaceFromJSON(
const Object &BuildNamespaceObject)
const {
233 auto OptBuildNamespaceKindStr = BuildNamespaceObject.getString(
"kind");
234 if (!OptBuildNamespaceKindStr) {
237 "BuildNamespaceKind",
"kind",
"string")
248 auto OptNameStr = BuildNamespaceObject.getString(
"name");
252 "BuildNamespaceName",
"name",
"string")
256 return {BuildNamespace(*ExpectedKind, *OptNameStr)};
270llvm::Expected<NestedBuildNamespace> JSONFormat::nestedBuildNamespaceFromJSON(
271 const Array &NestedBuildNamespaceArray)
const {
272 std::vector<BuildNamespace> Namespaces;
274 size_t NamespaceCount = NestedBuildNamespaceArray.size();
275 Namespaces.reserve(NamespaceCount);
277 for (
const auto &[Index, BuildNamespaceValue] :
278 llvm::enumerate(NestedBuildNamespaceArray)) {
279 const Object *BuildNamespaceObject = BuildNamespaceValue.getAsObject();
280 if (!BuildNamespaceObject) {
283 "BuildNamespace", Index,
"object")
287 auto ExpectedBuildNamespace = buildNamespaceFromJSON(*BuildNamespaceObject);
288 if (!ExpectedBuildNamespace) {
294 Namespaces.push_back(std::move(*ExpectedBuildNamespace));
297 return NestedBuildNamespace(std::move(Namespaces));
300Array JSONFormat::nestedBuildNamespaceToJSON(
303 const auto &Namespaces = getNamespaces(NBN);
304 Result.reserve(Namespaces.size());
306 for (
const auto &BN : Namespaces) {
307 Result.push_back(buildNamespaceToJSON(BN));
319static llvm::Expected<std::pair<llvm::StringRef, llvm::StringRef>>
321 const auto OptUSR = EntityNameObject.getString(
"usr");
329 const auto OptSuffix = EntityNameObject.getString(
"suffix");
333 "Suffix",
"suffix",
"string")
337 return std::make_pair(*OptUSR, *OptSuffix);
341JSONFormat::tuEntityNameFromJSON(
const Object &EntityNameObject)
const {
344 return ExpectedCore.takeError();
346 auto [USR, Suffix] = *ExpectedCore;
353 Result[
"suffix"] = getSuffix(EN);
357llvm::Expected<EntityName>
358JSONFormat::luEntityNameFromJSON(
const Object &EntityNameObject)
const {
361 return ExpectedCore.takeError();
363 auto [USR, Suffix] = *ExpectedCore;
365 const Array *OptNamespaceArray = EntityNameObject.getArray(
"namespace");
366 if (!OptNamespaceArray) {
369 "NestedBuildNamespace",
"namespace",
"array")
373 auto ExpectedNamespace = nestedBuildNamespaceFromJSON(*OptNamespaceArray);
374 if (!ExpectedNamespace) {
381 return EntityName{USR, Suffix, std::move(*ExpectedNamespace)};
387 Result[
"suffix"] = getSuffix(EN);
388 Result[
"namespace"] = nestedBuildNamespaceToJSON(getNamespace(EN));
396llvm::Expected<EntityLinkageType>
399 if (!OptEntityLinkageType) {
402 EntityLinkageTypeStr)
405 return *OptEntityLinkageType;
418JSONFormat::entityLinkageFromJSON(
const Object &EntityLinkageObject)
const {
419 auto OptLinkageStr = EntityLinkageObject.getString(
"type");
420 if (!OptLinkageStr) {
423 "EntityLinkageType",
"type",
"string")
428 if (!ExpectedLinkageType) {
434 return EntityLinkage(*ExpectedLinkageType);
448static llvm::Expected<EntityId>
450 llvm::function_ref<
EntityId(uint64_t)> MakeId) {
451 const Value *EntityIdIntValue = EntityIdTableEntryObject.get(
"id");
452 if (!EntityIdIntValue) {
456 "number (unsigned 64-bit integer)")
460 const std::optional<uint64_t> OptEntityIdInt =
461 EntityIdIntValue->getAsUINT64();
462 if (!OptEntityIdInt) {
466 "number (unsigned 64-bit integer)")
470 return MakeId(*OptEntityIdInt);
474JSONFormat::tuEntityIdTableEntryFromJSON(
475 const Object &EntityIdTableEntryObject)
const {
477 const Object *OptEntityNameObject =
478 EntityIdTableEntryObject.getObject(
"name");
479 if (!OptEntityNameObject) {
482 "EntityName",
"name",
"object")
486 auto ExpectedEntityName = tuEntityNameFromJSON(*OptEntityNameObject);
487 if (!ExpectedEntityName) {
494 EntityIdTableEntryObject,
495 [
this](uint64_t
V) {
return entityIdFromJSON(
V); });
497 return ExpectedId.takeError();
499 return std::make_pair(std::move(*ExpectedEntityName), std::move(*ExpectedId));
505 Entry[
"id"] = entityIdToJSON(EI);
506 Entry[
"name"] = tuEntityNameToJSON(EN);
510llvm::Expected<std::pair<EntityName, EntityId>>
511JSONFormat::luEntityIdTableEntryFromJSON(
512 const Object &EntityIdTableEntryObject)
const {
514 const Object *OptEntityNameObject =
515 EntityIdTableEntryObject.getObject(
"name");
516 if (!OptEntityNameObject) {
519 "EntityName",
"name",
"object")
523 auto ExpectedEntityName = luEntityNameFromJSON(*OptEntityNameObject);
524 if (!ExpectedEntityName) {
531 EntityIdTableEntryObject,
532 [
this](uint64_t
V) {
return entityIdFromJSON(
V); });
534 return ExpectedId.takeError();
536 return std::make_pair(std::move(*ExpectedEntityName), std::move(*ExpectedId));
542 Entry[
"id"] = entityIdToJSON(EI);
543 Entry[
"name"] = luEntityNameToJSON(EN);
555 const Array &EntityIdTableArray,
559 llvm::function_ref<std::map<EntityName, EntityId> &(
EntityIdTable &)>
562 std::map<EntityName, EntityId> &Entities = GetEntities(IdTable);
564 for (
const auto &[Index, EntityIdTableEntryValue] :
565 llvm::enumerate(EntityIdTableArray)) {
566 const Object *OptEntityIdTableEntryObject =
567 EntityIdTableEntryValue.getAsObject();
568 if (!OptEntityIdTableEntryObject) {
571 "EntityIdTable entry", Index,
"object")
575 auto ExpectedEntityIdTableEntry = EntryReader(*OptEntityIdTableEntryObject);
576 if (!ExpectedEntityIdTableEntry) {
583 auto [EntityIt, EntityInserted] =
584 Entities.emplace(std::move(*ExpectedEntityIdTableEntry));
585 if (!EntityInserted) {
588 "EntityIdTable entry", Index,
598JSONFormat::tuEntityIdTableFromJSON(
const Array &EntityIdTableArray)
const {
601 [
this](
const Object &O) {
return tuEntityIdTableEntryFromJSON(O); },
603 return getEntities(T);
608 Array EntityIdTableArray;
609 const auto &Entities = getEntities(IdTable);
610 EntityIdTableArray.reserve(Entities.size());
612 for (
const auto &[EntityName, EntityId] : Entities) {
613 EntityIdTableArray.push_back(
614 tuEntityIdTableEntryToJSON(EntityName, EntityId));
617 return EntityIdTableArray;
620llvm::Expected<EntityIdTable>
621JSONFormat::luEntityIdTableFromJSON(
const Array &EntityIdTableArray)
const {
624 [
this](
const Object &O) {
return luEntityIdTableEntryFromJSON(O); },
625 [](EntityIdTable &T) -> std::map<EntityName, EntityId> & {
626 return getEntities(T);
631 Array EntityIdTableArray;
632 const auto &Entities = getEntities(IdTable);
633 EntityIdTableArray.reserve(Entities.size());
635 for (
const auto &[EntityName, EntityId] : Entities) {
636 EntityIdTableArray.push_back(
637 luEntityIdTableEntryToJSON(EntityName, EntityId));
640 return EntityIdTableArray;
647llvm::Expected<std::pair<EntityId, EntityLinkage>>
648JSONFormat::linkageTableEntryFromJSON(
649 const Object &LinkageTableEntryObject)
const {
650 const Value *EntityIdIntValue = LinkageTableEntryObject.get(
"id");
651 if (!EntityIdIntValue) {
655 "number (unsigned 64-bit integer)")
659 const std::optional<uint64_t> OptEntityIdInt =
660 EntityIdIntValue->getAsUINT64();
661 if (!OptEntityIdInt) {
665 "number (unsigned 64-bit integer)")
669 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
671 const Object *OptEntityLinkageObject =
672 LinkageTableEntryObject.getObject(
"linkage");
673 if (!OptEntityLinkageObject) {
676 "EntityLinkage",
"linkage",
"object")
680 auto ExpectedEntityLinkage = entityLinkageFromJSON(*OptEntityLinkageObject);
681 if (!ExpectedEntityLinkage) {
687 return std::make_pair(std::move(EI), std::move(*ExpectedEntityLinkage));
693 Entry[
"id"] = entityIdToJSON(EI);
694 Entry[
"linkage"] = entityLinkageToJSON(EL);
706llvm::Expected<std::map<EntityId, EntityLinkage>>
707JSONFormat::linkageTableFromJSON(
const Array &LinkageTableArray,
708 std::set<EntityId> ExpectedIds)
const {
709 std::map<EntityId, EntityLinkage> LinkageTable;
711 for (
const auto &[Index, LinkageTableEntryValue] :
712 llvm::enumerate(LinkageTableArray)) {
713 const Object *OptLinkageTableEntryObject =
714 LinkageTableEntryValue.getAsObject();
715 if (!OptLinkageTableEntryObject) {
718 "LinkageTable entry", Index,
"object")
722 auto ExpectedLinkageTableEntry =
723 linkageTableEntryFromJSON(*OptLinkageTableEntryObject);
724 if (!ExpectedLinkageTableEntry) {
730 const EntityId EI = ExpectedLinkageTableEntry->first;
732 auto [It, Inserted] =
733 LinkageTable.insert(std::move(*ExpectedLinkageTableEntry));
737 "LinkageTable entry", Index, It->first)
741 if (ExpectedIds.erase(EI) == 0) {
743 std::errc::invalid_argument,
750 if (!ExpectedIds.empty()) {
752 std::errc::invalid_argument,
754 *ExpectedIds.begin())
761Array JSONFormat::linkageTableToJSON(
762 const std::map<EntityId, EntityLinkage> &LinkageTable)
const {
764 Result.reserve(LinkageTable.size());
766 for (
const auto &[EI, EL] : LinkageTable) {
767 Result.push_back(linkageTableEntryToJSON(EI, EL));
777llvm::Expected<std::unique_ptr<EntitySummary>>
778JSONFormat::entitySummaryFromJSON(
const SummaryName &SN,
779 const Object &EntitySummaryObject,
781 auto InfoIt = FormatInfos.find(SN);
782 if (InfoIt == FormatInfos.end()) {
784 std::errc::invalid_argument,
789 const auto &InfoEntry = InfoIt->second;
790 assert(InfoEntry.ForSummary == SN);
792 return InfoEntry.Deserialize(EntitySummaryObject, IdTable,
793 entityIdFromJSONObject);
796llvm::Expected<Object>
797JSONFormat::entitySummaryToJSON(
const SummaryName &SN,
799 auto InfoIt = FormatInfos.find(SN);
800 if (InfoIt == FormatInfos.end()) {
802 std::errc::invalid_argument,
807 const auto &InfoEntry = InfoIt->second;
808 assert(InfoEntry.ForSummary == SN);
810 return InfoEntry.Serialize(ES, entityIdToJSONObject);
817llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummary>>>
818JSONFormat::entityDataMapEntryFromJSON(
const Object &EntityDataMapEntryObject,
822 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
823 if (!EntityIdIntValue) {
826 "EntityId",
"entity_id",
827 "number (unsigned 64-bit integer)")
831 const std::optional<uint64_t> OptEntityIdInt =
832 EntityIdIntValue->getAsUINT64();
833 if (!OptEntityIdInt) {
836 "EntityId",
"entity_id",
837 "number (unsigned 64-bit integer)")
841 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
843 const Object *OptEntitySummaryObject =
844 EntityDataMapEntryObject.getObject(
"entity_summary");
845 if (!OptEntitySummaryObject) {
848 "EntitySummary",
"entity_summary",
"object")
852 auto ExpectedEntitySummary =
853 entitySummaryFromJSON(SN, *OptEntitySummaryObject, IdTable);
854 if (!ExpectedEntitySummary) {
861 if (*ExpectedEntitySummary ==
nullptr) {
863 std::errc::invalid_argument,
868 auto ActualSN = (*ExpectedEntitySummary)->getSummaryName();
869 if (SN != ActualSN) {
871 std::errc::invalid_argument,
873 FailedToDeserializeEntitySummaryMismatchedSummaryName,
878 return std::make_pair(std::move(EI), std::move(*ExpectedEntitySummary));
881llvm::Expected<Object> JSONFormat::entityDataMapEntryToJSON(
886 Entry[
"entity_id"] = entityIdToJSON(EI);
888 if (!EntitySummary) {
893 const auto ActualSN = EntitySummary->getSummaryName();
894 if (SN != ActualSN) {
900 auto ExpectedEntitySummaryObject = entitySummaryToJSON(SN, *EntitySummary);
901 if (!ExpectedEntitySummaryObject) {
908 Entry[
"entity_summary"] = std::move(*ExpectedEntitySummaryObject);
917llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummary>>>
918JSONFormat::entityDataMapFromJSON(
const SummaryName &SN,
919 const Array &EntityDataArray,
921 std::map<EntityId, std::unique_ptr<EntitySummary>> EntityDataMap;
923 for (
const auto &[Index, EntityDataMapEntryValue] :
924 llvm::enumerate(EntityDataArray)) {
925 const Object *OptEntityDataMapEntryObject =
926 EntityDataMapEntryValue.getAsObject();
927 if (!OptEntityDataMapEntryObject) {
930 "EntitySummary entry", Index,
"object")
934 auto ExpectedEntityDataMapEntry =
935 entityDataMapEntryFromJSON(*OptEntityDataMapEntryObject, SN, IdTable);
936 if (!ExpectedEntityDataMapEntry) {
943 auto [DataIt, DataInserted] =
944 EntityDataMap.insert(std::move(*ExpectedEntityDataMapEntry));
948 "EntitySummary entry", Index, DataIt->first)
953 return std::move(EntityDataMap);
956llvm::Expected<Array> JSONFormat::entityDataMapToJSON(
958 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &EntityDataMap)
961 Result.reserve(EntityDataMap.size());
963 for (
const auto &[Index, EntityDataMapEntry] :
964 llvm::enumerate(EntityDataMap)) {
965 const auto &[EntityId, EntitySummary] = EntityDataMapEntry;
967 auto ExpectedEntityDataMapEntryObject =
968 entityDataMapEntryToJSON(EntityId, EntitySummary, SN);
970 if (!ExpectedEntityDataMapEntryObject) {
976 Result.push_back(std::move(*ExpectedEntityDataMapEntryObject));
987 std::pair<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
988JSONFormat::summaryDataMapEntryFromJSON(
const Object &SummaryDataMapEntryObject,
991 std::optional<llvm::StringRef> OptSummaryNameStr =
992 SummaryDataMapEntryObject.getString(
"summary_name");
993 if (!OptSummaryNameStr) {
996 "SummaryName",
"summary_name",
"string")
1002 const Array *OptEntityDataArray =
1003 SummaryDataMapEntryObject.getArray(
"summary_data");
1004 if (!OptEntityDataArray) {
1007 "EntitySummary entries",
"summary_data",
1012 auto ExpectedEntityDataMap =
1013 entityDataMapFromJSON(SN, *OptEntityDataArray, IdTable);
1014 if (!ExpectedEntityDataMap) {
1021 return std::make_pair(std::move(SN), std::move(*ExpectedEntityDataMap));
1024llvm::Expected<Object> JSONFormat::summaryDataMapEntryToJSON(
1026 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &SD)
const {
1031 auto ExpectedSummaryDataArray = entityDataMapToJSON(SN, SD);
1032 if (!ExpectedSummaryDataArray) {
1039 Result[
"summary_data"] = std::move(*ExpectedSummaryDataArray);
1049 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
1050JSONFormat::summaryDataMapFromJSON(
const Array &SummaryDataArray,
1052 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>
1055 for (
const auto &[Index, SummaryDataMapEntryValue] :
1056 llvm::enumerate(SummaryDataArray)) {
1057 const Object *OptSummaryDataMapEntryObject =
1058 SummaryDataMapEntryValue.getAsObject();
1059 if (!OptSummaryDataMapEntryObject) {
1062 "SummaryData entry", Index,
"object")
1066 auto ExpectedSummaryDataMapEntry =
1067 summaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject, IdTable);
1068 if (!ExpectedSummaryDataMapEntry) {
1074 auto [SummaryIt, SummaryInserted] =
1075 SummaryDataMap.emplace(std::move(*ExpectedSummaryDataMapEntry));
1076 if (!SummaryInserted) {
1079 "SummaryData entry", Index, SummaryIt->first)
1084 return std::move(SummaryDataMap);
1087llvm::Expected<Array> JSONFormat::summaryDataMapToJSON(
1089 std::map<
EntityId, std::unique_ptr<EntitySummary>>>
1090 &SummaryDataMap)
const {
1092 Result.reserve(SummaryDataMap.size());
1094 for (
const auto &[Index, SummaryDataMapEntry] :
1095 llvm::enumerate(SummaryDataMap)) {
1096 const auto &[SummaryName, DataMap] = SummaryDataMapEntry;
1098 auto ExpectedSummaryDataMapObject =
1099 summaryDataMapEntryToJSON(SummaryName, DataMap);
1100 if (!ExpectedSummaryDataMapObject) {
1106 Result.push_back(std::move(*ExpectedSummaryDataMapObject));
1109 return std::move(
Result);
1116llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1117JSONFormat::encodingDataMapEntryFromJSON(
1118 const Object &EntityDataMapEntryObject)
const {
1119 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
1120 if (!EntityIdIntValue) {
1123 "EntityId",
"entity_id",
1124 "number (unsigned 64-bit integer)")
1128 const std::optional<uint64_t> OptEntityIdInt =
1129 EntityIdIntValue->getAsUINT64();
1130 if (!OptEntityIdInt) {
1133 "EntityId",
"entity_id",
1134 "number (unsigned 64-bit integer)")
1138 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
1140 const Object *OptEntitySummaryObject =
1141 EntityDataMapEntryObject.getObject(
"entity_summary");
1142 if (!OptEntitySummaryObject) {
1145 "EntitySummary",
"entity_summary",
"object")
1149 std::unique_ptr<EntitySummaryEncoding>
Encoding(
1152 return std::make_pair(std::move(EI), std::move(Encoding));
1155Object JSONFormat::encodingDataMapEntryToJSON(
1156 EntityId EI,
const std::unique_ptr<EntitySummaryEncoding> &Encoding)
const {
1158 Entry[
"entity_id"] = entityIdToJSON(EI);
1165 Entry[
"entity_summary"] = JSONEncoding->Data;
1174llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1175JSONFormat::encodingDataMapFromJSON(
const Array &EntityDataArray)
const {
1176 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>> EncodingDataMap;
1178 for (
const auto &[Index, EntityDataMapEntryValue] :
1179 llvm::enumerate(EntityDataArray)) {
1180 const Object *OptEntityDataMapEntryObject =
1181 EntityDataMapEntryValue.getAsObject();
1182 if (!OptEntityDataMapEntryObject) {
1185 "EntitySummary entry", Index,
"object")
1189 auto ExpectedEntry =
1190 encodingDataMapEntryFromJSON(*OptEntityDataMapEntryObject);
1191 if (!ExpectedEntry) {
1198 auto [DataIt, DataInserted] =
1199 EncodingDataMap.insert(std::move(*ExpectedEntry));
1200 if (!DataInserted) {
1203 "EntitySummary entry", Index, DataIt->first)
1208 return std::move(EncodingDataMap);
1211Array JSONFormat::encodingDataMapToJSON(
1212 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1213 &EncodingDataMap)
const {
1215 Result.reserve(EncodingDataMap.size());
1217 for (
const auto &[EI, Encoding] : EncodingDataMap) {
1218 Result.push_back(encodingDataMapEntryToJSON(EI, Encoding));
1228llvm::Expected<std::pair<
1229 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1230JSONFormat::encodingSummaryDataMapEntryFromJSON(
1231 const Object &SummaryDataMapEntryObject)
const {
1232 std::optional<llvm::StringRef> OptSummaryNameStr =
1233 SummaryDataMapEntryObject.getString(
"summary_name");
1234 if (!OptSummaryNameStr) {
1237 "SummaryName",
"summary_name",
"string")
1243 const Array *OptEntityDataArray =
1244 SummaryDataMapEntryObject.getArray(
"summary_data");
1245 if (!OptEntityDataArray) {
1248 "EntitySummary entries",
"summary_data",
1253 auto ExpectedEncodingDataMap = encodingDataMapFromJSON(*OptEntityDataArray);
1254 if (!ExpectedEncodingDataMap) {
1261 return std::make_pair(std::move(SN), std::move(*ExpectedEncodingDataMap));
1264Object JSONFormat::encodingSummaryDataMapEntryToJSON(
1266 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1267 &EncodingMap)
const {
1271 Result[
"summary_data"] = encodingDataMapToJSON(EncodingMap);
1280llvm::Expected<std::map<
1281 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1282JSONFormat::encodingSummaryDataMapFromJSON(
1283 const Array &SummaryDataArray)
const {
1284 std::map<SummaryName,
1285 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1286 EncodingSummaryDataMap;
1288 for (
const auto &[Index, SummaryDataMapEntryValue] :
1289 llvm::enumerate(SummaryDataArray)) {
1290 const Object *OptSummaryDataMapEntryObject =
1291 SummaryDataMapEntryValue.getAsObject();
1292 if (!OptSummaryDataMapEntryObject) {
1295 "SummaryData entry", Index,
"object")
1299 auto ExpectedEntry =
1300 encodingSummaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject);
1301 if (!ExpectedEntry) {
1307 auto [SummaryIt, SummaryInserted] =
1308 EncodingSummaryDataMap.emplace(std::move(*ExpectedEntry));
1309 if (!SummaryInserted) {
1312 "SummaryData entry", Index, SummaryIt->first)
1317 return std::move(EncodingSummaryDataMap);
1320Array JSONFormat::encodingSummaryDataMapToJSON(
1322 std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1323 &EncodingSummaryDataMap)
const {
1325 Result.reserve(EncodingSummaryDataMap.size());
1327 for (
const auto &[SN, EncodingMap] : EncodingSummaryDataMap) {
1328 Result.push_back(encodingSummaryDataMapEntryToJSON(SN, EncodingMap));
static std::optional< NonLoc > getIndex(ProgramStateRef State, const ElementRegion *ER, CharKind CK)
static Decl::Kind getKind(const Decl *D)
static std::string getUSR(const Decl *D)
Uniquely identifies a whole-program analysis and the AnalysisResult it produces.
llvm::StringRef str() const
Explicit conversion to the underlying string representation.
Represents a single namespace in the build process.
Manages entity name interning and provides efficient EntityId handles.
Lightweight opaque handle representing an entity in an EntityIdTable.
Represents the linkage properties of an entity in the program model.
Uniquely identifies an entity in a program.
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.
Represents a hierarchical sequence of build namespaces.
Uniquely identifies an analysis summary.
llvm::StringRef str() const
Explicit conversion to the underlying string representation.
StringRef getName(const HeaderType T)
constexpr const char * FailedToSerializeEntitySummaryMismatchedSummaryName
constexpr const char * InvalidBuildNamespaceKind
constexpr const char * ReadingFromField
constexpr const char * FailedToReadObjectAtIndex
constexpr const char * FailedToDeserializeEntitySummaryNoFormatInfo
constexpr const char * InvalidEntityLinkageType
constexpr const char * FileIsDirectory
constexpr const char * FileNotFound
constexpr const char * FailedToReadObjectAtField
constexpr const char * FileExists
constexpr const char * FailedToReadEntityIdObject
constexpr const char * ReadingFromIndex
constexpr const char * WritingToField
constexpr const char * FailedInsertionOnDuplication
constexpr const char * FailedToDeserializeLinkageTableExtraId
constexpr const char * FailedToSerializeEntitySummaryMissingData
constexpr const char * FailedToDeserializeEntitySummaryMissingData
constexpr const char * FailedToWriteFile
constexpr const char * FailedToDeserializeLinkageTableMissingId
constexpr const char * FileIsNotJSON
constexpr const char * FailedToReadFile
constexpr const char * ParentDirectoryNotFound
constexpr const char * FailedToSerializeEntitySummaryNoFormatInfo
constexpr const char * WritingToIndex
SummaryName summaryNameFromJSON(llvm::StringRef SummaryNameStr)
llvm::StringRef summaryNameToJSON(const SummaryName &SN)
std::optional< EntityLinkageType > entityLinkageTypeFromString(llvm::StringRef Str)
Parses a string produced by entityLinkageTypeToString().
std::optional< BuildNamespaceKind > buildNamespaceKindFromString(llvm::StringRef Str)
Parses a string produced by buildNamespaceKindToString().
llvm::Expected< EntityLinkageType > entityLinkageTypeFromJSON(llvm::StringRef EntityLinkageTypeStr)
constexpr const char * JSONEntityIdKey
An entity ID is encoded as the single-key object {"@": <index>}.
llvm::StringRef analysisNameToJSON(const AnalysisName &AN)
static llvm::Expected< std::pair< llvm::StringRef, llvm::StringRef > > entityNameCoreFromJSON(const Object &EntityNameObject)
Reads "usr" and "suffix" fields from an EntityName JSON object.
AnalysisName analysisNameFromJSON(llvm::StringRef AnalysisNameStr)
llvm::Expected< BuildNamespaceKind > buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr)
llvm::json::Object Object
llvm::Expected< Value > readJSON(llvm::StringRef Path)
static llvm::Expected< EntityId > entityIdTableEntryIdFromJSON(const Object &EntityIdTableEntryObject, llvm::function_ref< EntityId(uint64_t)> MakeId)
Shared logic for reading the "id" field from an EntityIdTableEntry object.
constexpr const char * JSONFormatFileExtension
llvm::StringRef buildNamespaceKindToJSON(BuildNamespaceKind BNK)
static llvm::Expected< EntityIdTable > entityIdTableFromJSONImpl(const Array &EntityIdTableArray, llvm::function_ref< llvm::Expected< std::pair< EntityName, EntityId > >(const Object &)> EntryReader, llvm::function_ref< std::map< EntityName, EntityId > &(EntityIdTable &)> GetEntities)
Shared logic for deserializing an EntityIdTable from a JSON array.
llvm::StringRef entityLinkageTypeToJSON(EntityLinkageType LT)
llvm::Error writeJSON(Value &&V, llvm::StringRef Path)
llvm::StringRef buildNamespaceKindToString(BuildNamespaceKind BNK)
Returns the canonical string representation of BNK used for serialization and display (e....
volatile int JSONFormatAnchorSource
llvm::StringRef entityLinkageTypeToString(EntityLinkageType LT)
Returns the canonical string representation of LT used for serialization and display (e....
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.