Skip to content
Snippets Groups Projects
Commit 0305311a authored by Alex Lorenz's avatar Alex Lorenz
Browse files

[index] Remove 'implicit' role for message sends in implicit ObjC

property references

rdar://32375673


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@307016 91177308-0d34-0410-b5e6-96231b3b80d8
parent b9181e93
No related branches found
No related tags found
No related merge requests found
...@@ -230,7 +230,31 @@ public: ...@@ -230,7 +230,31 @@ public:
SmallVector<SymbolRelation, 2> Relations; SmallVector<SymbolRelation, 2> Relations;
addCallRole(Roles, Relations); addCallRole(Roles, Relations);
Stmt *Containing = getParentStmt(); Stmt *Containing = getParentStmt();
if (E->isImplicit() || (Containing && isa<PseudoObjectExpr>(Containing)))
auto IsImplicitProperty = [](const PseudoObjectExpr *POE) -> bool {
const auto *E = POE->getSyntacticForm();
if (const auto *BinOp = dyn_cast<BinaryOperator>(E))
E = BinOp->getLHS();
const auto *PRE = dyn_cast<ObjCPropertyRefExpr>(E);
if (!PRE)
return false;
if (PRE->isExplicitProperty())
return false;
if (const ObjCMethodDecl *Getter = PRE->getImplicitPropertyGetter()) {
// Class properties that are explicitly defined using @property
// declarations are represented implicitly as there is no ivar for
// class properties.
if (Getter->isClassMethod() &&
Getter->getCanonicalDecl()->findPropertyDecl())
return false;
}
return true;
};
bool IsPropCall = Containing && isa<PseudoObjectExpr>(Containing);
// Implicit property message sends are not 'implicit'.
if ((E->isImplicit() || IsPropCall) &&
!(IsPropCall &&
IsImplicitProperty(cast<PseudoObjectExpr>(Containing))))
Roles |= (unsigned)SymbolRole::Implicit; Roles |= (unsigned)SymbolRole::Implicit;
if (isDynamic(E)) { if (isDynamic(E)) {
......
...@@ -413,3 +413,28 @@ void classReceivers() { ...@@ -413,3 +413,28 @@ void classReceivers() {
(void)ClassReceivers.implicit; (void)ClassReceivers.implicit;
// CHECK: [[@LINE-1]]:9 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,RelCont | rel: 1 // CHECK: [[@LINE-1]]:9 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,RelCont | rel: 1
} }
@interface ImplicitProperties
- (int)implicit;
- (void)setImplicit:(int)x;
+ (int)classImplicit;
+ (void)setClassImplicit:(int)y;
@end
void testImplicitProperties(ImplicitProperties *c) {
c.implicit = 0;
// CHECK: [[@LINE-1]]:5 | instance-method/ObjC | setImplicit: | c:objc(cs)ImplicitProperties(im)setImplicit: | -[ImplicitProperties setImplicit:] | Ref,Call,Dyn,RelRec,RelCall,RelCont | rel: 2
// CHECK-NEXT: RelCall,RelCont | testImplicitProperties | c:@F@testImplicitProperties
c.implicit;
// CHECK: [[@LINE-1]]:5 | instance-method/ObjC | implicit | c:objc(cs)ImplicitProperties(im)implicit | -[ImplicitProperties implicit] | Ref,Call,Dyn,RelRec,RelCall,RelCont | rel: 2
// CHECK-NEXT: RelCall,RelCont | testImplicitProperties | c:@F@testImplicitProperties
ImplicitProperties.classImplicit = 1;
// CHECK: [[@LINE-1]]:22 | class-method/ObjC | setClassImplicit: | c:objc(cs)ImplicitProperties(cm)setClassImplicit: | +[ImplicitProperties setClassImplicit:] | Ref,Call,RelCall,RelCont | rel: 1
// CHECK-NEXT: RelCall,RelCont | testImplicitProperties | c:@F@testImplicitProperties
ImplicitProperties.classImplicit;
// CHECK: [[@LINE-1]]:22 | class-method/ObjC | classImplicit | c:objc(cs)ImplicitProperties(cm)classImplicit | +[ImplicitProperties classImplicit] | Ref,Call,RelCall,RelCont | rel: 1
// CHECK-NEXT: RelCall,RelCont | testImplicitProperties | c:@F@testImplicitProperties
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment