[PATCH] libclang: functions to deal with anonymous fields

Francois Pichet pichet2000 at gmail.com
Wed Jan 28 13:06:31 PST 2015


Hi, since your patch is just a rebasing of something that was already
reviewed, I think you can go ahead and commit..
any objection?

On Tue, Jan 27, 2015 at 7:36 PM, Loïc Jaquemet <loic.jaquemet at gmail.com>
wrote:

> Hi,
>
> would it be possible to get a review for this patch (libclang/python
> bindings) ?
>
> Thanks
>
> 2015-01-21 19:00 GMT-07:00 Loïc Jaquemet <loic.jaquemet at gmail.com>:
> > Please find this patches updated for .226743.
> >
> >
> > * libclang: Add three functions useful for dealing with anonymous fields.
> > +clang_Cursor_getOffsetOfField
> > +clang_Cursor_isAnonymous
> > +clang_Type_visitFields
> > Fixed: reuse CXVisitorResult instead of introducing a new enum
> >
> > * Python; Add corresponding methods for dealing with anonymous fields.
> >
> > * TU in print-type
> > adds [nbFields] in c-index-test for records
> > for anonymous record, shows offset of field in anonymous and parent
> > record. ( clang_Type_getOffsetOf/clang_Cursor_getOffsetOfField)
> >
> > LLVM tests passes
> > python tests passees
> >
> >
> > * Reference from 2013/2014
> >
> http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20140217/099453.html
> >
> > 2015-01-21 12:28 GMT-07:00 Francois Pichet <pichet2000 at gmail.com>:
> >> Hi Loic,
> >>
> >> Seems like this was never committed in trunk?  Any reason why?
> >> I have a project with a  lot of anonymous struct and this patch would be
> >> useful.
> >>
> >> On Thu, Feb 20, 2014 at 2:40 AM, Argyrios Kyrtzidis <
> kyrtzidis at apple.com>
> >> wrote:
> >>>
> >>>
> >>> On Feb 16, 2014, at 11:49 AM, Loïc Jaquemet <loic.jaquemet at gmail.com>
> >>> wrote:
> >>>
> >>> >>
> >>> >> +/**
> >>> >> + * \brief Visitor invoked for each field found by a traversal.
> >>> >> + *
> >>> >> + * This visitor function will be invoked for each field found by
> >>> >> + * clang_visitCursorFields(). Its first argument is the cursor
> being
> >>> >> + * visited, its second argument is the client data provided to
> >>> >> + * clang_visitCursorFields().
> >>> >> + *
> >>> >> + * The visitor should return one of the \c CXFieldVisitResult
> values
> >>> >> + * to direct clang_visitCursorFields().
> >>> >> + */
> >>> >> +typedef enum CXFieldVisitResult (*CXFieldVisitor)(CXCursor C,
> >>> >> +                                                  CXClientData
> >>> >> client_data);
> >>> >>
> >>> >> +CINDEX_LINKAGE unsigned clang_Type_visitFields(CXType T,
> >>> >> +                                               CXFieldVisitor
> visitor,
> >>> >> +                                               CXClientData
> >>> >> client_data);
> >>> >>
> >>> >> In general, the visitor is not recursing, right ? In that case why
> not
> >>> >> use a simpler "getNumFields / getField" pair of functions ?
> >>> >
> >>> > Well, the source code (AST.Decl.h ) exposes a iterator on its fields.
> >>> > Given that in other similar cases a visitor is used, I did the same.
> >>> >
> >>> > I did not want to introduce new code/new logic.
> >>> > I just want to expose the iterator.
> >>> >
> >>> > Do you want me to change it to a "getNumFields / getField" pair of
> >>> > functions ?
> >>>
> >>> I see, the visitor interface is fine.
> >>>
> >>> >
> >>> >
> >>> >> +enum CXFieldVisitResult {
> >>> >>
> >>> >> Could you reuse CXVisitorResult instead of introducing a new enum ?
> >>> >
> >>> > Yes. I did not see that one.
> >>> > Will change that.
> >>>
> >>> After that, LGTM!
> >>>
> >>> >
> >>> >
> >>> >>
> >>> >>
> >>> >> On Feb 10, 2014, at 5:13 PM, Loïc Jaquemet <loic.jaquemet at gmail.com
> >
> >>> >> wrote:
> >>> >>
> >>> >>> Hi,
> >>> >>>
> >>> >>> I'm pinging back about this patch :
> >>> >>> * libclang: Add three functions useful for dealing with anonymous
> >>> >>> fields.
> >>> >>> +clang_Cursor_getOffsetOfField
> >>> >>> +clang_Cursor_isAnonymous
> >>> >>> +clang_Type_visitFields
> >>> >>>
> >>> >>> Currently, there is no function in libclang to access clang logic
> that
> >>> >>> handles anonymous members in a record.
> >>> >>>
> >>> >>> Given the current API , there is no direct method to :
> >>> >>> a) recover the offset of an anonymous field.
> >>> >>> - displayname == spelling == '', clang_Type_getOffset does not work
> >>> >>> + new clang_Cursor_getOffsetOfField will expose that information
> >>> >>> b) clearly identify that DECL as an anonymous record.
> >>> >>> + new clang_Cursor_isAnonymous will expose that information
> >>> >>>
> >>> >>> When using clang_visitChildren, an anonymous member will be
> returned
> >>> >>> as a STRUCT_DECL/UNION_DECL.
> >>> >>> Currently the libclang user has to re-implement the logic to
> >>> >>> differentiate FIELD_DECL in the list of children nodes
> >>> >>> For example,
> >>> >>>
> >>> >>> struct A {
> >>> >>> struct {int a;} typeanon;
> >>> >>> struct {
> >>> >>>   int bariton;
> >>> >>>   union {
> >>> >>>     int foo;
> >>> >>>     int foo2;
> >>> >>>   };
> >>> >>> };
> >>> >>> int c;
> >>> >>> } ;
> >>> >>>
> >>> >>> Some children are STRUCT_DECL, some are FIELD_DECL, some are
> >>> >>> attributes.
> >>> >>> Worse,
> >>> >>> children[0] == STRUCT_DECL (struct {int a;})
> >>> >>> children[1] == FIELD_DECL (typeanon)
> >>> >>> children[2] == STRUCT_DECL (anonymous structure)
> >>> >>> children[3] == FIELD_DECL (int c)
> >>> >>>
> >>> >>> Sometime a STRUCT_DECL is a field (children[2]) sometimes it is
> just a
> >>> >>> STRUCT_DECL.
> >>> >>>
> >>> >>> The  new function clang_Type_visitFields will expose the existing
> >>> >>> libclang capabilities to list only fields, and not all children
> node,
> >>> >>> as does clang_visitChildren.
> >>> >>>
> >>> >>> fields[0] == FIELD_DECL (first structure - typeanon)
> >>> >>> fields[1] == FIELD_DECL (second anonymous structure)
> >>> >>> fields[2] == FIELD_DECL (int c)
> >>> >>>
> >>> >>>
> >>> >>>
> >>> >>>
> >>> >>>
> >>> >>>
> >>> >>>
> >>> >>> --
> >>> >>> Loïc Jaquemet
> >>> >>> <libclang-visit-fields.201116>
> >>> >>
> >>> >
> >>> >
> >>> >
> >>> > --
> >>> > Loïc Jaquemet
> >>>
> >>>
> >>> _______________________________________________
> >>> cfe-commits mailing list
> >>> cfe-commits at cs.uiuc.edu
> >>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> >>
> >>
> >
> >
> >
> > --
> > Loïc Jaquemet
>
>
>
> --
> Loïc Jaquemet
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150128/72d71fcb/attachment.html>


More information about the cfe-commits mailing list