[PATCH] libclang: functions to deal with anonymous fields

Loïc Jaquemet loic.jaquemet at gmail.com
Wed Jan 21 18:00:24 PST 2015


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
-------------- 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/20150121/9f4f3a19/attachment.obj>


More information about the cfe-commits mailing list