[PATCH] libclang: functions to deal with anonymous fields
Loïc Jaquemet
loic.jaquemet at gmail.com
Wed Apr 1 15:38:13 PDT 2015
Hi,
this is still the same patch as in 2013,
Updated for r233836
Would someone be able to commit it at last ?
$ nosetests .
.LIBCLANG TOOLING ERROR: json-compilation-database: Error while
opening JSON database: No such file or directory
.................................................................................................
----------------------------------------------------------------------
Ran 98 tests in 1.554s
OK
llvm[0]: ***** Completed Release+Asserts Build
$ make check-all
llvm[0]: Running test suite
Testing Time: 136.64s
Expected Passes : 21027
Expected Failures : 122
Unsupported Tests : 99
2015-02-11 18:34 GMT-07:00 Loïc Jaquemet <loic.jaquemet at gmail.com>:
> 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
--
Loïc Jaquemet
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 201501-visit-fields.r233836
Type: application/octet-stream
Size: 19792 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150401/3cde84bd/attachment.obj>
More information about the cfe-commits
mailing list