r267117 - [index] Add a SymbolSubKind for an ObjC unit test.

Argyrios Kyrtzidis via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 22 00:21:11 PDT 2016


Author: akirtzidis
Date: Fri Apr 22 02:21:10 2016
New Revision: 267117

URL: http://llvm.org/viewvc/llvm-project?rev=267117&view=rev
Log:
[index] Add a SymbolSubKind for an ObjC unit test.

Added:
    cfe/trunk/test/Index/Core/index-subkinds.m
Modified:
    cfe/trunk/include/clang/Index/IndexSymbol.h
    cfe/trunk/lib/Index/IndexSymbol.cpp
    cfe/trunk/tools/c-index-test/core_main.cpp

Modified: cfe/trunk/include/clang/Index/IndexSymbol.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexSymbol.h?rev=267117&r1=267116&r2=267117&view=diff
==============================================================================
--- cfe/trunk/include/clang/Index/IndexSymbol.h (original)
+++ cfe/trunk/include/clang/Index/IndexSymbol.h Fri Apr 22 02:21:10 2016
@@ -63,8 +63,9 @@ enum class SymbolSubKind : uint8_t {
   Generic                       = 1 << 0,
   TemplatePartialSpecialization = 1 << 1,
   TemplateSpecialization        = 1 << 2,
+  UnitTest                      = 1 << 3,
 };
-static const unsigned SymbolSubKindBitNum = 3;
+static const unsigned SymbolSubKindBitNum = 4;
 typedef unsigned SymbolSubKindSet;
 
 /// Set of roles that are attributed to symbol occurrences.

Modified: cfe/trunk/lib/Index/IndexSymbol.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexSymbol.cpp?rev=267117&r1=267116&r2=267117&view=diff
==============================================================================
--- cfe/trunk/lib/Index/IndexSymbol.cpp (original)
+++ cfe/trunk/lib/Index/IndexSymbol.cpp Fri Apr 22 02:21:10 2016
@@ -16,6 +16,30 @@
 using namespace clang;
 using namespace clang::index;
 
+/// \returns true if \c D is a subclass of 'XCTestCase'.
+static bool isUnitTestCase(const ObjCInterfaceDecl *D) {
+  if (!D)
+    return false;
+  while (const ObjCInterfaceDecl *SuperD = D->getSuperClass()) {
+    if (SuperD->getName() == "XCTestCase")
+      return true;
+    D = SuperD;
+  }
+  return false;
+}
+
+/// \returns true if \c D is in a subclass of 'XCTestCase', returns void, has
+/// no parameters, and its name starts with 'test'.
+static bool isUnitTest(const ObjCMethodDecl *D) {
+  if (!D->parameters().empty())
+    return false;
+  if (!D->getReturnType()->isVoidType())
+    return false;
+  if (!D->getSelector().getNameForSlot(0).startswith("test"))
+    return false;
+  return isUnitTestCase(D->getClassInterface());
+}
+
 SymbolInfo index::getSymbolInfo(const Decl *D) {
   assert(D);
   SymbolInfo Info;
@@ -84,10 +108,16 @@ SymbolInfo index::getSymbolInfo(const De
     case Decl::EnumConstant:
       Info.Kind = SymbolKind::EnumConstant; break;
     case Decl::ObjCInterface:
-    case Decl::ObjCImplementation:
+    case Decl::ObjCImplementation: {
       Info.Kind = SymbolKind::Class;
       Info.Lang = SymbolLanguage::ObjC;
+      const ObjCInterfaceDecl *ClsD = dyn_cast<ObjCInterfaceDecl>(D);
+      if (!ClsD)
+        ClsD = cast<ObjCImplementationDecl>(D)->getClassInterface();
+      if (isUnitTestCase(ClsD))
+        Info.SubKinds |= (unsigned)SymbolSubKind::UnitTest;
       break;
+    }
     case Decl::ObjCProtocol:
       Info.Kind = SymbolKind::Protocol;
       Info.Lang = SymbolLanguage::ObjC;
@@ -103,6 +133,8 @@ SymbolInfo index::getSymbolInfo(const De
       else
         Info.Kind = SymbolKind::ClassMethod;
       Info.Lang = SymbolLanguage::ObjC;
+      if (isUnitTest(cast<ObjCMethodDecl>(D)))
+        Info.SubKinds |= (unsigned)SymbolSubKind::UnitTest;
       break;
     case Decl::ObjCProperty:
       Info.Kind = SymbolKind::InstanceProperty;
@@ -314,6 +346,7 @@ void index::applyForEachSymbolSubKind(Sy
   APPLY_FOR_SUBKIND(Generic);
   APPLY_FOR_SUBKIND(TemplatePartialSpecialization);
   APPLY_FOR_SUBKIND(TemplateSpecialization);
+  APPLY_FOR_SUBKIND(UnitTest);
 
 #undef APPLY_FOR_SUBKIND
 }
@@ -329,6 +362,7 @@ void index::printSymbolSubKinds(SymbolSu
     case SymbolSubKind::Generic: OS << "Gen"; break;
     case SymbolSubKind::TemplatePartialSpecialization: OS << "TPS"; break;
     case SymbolSubKind::TemplateSpecialization: OS << "TS"; break;
+    case SymbolSubKind::UnitTest: OS << "test"; break;
     }
   });
 }

Added: cfe/trunk/test/Index/Core/index-subkinds.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index-subkinds.m?rev=267117&view=auto
==============================================================================
--- cfe/trunk/test/Index/Core/index-subkinds.m (added)
+++ cfe/trunk/test/Index/Core/index-subkinds.m Fri Apr 22 02:21:10 2016
@@ -0,0 +1,36 @@
+// RUN: c-index-test core -print-source-symbols -- %s -target x86_64-apple-macosx10.7 | FileCheck %s
+
+// CHECK: [[@LINE+1]]:12 | class/ObjC | XCTestCase | c:objc(cs)XCTestCase | _OBJC_CLASS_$_XCTestCase | Decl | rel: 0
+ at interface XCTestCase
+ at end
+
+// CHECK: [[@LINE+1]]:12 | class(test)/ObjC | MyTestCase | c:objc(cs)MyTestCase | _OBJC_CLASS_$_MyTestCase | Decl | rel: 0
+ at interface MyTestCase : XCTestCase
+ at end
+// CHECK: [[@LINE+1]]:17 | class(test)/ObjC | MyTestCase | c:objc(cs)MyTestCase | <no-cgname> | Def | rel: 0
+ at implementation MyTestCase
+// CHECK: [[@LINE+1]]:1 | instance-method(test)/ObjC | testMe | c:objc(cs)MyTestCase(im)testMe | -[MyTestCase testMe] | Def,Dyn,RelChild | rel: 1
+-(void)testMe {}
+// CHECK: [[@LINE+1]]:1 | instance-method/ObjC | testResult | c:objc(cs)MyTestCase(im)testResult | -[MyTestCase testResult] | Def,Dyn,RelChild | rel: 1
+-(id)testResult { return 0; }
+// CHECK: [[@LINE+1]]:1 | instance-method/ObjC | testWithInt: | c:objc(cs)MyTestCase(im)testWithInt: | -[MyTestCase testWithInt:] | Def,Dyn,RelChild | rel: 1
+-(void)testWithInt:(int)i {}
+ at end
+
+// CHECK: [[@LINE+1]]:12 | class(test)/ObjC | SubTestCase | c:objc(cs)SubTestCase | _OBJC_CLASS_$_SubTestCase | Decl | rel: 0
+ at interface SubTestCase : MyTestCase
+ at end
+// CHECK: [[@LINE+1]]:17 | class(test)/ObjC | SubTestCase | c:objc(cs)SubTestCase | <no-cgname> | Def | rel: 0
+ at implementation SubTestCase
+// CHECK: [[@LINE+1]]:1 | instance-method(test)/ObjC | testIt2 | c:objc(cs)SubTestCase(im)testIt2 | -[SubTestCase testIt2] | Def,Dyn,RelChild | rel: 1
+-(void)testIt2 {}
+ at end
+
+// CHECK: [[@LINE+1]]:12 | extension/ObjC | cat | c:objc(cy)MyTestCase at cat | <no-cgname> | Decl | rel: 0
+ at interface MyTestCase(cat)
+ at end
+// CHECK: [[@LINE+1]]:17 | extension/ObjC | MyTestCase | c:objc(cy)MyTestCase at cat | <no-cgname> | Def | rel: 0
+ at implementation MyTestCase(cat)
+// CHECK: [[@LINE+1]]:1 | instance-method(test)/ObjC | testInCat | c:objc(cs)MyTestCase(im)testInCat | -[MyTestCase(cat) testInCat] | Def,Dyn,RelChild | rel: 1
+- (void)testInCat {}
+ at end

Modified: cfe/trunk/tools/c-index-test/core_main.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/core_main.cpp?rev=267117&r1=267116&r2=267117&view=diff
==============================================================================
--- cfe/trunk/tools/c-index-test/core_main.cpp (original)
+++ cfe/trunk/tools/c-index-test/core_main.cpp Fri Apr 22 02:21:10 2016
@@ -169,8 +169,9 @@ static bool printSourceSymbols(ArrayRef<
 static void printSymbolInfo(SymbolInfo SymInfo, raw_ostream &OS) {
   OS << getSymbolKindString(SymInfo.Kind);
   if (SymInfo.SubKinds) {
-    OS << '-';
+    OS << '(';
     printSymbolSubKinds(SymInfo.SubKinds, OS);
+    OS << ')';
   }
   OS << '/' << getSymbolLanguageString(SymInfo.Lang);
 }




More information about the cfe-commits mailing list