13#include "llvm/Support/YAMLTraits.h"
14#include "llvm/Support/raw_ostream.h"
23LLVM_YAML_IS_SEQUENCE_VECTOR(
Location)
26LLVM_YAML_IS_SEQUENCE_VECTOR(
EnumInfo)
31LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<CommentInfo>)
32LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::SmallString<16>)
39template <>
struct ScalarEnumerationTraits<
clang::AccessSpecifier> {
40 static void enumeration(IO &IO, clang::AccessSpecifier &Value) {
41 IO.enumCase(Value,
"Public", clang::AccessSpecifier::AS_public);
42 IO.enumCase(Value,
"Protected", clang::AccessSpecifier::AS_protected);
43 IO.enumCase(Value,
"Private", clang::AccessSpecifier::AS_private);
44 IO.enumCase(Value,
"None", clang::AccessSpecifier::AS_none);
48template <>
struct ScalarEnumerationTraits<
clang::TagTypeKind> {
50 IO.enumCase(Value,
"Struct", clang::TagTypeKind::Struct);
51 IO.enumCase(Value,
"Interface", clang::TagTypeKind::Interface);
52 IO.enumCase(Value,
"Union", clang::TagTypeKind::Union);
53 IO.enumCase(Value,
"Class", clang::TagTypeKind::Class);
54 IO.enumCase(Value,
"Enum", clang::TagTypeKind::Enum);
58template <>
struct ScalarEnumerationTraits<
InfoType> {
71 IO.enumCase(Value,
"ParagraphComment",
74 IO.enumCase(Value,
"InlineCommandComment",
76 IO.enumCase(Value,
"HTMLStartTagComment",
78 IO.enumCase(Value,
"HTMLEndTagComment",
80 IO.enumCase(Value,
"BlockCommandComment",
82 IO.enumCase(Value,
"ParamCommandComment",
84 IO.enumCase(Value,
"TParamCommandComment",
86 IO.enumCase(Value,
"VerbatimBlockComment",
88 IO.enumCase(Value,
"VerbatimBlockLineComment",
90 IO.enumCase(Value,
"VerbatimLineComment",
97template <
unsigned U>
struct ScalarTraits<SmallString<U>> {
99 static void output(
const SmallString<U> &S,
void *, llvm::raw_ostream &OS) {
100 for (
const auto &C : S)
104 static StringRef
input(StringRef Scalar,
void *, SmallString<U> &Value) {
105 Value.assign(Scalar.begin(), Scalar.end());
109 static QuotingType
mustQuote(StringRef) {
return QuotingType::Single; }
112template <>
struct ScalarTraits<std::array<unsigned char, 20>> {
114 static void output(
const std::array<unsigned char, 20> &S,
void *,
115 llvm::raw_ostream &OS) {
116 OS << toHex(toStringRef(S));
119 static StringRef
input(StringRef Scalar,
void *,
120 std::array<unsigned char, 20> &Value) {
121 if (Scalar.size() != 40)
122 return "Error: Incorrect scalar size for USR.";
129 std::string HexString = fromHex(Value);
130 std::copy(HexString.begin(), HexString.end(), USR.begin());
134 static QuotingType
mustQuote(StringRef) {
return QuotingType::Single; }
145 IO.mapOptional(
"Name", I.
Name, SmallString<16>());
146 IO.mapOptional(
"DefaultValue", I.
DefaultValue, SmallString<16>());
150 IO.mapRequired(
"USR", I.
USR);
151 IO.mapOptional(
"Name", I.
Name, SmallString<16>());
152 IO.mapOptional(
"Path", I.
Path, SmallString<128>());
153 IO.mapOptional(
"Namespace", I.
Namespace, llvm::SmallVector<Reference, 4>());
159 IO.mapOptional(
"DefLocation", I.
DefLoc, std::optional<Location>());
160 IO.mapOptional(
"Location", I.
Loc, llvm::SmallVector<Location, 2>());
165 IO.mapOptional(
"TagType", I.
TagType);
166 IO.mapOptional(
"IsTypeDef", I.
IsTypeDef,
false);
167 IO.mapOptional(
"Members", I.
Members);
168 IO.mapOptional(
"Bases", I.
Bases);
169 IO.mapOptional(
"Parents", I.
Parents, llvm::SmallVector<Reference, 4>());
171 llvm::SmallVector<Reference, 4>());
172 IO.mapOptional(
"ChildRecords", I.
Children.
Records, std::vector<Reference>());
176 IO.mapOptional(
"Template", I.
Template);
181 IO.mapOptional(
"Text", I.
Text, SmallString<64>());
182 IO.mapOptional(
"Name", I.
Name, SmallString<16>());
183 IO.mapOptional(
"Direction", I.
Direction, SmallString<8>());
184 IO.mapOptional(
"ParamName", I.
ParamName, SmallString<16>());
185 IO.mapOptional(
"CloseName", I.
CloseName, SmallString<16>());
186 IO.mapOptional(
"SelfClosing", I.
SelfClosing,
false);
187 IO.mapOptional(
"Explicit", I.
Explicit,
false);
188 IO.mapOptional(
"Args", I.
Args, llvm::SmallVector<SmallString<16>, 4>());
189 IO.mapOptional(
"AttrKeys", I.
AttrKeys,
190 llvm::SmallVector<SmallString<16>, 4>());
192 llvm::SmallVector<SmallString<16>, 4>());
193 IO.mapOptional(
"Children", I.
Children);
201 IO.mapOptional(
"Filename", Loc.
Filename, SmallString<32>());
208 IO.mapOptional(
"Name",
Ref.Name, SmallString<16>());
209 IO.mapOptional(
"QualName",
Ref.QualName, SmallString<16>());
211 IO.mapOptional(
"Path",
Ref.Path, SmallString<128>());
222 IO.mapOptional(
"Name", I.
Name, SmallString<16>());
223 IO.mapOptional(
"DefaultValue", I.
DefaultValue, SmallString<16>());
233 IO.mapOptional(
"Access", I.
Access, clang::AccessSpecifier::AS_none);
242 std::vector<Reference>());
244 std::vector<Reference>());
258 IO.mapOptional(
"IsVirtual", I.
IsVirtual,
false);
262 IO.mapOptional(
"Access", I.
Access, clang::AccessSpecifier::AS_none);
263 IO.mapOptional(
"IsParent", I.
IsParent,
false);
269 IO.mapOptional(
"Name", I.
Name);
270 IO.mapOptional(
"Value", I.
Value);
271 IO.mapOptional(
"Expr", I.
ValueExpr, SmallString<16>());
278 IO.mapOptional(
"Scoped", I.
Scoped,
false);
279 IO.mapOptional(
"BaseType", I.
BaseType);
280 IO.mapOptional(
"Members", I.
Members);
288 IO.mapOptional(
"IsUsing", I.
IsUsing,
false);
295 IO.mapOptional(
"IsMethod", I.
IsMethod,
false);
297 IO.mapOptional(
"Params", I.
Params);
302 IO.mapOptional(
"Access", I.
Access, clang::AccessSpecifier::AS_none);
303 IO.mapOptional(
"Template", I.
Template);
309 IO.mapOptional(
"Contents", I.
Contents);
316 IO.mapOptional(
"Params", I.
Params);
322 IO.mapOptional(
"Params", I.
Params);
324 std::optional<TemplateSpecializationInfo>());
332template <>
struct MappingTraits<std::unique_ptr<CommentInfo>> {
333 static void mapping(IO &IO, std::unique_ptr<CommentInfo> &I) {
351 llvm::StringMap<std::unique_ptr<doc::Info>> Infos,
361 llvm::StringMap<std::unique_ptr<doc::Info>> Infos,
363 for (
const auto &Group : Infos) {
369 llvm::SmallString<128> Path;
370 llvm::sys::path::native(RootDir, Path);
372 llvm::sys::path::append(Path,
"index.yaml");
374 llvm::sys::path::append(Path, Group.getKey() +
".yaml");
377 std::error_code FileErr;
378 llvm::raw_fd_ostream InfoOS(Path, FileErr, llvm::sys::fs::OF_Text);
380 return llvm::createStringError(FileErr,
"Error opening file '%s'",
389 return llvm::Error::success();
394 llvm::yaml::Output InfoYAML(OS);
397 InfoYAML << *static_cast<clang::doc::NamespaceInfo *>(I);
400 InfoYAML << *static_cast<clang::doc::RecordInfo *>(I);
403 InfoYAML << *static_cast<clang::doc::EnumInfo *>(I);
406 InfoYAML << *static_cast<clang::doc::FunctionInfo *>(I);
409 InfoYAML << *static_cast<clang::doc::TypedefInfo *>(I);
416 return llvm::createStringError(llvm::inconvertibleErrorCode(),
417 "unexpected InfoType");
419 return llvm::Error::success();
423 "Generator for YAML output.");
Generator for YAML documentation.
llvm::Error generateDocs(StringRef RootDir, llvm::StringMap< std::unique_ptr< doc::Info > > Infos, const ClangDocContext &CDCtx) override
static const char * Format
llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS, const ClangDocContext &CDCtx) override
@ CK_InlineCommandComment
@ CK_VerbatimBlockLineComment
@ CK_VerbatimBlockComment
@ CK_TParamCommandComment
static GeneratorRegistry::Add< YAMLGenerator > YAML(YAMLGenerator::Format, "Generator for YAML output.")
volatile int YAMLGeneratorAnchorSource
std::array< uint8_t, 20 > SymbolID
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
static void infoMapping(IO &IO, Info &I)
static void commentInfoMapping(IO &IO, CommentInfo &I)
static void fieldTypeInfoMapping(IO &IO, FieldTypeInfo &I)
static void symbolInfoMapping(IO &IO, SymbolInfo &I)
static void typeInfoMapping(IO &IO, TypeInfo &I)
static void recordInfoMapping(IO &IO, RecordInfo &I)
Some operations such as code completion produce a set of candidates.
Represents a symbol occurrence in the source file.
llvm::SmallVector< EnumValueInfo, 4 > Members
std::optional< TypeInfo > BaseType
SmallString< 16 > ValueExpr
SmallString< 16 > DefaultValue
llvm::SmallVector< FieldTypeInfo, 4 > Params
std::optional< TemplateInfo > Template
std::vector< CommentInfo > Description
llvm::SmallString< 128 > Path
llvm::SmallVector< Reference, 4 > Namespace
SmallString< 32 > Filename
std::vector< CommentInfo > Description
llvm::SmallVector< MemberTypeInfo, 4 > Members
std::optional< TemplateInfo > Template
llvm::SmallVector< Reference, 4 > VirtualParents
llvm::SmallVector< Reference, 4 > Parents
std::vector< BaseRecordInfo > Bases
std::vector< Reference > Records
std::vector< TypedefInfo > Typedefs
std::vector< FunctionInfo > Functions
std::vector< Reference > Namespaces
std::vector< EnumInfo > Enums
llvm::SmallVector< Location, 2 > Loc
std::optional< Location > DefLoc
std::vector< TemplateParamInfo > Params
std::optional< TemplateSpecializationInfo > Specialization
SmallString< 16 > Contents
SymbolID SpecializationOf
std::vector< TemplateParamInfo > Params
static void mapping(IO &IO, BaseRecordInfo &I)
static void mapping(IO &IO, EnumInfo &I)
static void mapping(IO &IO, EnumValueInfo &I)
static void mapping(IO &IO, FieldTypeInfo &I)
static void mapping(IO &IO, FunctionInfo &I)
static void mapping(IO &IO, Location &Loc)
static void mapping(IO &IO, MemberTypeInfo &I)
static void mapping(IO &IO, NamespaceInfo &I)
static void mapping(IO &IO, RecordInfo &I)
static void mapping(IO &IO, Reference &Ref)
static void mapping(IO &IO, TemplateInfo &I)
static void mapping(IO &IO, TemplateParamInfo &I)
static void mapping(IO &IO, TemplateSpecializationInfo &I)
static void mapping(IO &IO, TypeInfo &I)
static void mapping(IO &IO, TypedefInfo &I)
static void enumeration(IO &IO, InfoType &Value)
static void enumeration(IO &IO, clang::AccessSpecifier &Value)
static void enumeration(IO &IO, clang::TagTypeKind &Value)
static void output(const SmallString< U > &S, void *, llvm::raw_ostream &OS)
static QuotingType mustQuote(StringRef)
static StringRef input(StringRef Scalar, void *, SmallString< U > &Value)
static SymbolID stringToSymbol(llvm::StringRef Value)
static StringRef input(StringRef Scalar, void *, std::array< unsigned char, 20 > &Value)
static QuotingType mustQuote(StringRef)
static void output(const std::array< unsigned char, 20 > &S, void *, llvm::raw_ostream &OS)