From: Douglas Gregor Date: Thu, 9 Sep 2010 23:28:23 +0000 (+0000) Subject: Add libclang visitation for C99 designated initializers. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fa2e26f62162d90a3d117e58d6b1f47e40377987;p=clang Add libclang visitation for C99 designated initializers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113560 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Index/load-exprs.c b/test/Index/load-exprs.c index 1c27490d63..d0033f88ff 100644 --- a/test/Index/load-exprs.c +++ b/test/Index/load-exprs.c @@ -64,6 +64,16 @@ void test_members(int aval, int bval) { // CHECK: load-exprs.c:17:10: DeclRefExpr= Extent=[17:10 - 17:11] // CHECK: load-exprs.c:20:10: DeclRefExpr=y:11:15 Extent=[20:10 - 20:11] // CHECK: load-exprs.c:29:6: FunctionDecl=test_members:29:6 (Definition) +// CHECK: load-exprs.c:30:12: VarDecl=y0:30:12 (Definition) Extent=[30:10 - 30:77] +// CHECK: load-exprs.c:30:10: TypeRef=struct Y:23:8 Extent=[30:10 - 30:11] +// CHECK: load-exprs.c:30:20: MemberRef=array:24:12 Extent=[30:20 - 30:25] +// CHECK: load-exprs.c:30:26: DeclRefExpr=StartIndex:27:8 Extent=[30:26 - 30:36] +// CHECK: load-exprs.c:30:38: MemberRef=b:2:19 Extent=[30:38 - 30:39] +// CHECK: load-exprs.c:30:42: DeclRefExpr=bval:29:33 Extent=[30:42 - 30:46] +// CHECK: load-exprs.c:30:49: MemberRef=array:24:12 Extent=[30:49 - 30:54] +// CHECK: load-exprs.c:30:55: DeclRefExpr=StartIndex:27:8 Extent=[30:55 - 30:65] +// CHECK: load-exprs.c:30:67: MemberRef=a:2:16 Extent=[30:67 - 30:68] +// CHECK: load-exprs.c:30:71: DeclRefExpr=aval:29:23 Extent=[30:71 - 30:75] // CHECK: load-exprs.c:31:29: TypeRef=struct Y:23:8 Extent=[31:29 - 31:30] // CHECK: load-exprs.c:31:32: MemberRef=array:24:12 Extent=[31:32 - 31:37] // CHECK: load-exprs.c:31:38: DeclRefExpr=StartIndex:27:8 Extent=[31:38 - 31:48] diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 35e28ad429..c899f5db6f 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -380,8 +380,8 @@ public: // FIXME: AddrLabelExpr (once we have cursors for labels) bool VisitTypesCompatibleExpr(TypesCompatibleExpr *E); bool VisitVAArgExpr(VAArgExpr *E); - // FIXME: InitListExpr (for the designators) - // FIXME: DesignatedInitExpr + bool VisitInitListExpr(InitListExpr *E); + bool VisitDesignatedInitExpr(DesignatedInitExpr *E); bool VisitCXXTypeidExpr(CXXTypeidExpr *E); bool VisitCXXUuidofExpr(CXXUuidofExpr *E); bool VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { return false; } @@ -1652,6 +1652,42 @@ bool CursorVisitor::VisitVAArgExpr(VAArgExpr *E) { return Visit(MakeCXCursor(E->getSubExpr(), StmtParent, TU)); } +bool CursorVisitor::VisitInitListExpr(InitListExpr *E) { + // We care about the syntactic form of the initializer list, only. + return VisitExpr(E->getSyntacticForm()); +} + +bool CursorVisitor::VisitDesignatedInitExpr(DesignatedInitExpr *E) { + // Visit the designators. + typedef DesignatedInitExpr::Designator Designator; + for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), + DEnd = E->designators_end(); + D != DEnd; ++D) { + if (D->isFieldDesignator()) { + if (FieldDecl *Field = D->getField()) + if (Visit(MakeCursorMemberRef(Field, D->getFieldLoc(), TU))) + return true; + + continue; + } + + if (D->isArrayDesignator()) { + if (Visit(MakeCXCursor(E->getArrayIndex(*D), StmtParent, TU))) + return true; + + continue; + } + + assert(D->isArrayRangeDesignator() && "Unknown designator kind"); + if (Visit(MakeCXCursor(E->getArrayRangeStart(*D), StmtParent, TU)) || + Visit(MakeCXCursor(E->getArrayRangeEnd(*D), StmtParent, TU))) + return true; + } + + // Visit the initializer value itself. + return Visit(MakeCXCursor(E->getInit(), StmtParent, TU)); +} + bool CursorVisitor::VisitCXXTypeidExpr(CXXTypeidExpr *E) { if (E->isTypeOperand()) { if (TypeSourceInfo *TSInfo = E->getTypeOperandSourceInfo())