[PATCH] libclang: functions to deal with anonymous fields

Loïc Jaquemet loic.jaquemet at gmail.com
Wed Feb 11 17:34:39 PST 2015


Updated for r228880

2015-01-30 19:13 GMT-07:00 Loïc Jaquemet <loic.jaquemet at gmail.com>:
> + Removed the useless default that creates a warning.
> + cleaned some whitespaces
>
> Testing Time: 127.86s
>   Expected Passes    : 20169
>   Expected Failures  : 103
>   Unsupported Tests  : 88
>
> 2015-01-29 19:08 GMT-07:00 Loïc Jaquemet <loic.jaquemet at gmail.com>:
>> my bad,
>>
>> I was using make check instead of make check-all
>>
>> the TU is fixed in the patch attached (2 modifs in print-type.cpp )
>>
>> $ ./Release+Asserts/bin/llvm-lit ~/llvm/tools/clang/test/Index/
>> [..]
>> Testing Time: 5.49s
>>   Expected Passes    : 239
>> $
>>
>>
>> $ make check-all
>> llvm[0]: Running test suite
>> [..]
>> Testing Time: 127.90s
>>   Expected Passes    : 20158
>>   Expected Failures  : 101
>>   Unsupported Tests  : 88
>>
>>
>>
>> 2015-01-29 18:22 GMT-07:00 Loïc Jaquemet <loic.jaquemet at gmail.com>:
>>> 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
>>
>>
>>
>> --
>> Loïc Jaquemet
>
>
>
> --
> Loïc Jaquemet



-- 
Loïc Jaquemet
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 201501-visit-fields.r228880
Type: application/octet-stream
Size: 19798 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150211/a2025c0a/attachment.obj>


More information about the cfe-commits mailing list