r204942 - Comment parsing: attach comments to enums declared using the NS_ENUM macro

Richard Smith richard at metafoo.co.uk
Fri Apr 11 12:47:37 PDT 2014


On Thu, Mar 27, 2014 at 9:40 AM, Dmitri Gribenko <gribozavr at gmail.com>wrote:

> Author: gribozavr
> Date: Thu Mar 27 11:40:51 2014
> New Revision: 204942
>
> URL: http://llvm.org/viewvc/llvm-project?rev=204942&view=rev
> Log:
> Comment parsing: attach comments to enums declared using the NS_ENUM macro
>
> Previously we would only attach comments to the typedef.
>
> Modified:
>     cfe/trunk/lib/AST/ASTContext.cpp
>     cfe/trunk/test/Index/annotate-comments-objc.m
>     cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp
>
> Modified: cfe/trunk/lib/AST/ASTContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=204942&r1=204941&r2=204942&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> +++ cfe/trunk/lib/AST/ASTContext.cpp Thu Mar 27 11:40:51 2014
> @@ -145,11 +145,23 @@ RawComment *ASTContext::getRawCommentFor
>      DeclLoc = D->getLocStart();
>    else {
>      DeclLoc = D->getLocation();
> -    // If location of the typedef name is in a macro, it is because being
> -    // declared via a macro. Try using declaration's starting location
> -    // as the "declaration location".
> -    if (DeclLoc.isMacroID() && isa<TypedefDecl>(D))
> -      DeclLoc = D->getLocStart();
> +    if (DeclLoc.isMacroID()) {
> +      if (isa<TypedefDecl>(D)) {
>

Should this be TypedefNameDecl? (That also covers C++11 alias declarations,
which are another syntax for typedefs.)


> +        // If location of the typedef name is in a macro, it is because
> being
> +        // declared via a macro. Try using declaration's starting
> location as
> +        // the "declaration location".
> +        DeclLoc = D->getLocStart();
> +      } else if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {
> +        // If location of the tag decl is inside a macro, but the
> spelling of
> +        // the tag name comes from a macro argument, it looks like a
> special
> +        // macro like NS_ENUM is being used to define the tag decl.  In
> that
> +        // case, adjust the source location to the expansion loc so that
> we can
> +        // attach the comment to the tag decl.
> +        if (SourceMgr.isMacroArgExpansion(DeclLoc) &&
> +            TD->isCompleteDefinition())
> +          DeclLoc = SourceMgr.getExpansionLoc(DeclLoc);
> +      }
> +    }
>    }
>
>    // If the declaration doesn't map directly to a location in a file, we
>
> Modified: cfe/trunk/test/Index/annotate-comments-objc.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/annotate-comments-objc.m?rev=204942&r1=204941&r2=204942&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Index/annotate-comments-objc.m (original)
> +++ cfe/trunk/test/Index/annotate-comments-objc.m Thu Mar 27 11:40:51 2014
> @@ -32,6 +32,32 @@ void functionBeforeImports(void);
>  - (void)method1_isdoxy4; /*!< method1_isdoxy4 IS_DOXYGEN_SINGLE */
>  @end
>
> +//===---
> +// rdar://14348912
> +// Check that we attach comments to enums declared using the NS_ENUM
> macro.
> +//===---
> +
> +#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
> +
> +/// An_NS_ENUM_isdoxy1 IS_DOXYGEN_SINGLE
> +typedef NS_ENUM(int, An_NS_ENUM_isdoxy1) { Red, Green, Blue };
> +
> +// In the implementation of attaching comments to enums declared using the
> +// NS_ENUM macro, it is tempting to use the fact that enum decl is
> embedded in
> +// the typedef.  Make sure that the heuristic is strong enough that it
> does not
> +// attach unrelated comments in the following cases where tag decls are
> +// embedded in declarators.
> +
> +#define DECLARE_FUNCTION() \
> +    void functionFromMacro() { \
> +      typedef struct Struct_notdoxy Struct_notdoxy; \
> +    }
> +
> +/// IS_DOXYGEN_NOT_ATTACHED
> +DECLARE_FUNCTION()
> +
> +/// typedef_isdoxy1 IS_DOXYGEN_SINGLE
> +typedef struct Struct_notdoxy *typedef_isdoxy1;
>
>  #endif
>
> @@ -91,4 +117,8 @@ void functionBeforeImports(void);
>  // CHECK: annotate-comments-objc.m:30:9:
> ObjCInstanceMethodDecl=method1_isdoxy2:{{.*}} method1_isdoxy2
> IS_DOXYGEN_SINGLE
>  // CHECK: annotate-comments-objc.m:31:9:
> ObjCInstanceMethodDecl=method1_isdoxy3:{{.*}} method1_isdoxy3
> IS_DOXYGEN_SINGLE
>  // CHECK: annotate-comments-objc.m:32:9:
> ObjCInstanceMethodDecl=method1_isdoxy4:{{.*}} method1_isdoxy4
> IS_DOXYGEN_SINGLE
> +// CHECK: annotate-comments-objc.m:43:22:
> EnumDecl=An_NS_ENUM_isdoxy1:{{.*}} An_NS_ENUM_isdoxy1 IS_DOXYGEN_SINGLE
> +// CHECK: annotate-comments-objc.m:43:22:
> TypedefDecl=An_NS_ENUM_isdoxy1:{{.*}} An_NS_ENUM_isdoxy1 IS_DOXYGEN_SINGLE
> +// CHECK: annotate-comments-objc.m:43:22:
> EnumDecl=An_NS_ENUM_isdoxy1:{{.*}} An_NS_ENUM_isdoxy1 IS_DOXYGEN_SINGLE
> +// CHECK: annotate-comments-objc.m:60:32:
> TypedefDecl=typedef_isdoxy1:{{.*}} typedef_isdoxy1 IS_DOXYGEN_SINGLE
>
>
> Modified: cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp?rev=204942&r1=204941&r2=204942&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp (original)
> +++ cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp Thu Mar 27
> 11:40:51 2014
> @@ -1015,17 +1015,5 @@ void comment_to_xml_conversion_exception
>  // CHECK-NEXT:         (CXComment_Paragraph
>  // CHECK-NEXT:           (CXComment_Text Text=[ Ccc.]))))]
>
> -
> -// rdar://14348912
> -#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
> -
> -/**! Documentation comment */
> -typedef NS_ENUM(int, Color) { Red, Green, Blue };
> -// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-1]]:22:
> TypedefDecl=Color:[[@LINE-1]]:22
> -// CHECK-NEXT:  CommentAST=[
> -// CHECK-NEXT:    (CXComment_FullComment
> -// CHECK-NEXT:       (CXComment_Paragraph
> -// CHECK-NEXT:         (CXComment_Text Text=[! Documentation comment ])))]
> -
>  #endif
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140411/79751e11/attachment.html>


More information about the cfe-commits mailing list