From bca9788dbaf5fcf241efdc82ddcda712cb22214e Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 5 Mar 2013 19:40:47 +0000 Subject: [PATCH] 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 --- include/clang/AST/CommentCommands.td | 4 ++-- include/clang/AST/CommentSema.h | 1 + include/clang/Basic/DiagnosticCommentKinds.td | 4 ++-- lib/AST/CommentParser.cpp | 2 -- lib/AST/CommentSema.cpp | 24 ++++++++++++++++--- test/Sema/warn-documentation.cpp | 22 +++++++++-------- test/Sema/warn-documentation.m | 8 +++++++ 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, 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, 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(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