27 patch(
const std::map<EntityId, EntityId> &EntityResolutionTable)
override {
32 explicit JSONEntitySummaryEncoding(llvm::json::Value Data)
33 : Data(std::move(Data)) {}
35 llvm::json::Value Data;
44llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
45JSONFormat::encodingDataMapEntryFromJSON(
46 const Object &EntityDataMapEntryObject)
const {
47 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
48 if (!EntityIdIntValue) {
51 "EntityId",
"entity_id",
52 "number (unsigned 64-bit integer)")
56 const std::optional<uint64_t> OptEntityIdInt =
57 EntityIdIntValue->getAsUINT64();
58 if (!OptEntityIdInt) {
61 "EntityId",
"entity_id",
62 "number (unsigned 64-bit integer)")
66 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
68 const Object *OptEntitySummaryObject =
69 EntityDataMapEntryObject.getObject(
"entity_summary");
70 if (!OptEntitySummaryObject) {
73 "EntitySummary",
"entity_summary",
"object")
77 std::unique_ptr<EntitySummaryEncoding>
Encoding(
78 new JSONEntitySummaryEncoding(
Value(
Object(*OptEntitySummaryObject))));
80 return std::make_pair(std::move(EI), std::move(Encoding));
83Object JSONFormat::encodingDataMapEntryToJSON(
84 EntityId EI,
const std::unique_ptr<EntitySummaryEncoding> &Encoding)
const {
86 Entry[
"entity_id"] = entityIdToJSON(EI);
91 auto *JSONEncoding =
static_cast<JSONEntitySummaryEncoding *
>(
Encoding.get());
92 Entry[
"entity_summary"] = JSONEncoding->Data;
101llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
102JSONFormat::encodingDataMapFromJSON(
const Array &EntityDataArray)
const {
103 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>> EncodingDataMap;
105 for (
const auto &[Index, EntityDataMapEntryValue] :
106 llvm::enumerate(EntityDataArray)) {
108 const Object *OptEntityDataMapEntryObject =
109 EntityDataMapEntryValue.getAsObject();
110 if (!OptEntityDataMapEntryObject) {
113 "EntitySummary entry", Index,
"object")
118 encodingDataMapEntryFromJSON(*OptEntityDataMapEntryObject);
119 if (!ExpectedEntry) {
126 auto [DataIt, DataInserted] =
127 EncodingDataMap.insert(std::move(*ExpectedEntry));
131 "EntitySummary entry", Index, DataIt->first)
136 return std::move(EncodingDataMap);
139Array JSONFormat::encodingDataMapToJSON(
140 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
141 &EncodingDataMap)
const {
143 Result.reserve(EncodingDataMap.size());
145 for (
const auto &[EI, Encoding] : EncodingDataMap) {
146 Result.push_back(encodingDataMapEntryToJSON(EI, Encoding));
156llvm::Expected<std::pair<
157 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
158JSONFormat::encodingSummaryDataMapEntryFromJSON(
159 const Object &SummaryDataMapEntryObject)
const {
160 std::optional<llvm::StringRef> OptSummaryNameStr =
161 SummaryDataMapEntryObject.getString(
"summary_name");
162 if (!OptSummaryNameStr) {
165 "SummaryName",
"summary_name",
"string")
171 const Array *OptEntityDataArray =
172 SummaryDataMapEntryObject.getArray(
"summary_data");
173 if (!OptEntityDataArray) {
176 "EntitySummary entries",
"summary_data",
181 auto ExpectedEncodingDataMap = encodingDataMapFromJSON(*OptEntityDataArray);
182 if (!ExpectedEncodingDataMap)
188 return std::make_pair(std::move(SN), std::move(*ExpectedEncodingDataMap));
191Object JSONFormat::encodingSummaryDataMapEntryToJSON(
193 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
194 &EncodingMap)
const {
198 Result[
"summary_data"] = encodingDataMapToJSON(EncodingMap);
207llvm::Expected<std::map<
208 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
209JSONFormat::encodingSummaryDataMapFromJSON(
210 const Array &SummaryDataArray)
const {
211 std::map<SummaryName,
212 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
213 EncodingSummaryDataMap;
215 for (
const auto &[Index, SummaryDataMapEntryValue] :
216 llvm::enumerate(SummaryDataArray)) {
218 const Object *OptSummaryDataMapEntryObject =
219 SummaryDataMapEntryValue.getAsObject();
220 if (!OptSummaryDataMapEntryObject) {
223 "SummaryData entry", Index,
"object")
228 encodingSummaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject);
229 if (!ExpectedEntry) {
235 auto [SummaryIt, SummaryInserted] =
236 EncodingSummaryDataMap.emplace(std::move(*ExpectedEntry));
237 if (!SummaryInserted) {
240 "SummaryData entry", Index, SummaryIt->first)
245 return std::move(EncodingSummaryDataMap);
248Array JSONFormat::encodingSummaryDataMapToJSON(
250 std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>>
251 &EncodingSummaryDataMap)
const {
253 Result.reserve(EncodingSummaryDataMap.size());
255 for (
const auto &[SN, EncodingMap] : EncodingSummaryDataMap) {
256 Result.push_back(encodingSummaryDataMapEntryToJSON(SN, EncodingMap));
266llvm::Expected<TUSummaryEncoding>
275 Object *RootObjectPtr = ExpectedJSON->getAsObject();
276 if (!RootObjectPtr) {
284 const Object &RootObject = *RootObjectPtr;
286 const Object *TUNamespaceObject = RootObject.getObject(
"tu_namespace");
287 if (!TUNamespaceObject) {
290 "BuildNamespace",
"tu_namespace",
"object")
295 auto ExpectedTUNamespace = buildNamespaceFromJSON(*TUNamespaceObject);
296 if (!ExpectedTUNamespace) {
307 const Array *IdTableArray = RootObject.getArray(
"id_table");
311 "IdTable",
"id_table",
"array")
316 auto ExpectedIdTable = entityIdTableFromJSON(*IdTableArray);
317 if (!ExpectedIdTable) {
324 getIdTable(Encoding) = std::move(*ExpectedIdTable);
328 const Array *LinkageTableArray = RootObject.getArray(
"linkage_table");
329 if (!LinkageTableArray) {
332 "LinkageTable",
"linkage_table",
"array")
337 auto ExpectedIdRange =
338 llvm::make_second_range(getEntities(getIdTable(Encoding)));
339 std::set<EntityId> ExpectedIds(ExpectedIdRange.begin(),
340 ExpectedIdRange.end());
344 auto ExpectedLinkageTable =
345 linkageTableFromJSON(*LinkageTableArray, std::move(ExpectedIds));
346 if (!ExpectedLinkageTable) {
354 getLinkageTable(Encoding) = std::move(*ExpectedLinkageTable);
358 const Array *SummaryDataArray = RootObject.getArray(
"data");
359 if (!SummaryDataArray) {
362 "SummaryData entries",
"data",
"array")
367 auto ExpectedEncodingSummaryDataMap =
368 encodingSummaryDataMapFromJSON(*SummaryDataArray);
369 if (!ExpectedEncodingSummaryDataMap) {
377 getData(Encoding) = std::move(*ExpectedEncodingSummaryDataMap);
380 return std::move(Encoding);
385 llvm::StringRef Path) {
388 RootObject[
"tu_namespace"] =
389 buildNamespaceToJSON(getTUNamespace(SummaryEncoding));
391 RootObject[
"id_table"] = entityIdTableToJSON(getIdTable(SummaryEncoding));
393 RootObject[
"linkage_table"] =
394 linkageTableToJSON(getLinkageTable(SummaryEncoding));
396 RootObject[
"data"] = encodingSummaryDataMapToJSON(getData(SummaryEncoding));
404 return llvm::Error::success();
Lightweight opaque handle representing an entity in an EntityIdTable.
Represents EntitySummary data in its serialized, format-specific encoding.
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.
Represents a translation unit summary in its serialized encoding.
constexpr const char * ReadingFromFile
constexpr const char * ReadingFromField
constexpr const char * FailedToReadObjectAtIndex
constexpr const char * FailedToReadObjectAtField
constexpr const char * WritingToFile
constexpr const char * ReadingFromIndex
constexpr const char * FailedInsertionOnDuplication
constexpr const char * FailedToReadObject
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.