12 #include "llvm/Support/YAMLTraits.h"
13 #include "llvm/Support/raw_ostream.h"
20 LLVM_YAML_IS_SEQUENCE_VECTOR(
Location)
23 LLVM_YAML_IS_SEQUENCE_VECTOR(
EnumInfo)
25 LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<CommentInfo>)
26 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::SmallString<16>)
33 template <>
struct ScalarEnumerationTraits<
clang::AccessSpecifier> {
34 static void enumeration(IO &IO, clang::AccessSpecifier &Value) {
35 IO.enumCase(Value,
"Public", clang::AccessSpecifier::AS_public);
36 IO.enumCase(Value,
"Protected", clang::AccessSpecifier::AS_protected);
37 IO.enumCase(Value,
"Private", clang::AccessSpecifier::AS_private);
38 IO.enumCase(Value,
"None", clang::AccessSpecifier::AS_none);
42 template <>
struct ScalarEnumerationTraits<
clang::TagTypeKind> {
44 IO.enumCase(Value,
"Struct", clang::TagTypeKind::TTK_Struct);
45 IO.enumCase(Value,
"Interface", clang::TagTypeKind::TTK_Interface);
46 IO.enumCase(Value,
"Union", clang::TagTypeKind::TTK_Union);
47 IO.enumCase(Value,
"Class", clang::TagTypeKind::TTK_Class);
48 IO.enumCase(Value,
"Enum", clang::TagTypeKind::TTK_Enum);
52 template <>
struct ScalarEnumerationTraits<
InfoType> {
63 template <
unsigned U>
struct ScalarTraits<SmallString<U>> {
65 static void output(
const SmallString<U> &S,
void *, llvm::raw_ostream &
OS) {
66 for (
const auto &
C : S)
70 static StringRef
input(StringRef Scalar,
void *, SmallString<U> &Value) {
71 Value.assign(Scalar.begin(), Scalar.end());
75 static QuotingType
mustQuote(StringRef) {
return QuotingType::Single; }
78 template <>
struct ScalarTraits<std::array<unsigned char, 20>> {
80 static void output(
const std::array<unsigned char, 20> &S,
void *,
81 llvm::raw_ostream &
OS) {
82 OS << toHex(toStringRef(S));
85 static StringRef
input(StringRef Scalar,
void *,
86 std::array<unsigned char, 20> &Value) {
87 if (Scalar.size() != 40)
88 return "Error: Incorrect scalar size for USR.";
89 Value = StringToSymbol(Scalar);
95 std::string HexString = fromHex(Value);
96 std::copy(HexString.begin(), HexString.end(), USR.begin());
100 static QuotingType
mustQuote(StringRef) {
return QuotingType::Single; }
111 IO.mapOptional(
"Name", I.
Name, SmallString<16>());
115 IO.mapRequired(
"USR", I.
USR);
116 IO.mapOptional(
"Name", I.
Name, SmallString<16>());
117 IO.mapOptional(
"Path", I.
Path, SmallString<128>());
118 IO.mapOptional(
"Namespace", I.
Namespace, llvm::SmallVector<Reference, 4>());
124 IO.mapOptional(
"DefLocation", I.DefLoc, Optional<Location>());
125 IO.mapOptional(
"Location", I.Loc, llvm::SmallVector<Location, 2>());
130 IO.mapOptional(
"TagType", I.
TagType, clang::TagTypeKind::TTK_Struct);
131 IO.mapOptional(
"Members", I.
Members);
132 IO.mapOptional(
"Bases", I.
Bases);
133 IO.mapOptional(
"Parents", I.
Parents, llvm::SmallVector<Reference, 4>());
135 llvm::SmallVector<Reference, 4>());
136 IO.mapOptional(
"ChildRecords", I.
ChildRecords, std::vector<Reference>());
142 IO.mapOptional(
"Kind", I.
Kind, SmallString<16>());
143 IO.mapOptional(
"Text", I.
Text, SmallString<64>());
144 IO.mapOptional(
"Name", I.
Name, SmallString<16>());
145 IO.mapOptional(
"Direction", I.
Direction, SmallString<8>());
146 IO.mapOptional(
"ParamName", I.
ParamName, SmallString<16>());
147 IO.mapOptional(
"CloseName", I.
CloseName, SmallString<16>());
148 IO.mapOptional(
"SelfClosing", I.
SelfClosing,
false);
149 IO.mapOptional(
"Explicit", I.
Explicit,
false);
150 IO.mapOptional(
"Args", I.
Args, llvm::SmallVector<SmallString<16>, 4>());
151 IO.mapOptional(
"AttrKeys", I.
AttrKeys,
152 llvm::SmallVector<SmallString<16>, 4>());
154 llvm::SmallVector<SmallString<16>, 4>());
155 IO.mapOptional(
"Children", I.
Children);
162 IO.mapOptional(
"LineNumber",
Loc.LineNumber, 0);
163 IO.mapOptional(
"Filename",
Loc.Filename, SmallString<32>());
170 IO.mapOptional(
"Name",
Ref.Name, SmallString<16>());
172 IO.mapOptional(
"Path",
Ref.Path, SmallString<128>());
173 IO.mapOptional(
"IsInGlobalNamespace",
Ref.IsInGlobalNamespace,
false);
184 IO.mapOptional(
"Name", I.
Name, SmallString<16>());
194 IO.mapOptional(
"Access", I.
Access, clang::AccessSpecifier::AS_none);
202 std::vector<Reference>());
203 IO.mapOptional(
"ChildRecords", I.
ChildRecords, std::vector<Reference>());
216 IO.mapOptional(
"IsVirtual", I.
IsVirtual,
false);
220 IO.mapOptional(
"Access", I.
Access, clang::AccessSpecifier::AS_none);
221 IO.mapOptional(
"IsParent", I.
IsParent,
false);
228 IO.mapOptional(
"Scoped", I.
Scoped,
false);
229 IO.mapOptional(
"Members", I.
Members);
236 IO.mapOptional(
"IsMethod", I.
IsMethod,
false);
238 IO.mapOptional(
"Params", I.
Params);
243 IO.mapOptional(
"Access", I.
Access, clang::AccessSpecifier::AS_none);
251 template <>
struct MappingTraits<std::unique_ptr<CommentInfo>> {
252 static void mapping(IO &IO, std::unique_ptr<CommentInfo> &I) {
269 llvm::Error generateDocForInfo(
Info *I, llvm::raw_ostream &
OS,
280 InfoYAML << *static_cast<clang::doc::NamespaceInfo *>(I);
283 InfoYAML << *static_cast<clang::doc::RecordInfo *>(I);
286 InfoYAML << *static_cast<clang::doc::EnumInfo *>(I);
289 InfoYAML << *static_cast<clang::doc::FunctionInfo *>(I);
292 return llvm::createStringError(llvm::inconvertibleErrorCode(),
293 "unexpected InfoType");
295 return llvm::Error::success();
299 "Generator for YAML output.");