17f87ca62SJulie Hockett //===-- clang-doc/MDGeneratorTest.cpp -------------------------------------===//
27f87ca62SJulie Hockett //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67f87ca62SJulie Hockett //
77f87ca62SJulie Hockett //===----------------------------------------------------------------------===//
87f87ca62SJulie Hockett
97f87ca62SJulie Hockett #include "ClangDocTest.h"
107f87ca62SJulie Hockett #include "Generators.h"
117f87ca62SJulie Hockett #include "Representation.h"
127f87ca62SJulie Hockett #include "gtest/gtest.h"
137f87ca62SJulie Hockett
147f87ca62SJulie Hockett namespace clang {
157f87ca62SJulie Hockett namespace doc {
167f87ca62SJulie Hockett
getMDGenerator()177f87ca62SJulie Hockett std::unique_ptr<Generator> getMDGenerator() {
187f87ca62SJulie Hockett auto G = doc::findGeneratorByName("md");
197f87ca62SJulie Hockett if (!G)
207f87ca62SJulie Hockett return nullptr;
217f87ca62SJulie Hockett return std::move(G.get());
227f87ca62SJulie Hockett }
237f87ca62SJulie Hockett
TEST(MDGeneratorTest,emitNamespaceMD)247f87ca62SJulie Hockett TEST(MDGeneratorTest, emitNamespaceMD) {
257f87ca62SJulie Hockett NamespaceInfo I;
267f87ca62SJulie Hockett I.Name = "Namespace";
277f87ca62SJulie Hockett I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
287f87ca62SJulie Hockett
2921fb70c6SBrett Wilson I.Children.Namespaces.emplace_back(EmptySID, "ChildNamespace",
307f87ca62SJulie Hockett InfoType::IT_namespace);
3121fb70c6SBrett Wilson I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record);
3221fb70c6SBrett Wilson I.Children.Functions.emplace_back();
3321fb70c6SBrett Wilson I.Children.Functions.back().Name = "OneFunction";
3421fb70c6SBrett Wilson I.Children.Functions.back().Access = AccessSpecifier::AS_none;
3521fb70c6SBrett Wilson I.Children.Enums.emplace_back();
3621fb70c6SBrett Wilson I.Children.Enums.back().Name = "OneEnum";
377f87ca62SJulie Hockett
387f87ca62SJulie Hockett auto G = getMDGenerator();
397f87ca62SJulie Hockett assert(G);
407f87ca62SJulie Hockett std::string Buffer;
417f87ca62SJulie Hockett llvm::raw_string_ostream Actual(Buffer);
42acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
437f87ca62SJulie Hockett assert(!Err);
447f87ca62SJulie Hockett std::string Expected = R"raw(# namespace Namespace
457f87ca62SJulie Hockett
467f87ca62SJulie Hockett
477f87ca62SJulie Hockett
487f87ca62SJulie Hockett ## Namespaces
497f87ca62SJulie Hockett
507003f64cSPetr Hosek * [ChildNamespace](../ChildNamespace/index.md)
517f87ca62SJulie Hockett
527f87ca62SJulie Hockett
537f87ca62SJulie Hockett ## Records
547f87ca62SJulie Hockett
557003f64cSPetr Hosek * [ChildStruct](../ChildStruct.md)
567f87ca62SJulie Hockett
577f87ca62SJulie Hockett
587f87ca62SJulie Hockett ## Functions
597f87ca62SJulie Hockett
607f87ca62SJulie Hockett ### OneFunction
617f87ca62SJulie Hockett
627f87ca62SJulie Hockett * OneFunction()*
637f87ca62SJulie Hockett
647f87ca62SJulie Hockett
657f87ca62SJulie Hockett
667f87ca62SJulie Hockett ## Enums
677f87ca62SJulie Hockett
687f87ca62SJulie Hockett | enum OneEnum |
697f87ca62SJulie Hockett
707f87ca62SJulie Hockett --
717f87ca62SJulie Hockett
727f87ca62SJulie Hockett
737f87ca62SJulie Hockett
747f87ca62SJulie Hockett
757f87ca62SJulie Hockett
767f87ca62SJulie Hockett )raw";
777f87ca62SJulie Hockett EXPECT_EQ(Expected, Actual.str());
787f87ca62SJulie Hockett }
797f87ca62SJulie Hockett
TEST(MDGeneratorTest,emitRecordMD)807f87ca62SJulie Hockett TEST(MDGeneratorTest, emitRecordMD) {
817f87ca62SJulie Hockett RecordInfo I;
827f87ca62SJulie Hockett I.Name = "r";
837f87ca62SJulie Hockett I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
847f87ca62SJulie Hockett
857f87ca62SJulie Hockett I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
867f87ca62SJulie Hockett I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
877f87ca62SJulie Hockett
880afc6085SBrett Wilson I.Members.emplace_back(TypeInfo("int"), "X", AccessSpecifier::AS_private);
89*edd690b0SVlad Serebrennikov I.TagType = TagTypeKind::Class;
907f87ca62SJulie Hockett I.Parents.emplace_back(EmptySID, "F", InfoType::IT_record);
917f87ca62SJulie Hockett I.VirtualParents.emplace_back(EmptySID, "G", InfoType::IT_record);
927f87ca62SJulie Hockett
9321fb70c6SBrett Wilson I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record);
9421fb70c6SBrett Wilson I.Children.Functions.emplace_back();
9521fb70c6SBrett Wilson I.Children.Functions.back().Name = "OneFunction";
9621fb70c6SBrett Wilson I.Children.Enums.emplace_back();
9721fb70c6SBrett Wilson I.Children.Enums.back().Name = "OneEnum";
987f87ca62SJulie Hockett
997f87ca62SJulie Hockett auto G = getMDGenerator();
1007f87ca62SJulie Hockett assert(G);
1017f87ca62SJulie Hockett std::string Buffer;
1027f87ca62SJulie Hockett llvm::raw_string_ostream Actual(Buffer);
103acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
1047f87ca62SJulie Hockett assert(!Err);
1057f87ca62SJulie Hockett std::string Expected = R"raw(# class r
1067f87ca62SJulie Hockett
1077003f64cSPetr Hosek *Defined at test.cpp#10*
1087f87ca62SJulie Hockett
1097f87ca62SJulie Hockett Inherits from F, G
1107f87ca62SJulie Hockett
1117f87ca62SJulie Hockett
1127f87ca62SJulie Hockett
1137f87ca62SJulie Hockett ## Members
1147f87ca62SJulie Hockett
1157f87ca62SJulie Hockett private int X
1167f87ca62SJulie Hockett
1177f87ca62SJulie Hockett
1187f87ca62SJulie Hockett
1197f87ca62SJulie Hockett ## Records
1207f87ca62SJulie Hockett
1217f87ca62SJulie Hockett ChildStruct
1227f87ca62SJulie Hockett
1237f87ca62SJulie Hockett
1247f87ca62SJulie Hockett
1257f87ca62SJulie Hockett ## Functions
1267f87ca62SJulie Hockett
1277f87ca62SJulie Hockett ### OneFunction
1287f87ca62SJulie Hockett
1296a29ae4bSDiego Astiazaran *public OneFunction()*
1307f87ca62SJulie Hockett
1317f87ca62SJulie Hockett
1327f87ca62SJulie Hockett
1337f87ca62SJulie Hockett ## Enums
1347f87ca62SJulie Hockett
1357f87ca62SJulie Hockett | enum OneEnum |
1367f87ca62SJulie Hockett
1377f87ca62SJulie Hockett --
1387f87ca62SJulie Hockett
1397f87ca62SJulie Hockett
1407f87ca62SJulie Hockett
1417f87ca62SJulie Hockett
1427f87ca62SJulie Hockett
1437f87ca62SJulie Hockett )raw";
1447f87ca62SJulie Hockett EXPECT_EQ(Expected, Actual.str());
1457f87ca62SJulie Hockett }
1467f87ca62SJulie Hockett
TEST(MDGeneratorTest,emitFunctionMD)1477f87ca62SJulie Hockett TEST(MDGeneratorTest, emitFunctionMD) {
1487f87ca62SJulie Hockett FunctionInfo I;
1497f87ca62SJulie Hockett I.Name = "f";
1507f87ca62SJulie Hockett I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
1517f87ca62SJulie Hockett
1527f87ca62SJulie Hockett I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
1537f87ca62SJulie Hockett I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
1547f87ca62SJulie Hockett
1556a29ae4bSDiego Astiazaran I.Access = AccessSpecifier::AS_none;
1566a29ae4bSDiego Astiazaran
1570afc6085SBrett Wilson I.ReturnType = TypeInfo("void");
1580afc6085SBrett Wilson I.Params.emplace_back(TypeInfo("int"), "P");
1597f87ca62SJulie Hockett I.IsMethod = true;
1607f87ca62SJulie Hockett I.Parent = Reference(EmptySID, "Parent", InfoType::IT_record);
1617f87ca62SJulie Hockett
1627f87ca62SJulie Hockett auto G = getMDGenerator();
1637f87ca62SJulie Hockett assert(G);
1647f87ca62SJulie Hockett std::string Buffer;
1657f87ca62SJulie Hockett llvm::raw_string_ostream Actual(Buffer);
166acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
1677f87ca62SJulie Hockett assert(!Err);
1687f87ca62SJulie Hockett std::string Expected = R"raw(### f
1697f87ca62SJulie Hockett
1707f87ca62SJulie Hockett *void f(int P)*
1717f87ca62SJulie Hockett
1727003f64cSPetr Hosek *Defined at test.cpp#10*
1737f87ca62SJulie Hockett
1747f87ca62SJulie Hockett )raw";
1757f87ca62SJulie Hockett
1767f87ca62SJulie Hockett EXPECT_EQ(Expected, Actual.str());
1777f87ca62SJulie Hockett }
1787f87ca62SJulie Hockett
TEST(MDGeneratorTest,emitEnumMD)1797f87ca62SJulie Hockett TEST(MDGeneratorTest, emitEnumMD) {
1807f87ca62SJulie Hockett EnumInfo I;
1817f87ca62SJulie Hockett I.Name = "e";
1827f87ca62SJulie Hockett I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
1837f87ca62SJulie Hockett
1847f87ca62SJulie Hockett I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
1857f87ca62SJulie Hockett I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
1867f87ca62SJulie Hockett
1877f87ca62SJulie Hockett I.Members.emplace_back("X");
1887f87ca62SJulie Hockett I.Scoped = true;
1897f87ca62SJulie Hockett
1907f87ca62SJulie Hockett auto G = getMDGenerator();
1917f87ca62SJulie Hockett assert(G);
1927f87ca62SJulie Hockett std::string Buffer;
1937f87ca62SJulie Hockett llvm::raw_string_ostream Actual(Buffer);
194acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
1957f87ca62SJulie Hockett assert(!Err);
1967f87ca62SJulie Hockett std::string Expected = R"raw(| enum class e |
1977f87ca62SJulie Hockett
1987f87ca62SJulie Hockett --
1997f87ca62SJulie Hockett
2007f87ca62SJulie Hockett | X |
2017f87ca62SJulie Hockett
2027f87ca62SJulie Hockett
2037003f64cSPetr Hosek *Defined at test.cpp#10*
2047f87ca62SJulie Hockett
2057f87ca62SJulie Hockett )raw";
2067f87ca62SJulie Hockett
2077f87ca62SJulie Hockett EXPECT_EQ(Expected, Actual.str());
2087f87ca62SJulie Hockett }
2097f87ca62SJulie Hockett
TEST(MDGeneratorTest,emitCommentMD)2107f87ca62SJulie Hockett TEST(MDGeneratorTest, emitCommentMD) {
2117f87ca62SJulie Hockett FunctionInfo I;
2127f87ca62SJulie Hockett I.Name = "f";
2137f87ca62SJulie Hockett I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
2140afc6085SBrett Wilson I.ReturnType = TypeInfo("void");
2150afc6085SBrett Wilson I.Params.emplace_back(TypeInfo("int"), "I");
2160afc6085SBrett Wilson I.Params.emplace_back(TypeInfo("int"), "J");
2176a29ae4bSDiego Astiazaran I.Access = AccessSpecifier::AS_none;
2187f87ca62SJulie Hockett
2197f87ca62SJulie Hockett CommentInfo Top;
2207f87ca62SJulie Hockett Top.Kind = "FullComment";
2217f87ca62SJulie Hockett
2221c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>());
2237f87ca62SJulie Hockett CommentInfo *BlankLine = Top.Children.back().get();
2247f87ca62SJulie Hockett BlankLine->Kind = "ParagraphComment";
2251c705d9cSJonas Devlieghere BlankLine->Children.emplace_back(std::make_unique<CommentInfo>());
2267f87ca62SJulie Hockett BlankLine->Children.back()->Kind = "TextComment";
2277f87ca62SJulie Hockett
2281c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>());
2297f87ca62SJulie Hockett CommentInfo *Brief = Top.Children.back().get();
2307f87ca62SJulie Hockett Brief->Kind = "ParagraphComment";
2311c705d9cSJonas Devlieghere Brief->Children.emplace_back(std::make_unique<CommentInfo>());
2327f87ca62SJulie Hockett Brief->Children.back()->Kind = "TextComment";
2337f87ca62SJulie Hockett Brief->Children.back()->Name = "ParagraphComment";
2347f87ca62SJulie Hockett Brief->Children.back()->Text = " Brief description.";
2357f87ca62SJulie Hockett
2361c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>());
2377f87ca62SJulie Hockett CommentInfo *Extended = Top.Children.back().get();
2387f87ca62SJulie Hockett Extended->Kind = "ParagraphComment";
2391c705d9cSJonas Devlieghere Extended->Children.emplace_back(std::make_unique<CommentInfo>());
2407f87ca62SJulie Hockett Extended->Children.back()->Kind = "TextComment";
2417f87ca62SJulie Hockett Extended->Children.back()->Text = " Extended description that";
2421c705d9cSJonas Devlieghere Extended->Children.emplace_back(std::make_unique<CommentInfo>());
2437f87ca62SJulie Hockett Extended->Children.back()->Kind = "TextComment";
2447f87ca62SJulie Hockett Extended->Children.back()->Text = " continues onto the next line.";
2457f87ca62SJulie Hockett
2461c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>());
2477f87ca62SJulie Hockett CommentInfo *HTML = Top.Children.back().get();
2487f87ca62SJulie Hockett HTML->Kind = "ParagraphComment";
2491c705d9cSJonas Devlieghere HTML->Children.emplace_back(std::make_unique<CommentInfo>());
2507f87ca62SJulie Hockett HTML->Children.back()->Kind = "TextComment";
2511c705d9cSJonas Devlieghere HTML->Children.emplace_back(std::make_unique<CommentInfo>());
2527f87ca62SJulie Hockett HTML->Children.back()->Kind = "HTMLStartTagComment";
2537f87ca62SJulie Hockett HTML->Children.back()->Name = "ul";
2547f87ca62SJulie Hockett HTML->Children.back()->AttrKeys.emplace_back("class");
2557f87ca62SJulie Hockett HTML->Children.back()->AttrValues.emplace_back("test");
2561c705d9cSJonas Devlieghere HTML->Children.emplace_back(std::make_unique<CommentInfo>());
2577f87ca62SJulie Hockett HTML->Children.back()->Kind = "HTMLStartTagComment";
2587f87ca62SJulie Hockett HTML->Children.back()->Name = "li";
2591c705d9cSJonas Devlieghere HTML->Children.emplace_back(std::make_unique<CommentInfo>());
2607f87ca62SJulie Hockett HTML->Children.back()->Kind = "TextComment";
2617f87ca62SJulie Hockett HTML->Children.back()->Text = " Testing.";
2621c705d9cSJonas Devlieghere HTML->Children.emplace_back(std::make_unique<CommentInfo>());
2637f87ca62SJulie Hockett HTML->Children.back()->Kind = "HTMLEndTagComment";
2647f87ca62SJulie Hockett HTML->Children.back()->Name = "ul";
2657f87ca62SJulie Hockett HTML->Children.back()->SelfClosing = true;
2667f87ca62SJulie Hockett
2671c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>());
2687f87ca62SJulie Hockett CommentInfo *Verbatim = Top.Children.back().get();
2697f87ca62SJulie Hockett Verbatim->Kind = "VerbatimBlockComment";
2707f87ca62SJulie Hockett Verbatim->Name = "verbatim";
2717f87ca62SJulie Hockett Verbatim->CloseName = "endverbatim";
2721c705d9cSJonas Devlieghere Verbatim->Children.emplace_back(std::make_unique<CommentInfo>());
2737f87ca62SJulie Hockett Verbatim->Children.back()->Kind = "VerbatimBlockLineComment";
2747f87ca62SJulie Hockett Verbatim->Children.back()->Text = " The description continues.";
2757f87ca62SJulie Hockett
2761c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>());
2777f87ca62SJulie Hockett CommentInfo *ParamOut = Top.Children.back().get();
2787f87ca62SJulie Hockett ParamOut->Kind = "ParamCommandComment";
2797f87ca62SJulie Hockett ParamOut->Direction = "[out]";
2807f87ca62SJulie Hockett ParamOut->ParamName = "I";
2817f87ca62SJulie Hockett ParamOut->Explicit = true;
2821c705d9cSJonas Devlieghere ParamOut->Children.emplace_back(std::make_unique<CommentInfo>());
2837f87ca62SJulie Hockett ParamOut->Children.back()->Kind = "ParagraphComment";
2847f87ca62SJulie Hockett ParamOut->Children.back()->Children.emplace_back(
2851c705d9cSJonas Devlieghere std::make_unique<CommentInfo>());
2867f87ca62SJulie Hockett ParamOut->Children.back()->Children.back()->Kind = "TextComment";
2877f87ca62SJulie Hockett ParamOut->Children.back()->Children.emplace_back(
2881c705d9cSJonas Devlieghere std::make_unique<CommentInfo>());
2897f87ca62SJulie Hockett ParamOut->Children.back()->Children.back()->Kind = "TextComment";
2907f87ca62SJulie Hockett ParamOut->Children.back()->Children.back()->Text = " is a parameter.";
2917f87ca62SJulie Hockett
2921c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>());
2937f87ca62SJulie Hockett CommentInfo *ParamIn = Top.Children.back().get();
2947f87ca62SJulie Hockett ParamIn->Kind = "ParamCommandComment";
2957f87ca62SJulie Hockett ParamIn->Direction = "[in]";
2967f87ca62SJulie Hockett ParamIn->ParamName = "J";
2971c705d9cSJonas Devlieghere ParamIn->Children.emplace_back(std::make_unique<CommentInfo>());
2987f87ca62SJulie Hockett ParamIn->Children.back()->Kind = "ParagraphComment";
2997f87ca62SJulie Hockett ParamIn->Children.back()->Children.emplace_back(
3001c705d9cSJonas Devlieghere std::make_unique<CommentInfo>());
3017f87ca62SJulie Hockett ParamIn->Children.back()->Children.back()->Kind = "TextComment";
3027f87ca62SJulie Hockett ParamIn->Children.back()->Children.back()->Text = " is a parameter.";
3037f87ca62SJulie Hockett ParamIn->Children.back()->Children.emplace_back(
3041c705d9cSJonas Devlieghere std::make_unique<CommentInfo>());
3057f87ca62SJulie Hockett ParamIn->Children.back()->Children.back()->Kind = "TextComment";
3067f87ca62SJulie Hockett
3071c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>());
3087f87ca62SJulie Hockett CommentInfo *Return = Top.Children.back().get();
3097f87ca62SJulie Hockett Return->Kind = "BlockCommandComment";
3107f87ca62SJulie Hockett Return->Name = "return";
3117f87ca62SJulie Hockett Return->Explicit = true;
3121c705d9cSJonas Devlieghere Return->Children.emplace_back(std::make_unique<CommentInfo>());
3137f87ca62SJulie Hockett Return->Children.back()->Kind = "ParagraphComment";
3147f87ca62SJulie Hockett Return->Children.back()->Children.emplace_back(
3151c705d9cSJonas Devlieghere std::make_unique<CommentInfo>());
3167f87ca62SJulie Hockett Return->Children.back()->Children.back()->Kind = "TextComment";
3177f87ca62SJulie Hockett Return->Children.back()->Children.back()->Text = "void";
3187f87ca62SJulie Hockett
3197f87ca62SJulie Hockett I.Description.emplace_back(std::move(Top));
3207f87ca62SJulie Hockett
3217f87ca62SJulie Hockett auto G = getMDGenerator();
3227f87ca62SJulie Hockett assert(G);
3237f87ca62SJulie Hockett std::string Buffer;
3247f87ca62SJulie Hockett llvm::raw_string_ostream Actual(Buffer);
325acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
3267f87ca62SJulie Hockett assert(!Err);
3277f87ca62SJulie Hockett std::string Expected =
3287f87ca62SJulie Hockett R"raw(### f
3297f87ca62SJulie Hockett
3307f87ca62SJulie Hockett *void f(int I, int J)*
3317f87ca62SJulie Hockett
3327003f64cSPetr Hosek *Defined at test.cpp#10*
3337f87ca62SJulie Hockett
3347f87ca62SJulie Hockett
3357f87ca62SJulie Hockett
3367f87ca62SJulie Hockett Brief description.
3377f87ca62SJulie Hockett
3387f87ca62SJulie Hockett Extended description that continues onto the next line.
3397f87ca62SJulie Hockett
3407f87ca62SJulie Hockett <ul "class=test">
3417f87ca62SJulie Hockett
3427f87ca62SJulie Hockett <li>
3437f87ca62SJulie Hockett
3447f87ca62SJulie Hockett Testing.</ul>
3457f87ca62SJulie Hockett
3467f87ca62SJulie Hockett
3477f87ca62SJulie Hockett
3487f87ca62SJulie Hockett The description continues.
3497f87ca62SJulie Hockett
35029b1af73SArnaud Botella **I** [out] is a parameter.
3517f87ca62SJulie Hockett
35229b1af73SArnaud Botella **J** is a parameter.
3537f87ca62SJulie Hockett
3547f87ca62SJulie Hockett **return**void
3557f87ca62SJulie Hockett
3567f87ca62SJulie Hockett )raw";
3577f87ca62SJulie Hockett
3587f87ca62SJulie Hockett EXPECT_EQ(Expected, Actual.str());
3597f87ca62SJulie Hockett }
3607f87ca62SJulie Hockett
3617f87ca62SJulie Hockett } // namespace doc
3627f87ca62SJulie Hockett } // namespace clang
363