diff --git a/clang/bindings/xml/comment-xml-schema.rng b/clang/bindings/xml/comment-xml-schema.rng --- a/clang/bindings/xml/comment-xml-schema.rng +++ b/clang/bindings/xml/comment-xml-schema.rng @@ -579,6 +579,14 @@ .*\S.* + + + + + \S+ + + + diff --git a/clang/include/clang-c/Documentation.h b/clang/include/clang-c/Documentation.h --- a/clang/include/clang-c/Documentation.h +++ b/clang/include/clang-c/Documentation.h @@ -181,7 +181,12 @@ * Command argument should be rendered emphasized (typically italic * font). */ - CXCommentInlineCommandRenderKind_Emphasized + CXCommentInlineCommandRenderKind_Emphasized, + + /** + * Command argument should not be rendered (since it only defines an anchor). + */ + CXCommentInlineCommandRenderKind_Anchor }; /** diff --git a/clang/include/clang/AST/Comment.h b/clang/include/clang/AST/Comment.h --- a/clang/include/clang/AST/Comment.h +++ b/clang/include/clang/AST/Comment.h @@ -94,10 +94,11 @@ unsigned : NumInlineContentCommentBits; - unsigned RenderKind : 2; + unsigned RenderKind : 3; + unsigned CommandID : CommandInfo::NumCommandIDBits; }; - enum { NumInlineCommandCommentBits = NumInlineContentCommentBits + 2 + + enum { NumInlineCommandCommentBits = NumInlineContentCommentBits + 3 + CommandInfo::NumCommandIDBits }; class HTMLTagCommentBitfields { @@ -310,7 +311,8 @@ RenderNormal, RenderBold, RenderMonospaced, - RenderEmphasized + RenderEmphasized, + RenderAnchor }; protected: diff --git a/clang/include/clang/AST/CommentCommands.td b/clang/include/clang/AST/CommentCommands.td --- a/clang/include/clang/AST/CommentCommands.td +++ b/clang/include/clang/AST/CommentCommands.td @@ -81,12 +81,13 @@ // InlineCommand //===----------------------------------------------------------------------===// -def B : InlineCommand<"b">; -def C : InlineCommand<"c">; -def P : InlineCommand<"p">; -def A : InlineCommand<"a">; -def E : InlineCommand<"e">; -def Em : InlineCommand<"em">; +def B : InlineCommand<"b">; +def C : InlineCommand<"c">; +def P : InlineCommand<"p">; +def A : InlineCommand<"a">; +def E : InlineCommand<"e">; +def Em : InlineCommand<"em">; +def Anchor : InlineCommand<"anchor">; //===----------------------------------------------------------------------===// // BlockCommand diff --git a/clang/lib/AST/CommentSema.cpp b/clang/lib/AST/CommentSema.cpp --- a/clang/lib/AST/CommentSema.cpp +++ b/clang/lib/AST/CommentSema.cpp @@ -1143,6 +1143,7 @@ .Case("b", InlineCommandComment::RenderBold) .Cases("c", "p", InlineCommandComment::RenderMonospaced) .Cases("a", "e", "em", InlineCommandComment::RenderEmphasized) + .Case("anchor", InlineCommandComment::RenderAnchor) .Default(InlineCommandComment::RenderNormal); } diff --git a/clang/lib/AST/JSONNodeDumper.cpp b/clang/lib/AST/JSONNodeDumper.cpp --- a/clang/lib/AST/JSONNodeDumper.cpp +++ b/clang/lib/AST/JSONNodeDumper.cpp @@ -1518,6 +1518,9 @@ case comments::InlineCommandComment::RenderMonospaced: JOS.attribute("renderKind", "monospaced"); break; + case comments::InlineCommandComment::RenderAnchor: + JOS.attribute("renderKind", "anchor"); + break; } llvm::json::Array Args; diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp --- a/clang/lib/AST/TextNodeDumper.cpp +++ b/clang/lib/AST/TextNodeDumper.cpp @@ -489,6 +489,9 @@ case comments::InlineCommandComment::RenderEmphasized: OS << " RenderEmphasized"; break; + case comments::InlineCommandComment::RenderAnchor: + OS << " RenderAnchor"; + break; } for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i) diff --git a/clang/lib/Index/CommentToXML.cpp b/clang/lib/Index/CommentToXML.cpp --- a/clang/lib/Index/CommentToXML.cpp +++ b/clang/lib/Index/CommentToXML.cpp @@ -297,6 +297,10 @@ appendToResultWithHTMLEscaping(Arg0); Result << ""; return; + case InlineCommandComment::RenderAnchor: + assert(C->getNumArgs() == 1); + Result << ""; + return; } } @@ -641,6 +645,10 @@ appendToResultWithXMLEscaping(Arg0); Result << ""; return; + case InlineCommandComment::RenderAnchor: + assert(C->getNumArgs() == 1); + Result << ""; + return; } } diff --git a/clang/test/AST/ast-dump-comment.cpp b/clang/test/AST/ast-dump-comment.cpp --- a/clang/test/AST/ast-dump-comment.cpp +++ b/clang/test/AST/ast-dump-comment.cpp @@ -47,6 +47,11 @@ // CHECK: VarDecl{{.*}}Test_InlineCommandComment // CHECK: InlineCommandComment{{.*}} Name="c" RenderMonospaced Arg[0]="Aaa" +/// \anchor Aaa +int Test_InlineCommandCommentAnchor; +// CHECK: VarDecl{{.*}}Test_InlineCommandComment +// CHECK: InlineCommandComment{{.*}} Name="anchor" RenderAnchor Arg[0]="Aaa" + /// Aaa ///
int Test_HTMLTagComment; diff --git a/clang/test/Index/Inputs/CommentXML/valid-inline-command-01.xml b/clang/test/Index/Inputs/CommentXML/valid-inline-command-01.xml new file mode 100644 --- /dev/null +++ b/clang/test/Index/Inputs/CommentXML/valid-inline-command-01.xml @@ -0,0 +1,9 @@ + + +aaa + + + + + + diff --git a/clang/test/Index/comment-to-html-xml-conversion.cpp b/clang/test/Index/comment-to-html-xml-conversion.cpp --- a/clang/test/Index/comment-to-html-xml-conversion.cpp +++ b/clang/test/Index/comment-to-html-xml-conversion.cpp @@ -734,6 +734,16 @@ // CHECK-NEXT: (CXComment_Text Text=[Aaa]) // CHECK-NEXT: (CXComment_HTMLEndTag Name=[h1])))] +/// \anchor A +void comment_to_html_conversion_37(); + +// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:6: FunctionDecl=comment_to_html_conversion_37:{{.*}} FullCommentAsHTML=[

] FullCommentAsXML=[comment_to_html_conversion_37c:@F@comment_to_html_conversion_37#void comment_to_html_conversion_37() ] +// CHECK-NEXT: CommentAST=[ +// CHECK-NEXT: (CXComment_FullComment +// CHECK-NEXT: (CXComment_Paragraph +// CHECK-NEXT: (CXComment_Text Text=[ ] IsWhitespace) +// CHECK-NEXT: (CXComment_InlineCommand CommandName=[anchor] RenderAnchor Arg[0]=A)))] + /// Aaa. class comment_to_xml_conversion_01 { diff --git a/clang/test/Index/comment-xml-schema.c b/clang/test/Index/comment-xml-schema.c --- a/clang/test/Index/comment-xml-schema.c +++ b/clang/test/Index/comment-xml-schema.c @@ -33,6 +33,8 @@ // RUN: xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/valid-enum-01.xml // // RUN: xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/valid-para-kind-01.xml +// +// RUN: xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/valid-inline-command-01.xml // RUN: not xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/invalid-function-01.xml 2>&1 | FileCheck %s -check-prefix=CHECK-INVALID // RUN: not xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/invalid-function-02.xml 2>&1 | FileCheck %s -check-prefix=CHECK-INVALID diff --git a/clang/test/Sema/warn-documentation.cpp b/clang/test/Sema/warn-documentation.cpp --- a/clang/test/Sema/warn-documentation.cpp +++ b/clang/test/Sema/warn-documentation.cpp @@ -1102,6 +1102,13 @@ /// \a A int test_inline_no_argument_a_good(int); +// expected-warning@+1 {{'\anchor' command does not have a valid word argument}} +/// \anchor +int test_inline_no_argument_anchor_bad(int); + +/// \anchor A +int test_inline_no_argument_anchor_good(int); + // expected-warning@+1 {{'@b' command does not have a valid word argument}} /// @b int test_inline_no_argument_b_bad(int); diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -497,6 +497,9 @@ case CXCommentInlineCommandRenderKind_Emphasized: printf(" RenderEmphasized"); break; + case CXCommentInlineCommandRenderKind_Anchor: + printf(" RenderAnchor"); + break; } for (i = 0, e = clang_InlineCommandComment_getNumArgs(Comment); i != e; ++i) { diff --git a/clang/tools/libclang/CXComment.cpp b/clang/tools/libclang/CXComment.cpp --- a/clang/tools/libclang/CXComment.cpp +++ b/clang/tools/libclang/CXComment.cpp @@ -159,6 +159,9 @@ case InlineCommandComment::RenderEmphasized: return CXCommentInlineCommandRenderKind_Emphasized; + + case InlineCommandComment::RenderAnchor: + return CXCommentInlineCommandRenderKind_Anchor; } llvm_unreachable("unknown InlineCommandComment::RenderKind"); }