summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2018-08-17 23:50:59 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2018-08-17 23:50:59 +0000
commitc0cd01764feffe4e481f1b5c02722783fe219434 (patch)
tree89d021f834cb084598a6bb4ac1284213f8fb48d4
parent96bc076c3a9ab660f830f13a63aee8816a023cc0 (diff)
downloadbcm5719-llvm-c0cd01764feffe4e481f1b5c02722783fe219434.tar.gz
bcm5719-llvm-c0cd01764feffe4e481f1b5c02722783fe219434.zip
[index] For an ObjC message call, also record as receivers the protocols if they are present in the ObjC type
llvm-svn: 340109
-rw-r--r--clang/lib/Index/IndexBody.cpp20
-rw-r--r--clang/test/Index/Core/index-source.m22
2 files changed, 38 insertions, 4 deletions
diff --git a/clang/lib/Index/IndexBody.cpp b/clang/lib/Index/IndexBody.cpp
index d79f0c39671..dd8a1c7b3f7 100644
--- a/clang/lib/Index/IndexBody.cpp
+++ b/clang/lib/Index/IndexBody.cpp
@@ -259,8 +259,24 @@ public:
if (isDynamic(E)) {
Roles |= (unsigned)SymbolRole::Dynamic;
- if (auto *RecD = E->getReceiverInterface())
- Relations.emplace_back((unsigned)SymbolRole::RelationReceivedBy, RecD);
+
+ auto addReceivers = [&](const ObjCObjectType *Ty) {
+ if (!Ty)
+ return;
+ if (const auto *clsD = Ty->getInterface()) {
+ Relations.emplace_back((unsigned)SymbolRole::RelationReceivedBy,
+ clsD);
+ }
+ for (const auto *protD : Ty->quals()) {
+ Relations.emplace_back((unsigned)SymbolRole::RelationReceivedBy,
+ protD);
+ }
+ };
+ QualType recT = E->getReceiverType();
+ if (const auto *Ptr = recT->getAs<ObjCObjectPointerType>())
+ addReceivers(Ptr->getObjectType());
+ else
+ addReceivers(recT->getAs<ObjCObjectType>());
}
return IndexCtx.handleReference(MD, E->getSelectorStartLoc(),
diff --git a/clang/test/Index/Core/index-source.m b/clang/test/Index/Core/index-source.m
index 2931e664eac..c319be63ab9 100644
--- a/clang/test/Index/Core/index-source.m
+++ b/clang/test/Index/Core/index-source.m
@@ -2,7 +2,7 @@
// RUN: c-index-test core -print-source-symbols -include-locals -- %s -target x86_64-apple-macosx10.7 | FileCheck -check-prefix=LOCAL %s
@interface Base
-// CHECK: [[@LINE-1]]:12 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Decl | rel: 0
+// CHECK: [[@LINE-1]]:12 | class/ObjC | Base | [[BASE_USR:.*]] | _OBJC_CLASS_$_Base | Decl | rel: 0
-(void)meth;
// CHECK: [[@LINE-1]]:8 | instance-method/ObjC | meth | c:objc(cs)Base(im)meth | -[Base meth] | Decl,Dyn,RelChild | rel: 1
// CHECK-NEXT: RelChild | Base | c:objc(cs)Base
@@ -60,7 +60,7 @@ void goo(Base *b) {
Base *f = (Base *) 2;
}
-// CHECK: [[@LINE+1]]:11 | protocol/ObjC | Prot1 | c:objc(pl)Prot1 | <no-cgname> | Decl | rel: 0
+// CHECK: [[@LINE+1]]:11 | protocol/ObjC | Prot1 | [[PROT1_USR:.*]] | <no-cgname> | Decl | rel: 0
@protocol Prot1
@end
@@ -472,3 +472,21 @@ void testImplicitProperties(ImplicitProperties *c) {
}
@end
+
+@protocol Prot3 // CHECK: [[@LINE]]:11 | protocol/ObjC | Prot3 | [[PROT3_USR:.*]] | <no-cgname> | Decl |
+-(void)meth;
+@end
+
+void test_rec1() {
+ id<Prot3, Prot1> o1;
+ [o1 meth]; // CHECK: [[@LINE]]:7 | instance-method/ObjC | meth | {{.*}} | Ref,Call,Dyn,RelRec,RelCall,RelCont | rel: 3
+ // CHECK-NEXT: RelCall,RelCont | test_rec1 |
+ // CHECK-NEXT: RelRec | Prot3 | [[PROT3_USR]]
+ // CHECK-NEXT: RelRec | Prot1 | [[PROT1_USR]]
+ Base<Prot3, Prot1> *o2;
+ [o2 meth]; // CHECK: [[@LINE]]:7 | instance-method/ObjC | meth | {{.*}} | Ref,Call,Dyn,RelRec,RelCall,RelCont | rel: 4
+ // CHECK-NEXT: RelCall,RelCont | test_rec1 |
+ // CHECK-NEXT: RelRec | Base | [[BASE_USR]]
+ // CHECK-NEXT: RelRec | Prot3 | [[PROT3_USR]]
+ // CHECK-NEXT: RelRec | Prot1 | [[PROT1_USR]]
+}
OpenPOWER on IntegriCloud