12#include "llvm/ADT/StringRef.h"
13#include "llvm/Support/Error.h"
14#include "llvm/Support/JSON.h"
15#include "llvm/Support/Registry.h"
24using Object = llvm::json::Object;
25using Array = llvm::json::Array;
28constexpr llvm::StringLiteral KeyParamEntities =
"param_entities";
29constexpr llvm::StringLiteral KeyReturnEntity =
"return_entity";
30constexpr llvm::StringLiteral KeyOverriddenMethods =
"overridden_methods";
32constexpr llvm::StringLiteral KeyRetAndParamFamilyIds =
"families";
33constexpr llvm::StringLiteral KeyParamId =
"pid";
34constexpr llvm::StringLiteral KeyFamilyId =
"fid";
40 Result.reserve(Ids.size());
42 Result.push_back(IdToJSON(Id));
49 std::vector<EntityId>
Result;
50 Result.reserve(Arr.size());
51 for (
const auto &
V : Arr) {
52 const Object *Obj =
V.getAsObject();
55 auto Id = IdFromJSON(*Obj);
57 return Id.takeError();
73 if (S.ReturnEntity.has_value())
74 Out[KeyReturnEntity] = IdToJSON(*S.ReturnEntity);
75 Out[KeyOverriddenMethods] =
83 auto Result = std::make_unique<VirtualMethodSummary>();
85 const Array *ParamArr = Obj.getArray(KeyParamEntities);
88 KeyParamEntities.data());
91 return Params.takeError();
92 Result->ParamEntities = std::move(*Params);
94 if (
const Object *RE = Obj.getObject(KeyReturnEntity)) {
95 auto Id = IdFromJSON(*RE);
97 return Id.takeError();
98 Result->ReturnEntity = *Id;
102 if (
const Array *OMArr = Obj.getArray(KeyOverriddenMethods)) {
105 return OM.takeError();
106 Result->OverriddenMethods = std::move(*OM);
120 for (
const auto &[ParamId, FamilyId] : R.RetAndParamData) {
122 Item[KeyParamId] = IdToJSON(ParamId);
123 Item[KeyFamilyId] = IdToJSON(FamilyId);
124 FamilyDataArr.push_back(std::move(Item));
128 Out[KeyRetAndParamFamilyIds] = std::move(FamilyDataArr);
135 const Array *FamilyDataArr = Obj.getArray(KeyRetAndParamFamilyIds);
138 KeyRetAndParamFamilyIds.data());
140 auto Result = std::make_unique<VirtualMethodFamilyAnalysisResult>();
142 for (
const auto &
V : *FamilyDataArr) {
143 const Object *Item =
V.getAsObject();
146 const Object *ParamObj = Item->getObject(KeyParamId);
147 const Object *FamilyObj = Item->getObject(KeyFamilyId);
148 if (!ParamObj || !FamilyObj)
150 "an object with fields {'%s', '%s'}",
151 KeyParamId.data(), KeyFamilyId.data());
152 auto ParamId = IdFromJSON(*ParamObj);
154 return ParamId.takeError();
155 auto FamilyId = IdFromJSON(*FamilyObj);
157 return FamilyId.takeError();
158 Result->RetAndParamData.insert({*ParamId, *FamilyId});
166 VirtualMethodSummaryJSONFormatInfo()
167 : JSONFormat::FormatInfo(VirtualMethodSummary::summaryName(),
173static llvm::Registry<JSONFormat::FormatInfo>::Add<
174 VirtualMethodSummaryJSONFormatInfo>
176 "JSON Format info for VirtualMethodSummary");
178static JSONFormat::AnalysisResultRegistry::Add<
Result
Implement __builtin_bit_cast and related operations.
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.
volatile int VirtualMethodFamilyJSONFormatAnchorSource
llvm::Error makeSawButExpectedError(const JSONTy &Saw, llvm::StringRef Expected, const Ts &...ExpectedArgs)
Top level wrappers for InstallAPI frontend operations.
static constexpr llvm::StringLiteral Name