<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Mar 27, 2014 at 9:40 AM, Dmitri Gribenko <span dir="ltr"><<a href="mailto:gribozavr@gmail.com" target="_blank">gribozavr@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: gribozavr<br>
Date: Thu Mar 27 11:40:51 2014<br>
New Revision: 204942<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=204942&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=204942&view=rev</a><br>
Log:<br>
Comment parsing: attach comments to enums declared using the NS_ENUM macro<br>
<br>
Previously we would only attach comments to the typedef.<br>
<br>
Modified:<br>
    cfe/trunk/lib/AST/ASTContext.cpp<br>
    cfe/trunk/test/Index/annotate-comments-objc.m<br>
    cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/ASTContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=204942&r1=204941&r2=204942&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=204942&r1=204941&r2=204942&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/ASTContext.cpp (original)<br>
+++ cfe/trunk/lib/AST/ASTContext.cpp Thu Mar 27 11:40:51 2014<br>
@@ -145,11 +145,23 @@ RawComment *ASTContext::getRawCommentFor<br>
     DeclLoc = D->getLocStart();<br>
   else {<br>
     DeclLoc = D->getLocation();<br>
-    // If location of the typedef name is in a macro, it is because being<br>
-    // declared via a macro. Try using declaration's starting location<br>
-    // as the "declaration location".<br>
-    if (DeclLoc.isMacroID() && isa<TypedefDecl>(D))<br>
-      DeclLoc = D->getLocStart();<br>
+    if (DeclLoc.isMacroID()) {<br>
+      if (isa<TypedefDecl>(D)) {<br></blockquote><div><br></div><div>Should this be TypedefNameDecl? (That also covers C++11 alias declarations, which are another syntax for typedefs.)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+        // If location of the typedef name is in a macro, it is because being<br>
+        // declared via a macro. Try using declaration's starting location as<br>
+        // the "declaration location".<br>
+        DeclLoc = D->getLocStart();<br>
+      } else if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {<br>
+        // If location of the tag decl is inside a macro, but the spelling of<br>
+        // the tag name comes from a macro argument, it looks like a special<br>
+        // macro like NS_ENUM is being used to define the tag decl.  In that<br>
+        // case, adjust the source location to the expansion loc so that we can<br>
+        // attach the comment to the tag decl.<br>
+        if (SourceMgr.isMacroArgExpansion(DeclLoc) &&<br>
+            TD->isCompleteDefinition())<br>
+          DeclLoc = SourceMgr.getExpansionLoc(DeclLoc);<br>
+      }<br>
+    }<br>
   }<br>
<br>
   // If the declaration doesn't map directly to a location in a file, we<br>
<br>
Modified: cfe/trunk/test/Index/annotate-comments-objc.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/annotate-comments-objc.m?rev=204942&r1=204941&r2=204942&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/annotate-comments-objc.m?rev=204942&r1=204941&r2=204942&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Index/annotate-comments-objc.m (original)<br>
+++ cfe/trunk/test/Index/annotate-comments-objc.m Thu Mar 27 11:40:51 2014<br>
@@ -32,6 +32,32 @@ void functionBeforeImports(void);<br>
 - (void)method1_isdoxy4; /*!< method1_isdoxy4 IS_DOXYGEN_SINGLE */<br>
 @end<br>
<br>
+//===---<br>
+// rdar://14348912<br>
+// Check that we attach comments to enums declared using the NS_ENUM macro.<br>
+//===---<br>
+<br>
+#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type<br>
+<br>
+/// An_NS_ENUM_isdoxy1 IS_DOXYGEN_SINGLE<br>
+typedef NS_ENUM(int, An_NS_ENUM_isdoxy1) { Red, Green, Blue };<br>
+<br>
+// In the implementation of attaching comments to enums declared using the<br>
+// NS_ENUM macro, it is tempting to use the fact that enum decl is embedded in<br>
+// the typedef.  Make sure that the heuristic is strong enough that it does not<br>
+// attach unrelated comments in the following cases where tag decls are<br>
+// embedded in declarators.<br>
+<br>
+#define DECLARE_FUNCTION() \<br>
+    void functionFromMacro() { \<br>
+      typedef struct Struct_notdoxy Struct_notdoxy; \<br>
+    }<br>
+<br>
+/// IS_DOXYGEN_NOT_ATTACHED<br>
+DECLARE_FUNCTION()<br>
+<br>
+/// typedef_isdoxy1 IS_DOXYGEN_SINGLE<br>
+typedef struct Struct_notdoxy *typedef_isdoxy1;<br>
<br>
 #endif<br>
<br>
@@ -91,4 +117,8 @@ void functionBeforeImports(void);<br>
 // CHECK: annotate-comments-objc.m:30:9: ObjCInstanceMethodDecl=method1_isdoxy2:{{.*}} method1_isdoxy2 IS_DOXYGEN_SINGLE<br>
 // CHECK: annotate-comments-objc.m:31:9: ObjCInstanceMethodDecl=method1_isdoxy3:{{.*}} method1_isdoxy3 IS_DOXYGEN_SINGLE<br>
 // CHECK: annotate-comments-objc.m:32:9: ObjCInstanceMethodDecl=method1_isdoxy4:{{.*}} method1_isdoxy4 IS_DOXYGEN_SINGLE<br>
+// CHECK: annotate-comments-objc.m:43:22: EnumDecl=An_NS_ENUM_isdoxy1:{{.*}} An_NS_ENUM_isdoxy1 IS_DOXYGEN_SINGLE<br>
+// CHECK: annotate-comments-objc.m:43:22: TypedefDecl=An_NS_ENUM_isdoxy1:{{.*}} An_NS_ENUM_isdoxy1 IS_DOXYGEN_SINGLE<br>
+// CHECK: annotate-comments-objc.m:43:22: EnumDecl=An_NS_ENUM_isdoxy1:{{.*}} An_NS_ENUM_isdoxy1 IS_DOXYGEN_SINGLE<br>
+// CHECK: annotate-comments-objc.m:60:32: TypedefDecl=typedef_isdoxy1:{{.*}} typedef_isdoxy1 IS_DOXYGEN_SINGLE<br>
<br>
<br>
Modified: cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp?rev=204942&r1=204941&r2=204942&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp?rev=204942&r1=204941&r2=204942&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp (original)<br>
+++ cfe/trunk/test/Index/comment-to-html-xml-conversion.cpp Thu Mar 27 11:40:51 2014<br>
@@ -1015,17 +1015,5 @@ void comment_to_xml_conversion_exception<br>
 // CHECK-NEXT:         (CXComment_Paragraph<br>
 // CHECK-NEXT:           (CXComment_Text Text=[ Ccc.]))))]<br>
<br>
-<br>
-// rdar://14348912<br>
-#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type<br>
-<br>
-/**! Documentation comment */<br>
-typedef NS_ENUM(int, Color) { Red, Green, Blue };<br>
-// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-1]]:22: TypedefDecl=Color:[[@LINE-1]]:22<br>
-// CHECK-NEXT:  CommentAST=[<br>
-// CHECK-NEXT:    (CXComment_FullComment<br>
-// CHECK-NEXT:       (CXComment_Paragraph<br>
-// CHECK-NEXT:         (CXComment_Text Text=[! Documentation comment ])))]<br>
-<br>
 #endif<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>