23#include "llvm/ADT/StringMap.h"
24#include "llvm/Support/Error.h"
25#include "llvm/Support/Path.h"
40 static const llvm::StringMap<CommentKind> KindMap = {
55 auto It = KindMap.find(KindStr);
56 if (It != KindMap.end()) {
67 return "ParagraphComment";
71 return "InlineCommandComment";
73 return "HTMLStartTagComment";
75 return "HTMLEndTagComment";
77 return "BlockCommandComment";
79 return "ParamCommandComment";
81 return "TParamCommandComment";
83 return "VerbatimBlockComment";
85 return "VerbatimBlockLineComment";
87 return "VerbatimLineComment";
91 llvm_unreachable(
"Unhandled CommentKind");
98 if (Values.empty() || !Values[0])
99 return llvm::createStringError(llvm::inconvertibleErrorCode(),
100 "no value to reduce");
102 T *Tmp =
static_cast<T *
>(
getPtr(Merged));
103 for (
auto &I : Values)
104 Tmp->merge(std::move(*
static_cast<T *
>(
getPtr(I))));
105 return std::move(Merged);
112 for (
unsigned long I = 0; I < Children.size(); I++) {
113 if (ChildToMerge.USR == Children[I].USR)
121 llvm::simple_ilist<T> &&ChildrenToMerge) {
122 while (!ChildrenToMerge.empty()) {
123 T *ChildToMerge = &ChildrenToMerge.front();
124 ChildrenToMerge.pop_front();
126 auto It = llvm::find_if(
127 Children, [&](
const T &C) {
return C.USR == ChildToMerge->USR; });
128 if (It == Children.end()) {
129 Children.push_back(*ChildToMerge);
131 It->merge(std::move(*ChildToMerge));
139 for (
auto &ChildToMerge : ChildrenToMerge) {
141 if (MergeIdx == -1) {
142 Children.push_back(std::move(ChildToMerge));
145 Children[MergeIdx].merge(std::move(ChildToMerge));
151 if (Values.empty() || !Values[0])
152 return llvm::createStringError(llvm::inconvertibleErrorCode(),
153 "no info values to merge");
155 switch (Values[0]->IT) {
173 return llvm::createStringError(llvm::inconvertibleErrorCode(),
174 "unexpected info type");
176 llvm_unreachable(
"unhandled enumerator");
191 llvm::deref<std::equal_to<>>{});
202 if (FirstCI < SecondCI)
205 if (FirstCI == SecondCI) {
206 return std::lexicographical_compare(
208 Other.
Children.end(), llvm::deref<std::less<>>());
214static llvm::SmallString<64>
216 const StringRef &Name,
const StringRef &CurrentPath) {
217 llvm::SmallString<64> FilePath;
219 if (CurrentPath != Path) {
221 for (llvm::sys::path::const_iterator I =
222 llvm::sys::path::begin(CurrentPath);
223 I != llvm::sys::path::end(CurrentPath); ++I)
224 llvm::sys::path::append(FilePath,
"..");
225 llvm::sys::path::append(FilePath, Path);
231 llvm::sys::path::append(FilePath, Name);
233 return llvm::sys::path::relative_path(FilePath);
280 Ref.merge(std::move(Other.Ref));
281 SymbolInfo::merge(std::move(Other));
295 std::move(Other.Description.begin(), Other.Description.end(),
313 DefLoc = std::move(Other.DefLoc);
315 std::move(Other.Loc.begin(), Other.Loc.end(), std::back_inserter(
Loc));
317 auto *Last = llvm::unique(
Loc);
318 Loc.erase(Last,
Loc.end());
345 if (!llvm::to_underlying(
TagType))
349 Members = std::move(Other.Members);
351 Bases = std::move(Other.Bases);
353 Parents = std::move(Other.Parents);
357 Friends = std::move(Other.Friends);
363 SymbolInfo::merge(std::move(Other));
373 Members = std::move(Other.Members);
374 SymbolInfo::merge(std::move(Other));
386 Parent = std::move(Other.Parent);
388 Params = std::move(Other.Params);
389 SymbolInfo::merge(std::move(Other));
402 SymbolInfo::merge(std::move(Other));
412 Template.Constraints = std::move(Other.Template.Constraints);
414 Template.Params = std::move(Other.Template.Params);
415 SymbolInfo::merge(std::move(Other));
423 Type = std::move(Other.Type);
424 SymbolInfo::merge(std::move(Other));
446 return "@GlobalNamespace";
450 return "GlobalNamespace";
452 return internString(
"@nonymous_record_" + toHex(llvm::toStringRef(
USR)));
454 return internString(
"@nonymous_enum_" + toHex(llvm::toStringRef(
USR)));
456 return internString(
"@nonymous_typedef_" + toHex(llvm::toStringRef(
USR)));
458 return internString(
"@nonymous_function_" + toHex(llvm::toStringRef(
USR)));
460 return internString(
"@nonymous_concept_" + toHex(llvm::toStringRef(
USR)));
462 return internString(
"@nonymous_variable_" + toHex(llvm::toStringRef(
USR)));
464 return internString(
"@nonymous_friend_" + toHex(llvm::toStringRef(
USR)));
468 llvm_unreachable(
"Invalid InfoType.");
477 int Cmp =
Name.compare_insensitive(Other.
Name);
488 SortedChildren.reserve(
Children.size());
490 SortedChildren.push_back(&C);
491 llvm::sort(SortedChildren,
492 [](
const Index *A,
const Index *B) {
return *A < *B; });
493 return SortedChildren;
507 clang::DiagnosticsEngine &
Diags,
513 llvm::SmallString<128> SourceRootDir(
SourceRoot);
516 llvm::sys::fs::current_path(SourceRootDir);
517 this->SourceRoot = std::string(SourceRootDir);
522 this->RepositoryUrl->insert(0,
"https://");
@ CK_InlineCommandComment
@ CK_VerbatimBlockLineComment
@ CK_VerbatimBlockComment
@ CK_TParamCommandComment
llvm::Expected< OwnedPtr< Info > > mergeInfos(OwningPtrArray< Info > &Values)
static llvm::SmallString< 64 > calculateRelativeFilePath(const InfoType &Type, const StringRef &Path, const StringRef &Name, const StringRef &CurrentPath)
std::unique_ptr< T > OwnedPtr
thread_local llvm::BumpPtrAllocator PersistentArena
static void reduceChildren(llvm::simple_ilist< T > &Children, llvm::simple_ilist< T > &&ChildrenToMerge)
T * getPtr(const OwnedPtr< T > &O)
static int getChildIndexIfExists(OwningVec< T > &Children, T &ChildToMerge)
ConcurrentStringPool & getGlobalStringPool()
CommentKind stringToCommentKind(llvm::StringRef KindStr)
std::vector< OwnedPtr< T > > OwningPtrArray
thread_local llvm::BumpPtrAllocator TransientArena
StringRef internString(const Twine &T)
static llvm::Expected< OwnedPtr< Info > > reduce(OwningPtrArray< Info > &Values)
std::vector< T > OwningVec
OwnedPtr< T > allocatePtr(Args &&...args)
std::array< uint8_t, 20 > SymbolID
llvm::StringRef commentKindToString(CommentKind Kind)
static const SymbolID EmptySID
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
std::optional< std::string > RepositoryUrl
std::vector< std::string > UserStylesheets
ClangDocContext(tooling::ExecutionContext *ECtx, StringRef ProjectName, bool PublicOnly, StringRef OutDirectory, StringRef SourceRoot, StringRef RepositoryUrl, StringRef RepositoryCodeLinePrefix, StringRef Base, std::vector< std::string > UserStylesheets, clang::DiagnosticsEngine &Diags, OutputFormatTy Format, bool FTimeTrace=false)
tooling::ExecutionContext * ECtx
clang::DiagnosticsEngine & Diags
std::optional< std::string > RepositoryLinePrefix
void merge(ConceptInfo &&I)
StringRef ConstraintExpression
llvm::SmallVector< EnumValueInfo, 4 > Members
void merge(FriendInfo &&Other)
bool mergeable(const FriendInfo &Other)
FunctionInfo(SymbolID USR=SymbolID())
llvm::SmallVector< FieldTypeInfo, 4 > Params
void merge(FunctionInfo &&I)
std::optional< TemplateInfo > Template
OwningVec< const Index * > getSortedChildren() const
bool operator<(const Index &Other) const
llvm::StringMap< Index > Children
StringRef getRelativeFilePath(const StringRef &CurrentPath) const
Returns the file path for this Info relative to CurrentPath.
Info(InfoType IT=InfoType::IT_default, SymbolID USR=SymbolID(), StringRef Name=StringRef(), StringRef Path=StringRef())
bool mergeable(const Info &Other)
OwningVec< CommentInfo > Description
StringRef extractName() const
StringRef DocumentationFileName
StringRef getFileBaseName() const
Returns the basename that should be used for this Info.
llvm::SmallVector< Reference, 4 > Namespace
NamespaceInfo(SymbolID USR=SymbolID(), StringRef Name=StringRef(), StringRef Path=StringRef())
void merge(NamespaceInfo &&I)
OwningVec< BaseRecordInfo > Bases
llvm::SmallVector< MemberTypeInfo, 4 > Members
RecordInfo(SymbolID USR=SymbolID(), StringRef Name=StringRef(), StringRef Path=StringRef())
std::optional< TemplateInfo > Template
llvm::SmallVector< Reference, 4 > VirtualParents
llvm::SmallVector< Reference, 4 > Parents
void merge(RecordInfo &&I)
OwningVec< FriendInfo > Friends
void merge(Reference &&I)
StringRef DocumentationFileName
Reference(SymbolID USR=SymbolID(), StringRef Name=StringRef(), InfoType IT=InfoType::IT_default)
bool mergeable(const Reference &Other)
StringRef getFileBaseName() const
Returns the basename that should be used for this Reference.
StringRef getRelativeFilePath(const StringRef &CurrentPath) const
Returns the path for this Reference relative to CurrentPath.
OwningVec< FunctionInfo > Functions
OwningVec< TypedefInfo > Typedefs
OwningVec< EnumInfo > Enums
OwningVec< Reference > Records
OwningVec< ConceptInfo > Concepts
OwningVec< VarInfo > Variables
llvm::simple_ilist< Reference > Namespaces
SymbolInfo(InfoType IT, SymbolID USR=SymbolID(), StringRef Name=StringRef(), StringRef Path=StringRef())
llvm::SmallVector< Location, 2 > Loc
std::optional< Location > DefLoc
void merge(TypedefInfo &&I)
std::optional< TemplateInfo > Template
TypedefInfo(SymbolID USR=SymbolID())