23 #include "llvm/Support/Error.h"
24 #include "llvm/Support/Path.h"
34 llvm::Expected<std::unique_ptr<Info>>
35 reduce(std::vector<std::unique_ptr<Info>> &Values) {
37 return llvm::createStringError(llvm::inconvertibleErrorCode(),
38 "no value to reduce");
39 std::unique_ptr<Info> Merged = std::make_unique<T>(Values[0]->USR);
40 T *Tmp =
static_cast<T *
>(Merged.get());
41 for (
auto &I : Values)
42 Tmp->merge(std::move(*
static_cast<T *
>(I.get())));
43 return std::move(Merged);
49 int getChildIndexIfExists(std::vector<T> &Children, T &ChildToMerge) {
50 for (
unsigned long I = 0; I <
Children.size(); I++) {
51 if (ChildToMerge.USR == Children[I].USR)
57 void reduceChildren(std::vector<Reference> &Children,
58 std::vector<Reference> &&ChildrenToMerge) {
59 for (
auto &ChildToMerge : ChildrenToMerge) {
60 int mergeIdx = getChildIndexIfExists(Children, ChildToMerge);
62 Children.push_back(std::move(ChildToMerge));
65 Children[mergeIdx].merge(std::move(ChildToMerge));
69 void reduceChildren(std::vector<FunctionInfo> &Children,
70 std::vector<FunctionInfo> &&ChildrenToMerge) {
71 for (
auto &ChildToMerge : ChildrenToMerge) {
72 int mergeIdx = getChildIndexIfExists(Children, ChildToMerge);
74 Children.push_back(std::move(ChildToMerge));
77 Children[mergeIdx].merge(std::move(ChildToMerge));
81 void reduceChildren(std::vector<EnumInfo> &Children,
82 std::vector<EnumInfo> &&ChildrenToMerge) {
83 for (
auto &ChildToMerge : ChildrenToMerge) {
84 int mergeIdx = getChildIndexIfExists(Children, ChildToMerge);
86 Children.push_back(std::move(ChildToMerge));
89 Children[mergeIdx].merge(std::move(ChildToMerge));
96 llvm::Expected<std::unique_ptr<Info>>
99 return llvm::createStringError(llvm::inconvertibleErrorCode(),
100 "no info values to merge");
102 switch (Values[0]->IT) {
104 return reduce<NamespaceInfo>(Values);
106 return reduce<RecordInfo>(Values);
108 return reduce<EnumInfo>(Values);
110 return reduce<FunctionInfo>(Values);
112 return llvm::createStringError(llvm::inconvertibleErrorCode(),
113 "unexpected info type");
117 static llvm::SmallString<64>
119 const StringRef &
Name,
const StringRef &CurrentPath) {
120 llvm::SmallString<64> FilePath;
122 if (CurrentPath !=
Path) {
124 for (llvm::sys::path::const_iterator I =
125 llvm::sys::path::begin(CurrentPath);
126 I != llvm::sys::path::end(CurrentPath); ++I)
127 llvm::sys::path::append(FilePath,
"..");
128 llvm::sys::path::append(FilePath,
Path);
134 llvm::sys::path::append(FilePath,
Name);
136 return llvm::sys::path::relative_path(FilePath);
139 llvm::SmallString<64>
146 return llvm::SmallString<16>(
"index");
151 llvm::SmallString<64>
158 return llvm::SmallString<16>(
"index");
188 std::move(Other.Description.begin(), Other.Description.end(),
202 DefLoc = std::move(Other.DefLoc);
204 std::move(Other.Loc.begin(), Other.Loc.end(), std::back_inserter(
Loc));
206 auto Last = std::unique(
Loc.begin(),
Loc.end());
207 Loc.erase(Last,
Loc.end());
215 reduceChildren(
ChildRecords, std::move(Other.ChildRecords));
217 reduceChildren(
ChildEnums, std::move(Other.ChildEnums));
226 Members = std::move(Other.Members);
228 Bases = std::move(Other.Bases);
230 Parents = std::move(Other.Parents);
234 reduceChildren(
ChildRecords, std::move(Other.ChildRecords));
236 reduceChildren(
ChildEnums, std::move(Other.ChildEnums));
245 Members = std::move(Other.Members);
258 Parent = std::move(Other.Parent);
260 Params = std::move(Other.Params);
275 return llvm::SmallString<16>(
"@GlobalNamespace");
279 return llvm::SmallString<16>(
"GlobalNamespace");
281 return llvm::SmallString<16>(
"@nonymous_record_" +
282 toHex(llvm::toStringRef(
USR)));
284 return llvm::SmallString<16>(
"@nonymous_enum_" +
285 toHex(llvm::toStringRef(
USR)));
287 return llvm::SmallString<16>(
"@nonymous_function_" +
288 toHex(llvm::toStringRef(
USR)));
290 return llvm::SmallString<16>(
"@nonymous_" + toHex(llvm::toStringRef(
USR)));
292 llvm_unreachable(
"Invalid InfoType.");
293 return llvm::SmallString<16>(
"");
299 for (
unsigned I = 0; I <
Name.size() && I < Other.
Name.size(); ++I) {
301 int D = tolower(
Name[I]) - tolower(Other.
Name[I]);
310 if (
Name.size() == Other.
Name.size())
313 return Name.size() < Other.
Name.size();
327 std::vector<std::string> JsScripts)
330 JsScripts(JsScripts) {
331 llvm::SmallString<128> SourceRootDir(
SourceRoot);
334 llvm::sys::fs::current_path(SourceRootDir);
335 this->SourceRoot = std::string(SourceRootDir.str());
340 this->RepositoryUrl->insert(0,
"https://");