15#include "llvm/Support/Error.h"
16#include "llvm/Support/JSON.h"
17#include "llvm/Support/Registry.h"
38 static SummaryName summaryName() {
return SummaryName(
"TagsEntitySummary"); }
40 SummaryName getSummaryName()
const override {
41 return SummaryName(
"TagsEntitySummary");
44 std::vector<std::string> Tags;
47json::Object serializeTagsEntitySummary(
const EntitySummary &ES,
49 const auto &S =
static_cast<const TagsEntitySummary &
>(ES);
50 json::Array TagsArray;
51 TagsArray.reserve(S.Tags.size());
52 llvm::append_range(TagsArray, S.Tags);
53 return json::Object{{
"tags", std::move(TagsArray)}};
57deserializeTagsEntitySummary(
const json::Object &Obj,
EntityIdTable &,
59 const json::Array *TagsArray = Obj.getArray(
"tags");
61 return createStringError(inconvertibleErrorCode(),
62 "missing or invalid field 'tags'");
65 auto S = std::make_unique<TagsEntitySummary>();
66 for (
const auto &[Index, Val] : llvm::enumerate(*TagsArray)) {
67 auto Str = Val.getAsString();
69 return createStringError(inconvertibleErrorCode(),
70 "tags element at index %zu is not a string",
73 S->Tags.push_back(Str->str());
79 TagsEntitySummaryFormatInfo()
80 : JSONFormat::FormatInfo(SummaryName(
"TagsEntitySummary"),
81 serializeTagsEntitySummary,
82 deserializeTagsEntitySummary) {}
85llvm::Registry<JSONFormat::FormatInfo>::Add<TagsEntitySummaryFormatInfo>
86 RegisterTagsEntitySummaryForJSON(
"TagsEntitySummary",
87 "JSON format info for TagsEntitySummary");
98 json::Array TagsArray;
99 TagsArray.reserve(
R.Tags.size());
100 llvm::append_range(TagsArray,
R.Tags);
101 return json::Object{{
"tags", std::move(TagsArray)}};
105deserializeTagsAnalysisResult(
const json::Object &Obj,
107 const json::Array *TagsArray = Obj.getArray(
"tags");
109 return createStringError(inconvertibleErrorCode(),
110 "missing or invalid field 'tags'");
113 auto R = std::make_unique<TagsAnalysisResult>();
114 for (
const auto &[Index, Val] : llvm::enumerate(*TagsArray)) {
115 auto S = Val.getAsString();
117 return createStringError(inconvertibleErrorCode(),
118 "tags element at index %zu is not a string",
121 R->Tags.push_back(S->str());
126JSONFormat::AnalysisResultRegistry::Add<TagsAnalysisResult>
127 RegisterTagsResultForJSON(serializeTagsAnalysisResult,
128 deserializeTagsAnalysisResult);
137class TagsAnalysis final
140 using ResultType = TagsAnalysisResult;
142 llvm::Error add(EntityId,
const TagsEntitySummary &S)
override {
143 for (
const auto &Tag : S.Tags) {
144 result().Tags.push_back(Tag);
146 return llvm::Error::success();
150 auto &Tags = result().Tags;
151 std::sort(Tags.begin(), Tags.end());
152 Tags.erase(std::unique(Tags.begin(), Tags.end()), Tags.end());
153 return llvm::Error::success();
158 RegisterTagsAnalysis(
"Collects unique tags across entities");
Manages entity name interning and provides efficient EntityId handles.
Base class for analysis-specific summary data.
Typed intermediate that concrete summary analyses inherit from.
void finalize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
Diagnostic wrappers for TextAPI types for error reporting.
Registers AnalysisT with the unified registry.