[PATCH] libclang: functions to deal with anonymous fields

Loïc Jaquemet loic.jaquemet at gmail.com
Thu Jan 29 18:08:44 PST 2015


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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 201501-visit-fields.227525
Type: application/octet-stream
Size: 19875 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150129/568a1e21/attachment.obj>


More information about the cfe-commits mailing list