[PATCH] libclang: functions to deal with anonymous fields

Loïc Jaquemet loic.jaquemet at gmail.com
Thu Jan 29 17:22:45 PST 2015


Apparently it was reverted in r227472

2015-01-29 5:49 GMT-07:00 Francois Pichet <pichet2000 at gmail.com>:
> I committed in r227432, thanks.
>
> On Wed, Jan 28, 2015 at 5:18 PM, Argyrios Kyrtzidis <kyrtzidis at apple.com>
> wrote:
>>
>> Yes, I think it’s good to go, thanks Loïc!
>>
>>
>> On Jan 28, 2015, at 1:06 PM, Francois Pichet <pichet2000 at gmail.com> wrote:
>>
>> 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
>>
>>
>



-- 
Loïc Jaquemet




More information about the cfe-commits mailing list