[cfe-commits] r160633 - in /cfe/trunk: include/clang-c/Index.h include/clang/AST/Comment.h include/clang/AST/CommentSema.h lib/AST/CommentDumper.cpp lib/AST/CommentSema.cpp test/Index/annotate-comments.cpp tools/c-index-test/c-index-test.c tools/libclang/CXComment.cpp tools/libclang/libclang.exports
Dmitri Gribenko
gribozavr at gmail.com
Mon Jul 23 09:43:01 PDT 2012
Author: gribozavr
Date: Mon Jul 23 11:43:01 2012
New Revision: 160633
URL: http://llvm.org/viewvc/llvm-project?rev=160633&view=rev
Log:
Comment AST: add InlineContentComment::RenderKind to specify a default
rendering mode for clients that don't want to interpret Doxygen commands.
Also add a libclang API to query this information.
Modified:
cfe/trunk/include/clang-c/Index.h
cfe/trunk/include/clang/AST/Comment.h
cfe/trunk/include/clang/AST/CommentSema.h
cfe/trunk/lib/AST/CommentDumper.cpp
cfe/trunk/lib/AST/CommentSema.cpp
cfe/trunk/test/Index/annotate-comments.cpp
cfe/trunk/tools/c-index-test/c-index-test.c
cfe/trunk/tools/libclang/CXComment.cpp
cfe/trunk/tools/libclang/libclang.exports
Modified: cfe/trunk/include/clang-c/Index.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=160633&r1=160632&r2=160633&view=diff
==============================================================================
--- cfe/trunk/include/clang-c/Index.h (original)
+++ cfe/trunk/include/clang-c/Index.h Mon Jul 23 11:43:01 2012
@@ -3308,6 +3308,33 @@
};
/**
+ * \brief The most appropriate rendering mode for an inline command, chosen on
+ * command semantics in Doxygen.
+ */
+enum CXCommentInlineCommandRenderKind {
+ /**
+ * \brief Command argument should be rendered in a normal font.
+ */
+ CXCommentInlineCommandRenderKind_Normal,
+
+ /**
+ * \brief Command argument should be rendered in a bold font.
+ */
+ CXCommentInlineCommandRenderKind_Bold,
+
+ /**
+ * \brief Command argument should be rendered in a monospaced font.
+ */
+ CXCommentInlineCommandRenderKind_Monospaced,
+
+ /**
+ * \brief Command argument should be rendered emphasized (typically italic
+ * font).
+ */
+ CXCommentInlineCommandRenderKind_Emphasized
+};
+
+/**
* \brief Describes parameter passing direction for \\param or \\arg command.
*/
enum CXCommentParamPassDirection {
@@ -3388,6 +3415,15 @@
/**
* \param Comment a \c CXComment_InlineCommand AST node.
*
+ * \returns the most appropriate rendering mode, chosen on command
+ * semantics in Doxygen.
+ */
+CINDEX_LINKAGE enum CXCommentInlineCommandRenderKind
+clang_InlineCommandComment_getRenderKind(CXComment Comment);
+
+/**
+ * \param Comment a \c CXComment_InlineCommand AST node.
+ *
* \returns number of command arguments.
*/
CINDEX_LINKAGE
Modified: cfe/trunk/include/clang/AST/Comment.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Comment.h?rev=160633&r1=160632&r2=160633&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Comment.h (original)
+++ cfe/trunk/include/clang/AST/Comment.h Mon Jul 23 11:43:01 2012
@@ -63,6 +63,15 @@
};
enum { NumTextCommentBits = NumInlineContentCommentBits + 2 };
+ class InlineCommandCommentBitfields {
+ friend class InlineCommandComment;
+
+ unsigned : NumInlineContentCommentBits;
+
+ unsigned RenderKind : 2;
+ };
+ enum { NumInlineCommandCommentBits = NumInlineContentCommentBits + 1 };
+
class HTMLStartTagCommentBitfields {
friend class HTMLStartTagComment;
@@ -104,6 +113,7 @@
CommentBitfields CommentBits;
InlineContentCommentBitfields InlineContentCommentBits;
TextCommentBitfields TextCommentBits;
+ InlineCommandCommentBitfields InlineCommandCommentBits;
HTMLStartTagCommentBitfields HTMLStartTagCommentBits;
ParagraphCommentBitfields ParagraphCommentBits;
ParamCommandCommentBitfields ParamCommandCommentBits;
@@ -248,6 +258,15 @@
Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { }
};
+ /// The most appropriate rendering mode for this command, chosen on command
+ /// semantics in Doxygen.
+ enum RenderKind {
+ RenderNormal,
+ RenderBold,
+ RenderMonospaced,
+ RenderEmphasized
+ };
+
protected:
/// Command name.
StringRef Name;
@@ -259,10 +278,12 @@
InlineCommandComment(SourceLocation LocBegin,
SourceLocation LocEnd,
StringRef Name,
+ RenderKind RK,
llvm::ArrayRef<Argument> Args) :
- InlineContentComment(InlineCommandCommentKind, LocBegin, LocEnd),
- Name(Name), Args(Args)
- { }
+ InlineContentComment(InlineCommandCommentKind, LocBegin, LocEnd),
+ Name(Name), Args(Args) {
+ InlineCommandCommentBits.RenderKind = RK;
+ }
static bool classof(const Comment *C) {
return C->getCommentKind() == InlineCommandCommentKind;
@@ -283,6 +304,10 @@
getLocEnd());
}
+ RenderKind getRenderKind() const {
+ return static_cast<RenderKind>(InlineCommandCommentBits.RenderKind);
+ }
+
unsigned getNumArgs() const {
return Args.size();
}
Modified: cfe/trunk/include/clang/AST/CommentSema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/CommentSema.h?rev=160633&r1=160632&r2=160633&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/CommentSema.h (original)
+++ cfe/trunk/include/clang/AST/CommentSema.h Mon Jul 23 11:43:01 2012
@@ -155,7 +155,10 @@
bool isParamCommand(StringRef Name);
unsigned getBlockCommandNumArgs(StringRef Name);
- bool isInlineCommand(StringRef Name);
+ bool isInlineCommand(StringRef Name) const;
+
+ InlineCommandComment::RenderKind
+ getInlineCommandRenderKind(StringRef Name) const;
bool isHTMLEndTagOptional(StringRef Name);
bool isHTMLEndTagForbidden(StringRef Name);
Modified: cfe/trunk/lib/AST/CommentDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentDumper.cpp?rev=160633&r1=160632&r2=160633&view=diff
==============================================================================
--- cfe/trunk/lib/AST/CommentDumper.cpp (original)
+++ cfe/trunk/lib/AST/CommentDumper.cpp Mon Jul 23 11:43:01 2012
@@ -107,6 +107,21 @@
dumpComment(C);
OS << " Name=\"" << C->getCommandName() << "\"";
+ switch (C->getRenderKind()) {
+ case InlineCommandComment::RenderNormal:
+ OS << " RenderNormal";
+ break;
+ case InlineCommandComment::RenderBold:
+ OS << " RenderBold";
+ break;
+ case InlineCommandComment::RenderMonospaced:
+ OS << " RenderMonospaced";
+ break;
+ case InlineCommandComment::RenderEmphasized:
+ OS << " RenderEmphasized";
+ break;
+ }
+
for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
}
Modified: cfe/trunk/lib/AST/CommentSema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentSema.cpp?rev=160633&r1=160632&r2=160633&view=diff
==============================================================================
--- cfe/trunk/lib/AST/CommentSema.cpp (original)
+++ cfe/trunk/lib/AST/CommentSema.cpp Mon Jul 23 11:43:01 2012
@@ -202,10 +202,12 @@
SourceLocation CommandLocEnd,
StringRef CommandName) {
ArrayRef<InlineCommandComment::Argument> Args;
- return new (Allocator) InlineCommandComment(CommandLocBegin,
- CommandLocEnd,
- CommandName,
- Args);
+ return new (Allocator) InlineCommandComment(
+ CommandLocBegin,
+ CommandLocEnd,
+ CommandName,
+ getInlineCommandRenderKind(CommandName),
+ Args);
}
InlineCommandComment *Sema::actOnInlineCommand(SourceLocation CommandLocBegin,
@@ -219,17 +221,22 @@
ArgLocEnd),
Arg);
- return new (Allocator) InlineCommandComment(CommandLocBegin,
- CommandLocEnd,
- CommandName,
- llvm::makeArrayRef(A, 1));
+ return new (Allocator) InlineCommandComment(
+ CommandLocBegin,
+ CommandLocEnd,
+ CommandName,
+ getInlineCommandRenderKind(CommandName),
+ llvm::makeArrayRef(A, 1));
}
InlineContentComment *Sema::actOnUnknownCommand(SourceLocation LocBegin,
SourceLocation LocEnd,
StringRef Name) {
ArrayRef<InlineCommandComment::Argument> Args;
- return new (Allocator) InlineCommandComment(LocBegin, LocEnd, Name, Args);
+ return new (Allocator) InlineCommandComment(
+ LocBegin, LocEnd, Name,
+ InlineCommandComment::RenderNormal,
+ Args);
}
TextComment *Sema::actOnText(SourceLocation LocBegin,
@@ -445,7 +452,7 @@
.Default(0);
}
-bool Sema::isInlineCommand(StringRef Name) {
+bool Sema::isInlineCommand(StringRef Name) const {
return llvm::StringSwitch<bool>(Name)
.Case("b", true)
.Cases("c", "p", true)
@@ -453,6 +460,17 @@
.Default(false);
}
+InlineCommandComment::RenderKind
+Sema::getInlineCommandRenderKind(StringRef Name) const {
+ assert(isInlineCommand(Name));
+
+ return llvm::StringSwitch<InlineCommandComment::RenderKind>(Name)
+ .Case("b", InlineCommandComment::RenderBold)
+ .Cases("c", "p", InlineCommandComment::RenderMonospaced)
+ .Cases("a", "e", "em", InlineCommandComment::RenderEmphasized)
+ .Default(InlineCommandComment::RenderNormal);
+}
+
bool Sema::isHTMLEndTagOptional(StringRef Name) {
return llvm::StringSwitch<bool>(Name)
.Case("p", true)
Modified: cfe/trunk/test/Index/annotate-comments.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/annotate-comments.cpp?rev=160633&r1=160632&r2=160633&view=diff
==============================================================================
--- cfe/trunk/test/Index/annotate-comments.cpp (original)
+++ cfe/trunk/test/Index/annotate-comments.cpp Mon Jul 23 11:43:01 2012
@@ -572,25 +572,25 @@
// CHECK-NEXT: (CXComment_FullComment
// CHECK-NEXT: (CXComment_Paragraph
// CHECK-NEXT: (CXComment_Text Text=[ ] IsWhitespace)
-// CHECK-NEXT: (CXComment_InlineCommand CommandName=[b] Arg[0]=Aaa)))]
+// CHECK-NEXT: (CXComment_InlineCommand CommandName=[b] RenderBold Arg[0]=Aaa)))]
// CHECK: annotate-comments.cpp:307:6: FunctionDecl=comment_to_html_conversion_19:{{.*}} FullCommentAsHTML=[<p class="para-brief"> <tt>Aaa</tt> <tt>Bbb</tt></p>]
// CHECK-NEXT: CommentAST=[
// CHECK-NEXT: (CXComment_FullComment
// CHECK-NEXT: (CXComment_Paragraph
// CHECK-NEXT: (CXComment_Text Text=[ ] IsWhitespace)
-// CHECK-NEXT: (CXComment_InlineCommand CommandName=[c] Arg[0]=Aaa)
+// CHECK-NEXT: (CXComment_InlineCommand CommandName=[c] RenderMonospaced Arg[0]=Aaa)
// CHECK-NEXT: (CXComment_Text Text=[ ] IsWhitespace)
-// CHECK-NEXT: (CXComment_InlineCommand CommandName=[p] Arg[0]=Bbb)))]
+// CHECK-NEXT: (CXComment_InlineCommand CommandName=[p] RenderMonospaced Arg[0]=Bbb)))]
// CHECK: annotate-comments.cpp:310:6: FunctionDecl=comment_to_html_conversion_20:{{.*}} FullCommentAsHTML=[<p class="para-brief"> <em>Aaa</em> <em>Bbb</em> <em>Ccc</em></p>]
// CHECK-NEXT: CommentAST=[
// CHECK-NEXT: (CXComment_FullComment
// CHECK-NEXT: (CXComment_Paragraph
// CHECK-NEXT: (CXComment_Text Text=[ ] IsWhitespace)
-// CHECK-NEXT: (CXComment_InlineCommand CommandName=[a] Arg[0]=Aaa)
+// CHECK-NEXT: (CXComment_InlineCommand CommandName=[a] RenderEmphasized Arg[0]=Aaa)
// CHECK-NEXT: (CXComment_Text Text=[ ] IsWhitespace)
-// CHECK-NEXT: (CXComment_InlineCommand CommandName=[e] Arg[0]=Bbb)
+// CHECK-NEXT: (CXComment_InlineCommand CommandName=[e] RenderEmphasized Arg[0]=Bbb)
// CHECK-NEXT: (CXComment_Text Text=[ ] IsWhitespace)
-// CHECK-NEXT: (CXComment_InlineCommand CommandName=[em] Arg[0]=Ccc)))]
+// CHECK-NEXT: (CXComment_InlineCommand CommandName=[em] RenderEmphasized Arg[0]=Ccc)))]
// CHECK: annotate-comments.cpp:313:6: FunctionDecl=comment_to_html_conversion_21:{{.*}} FullCommentAsHTML=[<p class="para-brief"> \ @ & $ # < > % " . ::</p>]
// CHECK-NEXT: CommentAST=[
// CHECK-NEXT: (CXComment_FullComment
Modified: cfe/trunk/tools/c-index-test/c-index-test.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=160633&r1=160632&r2=160633&view=diff
==============================================================================
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)
+++ cfe/trunk/tools/c-index-test/c-index-test.c Mon Jul 23 11:43:01 2012
@@ -283,6 +283,20 @@
PrintCXStringWithPrefixAndDispose(
"CommandName",
clang_InlineCommandComment_getCommandName(Comment));
+ switch (clang_InlineCommandComment_getRenderKind(Comment)) {
+ case CXCommentInlineCommandRenderKind_Normal:
+ printf(" RenderNormal");
+ break;
+ case CXCommentInlineCommandRenderKind_Bold:
+ printf(" RenderBold");
+ break;
+ case CXCommentInlineCommandRenderKind_Monospaced:
+ printf(" RenderMonospaced");
+ break;
+ case CXCommentInlineCommandRenderKind_Emphasized:
+ printf(" RenderEmphasized");
+ break;
+ }
for (i = 0, e = clang_InlineCommandComment_getNumArgs(Comment);
i != e; ++i) {
printf(" Arg[%u]=", i);
Modified: cfe/trunk/tools/libclang/CXComment.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXComment.cpp?rev=160633&r1=160632&r2=160633&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CXComment.cpp (original)
+++ cfe/trunk/tools/libclang/CXComment.cpp Mon Jul 23 11:43:01 2012
@@ -126,6 +126,28 @@
return createCXString(ICC->getCommandName(), /*DupString=*/ false);
}
+enum CXCommentInlineCommandRenderKind
+clang_InlineCommandComment_getRenderKind(CXComment CXC) {
+ const InlineCommandComment *ICC = getASTNodeAs<InlineCommandComment>(CXC);
+ if (!ICC)
+ return CXCommentInlineCommandRenderKind_Normal;
+
+ switch (ICC->getRenderKind()) {
+ case InlineCommandComment::RenderNormal:
+ return CXCommentInlineCommandRenderKind_Normal;
+
+ case InlineCommandComment::RenderBold:
+ return CXCommentInlineCommandRenderKind_Bold;
+
+ case InlineCommandComment::RenderMonospaced:
+ return CXCommentInlineCommandRenderKind_Monospaced;
+
+ case InlineCommandComment::RenderEmphasized:
+ return CXCommentInlineCommandRenderKind_Emphasized;
+ }
+ llvm_unreachable("unknown InlineCommandComment::RenderKind");
+}
+
unsigned clang_InlineCommandComment_getNumArgs(CXComment CXC) {
const InlineCommandComment *ICC = getASTNodeAs<InlineCommandComment>(CXC);
if (!ICC)
@@ -344,34 +366,34 @@
void CommentASTToHTMLConverter::visitInlineCommandComment(
const InlineCommandComment *C) {
- StringRef CommandName = C->getCommandName();
- bool HasArg0 = C->getNumArgs() > 0 && !C->getArgText(0).empty();
- StringRef Arg0;
- if (HasArg0)
- Arg0 = C->getArgText(0);
-
- if (CommandName == "b") {
- if (!HasArg0)
- return;
+ // Nothing to render if no arguments supplied.
+ if (C->getNumArgs() == 0)
+ return;
+
+ // Nothing to render if argument is empty.
+ StringRef Arg0 = C->getArgText(0);
+ if (Arg0.empty())
+ return;
+
+ switch (C->getRenderKind()) {
+ case InlineCommandComment::RenderNormal:
+ for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
+ Result << C->getArgText(i) << " ";
+ return;
+
+ case InlineCommandComment::RenderBold:
+ assert(C->getNumArgs() == 1);
Result << "<b>" << Arg0 << "</b>";
return;
- }
- if (CommandName == "c" || CommandName == "p") {
- if (!HasArg0)
- return;
+ case InlineCommandComment::RenderMonospaced:
+ assert(C->getNumArgs() == 1);
Result << "<tt>" << Arg0 << "</tt>";
return;
- }
- if (CommandName == "a" || CommandName == "e" || CommandName == "em") {
- if (!HasArg0)
- return;
+ case InlineCommandComment::RenderEmphasized:
+ assert(C->getNumArgs() == 1);
Result << "<em>" << Arg0 << "</em>";
return;
}
-
- // We don't recognize this command, so just print its arguments.
- for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
- Result << C->getArgText(i) << " ";
}
void CommentASTToHTMLConverter::visitHTMLStartTagComment(
Modified: cfe/trunk/tools/libclang/libclang.exports
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=160633&r1=160632&r2=160633&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/libclang.exports (original)
+++ cfe/trunk/tools/libclang/libclang.exports Mon Jul 23 11:43:01 2012
@@ -25,6 +25,7 @@
clang_InlineContentComment_hasTrailingNewline
clang_TextComment_getText
clang_InlineCommandComment_getCommandName
+clang_InlineCommandComment_getRenderKind
clang_InlineCommandComment_getNumArgs
clang_InlineCommandComment_getArgText
clang_HTMLTagComment_getTagName
More information about the cfe-commits
mailing list