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
This commit is contained in:
Fariborz Jahanian 2013-03-05 19:40:47 +00:00
Родитель 971023066c
Коммит bca9788dba
7 изменённых файлов: 46 добавлений и 19 удалений

Просмотреть файл

@ -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">;

Просмотреть файл

@ -206,6 +206,7 @@ public:
void resolveParamCommandIndexes(const FullComment *FC);
bool isFunctionDecl();
bool isCallbackDecl();
bool isObjCPropertyDecl();
bool isTemplateOrSpecialization();

Просмотреть файл

@ -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<

Просмотреть файл

@ -706,8 +706,6 @@ VerbatimLineComment *Parser::parseVerbatimLine() {
TextBegin,
Text);
consumeToken();
S.checkFunctionDeclVerbatimLine(VL);
return VL;
}

Просмотреть файл

@ -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;

Просмотреть файл

@ -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);

Просмотреть файл

@ -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