]> granicus.if.org Git - clang/commitdiff
[libclang/AST]
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 8 Jun 2012 02:16:11 +0000 (02:16 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 8 Jun 2012 02:16:11 +0000 (02:16 +0000)
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
test/Index/index-decls.m
tools/libclang/IndexDecl.cpp

index 52859d4f6d26d3ff2308647952fff6c84c4a534d..91fe0ba92bef072e7e893544430452f743491832 100644 (file)
@@ -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);
index 9e4e620497fe65e6b2eecf9d038b5f2247b4d479..bf5e2c89ca8c1f22025af9d29cfd8b6a424b144c 100644 (file)
 @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
index c257c342aa72892b7210de9a42f0bc6543454bce..7560398395a54a86baf970128f8654c2ea8de172 100644 (file)
@@ -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;
   }