aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-03-05 19:40:47 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-03-05 19:40:47 +0000
commitbca9788dbaf5fcf241efdc82ddcda712cb22214e (patch)
tree3202fa56d48f01ba067e152f305d63934b6c7bca
parent971023066ce2a20aa693cc981412d015bac304b9 (diff)
doc parsing. Add @method and @callback for
checkings and few other refactoring/cleanup. // rdar://13094352. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176509 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/CommentCommands.td4
-rw-r--r--include/clang/AST/CommentSema.h1
-rw-r--r--include/clang/Basic/DiagnosticCommentKinds.td4
-rw-r--r--lib/AST/CommentParser.cpp2
-rw-r--r--lib/AST/CommentSema.cpp24
-rw-r--r--test/Sema/warn-documentation.cpp22
-rw-r--r--test/Sema/warn-documentation.m8
7 files changed, 46 insertions, 19 deletions
diff --git a/include/clang/AST/CommentCommands.td b/include/clang/AST/CommentCommands.td
index 50abc5948c..f3d9baab43 100644
--- a/include/clang/AST/CommentCommands.td
+++ b/include/clang/AST/CommentCommands.td
@@ -187,8 +187,8 @@ def Protocol : DeclarationVerbatimLineCommand<"protocol">;
def Category : DeclarationVerbatimLineCommand<"category">;
def Template : DeclarationVerbatimLineCommand<"template">;
def Function : FunctionDeclarationVerbatimLineCommand<"function">;
-def Method : DeclarationVerbatimLineCommand<"method">;
-def Callback : DeclarationVerbatimLineCommand<"callback">;
+def Method : FunctionDeclarationVerbatimLineCommand<"method">;
+def Callback : FunctionDeclarationVerbatimLineCommand<"callback">;
def Const : DeclarationVerbatimLineCommand<"const">;
def Constant : DeclarationVerbatimLineCommand<"constant">;
def Struct : DeclarationVerbatimLineCommand<"struct">;
diff --git a/include/clang/AST/CommentSema.h b/include/clang/AST/CommentSema.h
index 6df48dcce1..7b81077b50 100644
--- a/include/clang/AST/CommentSema.h
+++ b/include/clang/AST/CommentSema.h
@@ -206,6 +206,7 @@ public:
void resolveParamCommandIndexes(const FullComment *FC);
bool isFunctionDecl();
+ bool isCallbackDecl();
bool isObjCPropertyDecl();
bool isTemplateOrSpecialization();
diff --git a/include/clang/Basic/DiagnosticCommentKinds.td b/include/clang/Basic/DiagnosticCommentKinds.td
index 5f28625151..2ee9327816 100644
--- a/include/clang/Basic/DiagnosticCommentKinds.td
+++ b/include/clang/Basic/DiagnosticCommentKinds.td
@@ -74,8 +74,8 @@ def warn_doc_param_not_attached_to_a_function_decl : Warning<
InGroup<Documentation>, DefaultIgnore;
def warn_doc_function_not_attached_to_a_function_decl : Warning<
- "'@function' command used in a comment that is attached to "
- "a non-function declaration immediately following it">,
+ "'%select{\\|@}0%1' command used in a comment that is attached to a non-%2 "
+ "declaration immediately following it">,
InGroup<Documentation>, DefaultIgnore;
def warn_doc_param_duplicate : Warning<
diff --git a/lib/AST/CommentParser.cpp b/lib/AST/CommentParser.cpp
index c361679e90..09912c6188 100644
--- a/lib/AST/CommentParser.cpp
+++ b/lib/AST/CommentParser.cpp
@@ -706,8 +706,6 @@ VerbatimLineComment *Parser::parseVerbatimLine() {
TextBegin,
Text);
consumeToken();
- S.checkFunctionDeclVerbatimLine(VL);
-
return VL;
}
diff --git a/lib/AST/CommentSema.cpp b/lib/AST/CommentSema.cpp
index 0cf7b5fd50..8adaa9526f 100644
--- a/lib/AST/CommentSema.cpp
+++ b/lib/AST/CommentSema.cpp
@@ -1,4 +1,4 @@
-//===--- CommentSema.cpp - Doxygen comment semantic analysis --------------===//
+class//===--- CommentSema.cpp - Doxygen comment semantic analysis --------------===//
//
// The LLVM Compiler Infrastructure
//
@@ -91,9 +91,11 @@ ParamCommandComment *Sema::actOnParamCommandStart(
void Sema::checkFunctionDeclVerbatimLine(const BlockCommandComment *Comment) {
const CommandInfo *Info = Traits.getCommandInfo(Comment->getCommandID());
if (Info->IsFunctionDeclarationCommand &&
- !isFunctionDecl())
+ !isFunctionDecl() && !isCallbackDecl())
Diag(Comment->getLocation(),
diag::warn_doc_function_not_attached_to_a_function_decl)
+ << Comment->getCommandMarker()
+ << Info->Name << Info->Name
<< Comment->getSourceRange();
}
@@ -346,12 +348,14 @@ VerbatimLineComment *Sema::actOnVerbatimLine(SourceLocation LocBegin,
unsigned CommandID,
SourceLocation TextBegin,
StringRef Text) {
- return new (Allocator) VerbatimLineComment(
+ VerbatimLineComment *VL = new (Allocator) VerbatimLineComment(
LocBegin,
TextBegin.getLocWithOffset(Text.size()),
CommandID,
TextBegin,
Text);
+ checkFunctionDeclVerbatimLine(VL);
+ return VL;
}
HTMLStartTagComment *Sema::actOnHTMLStartTagStart(SourceLocation LocBegin,
@@ -682,6 +686,20 @@ bool Sema::isFunctionDecl() {
return ThisDeclInfo->getKind() == DeclInfo::FunctionKind;
}
+bool Sema::isCallbackDecl() {
+ if (!ThisDeclInfo)
+ return false;
+ if (!ThisDeclInfo->IsFilled)
+ inspectThisDecl();
+ if (ThisDeclInfo->getKind() == DeclInfo::VariableKind) {
+ if (const VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDeclInfo->CurrentDecl)) {
+ QualType QT = VD->getType();
+ return QT->isFunctionPointerType();
+ }
+ }
+ return false;
+}
+
bool Sema::isObjCPropertyDecl() {
if (!ThisDeclInfo)
return false;
diff --git a/test/Sema/warn-documentation.cpp b/test/Sema/warn-documentation.cpp
index 8b38ddd81a..0e5fef823e 100644
--- a/test/Sema/warn-documentation.cpp
+++ b/test/Sema/warn-documentation.cpp
@@ -548,6 +548,18 @@ namespace test_returns_wrong_decl_10 { };
/// @returns Aaa
typedef unsigned int test_returns_wrong_decl_11;
+// rdar://13094352
+// expected-warning@+1 {{'@function' command used in a comment that is attached to a non-function declaration immediately following it}}
+/*! @function test_function
+*/
+typedef unsigned int Base64Flags;
+unsigned test_function(Base64Flags inFlags);
+
+// expected-warning@+1 {{'@callback' command used in a comment that is attached to a non-callback declaration immediately following it}}
+/*! @callback test_callback
+*/
+typedef unsigned int BaseFlags;
+unsigned (*test_callback)(BaseFlags inFlags);
// expected-warning@+1 {{'\endverbatim' command does not terminate a verbatim text block}}
/// \endverbatim
@@ -910,13 +922,3 @@ int test_nocrash12();
// expected-warning@+1 {{empty paragraph passed to '@param' command}}
///@param x@param y
int test_nocrash13(int x, int y);
-
-// expected-warning@+3 {{'@function' command used in a comment that is attached to a non-function declaration immediately following it}}
-// expected-warning@+3 {{'@param' command used in a comment that is not attached to a function declaration}}
-// expected-warning@+3 {{'@result' command used in a comment that is not attached to a function or method declaration}}
-/*! @function Base64EncodeEx
- @param inFlags This is error flag
- @result Error
-*/
-typedef unsigned int Base64Flags;
-unsigned Base64EncodeEx(Base64Flags inFlags);
diff --git a/test/Sema/warn-documentation.m b/test/Sema/warn-documentation.m
index 8a894dca70..cfa84870e8 100644
--- a/test/Sema/warn-documentation.m
+++ b/test/Sema/warn-documentation.m
@@ -97,3 +97,11 @@ int b;
/// \returns aaa.
typedef int (^test_param1)(int aaa, int ccc);
+// rdar://13094352
+// expected-warning@+2 {{'@method' command used in a comment that is attached to a non-method declaration immediately following it}}
+@interface I
+/*! @method Base64EncodeEx
+*/
+typedef id ID;
+- (unsigned) Base64EncodeEx : (ID)Arg;
+@end