Attach enum's documentation to its typedef if
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 25 Jan 2013 22:48:32 +0000 (22:48 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 25 Jan 2013 22:48:32 +0000 (22:48 +0000)
latter does not have one of its own. // rdar://13067629

llvm-svn: 173516

clang/lib/AST/ASTContext.cpp
clang/test/Index/annotate-comments-typedef.m [new file with mode: 0644]

index 0b77174..b0cea14 100644 (file)
@@ -434,6 +434,16 @@ comments::FullComment *ASTContext::getCommentForDecl(
         }
       }
     }
+    else if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
+      QualType QT = TD->getUnderlyingType();
+      if (const EnumType *ET = QT->getAs<EnumType>()) {
+        if (const EnumDecl *ED = ET->getDecl())
+          if (comments::FullComment *FC = getCommentForDecl(ED, PP)) {
+            comments::FullComment *CFC = cloneFullComment(FC, D);
+            return CFC;
+          }
+      }
+    }
     return NULL;
   }
   
diff --git a/clang/test/Index/annotate-comments-typedef.m b/clang/test/Index/annotate-comments-typedef.m
new file mode 100644 (file)
index 0000000..0a87a7d
--- /dev/null
@@ -0,0 +1,30 @@
+// RUN: rm -rf %t
+// RUN: mkdir %t
+// RUN: c-index-test -test-load-source all -comments-xml-schema=%S/../../bindings/xml/comment-xml-schema.rng %s > %t/out
+// RUN: FileCheck %s < %t/out
+// rdar://13067629
+
+// Ensure that XML we generate is not invalid.
+// RUN: FileCheck %s -check-prefix=WRONG < %t/out
+// WRONG-NOT: CommentXMLInvalid
+
+/** Documentation for NSUInteger */
+typedef unsigned int NSUInteger;
+
+/** Documentation for MyEnum */
+typedef enum : NSUInteger {
+        MyEnumFoo, /**< value Foo */
+        MyEnumBar, /**< value Bar */
+        MyEnumBaz, /**< value Baz */
+} MyEnum;
+// CHECK: TypedefDecl=MyEnum:[[@LINE-1]]:3 (Definition) FullCommentAsHTML=[<p class="para-brief"> Documentation for MyEnum </p>] FullCommentAsXML=[<Typedef file="{{[^"]+}}annotate-comments-typedef.m" line="[[@LINE-1]]" column="3"><Name>&lt;anonymous&gt;</Name><USR>c:@EA@MyEnum</USR><Declaration>typedef enum MyEnum MyEnum</Declaration><Abstract><Para> Documentation for MyEnum </Para></Abstract></Typedef>] CommentXMLValid
+
+
+/** Documentation for E */
+enum E {
+        MyEnumFoo, /**< value Foo */
+        MyEnumBar, /**< value Bar */
+        MyEnumBaz, /**< value Baz */
+};
+typedef enum E E_T;
+// CHECK: TypedefDecl=E_T:[[@LINE-1]]:16 (Definition) FullCommentAsHTML=[<p class="para-brief"> Documentation for E </p>] FullCommentAsXML=[<Typedef file="{{[^"]+}}annotate-comments-typedef.m" line="[[@LINE-1]]" column="16"><Name>E</Name><USR>c:@E@E</USR><Declaration>typedef enum E E_T</Declaration><Abstract><Para> Documentation for E </Para></Abstract></Typedef>] CommentXMLValid