diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 97c599a3f605c..41983d5f938fc 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -84,8 +84,24 @@ serializeLocation(const Location &Loc, return LocationObj; } +/// Insert comments into a key in the Description object. +/// +/// \param Comment Either an Object or Array, depending on the comment type +/// \param Key The type (Brief, Code, etc.) of comment to be inserted static void insertComment(Object &Description, json::Value &Comment, StringRef Key) { + // The comment has a Children array for the actual text, with meta attributes + // alongside it in the Object. + if (auto *Obj = Comment.getAsObject()) { + if (auto *Children = Obj->getArray("Children"); + !Children || Children->empty()) + return; + } + // The comment is just an array of text comments. + else if (auto *Array = Comment.getAsArray(); !Array || Array->empty()) { + return; + } + auto DescriptionIt = Description.find(Key); if (DescriptionIt == Description.end()) { @@ -98,10 +114,31 @@ static void insertComment(Object &Description, json::Value &Comment, } } +/// Takes the nested "Children" array from a comment Object. +/// +/// \return a json::Array of comments, possible json::Value::Kind::Null static json::Value extractTextComments(Object *ParagraphComment) { if (!ParagraphComment) - return json::Object(); - return *ParagraphComment->get("Children"); + return json::Value(nullptr); + json::Value *Children = ParagraphComment->get("Children"); + if (!Children) + return json::Value(nullptr); + auto ChildrenArray = *Children->getAsArray(); + auto ChildrenIt = ChildrenArray.begin(); + while (ChildrenIt != ChildrenArray.end()) { + auto *ChildObj = ChildrenIt->getAsObject(); + if (!ChildObj) { + ++ChildrenIt; + continue; + } + auto TextComment = ChildObj->getString("TextComment"); + if (!TextComment || TextComment->empty()) { + ChildrenIt = ChildrenArray.erase(ChildrenIt); + continue; + } + ++ChildrenIt; + } + return ChildrenArray; } static json::Value extractVerbatimComments(json::Array VerbatimLines) { @@ -131,7 +168,8 @@ static Object serializeComment(const CommentInfo &I, Object &Description) { switch (I.Kind) { case CommentKind::CK_TextComment: { - Obj.insert({commentKindToString(I.Kind), I.Text}); + if (!I.Text.empty()) + Obj.insert({commentKindToString(I.Kind), I.Text}); return Obj; } @@ -265,6 +303,9 @@ serializeCommonAttributes(const Info &I, json::Object &Obj, if (auto *ParagraphComment = Comment.getAsObject(); ParagraphComment->get("ParagraphComment")) { auto TextCommentsArray = extractTextComments(ParagraphComment); + if (TextCommentsArray.kind() == json::Value::Null || + TextCommentsArray.getAsArray()->empty()) + continue; insertComment(Description, TextCommentsArray, "ParagraphComments"); } } diff --git a/clang-tools-extra/test/clang-doc/basic-project.mustache.test b/clang-tools-extra/test/clang-doc/basic-project.mustache.test index 9f7de6e689313..2e64d42d42b81 100644 --- a/clang-tools-extra/test/clang-doc/basic-project.mustache.test +++ b/clang-tools-extra/test/clang-doc/basic-project.mustache.test @@ -65,9 +65,6 @@ HTML-SHAPE:
Abstract base class for shapes.
HTML-SHAPE:Provides a common interface for different types of shapes.
HTML-SHAPE:Calculates the area of the shape.
HTML-SHAPE:double The area of the shape.
HTML-SHAPE:Calculates the perimeter of the shape.
HTML-SHAPE:double The perimeter of the shape.
HTML-SHAPE:Virtual destructor.
HTML-SHAPE:A simple calculator class.
HTML-CALC:Provides basic arithmetic operations.
HTML-CALC:Adds two integers.
HTML-CALC:Subtracts the second integer from the first.
HTML-CALC:Multiplies two integers.
HTML-CALC:Divides the first integer by the second.
HTML-CALC:double The result of a / b.
-HTML-CALC: HTML-CALC:Performs the mod operation on integers.
HTML-CALC:Rectangle class derived from Shape.
HTML-RECTANGLE:Represents a rectangle with a given width and height.
HTML-RECTANGLE:Constructs a new Rectangle object.
HTML-RECTANGLE:Calculates the area of the rectangle.
HTML-RECTANGLE:double The area of the rectangle.
HTML-RECTANGLE:Calculates the perimeter of the rectangle.
HTML-RECTANGLE:double The perimeter of the rectangle.
HTML-RECTANGLE:Circle class derived from Shape.
HTML-CIRCLE:Represents a circle with a given radius.
HTML-CIRCLE:Constructs a new Circle object.
HTML-CIRCLE:Calculates the area of the circle.
HTML-CIRCLE:double The area of the circle.
HTML-CIRCLE:Calculates the perimeter of the circle.
HTML-CIRCLE:double The perimeter of the circle.
HTML-CIRCLE: