From: Argyrios Kyrtzidis Date: Wed, 29 May 2013 23:58:31 +0000 (+0000) Subject: [libclang] When indexing a @synthesize, don't consider that it defines a getter/sette... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1bc085aec3901e22b819bb6761d5ccc360194604;p=clang [libclang] When indexing a @synthesize, don't consider that it defines a getter/setter if one is already defined by the user. Fixes rdar://13925258 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182895 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Index/index-decls.m b/test/Index/index-decls.m index c6b14bb8fd..a405abc78c 100644 --- a/test/Index/index-decls.m +++ b/test/Index/index-decls.m @@ -33,6 +33,21 @@ int test1() { return extfn(); } +@interface I4 +@property (assign, nonatomic) id prop; +-(id)prop; +-(void)setProp:(id)p; +@end + +@implementation I4 +@synthesize prop = _prop; +-(id)prop { + return 0; +} +-(void)setProp:(id)p { +} +@end + // RUN: c-index-test -index-file %s -target x86_64-apple-macosx10.7 > %t // RUN: FileCheck %s -input-file=%t // CHECK: [indexDeclaration]: kind: objc-class | name: I | {{.*}} | loc: 1:12 @@ -54,3 +69,7 @@ int test1() { // CHECK: [indexEntityReference]: kind: variable | name: extvar | {{.*}} | loc: 31:3 // CHECK: [indexDeclaration]: kind: function | name: extfn | {{.*}} | loc: 32:14 // CHECK: [indexEntityReference]: kind: function | name: extfn | {{.*}} | loc: 33:10 + +// CHECK: [indexDeclaration]: kind: objc-class | name: I4 | {{.*}} | loc: 36:12 +// CHECK-NOT: [indexDeclaration]: kind: objc-instance-method {{.*}} loc: 37: +// CHECK-NOT: [indexDeclaration]: kind: objc-instance-method {{.*}} loc: 43: diff --git a/tools/libclang/IndexDecl.cpp b/tools/libclang/IndexDecl.cpp index 756001c3c1..89feb96d48 100644 --- a/tools/libclang/IndexDecl.cpp +++ b/tools/libclang/IndexDecl.cpp @@ -22,6 +22,15 @@ public: explicit IndexingDeclVisitor(IndexingContext &indexCtx) : IndexCtx(indexCtx) { } + /// \brief Returns true if the given method has been defined explicitly by the + /// user. + static bool hasUserDefined(const ObjCMethodDecl *D, + const ObjCImplDecl *Container) { + const ObjCMethodDecl *MD = Container->getMethod(D->getSelector(), + D->isInstanceMethod()); + return MD && !MD->isImplicit() && MD->isThisDeclarationADefinition(); + } + void handleDeclarator(const DeclaratorDecl *D, const NamedDecl *Parent = 0) { if (!Parent) Parent = D; @@ -234,12 +243,14 @@ public: } if (ObjCMethodDecl *MD = PD->getGetterMethodDecl()) { - if (MD->isPropertyAccessor()) + if (MD->isPropertyAccessor() && + !hasUserDefined(MD, cast(D->getDeclContext()))) IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation(), D->getLexicalDeclContext()); } if (ObjCMethodDecl *MD = PD->getSetterMethodDecl()) { - if (MD->isPropertyAccessor()) + if (MD->isPropertyAccessor() && + !hasUserDefined(MD, cast(D->getDeclContext()))) IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation(), D->getLexicalDeclContext()); }