[PATCH] libclang: functions to deal with anonymous fields

Loïc Jaquemet loic.jaquemet at gmail.com
Tue Jan 27 16:36:00 PST 2015


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 --------------
A non-text attachment was scrubbed...
Name: 201501-visit-fields.226743
Type: application/octet-stream
Size: 19763 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150127/26cde5de/attachment.obj>


More information about the cfe-commits mailing list