12#include "llvm/Support/Registry.h"
13#include "llvm/TargetParser/Triple.h"
19 llvm::Registry<JSONFormat::FormatInfo>)
21 CLANG_ABI_EXPORT, llvm::Registry<JSONFormat::AnalysisResultRegistry::Codec>)
23static SerializationFormatRegistry::Add<JSONFormat>
36 if (!llvm::sys::fs::exists(Path)) {
43 if (llvm::sys::fs::is_directory(Path)) {
58 auto BufferOrError = llvm::MemoryBuffer::getFile(Path);
60 const std::error_code EC = BufferOrError.getError();
66 return llvm::json::parse(BufferOrError.get()->getBuffer());
70 if (llvm::sys::fs::exists(Path)) {
77 llvm::StringRef Dir = llvm::sys::path::parent_path(Path);
78 if (!Dir.empty() && !llvm::sys::fs::is_directory(Dir)) {
94 llvm::raw_fd_ostream OutStream(Path, EC, llvm::sys::fs::OF_Text);
102 OutStream << llvm::formatv(
"{0:2}\n",
V);
108 if (OutStream.has_error()) {
111 OutStream.error().message())
115 return llvm::Error::success();
122std::map<SummaryName, JSONFormat::FormatInfo> JSONFormat::initFormatInfos() {
123 std::map<SummaryName, FormatInfo> FormatInfos;
124 for (
const auto &
FormatInfoEntry : llvm::Registry<FormatInfo>::entries()) {
126 bool Inserted = FormatInfos.try_emplace(Info->ForSummary, *Info).second;
128 llvm::report_fatal_error(
129 "FormatInfo is already registered for summary: " +
130 Info->ForSummary.str());
137 llvm::function_ref<
void(llvm::StringRef, llvm::StringRef)> Callback)
const {
138 for (
const auto &Entry : llvm::Registry<FormatInfo>::entries())
139 Callback(Entry.getName(), Entry.getDesc());
157 std::optional<llvm::StringRef> OptType = RootObject.getString(
JSONTypeKey);
170 if (!ExpectedActual) {
171 return ExpectedActual.takeError();
179 return llvm::Error::success();
196EntityId JSONFormat::entityIdFromJSON(
const uint64_t EntityIdIndex)
const {
197 return makeEntityId(
static_cast<size_t>(EntityIdIndex));
200uint64_t JSONFormat::entityIdToJSON(
EntityId EI)
const {
201 return static_cast<uint64_t
>(
getIndex(EI));
204llvm::Expected<EntityId>
205JSONFormat::entityIdFromJSONObject(
const Object &EntityIdObject) {
206 if (EntityIdObject.size() != 1) {
221 std::optional<uint64_t> OptEntityIdIndex = AtVal->getAsUINT64();
222 if (!OptEntityIdIndex) {
229 return makeEntityId(
static_cast<size_t>(*OptEntityIdIndex));
242llvm::Expected<BuildNamespaceKind>
244 auto OptBuildNamespaceKind =
246 if (!OptBuildNamespaceKind) {
249 BuildNamespaceKindStr)
252 return *OptBuildNamespaceKind;
265JSONFormat::buildNamespaceFromJSON(
const Object &BuildNamespaceObject)
const {
266 auto OptBuildNamespaceKindStr = BuildNamespaceObject.getString(
"kind");
267 if (!OptBuildNamespaceKindStr) {
270 "BuildNamespaceKind",
"kind",
"string")
281 auto OptNameStr = BuildNamespaceObject.getString(
"name");
285 "BuildNamespaceName",
"name",
"string")
289 return {BuildNamespace(*ExpectedKind, *OptNameStr)};
303llvm::Expected<NestedBuildNamespace> JSONFormat::nestedBuildNamespaceFromJSON(
304 const Array &NestedBuildNamespaceArray)
const {
305 std::vector<BuildNamespace> Namespaces;
307 size_t NamespaceCount = NestedBuildNamespaceArray.size();
308 Namespaces.reserve(NamespaceCount);
310 for (
const auto &[Index, BuildNamespaceValue] :
311 llvm::enumerate(NestedBuildNamespaceArray)) {
312 const Object *BuildNamespaceObject = BuildNamespaceValue.getAsObject();
313 if (!BuildNamespaceObject) {
316 "BuildNamespace", Index,
"object")
320 auto ExpectedBuildNamespace = buildNamespaceFromJSON(*BuildNamespaceObject);
321 if (!ExpectedBuildNamespace) {
327 Namespaces.push_back(std::move(*ExpectedBuildNamespace));
330 return NestedBuildNamespace(std::move(Namespaces));
333Array JSONFormat::nestedBuildNamespaceToJSON(
336 const auto &Namespaces = getNamespaces(NBN);
337 Result.reserve(Namespaces.size());
339 for (
const auto &BN : Namespaces) {
340 Result.push_back(buildNamespaceToJSON(BN));
352static llvm::Expected<std::pair<llvm::StringRef, llvm::StringRef>>
354 const auto OptUSR = EntityNameObject.getString(
"usr");
362 const auto OptSuffix = EntityNameObject.getString(
"suffix");
366 "Suffix",
"suffix",
"string")
370 return std::make_pair(*OptUSR, *OptSuffix);
374JSONFormat::tuEntityNameFromJSON(
const Object &EntityNameObject)
const {
377 return ExpectedCore.takeError();
379 auto [USR, Suffix] = *ExpectedCore;
386 Result[
"suffix"] = getSuffix(EN);
390llvm::Expected<EntityName>
391JSONFormat::luEntityNameFromJSON(
const Object &EntityNameObject)
const {
394 return ExpectedCore.takeError();
396 auto [USR, Suffix] = *ExpectedCore;
398 const Array *OptNamespaceArray = EntityNameObject.getArray(
"namespace");
399 if (!OptNamespaceArray) {
402 "NestedBuildNamespace",
"namespace",
"array")
406 auto ExpectedNamespace = nestedBuildNamespaceFromJSON(*OptNamespaceArray);
407 if (!ExpectedNamespace) {
414 return EntityName{USR, Suffix, std::move(*ExpectedNamespace)};
420 Result[
"suffix"] = getSuffix(EN);
421 Result[
"namespace"] = nestedBuildNamespaceToJSON(getNamespace(EN));
429llvm::Expected<EntityLinkageType>
432 if (!OptEntityLinkageType) {
435 EntityLinkageTypeStr)
438 return *OptEntityLinkageType;
451 std::string Normalized = llvm::Triple::normalize(Triple);
452 if (Normalized != Triple) {
458 return llvm::Error::success();
466JSONFormat::entityLinkageFromJSON(
const Object &EntityLinkageObject)
const {
467 auto OptLinkageStr = EntityLinkageObject.getString(
"type");
468 if (!OptLinkageStr) {
471 "EntityLinkageType",
"type",
"string")
476 if (!ExpectedLinkageType) {
482 return EntityLinkage(*ExpectedLinkageType);
496static llvm::Expected<EntityId>
498 llvm::function_ref<
EntityId(uint64_t)> MakeId) {
499 const Value *EntityIdIntValue = EntityIdTableEntryObject.get(
"id");
500 if (!EntityIdIntValue) {
504 "number (unsigned 64-bit integer)")
508 const std::optional<uint64_t> OptEntityIdInt =
509 EntityIdIntValue->getAsUINT64();
510 if (!OptEntityIdInt) {
514 "number (unsigned 64-bit integer)")
518 return MakeId(*OptEntityIdInt);
522JSONFormat::tuEntityIdTableEntryFromJSON(
523 const Object &EntityIdTableEntryObject)
const {
525 const Object *OptEntityNameObject =
526 EntityIdTableEntryObject.getObject(
"name");
527 if (!OptEntityNameObject) {
530 "EntityName",
"name",
"object")
534 auto ExpectedEntityName = tuEntityNameFromJSON(*OptEntityNameObject);
535 if (!ExpectedEntityName) {
542 EntityIdTableEntryObject,
543 [
this](uint64_t
V) {
return entityIdFromJSON(
V); });
545 return ExpectedId.takeError();
547 return std::make_pair(std::move(*ExpectedEntityName), std::move(*ExpectedId));
553 Entry[
"id"] = entityIdToJSON(EI);
554 Entry[
"name"] = tuEntityNameToJSON(EN);
558llvm::Expected<std::pair<EntityName, EntityId>>
559JSONFormat::luEntityIdTableEntryFromJSON(
560 const Object &EntityIdTableEntryObject)
const {
562 const Object *OptEntityNameObject =
563 EntityIdTableEntryObject.getObject(
"name");
564 if (!OptEntityNameObject) {
567 "EntityName",
"name",
"object")
571 auto ExpectedEntityName = luEntityNameFromJSON(*OptEntityNameObject);
572 if (!ExpectedEntityName) {
579 EntityIdTableEntryObject,
580 [
this](uint64_t
V) {
return entityIdFromJSON(
V); });
582 return ExpectedId.takeError();
584 return std::make_pair(std::move(*ExpectedEntityName), std::move(*ExpectedId));
590 Entry[
"id"] = entityIdToJSON(EI);
591 Entry[
"name"] = luEntityNameToJSON(EN);
603 const Array &EntityIdTableArray,
607 llvm::function_ref<std::map<EntityName, EntityId> &(
EntityIdTable &)>
610 std::map<EntityName, EntityId> &Entities = GetEntities(IdTable);
612 for (
const auto &[Index, EntityIdTableEntryValue] :
613 llvm::enumerate(EntityIdTableArray)) {
614 const Object *OptEntityIdTableEntryObject =
615 EntityIdTableEntryValue.getAsObject();
616 if (!OptEntityIdTableEntryObject) {
619 "EntityIdTable entry", Index,
"object")
623 auto ExpectedEntityIdTableEntry = EntryReader(*OptEntityIdTableEntryObject);
624 if (!ExpectedEntityIdTableEntry) {
631 auto [EntityIt, EntityInserted] =
632 Entities.emplace(std::move(*ExpectedEntityIdTableEntry));
633 if (!EntityInserted) {
636 "EntityIdTable entry", Index,
646JSONFormat::tuEntityIdTableFromJSON(
const Array &EntityIdTableArray)
const {
649 [
this](
const Object &O) {
return tuEntityIdTableEntryFromJSON(O); },
651 return getEntities(T);
656 Array EntityIdTableArray;
657 const auto &Entities = getEntities(IdTable);
658 EntityIdTableArray.reserve(Entities.size());
660 for (
const auto &[EntityName, EntityId] : Entities) {
661 EntityIdTableArray.push_back(
662 tuEntityIdTableEntryToJSON(EntityName, EntityId));
665 return EntityIdTableArray;
668llvm::Expected<EntityIdTable>
669JSONFormat::luEntityIdTableFromJSON(
const Array &EntityIdTableArray)
const {
672 [
this](
const Object &O) {
return luEntityIdTableEntryFromJSON(O); },
673 [](EntityIdTable &T) -> std::map<EntityName, EntityId> & {
674 return getEntities(T);
679 Array EntityIdTableArray;
680 const auto &Entities = getEntities(IdTable);
681 EntityIdTableArray.reserve(Entities.size());
683 for (
const auto &[EntityName, EntityId] : Entities) {
684 EntityIdTableArray.push_back(
685 luEntityIdTableEntryToJSON(EntityName, EntityId));
688 return EntityIdTableArray;
695llvm::Expected<std::pair<EntityId, EntityLinkage>>
696JSONFormat::linkageTableEntryFromJSON(
697 const Object &LinkageTableEntryObject)
const {
698 const Value *EntityIdIntValue = LinkageTableEntryObject.get(
"id");
699 if (!EntityIdIntValue) {
703 "number (unsigned 64-bit integer)")
707 const std::optional<uint64_t> OptEntityIdInt =
708 EntityIdIntValue->getAsUINT64();
709 if (!OptEntityIdInt) {
713 "number (unsigned 64-bit integer)")
717 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
719 const Object *OptEntityLinkageObject =
720 LinkageTableEntryObject.getObject(
"linkage");
721 if (!OptEntityLinkageObject) {
724 "EntityLinkage",
"linkage",
"object")
728 auto ExpectedEntityLinkage = entityLinkageFromJSON(*OptEntityLinkageObject);
729 if (!ExpectedEntityLinkage) {
735 return std::make_pair(std::move(EI), std::move(*ExpectedEntityLinkage));
741 Entry[
"id"] = entityIdToJSON(EI);
742 Entry[
"linkage"] = entityLinkageToJSON(EL);
754llvm::Expected<std::map<EntityId, EntityLinkage>>
755JSONFormat::linkageTableFromJSON(
const Array &LinkageTableArray,
756 std::set<EntityId> ExpectedIds)
const {
757 std::map<EntityId, EntityLinkage> LinkageTable;
759 for (
const auto &[Index, LinkageTableEntryValue] :
760 llvm::enumerate(LinkageTableArray)) {
761 const Object *OptLinkageTableEntryObject =
762 LinkageTableEntryValue.getAsObject();
763 if (!OptLinkageTableEntryObject) {
766 "LinkageTable entry", Index,
"object")
770 auto ExpectedLinkageTableEntry =
771 linkageTableEntryFromJSON(*OptLinkageTableEntryObject);
772 if (!ExpectedLinkageTableEntry) {
778 const EntityId EI = ExpectedLinkageTableEntry->first;
780 auto [It, Inserted] =
781 LinkageTable.insert(std::move(*ExpectedLinkageTableEntry));
785 "LinkageTable entry", Index, It->first)
789 if (ExpectedIds.erase(EI) == 0) {
791 std::errc::invalid_argument,
798 if (!ExpectedIds.empty()) {
800 std::errc::invalid_argument,
802 *ExpectedIds.begin())
809Array JSONFormat::linkageTableToJSON(
810 const std::map<EntityId, EntityLinkage> &LinkageTable)
const {
812 Result.reserve(LinkageTable.size());
814 for (
const auto &[EI, EL] : LinkageTable) {
815 Result.push_back(linkageTableEntryToJSON(EI, EL));
825llvm::Expected<std::unique_ptr<EntitySummary>>
826JSONFormat::entitySummaryFromJSON(
const SummaryName &SN,
827 const Object &EntitySummaryObject,
829 auto InfoIt = FormatInfos.find(SN);
830 if (InfoIt == FormatInfos.end()) {
832 std::errc::invalid_argument,
837 const auto &InfoEntry = InfoIt->second;
838 assert(InfoEntry.ForSummary == SN);
840 return InfoEntry.Deserialize(EntitySummaryObject, IdTable,
841 entityIdFromJSONObject);
844llvm::Expected<Object>
845JSONFormat::entitySummaryToJSON(
const SummaryName &SN,
847 auto InfoIt = FormatInfos.find(SN);
848 if (InfoIt == FormatInfos.end()) {
850 std::errc::invalid_argument,
855 const auto &InfoEntry = InfoIt->second;
856 assert(InfoEntry.ForSummary == SN);
858 return InfoEntry.Serialize(ES, entityIdToJSONObject);
865llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummary>>>
866JSONFormat::entityDataMapEntryFromJSON(
const Object &EntityDataMapEntryObject,
870 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
871 if (!EntityIdIntValue) {
874 "EntityId",
"entity_id",
875 "number (unsigned 64-bit integer)")
879 const std::optional<uint64_t> OptEntityIdInt =
880 EntityIdIntValue->getAsUINT64();
881 if (!OptEntityIdInt) {
884 "EntityId",
"entity_id",
885 "number (unsigned 64-bit integer)")
889 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
891 const Object *OptEntitySummaryObject =
892 EntityDataMapEntryObject.getObject(
"entity_summary");
893 if (!OptEntitySummaryObject) {
896 "EntitySummary",
"entity_summary",
"object")
900 auto ExpectedEntitySummary =
901 entitySummaryFromJSON(SN, *OptEntitySummaryObject, IdTable);
902 if (!ExpectedEntitySummary) {
909 if (*ExpectedEntitySummary ==
nullptr) {
911 std::errc::invalid_argument,
916 auto ActualSN = (*ExpectedEntitySummary)->getSummaryName();
917 if (SN != ActualSN) {
919 std::errc::invalid_argument,
921 FailedToDeserializeEntitySummaryMismatchedSummaryName,
926 return std::make_pair(std::move(EI), std::move(*ExpectedEntitySummary));
929llvm::Expected<Object> JSONFormat::entityDataMapEntryToJSON(
934 Entry[
"entity_id"] = entityIdToJSON(EI);
936 if (!EntitySummary) {
941 const auto ActualSN = EntitySummary->getSummaryName();
942 if (SN != ActualSN) {
948 auto ExpectedEntitySummaryObject = entitySummaryToJSON(SN, *EntitySummary);
949 if (!ExpectedEntitySummaryObject) {
956 Entry[
"entity_summary"] = std::move(*ExpectedEntitySummaryObject);
965llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummary>>>
966JSONFormat::entityDataMapFromJSON(
const SummaryName &SN,
967 const Array &EntityDataArray,
969 std::map<EntityId, std::unique_ptr<EntitySummary>> EntityDataMap;
971 for (
const auto &[Index, EntityDataMapEntryValue] :
972 llvm::enumerate(EntityDataArray)) {
973 const Object *OptEntityDataMapEntryObject =
974 EntityDataMapEntryValue.getAsObject();
975 if (!OptEntityDataMapEntryObject) {
978 "EntitySummary entry", Index,
"object")
982 auto ExpectedEntityDataMapEntry =
983 entityDataMapEntryFromJSON(*OptEntityDataMapEntryObject, SN, IdTable);
984 if (!ExpectedEntityDataMapEntry) {
991 auto [DataIt, DataInserted] =
992 EntityDataMap.insert(std::move(*ExpectedEntityDataMapEntry));
996 "EntitySummary entry", Index, DataIt->first)
1001 return std::move(EntityDataMap);
1004llvm::Expected<Array> JSONFormat::entityDataMapToJSON(
1006 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &EntityDataMap)
1009 Result.reserve(EntityDataMap.size());
1011 for (
const auto &[Index, EntityDataMapEntry] :
1012 llvm::enumerate(EntityDataMap)) {
1013 const auto &[EntityId, EntitySummary] = EntityDataMapEntry;
1015 auto ExpectedEntityDataMapEntryObject =
1016 entityDataMapEntryToJSON(EntityId, EntitySummary, SN);
1018 if (!ExpectedEntityDataMapEntryObject) {
1024 Result.push_back(std::move(*ExpectedEntityDataMapEntryObject));
1035 std::pair<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
1036JSONFormat::summaryDataMapEntryFromJSON(
const Object &SummaryDataMapEntryObject,
1039 std::optional<llvm::StringRef> OptSummaryNameStr =
1040 SummaryDataMapEntryObject.getString(
"summary_name");
1041 if (!OptSummaryNameStr) {
1044 "SummaryName",
"summary_name",
"string")
1050 const Array *OptEntityDataArray =
1051 SummaryDataMapEntryObject.getArray(
"summary_data");
1052 if (!OptEntityDataArray) {
1055 "EntitySummary entries",
"summary_data",
1060 auto ExpectedEntityDataMap =
1061 entityDataMapFromJSON(SN, *OptEntityDataArray, IdTable);
1062 if (!ExpectedEntityDataMap) {
1069 return std::make_pair(std::move(SN), std::move(*ExpectedEntityDataMap));
1072llvm::Expected<Object> JSONFormat::summaryDataMapEntryToJSON(
1074 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &SD)
const {
1079 auto ExpectedSummaryDataArray = entityDataMapToJSON(SN, SD);
1080 if (!ExpectedSummaryDataArray) {
1087 Result[
"summary_data"] = std::move(*ExpectedSummaryDataArray);
1097 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
1098JSONFormat::summaryDataMapFromJSON(
const Array &SummaryDataArray,
1100 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>
1103 for (
const auto &[Index, SummaryDataMapEntryValue] :
1104 llvm::enumerate(SummaryDataArray)) {
1105 const Object *OptSummaryDataMapEntryObject =
1106 SummaryDataMapEntryValue.getAsObject();
1107 if (!OptSummaryDataMapEntryObject) {
1110 "SummaryData entry", Index,
"object")
1114 auto ExpectedSummaryDataMapEntry =
1115 summaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject, IdTable);
1116 if (!ExpectedSummaryDataMapEntry) {
1122 auto [SummaryIt, SummaryInserted] =
1123 SummaryDataMap.emplace(std::move(*ExpectedSummaryDataMapEntry));
1124 if (!SummaryInserted) {
1127 "SummaryData entry", Index, SummaryIt->first)
1132 return std::move(SummaryDataMap);
1135llvm::Expected<Array> JSONFormat::summaryDataMapToJSON(
1137 std::map<
EntityId, std::unique_ptr<EntitySummary>>>
1138 &SummaryDataMap)
const {
1140 Result.reserve(SummaryDataMap.size());
1142 for (
const auto &[Index, SummaryDataMapEntry] :
1143 llvm::enumerate(SummaryDataMap)) {
1144 const auto &[SummaryName, DataMap] = SummaryDataMapEntry;
1146 auto ExpectedSummaryDataMapObject =
1147 summaryDataMapEntryToJSON(SummaryName, DataMap);
1148 if (!ExpectedSummaryDataMapObject) {
1154 Result.push_back(std::move(*ExpectedSummaryDataMapObject));
1157 return std::move(
Result);
1164llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1165JSONFormat::encodingDataMapEntryFromJSON(
1166 const Object &EntityDataMapEntryObject)
const {
1167 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
1168 if (!EntityIdIntValue) {
1171 "EntityId",
"entity_id",
1172 "number (unsigned 64-bit integer)")
1176 const std::optional<uint64_t> OptEntityIdInt =
1177 EntityIdIntValue->getAsUINT64();
1178 if (!OptEntityIdInt) {
1181 "EntityId",
"entity_id",
1182 "number (unsigned 64-bit integer)")
1186 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
1188 const Object *OptEntitySummaryObject =
1189 EntityDataMapEntryObject.getObject(
"entity_summary");
1190 if (!OptEntitySummaryObject) {
1193 "EntitySummary",
"entity_summary",
"object")
1197 std::unique_ptr<EntitySummaryEncoding>
Encoding(
1200 return std::make_pair(std::move(EI), std::move(Encoding));
1203Object JSONFormat::encodingDataMapEntryToJSON(
1204 EntityId EI,
const std::unique_ptr<EntitySummaryEncoding> &Encoding)
const {
1206 Entry[
"entity_id"] = entityIdToJSON(EI);
1213 Entry[
"entity_summary"] = JSONEncoding->Data;
1222llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1223JSONFormat::encodingDataMapFromJSON(
const Array &EntityDataArray)
const {
1224 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>> EncodingDataMap;
1226 for (
const auto &[Index, EntityDataMapEntryValue] :
1227 llvm::enumerate(EntityDataArray)) {
1228 const Object *OptEntityDataMapEntryObject =
1229 EntityDataMapEntryValue.getAsObject();
1230 if (!OptEntityDataMapEntryObject) {
1233 "EntitySummary entry", Index,
"object")
1237 auto ExpectedEntry =
1238 encodingDataMapEntryFromJSON(*OptEntityDataMapEntryObject);
1239 if (!ExpectedEntry) {
1246 auto [DataIt, DataInserted] =
1247 EncodingDataMap.insert(std::move(*ExpectedEntry));
1248 if (!DataInserted) {
1251 "EntitySummary entry", Index, DataIt->first)
1256 return std::move(EncodingDataMap);
1259Array JSONFormat::encodingDataMapToJSON(
1260 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1261 &EncodingDataMap)
const {
1263 Result.reserve(EncodingDataMap.size());
1265 for (
const auto &[EI, Encoding] : EncodingDataMap) {
1266 Result.push_back(encodingDataMapEntryToJSON(EI, Encoding));
1276llvm::Expected<std::pair<
1277 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1278JSONFormat::encodingSummaryDataMapEntryFromJSON(
1279 const Object &SummaryDataMapEntryObject)
const {
1280 std::optional<llvm::StringRef> OptSummaryNameStr =
1281 SummaryDataMapEntryObject.getString(
"summary_name");
1282 if (!OptSummaryNameStr) {
1285 "SummaryName",
"summary_name",
"string")
1291 const Array *OptEntityDataArray =
1292 SummaryDataMapEntryObject.getArray(
"summary_data");
1293 if (!OptEntityDataArray) {
1296 "EntitySummary entries",
"summary_data",
1301 auto ExpectedEncodingDataMap = encodingDataMapFromJSON(*OptEntityDataArray);
1302 if (!ExpectedEncodingDataMap) {
1309 return std::make_pair(std::move(SN), std::move(*ExpectedEncodingDataMap));
1312Object JSONFormat::encodingSummaryDataMapEntryToJSON(
1314 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1315 &EncodingMap)
const {
1319 Result[
"summary_data"] = encodingDataMapToJSON(EncodingMap);
1328llvm::Expected<std::map<
1329 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1330JSONFormat::encodingSummaryDataMapFromJSON(
1331 const Array &SummaryDataArray)
const {
1332 std::map<SummaryName,
1333 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1334 EncodingSummaryDataMap;
1336 for (
const auto &[Index, SummaryDataMapEntryValue] :
1337 llvm::enumerate(SummaryDataArray)) {
1338 const Object *OptSummaryDataMapEntryObject =
1339 SummaryDataMapEntryValue.getAsObject();
1340 if (!OptSummaryDataMapEntryObject) {
1343 "SummaryData entry", Index,
"object")
1347 auto ExpectedEntry =
1348 encodingSummaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject);
1349 if (!ExpectedEntry) {
1355 auto [SummaryIt, SummaryInserted] =
1356 EncodingSummaryDataMap.emplace(std::move(*ExpectedEntry));
1357 if (!SummaryInserted) {
1360 "SummaryData entry", Index, SummaryIt->first)
1365 return std::move(EncodingSummaryDataMap);
1368Array JSONFormat::encodingSummaryDataMapToJSON(
1370 std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1371 &EncodingSummaryDataMap)
const {
1373 Result.reserve(EncodingSummaryDataMap.size());
1375 for (
const auto &[SN, EncodingMap] : EncodingSummaryDataMap) {
1376 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 * MismatchedSummaryType
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 * TargetTripleNotNormalized
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().
constexpr const char * JSONTypeKey
Root-object key naming the summary kind so files are self-describing.
llvm::Expected< llvm::StringRef > readSummaryType(const Object &RootObject)
Reads the JSONTypeKey field from the root object as a string.
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::Error validateNormalizedTargetTriple(llvm::StringRef Triple)
Validates that Triple is a target triple string in normalized form.
llvm::Expected< BuildNamespaceKind > buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr)
llvm::json::Object Object
llvm::Expected< Value > readJSON(llvm::StringRef Path)
llvm::Error checkSummaryType(const Object &RootObject, llvm::StringRef ExpectedType)
Reads the JSONTypeKey field from the root object and verifies it equals ExpectedType.
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.
llvm::Expected< QualType > ExpectedType