diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-05-18 10:43:11 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-05-18 10:43:11 +0000 |
commit | e1e566d4df7cb4f345ee536a33757d4f2d858adc (patch) | |
tree | b666898231a13a8a74b585dca4e3fb56acceb244 | |
parent | 6bba6068be0d884c15ff78ecf803197f5d84a5e2 (diff) | |
download | bcm5719-llvm-e1e566d4df7cb4f345ee536a33757d4f2d858adc.tar.gz bcm5719-llvm-e1e566d4df7cb4f345ee536a33757d4f2d858adc.zip |
[index] Record references to class receivers used in property references
rdar://32250025
llvm-svn: 303343
-rw-r--r-- | clang/lib/Index/IndexBody.cpp | 3 | ||||
-rw-r--r-- | clang/test/Index/Core/index-source.m | 19 |
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Index/IndexBody.cpp b/clang/lib/Index/IndexBody.cpp index 08d233fb83e..efa5ed85d60 100644 --- a/clang/lib/Index/IndexBody.cpp +++ b/clang/lib/Index/IndexBody.cpp @@ -246,6 +246,9 @@ public: } bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { + if (E->isClassReceiver()) + IndexCtx.handleReference(E->getClassReceiver(), E->getReceiverLocation(), + Parent, ParentDC); if (E->isExplicitProperty()) { SmallVector<SymbolRelation, 2> Relations; SymbolRoleSet Roles = getRolesForRef(E, Relations); diff --git a/clang/test/Index/Core/index-source.m b/clang/test/Index/Core/index-source.m index 041753b9531..7c2f753e71d 100644 --- a/clang/test/Index/Core/index-source.m +++ b/clang/test/Index/Core/index-source.m @@ -385,3 +385,22 @@ Separate separateT; // CHECK: [[@LINE-1]]:1 | type-alias/C | Separate | {{.*}} | {{.*}} | Ref,RelCont | rel: 1 struct Separate separateE; // CHECK: [[@LINE-1]]:8 | struct/C | Separate | {{.*}} | {{.*}} | Ref,RelCont | rel: 1 + +@interface ClassReceivers + +@property(class) int p1; ++ (int)implicit; ++ (void)setImplicit:(int)x; + +@end + +void classReceivers() { + ClassReceivers.p1 = 0; +// CHECK: [[@LINE-1]]:3 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,RelCont | rel: 1 + (void)ClassReceivers.p1; +// CHECK: [[@LINE-1]]:9 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,RelCont | rel: 1 + ClassReceivers.implicit = 0; +// CHECK: [[@LINE-1]]:3 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,RelCont | rel: 1 + (void)ClassReceivers.implicit; +// CHECK: [[@LINE-1]]:9 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,RelCont | rel: 1 +} |