From 390fff8e8b480fa146ffc14cbc63a1c2f9e2d206 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Fri, 8 Jun 2012 02:16:11 +0000 Subject: [PATCH] [libclang/AST] AST: For auto-synthesized ivars give them the location of the related property (previously they had no source location). This allows them to be indexed by libclang. libclang: Make sure synthesized ivars are indexed before the methods that may reference them. Fixes rdar://11607001. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158189 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaObjCProperty.cpp | 2 +- test/Index/index-decls.m | 15 ++++++++++++++- tools/libclang/IndexDecl.cpp | 15 ++++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index 52859d4f6d..91fe0ba92b 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/lib/Sema/SemaObjCProperty.cpp @@ -1502,7 +1502,7 @@ void Sema::DefaultSynthesizeProperties(Scope *S, ObjCImplDecl* IMPDecl, true, /* property = */ Prop->getIdentifier(), /* ivar = */ getDefaultSynthIvarName(Prop, Context), - SourceLocation())); + Prop->getLocation())); if (PIDecl) { Diag(Prop->getLocation(), diag::warn_missing_explicit_synthesis); Diag(IMPDecl->getLocation(), diag::note_while_in_implementation); diff --git a/test/Index/index-decls.m b/test/Index/index-decls.m index 9e4e620497..bf5e2c89ca 100644 --- a/test/Index/index-decls.m +++ b/test/Index/index-decls.m @@ -11,11 +11,21 @@ @synthesize prop = _prop; @end -rdar://11015325 +// rdar://11015325 @interface I1 __attribute__((something)) @interface I2 @end @end +@interface I3 +@property (assign,readwrite) id auto_prop; +@end + +@implementation I3 +-(void)meth { + _auto_prop = 0; +} +@end + // RUN: c-index-test -index-file %s > %t // RUN: FileCheck %s -input-file=%t // CHECK: [indexDeclaration]: kind: objc-class | name: I | {{.*}} | loc: 1:12 @@ -28,3 +38,6 @@ __attribute__((something)) @interface I2 @end // CHECK: [indexDeclaration]: kind: objc-ivar | name: _prop | {{.*}} | loc: 11:20 // CHECK: [indexDeclaration]: kind: objc-instance-method | name: prop | {{.*}} | loc: 11:13 | {{.*}} | lexical-container: [I:10:17] // CHECK: [indexDeclaration]: kind: objc-instance-method | name: setProp: | {{.*}} | loc: 11:13 | {{.*}} | lexical-container: [I:10:17] + +// CHECK: [indexDeclaration]: kind: objc-ivar | name: _auto_prop | {{.*}} | loc: 20:33 +// CHECK: [indexEntityReference]: kind: objc-ivar | name: _auto_prop | {{.*}} | loc: 25:3 diff --git a/tools/libclang/IndexDecl.cpp b/tools/libclang/IndexDecl.cpp index c257c342aa..7560398395 100644 --- a/tools/libclang/IndexDecl.cpp +++ b/tools/libclang/IndexDecl.cpp @@ -154,7 +154,20 @@ public: IndexCtx.handleObjCImplementation(D); IndexCtx.indexTUDeclsInObjCContainer(); - IndexCtx.indexDeclContext(D); + + // Index the ivars first to make sure the synthesized ivars are indexed + // before indexing the methods that can reference them. + for (ObjCImplementationDecl::ivar_iterator + IvarI = D->ivar_begin(), + IvarE = D->ivar_end(); IvarI != IvarE; ++IvarI) { + IndexCtx.indexDecl(*IvarI); + } + for (DeclContext::decl_iterator + I = D->decls_begin(), E = D->decls_end(); I != E; ++I) { + if (!isa(*I)) + IndexCtx.indexDecl(*I); + } + return true; } -- 2.40.0