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
This commit is contained in:
Argyrios Kyrtzidis 2012-06-08 02:16:11 +00:00
Родитель 19b17cb57a
Коммит 390fff8e8b
3 изменённых файлов: 29 добавлений и 3 удалений

Просмотреть файл

@ -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);

Просмотреть файл

@ -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

Просмотреть файл

@ -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<ObjCIvarDecl>(*I))
IndexCtx.indexDecl(*I);
}
return true;
}