12 #include "llvm/ADT/StringRef.h" 13 #include "llvm/Support/FileSystem.h" 14 #include "llvm/Support/Path.h" 26 case AccessSpecifier::AS_public:
28 case AccessSpecifier::AS_protected:
30 case AccessSpecifier::AS_private:
32 case AccessSpecifier::AS_none:
35 llvm_unreachable(
"Unknown AccessSpecifier");
40 case TagTypeKind::TTK_Class:
42 case TagTypeKind::TTK_Union:
44 case TagTypeKind::TTK_Interface:
46 case TagTypeKind::TTK_Struct:
48 case TagTypeKind::TTK_Enum:
51 llvm_unreachable(
"Unknown TagTypeKind");
56 std::string
genItalic(
const Twine &Text) {
return "*" + Text.str() +
"*"; }
58 std::string
genEmphasis(
const Twine &Text) {
return "**" + Text.str() +
"**"; }
60 std::string
genLink(
const Twine &Text,
const Twine &Link) {
61 return "[" + Text.str() +
"](" + Link.str() +
")";
66 llvm::raw_string_ostream Stream(Buffer);
68 for (
const auto &R : Refs) {
77 void writeLine(
const Twine &Text, raw_ostream &OS) { OS << Text <<
"\n\n"; }
81 void writeHeader(
const Twine &Text,
unsigned int Num, raw_ostream &OS) {
82 OS << std::string(Num,
'#') +
" " + Text <<
"\n\n";
92 if (I.
Kind ==
"FullComment") {
95 }
else if (I.
Kind ==
"ParagraphComment") {
99 }
else if (I.
Kind ==
"BlockCommandComment") {
101 for (
const auto &Child : I.
Children)
103 }
else if (I.
Kind ==
"InlineCommandComment") {
105 }
else if (I.
Kind ==
"ParamCommandComment") {
108 }
else if (I.
Kind ==
"TParamCommandComment") {
111 }
else if (I.
Kind ==
"VerbatimBlockComment") {
112 for (
const auto &Child : I.
Children)
114 }
else if (I.
Kind ==
"VerbatimBlockLineComment") {
117 }
else if (I.
Kind ==
"VerbatimLineComment") {
120 }
else if (I.
Kind ==
"HTMLStartTagComment") {
124 llvm::raw_string_ostream Attrs(Buffer);
125 for (
unsigned Idx = 0; Idx < I.
AttrKeys.size(); ++Idx)
130 }
else if (I.
Kind ==
"HTMLEndTagComment") {
132 }
else if (I.
Kind ==
"TextComment") {
135 OS <<
"Unknown comment kind: " << I.
Kind <<
".\n\n";
147 llvm::raw_string_ostream Members(Buffer);
149 for (
const auto &N : I.
Members)
150 Members <<
"| " << N <<
" |\n";
161 llvm::raw_string_ostream Stream(Buffer);
163 for (
const auto &N : I.
Params) {
166 Stream << N.Type.Name +
" " + N.Name;
173 "(" + Stream.str() +
")"),
238 if (!Parents.empty() || !VParents.empty()) {
240 writeLine(
"Inherits from " + VParents, OS);
241 else if (VParents.empty())
242 writeLine(
"Inherits from " + Parents, OS);
244 writeLine(
"Inherits from " + Parents +
", " + VParents, OS);
250 for (
const auto Member : I.
Members) {
251 std::string Access =
getAccess(Member.Access);
253 writeLine(Access +
" " + Member.Type.Name +
" " + Member.Name, OS);
255 writeLine(Member.Type.Name +
" " + Member.Name, OS);
285 llvm::Error generateDocForInfo(
Info *I, llvm::raw_ostream &OS)
override;
288 const char *MDGenerator::Format =
"md";
290 llvm::Error MDGenerator::generateDocForInfo(
Info *I, llvm::raw_ostream &OS) {
292 case InfoType::IT_namespace:
293 genMarkdown(*static_cast<clang::doc::NamespaceInfo *>(I), OS);
295 case InfoType::IT_record:
296 genMarkdown(*static_cast<clang::doc::RecordInfo *>(I), OS);
298 case InfoType::IT_enum:
299 genMarkdown(*static_cast<clang::doc::EnumInfo *>(I), OS);
301 case InfoType::IT_function:
302 genMarkdown(*static_cast<clang::doc::FunctionInfo *>(I), OS);
304 case InfoType::IT_default:
305 return llvm::make_error<llvm::StringError>(
"Unexpected info type.\n",
306 llvm::inconvertibleErrorCode());
308 return llvm::Error::success();
311 static GeneratorRegistry::Add<MDGenerator>
MD(MDGenerator::Format,
312 "Generator for MD output.");
void writeFileDefinition(const Location &L, raw_ostream &OS)
Some operations such as code completion produce a set of candidates.
void genMarkdown(const RecordInfo &I, llvm::raw_ostream &OS)
void writeHeader(const Twine &Text, unsigned int Num, raw_ostream &OS)
llvm::Optional< Location > DefLoc
void writeNewLine(raw_ostream &OS)
std::vector< FunctionInfo > ChildFunctions
std::vector< FunctionInfo > ChildFunctions
std::vector< EnumInfo > ChildEnums
std::vector< Reference > ChildRecords
llvm::SmallVector< Reference, 4 > VirtualParents
std::string getAccess(AccessSpecifier AS)
llvm::SmallVector< FieldTypeInfo, 4 > Params
llvm::SmallVector< SmallString< 16 >, 4 > Members
std::vector< CommentInfo > Description
std::string getTagType(TagTypeKind AS)
void writeLine(const Twine &Text, raw_ostream &OS)
llvm::SmallVector< Reference, 4 > Parents
static const char * Format
volatile int MDGeneratorAnchorSource
void writeDescription(const CommentInfo &I, raw_ostream &OS)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
static GeneratorRegistry::Add< MDGenerator > MD(MDGenerator::Format, "Generator for MD output.")
std::vector< Reference > ChildNamespaces
std::string genEmphasis(const Twine &Text)
std::vector< Reference > ChildRecords
Generator for Markdown documentation.
SmallString< 32 > Filename
std::string genLink(const Twine &Text, const Twine &Link)
std::vector< EnumInfo > ChildEnums
llvm::SmallVector< MemberTypeInfo, 4 > Members
std::string genReferenceList(const llvm::SmallVectorImpl< Reference > &Refs)
std::string genItalic(const Twine &Text)