From fc929208193eff37e1d3a28b1ea3bd1c9a7913e0 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Jun 2010 22:33:30 +0000 Subject: [PATCH] Add indexing support for the block and @property type location information I just implemented. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105491 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Index/blocks.c | 29 +++++++++++++++++++++++++++++ tools/libclang/CIndex.cpp | 9 +++++---- 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 test/Index/blocks.c diff --git a/test/Index/blocks.c b/test/Index/blocks.c new file mode 100644 index 0000000000..08241cbcd1 --- /dev/null +++ b/test/Index/blocks.c @@ -0,0 +1,29 @@ +// RUN: c-index-test -test-load-source local -fblocks %s | FileCheck %s + +typedef int int_t; +struct foo { long x; }; + +void test() { + static struct foo _foo; + ^ int_t(struct foo *foo) { return (int_t) foo->x; }(&_foo); +} + +// TODO: expose the BlockExpr, CastExpr, and UnaryOperatorExpr here + +// CHECK: blocks.c:3:13: TypedefDecl=int_t:3:13 (Definition) Extent=[3:13 - 3:18] +// CHECK: blocks.c:4:8: StructDecl=foo:4:8 (Definition) Extent=[4:1 - 4:23] +// CHECK: blocks.c:4:19: FieldDecl=x:4:19 (Definition) Extent=[4:19 - 4:20] +// CHECK: blocks.c:6:6: FunctionDecl=test:6:6 (Definition) Extent=[6:6 - 9:2] +// CHECK: blocks.c:7:21: VarDecl=_foo:7:21 (Definition) Extent=[7:17 - 7:25] +// CHECK: blocks.c:7:17: TypeRef=struct foo:4:8 Extent=[7:17 - 7:20] +// CHECK: blocks.c:8:3: CallExpr= Extent=[8:3 - 8:61] +// CHECK: blocks.c:8:3: UnexposedExpr= Extent=[8:3 - 8:54] +// CHECK: blocks.c:8:5: TypeRef=int_t:3:13 Extent=[8:5 - 8:10] +// CHECK: blocks.c:8:23: ParmDecl=foo:8:23 (Definition) Extent=[8:18 - 8:26] +// CHECK: blocks.c:8:18: TypeRef=struct foo:4:8 Extent=[8:18 - 8:21] +// CHECK: blocks.c:8:37: UnexposedExpr=x:4:19 Extent=[8:37 - 8:51] +// CHECK: blocks.c:8:38: TypeRef=int_t:3:13 Extent=[8:38 - 8:43] +// CHECK: blocks.c:8:50: MemberRefExpr=x:4:19 Extent=[8:45 - 8:51] +// CHECK: blocks.c:8:45: DeclRefExpr=foo:8:23 Extent=[8:45 - 8:48] +// CHECK: blocks.c:8:55: UnexposedExpr= Extent=[8:55 - 8:60] +// CHECK: blocks.c:8:56: DeclRefExpr=_foo:7:21 Extent=[8:56 - 8:60] diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index ae126676fc..903d341a79 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -517,10 +517,8 @@ bool CursorVisitor::VisitChildren(CXCursor Cursor) { } bool CursorVisitor::VisitBlockDecl(BlockDecl *B) { - for (BlockDecl::param_iterator I=B->param_begin(), E=B->param_end(); I!=E;++I) - if (Decl *D = *I) - if (Visit(D)) - return true; + if (Visit(B->getSignatureAsWritten()->getTypeLoc())) + return true; return Visit(MakeCXCursor(B->getBody(), StmtParent, TU)); } @@ -672,6 +670,9 @@ bool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) { } bool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) { + if (Visit(PD->getTypeSourceInfo()->getTypeLoc())) + return true; + // FIXME: This implements a workaround with @property declarations also being // installed in the DeclContext for the @interface. Eventually this code // should be removed. -- 2.40.0