<div dir="ltr">Hi Loic,<div><br></div><div>Seems like this was never committed in trunk?  Any reason why?</div><div>I have a project with a  lot of anonymous struct and this patch would be useful.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 20, 2014 at 2:40 AM, Argyrios Kyrtzidis <span dir="ltr"><<a href="mailto:kyrtzidis@apple.com" target="_blank">kyrtzidis@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
On Feb 16, 2014, at 11:49 AM, Loïc Jaquemet <<a href="mailto:loic.jaquemet@gmail.com">loic.jaquemet@gmail.com</a>> wrote:<br>
<br>
>><br>
>> +/**<br>
>> + * \brief Visitor invoked for each field found by a traversal.<br>
>> + *<br>
>> + * This visitor function will be invoked for each field found by<br>
>> + * clang_visitCursorFields(). Its first argument is the cursor being<br>
>> + * visited, its second argument is the client data provided to<br>
>> + * clang_visitCursorFields().<br>
>> + *<br>
>> + * The visitor should return one of the \c CXFieldVisitResult values<br>
>> + * to direct clang_visitCursorFields().<br>
>> + */<br>
>> +typedef enum CXFieldVisitResult (*CXFieldVisitor)(CXCursor C,<br>
>> +                                                  CXClientData client_data);<br>
>><br>
>> +CINDEX_LINKAGE unsigned clang_Type_visitFields(CXType T,<br>
>> +                                               CXFieldVisitor visitor,<br>
>> +                                               CXClientData client_data);<br>
>><br>
>> In general, the visitor is not recursing, right ? In that case why not use a simpler "getNumFields / getField" pair of functions ?<br>
><br>
> Well, the source code (AST.Decl.h ) exposes a iterator on its fields.<br>
> Given that in other similar cases a visitor is used, I did the same.<br>
><br>
> I did not want to introduce new code/new logic.<br>
> I just want to expose the iterator.<br>
><br>
> Do you want me to change it to a "getNumFields / getField" pair of functions ?<br>
<br>
</span>I see, the visitor interface is fine.<br>
<span class=""><br>
><br>
><br>
>> +enum CXFieldVisitResult {<br>
>><br>
>> Could you reuse CXVisitorResult instead of introducing a new enum ?<br>
><br>
> Yes. I did not see that one.<br>
> Will change that.<br>
<br>
</span>After that, LGTM!<br>
<div class="HOEnZb"><div class="h5"><br>
><br>
><br>
>><br>
>><br>
>> On Feb 10, 2014, at 5:13 PM, Loïc Jaquemet <<a href="mailto:loic.jaquemet@gmail.com">loic.jaquemet@gmail.com</a>> wrote:<br>
>><br>
>>> Hi,<br>
>>><br>
>>> I'm pinging back about this patch :<br>
>>> * libclang: Add three functions useful for dealing with anonymous fields.<br>
>>> +clang_Cursor_getOffsetOfField<br>
>>> +clang_Cursor_isAnonymous<br>
>>> +clang_Type_visitFields<br>
>>><br>
>>> Currently, there is no function in libclang to access clang logic that<br>
>>> handles anonymous members in a record.<br>
>>><br>
>>> Given the current API , there is no direct method to :<br>
>>> a) recover the offset of an anonymous field.<br>
>>> - displayname == spelling == '', clang_Type_getOffset does not work<br>
>>> + new clang_Cursor_getOffsetOfField will expose that information<br>
>>> b) clearly identify that DECL as an anonymous record.<br>
>>> + new clang_Cursor_isAnonymous will expose that information<br>
>>><br>
>>> When using clang_visitChildren, an anonymous member will be returned<br>
>>> as a STRUCT_DECL/UNION_DECL.<br>
>>> Currently the libclang user has to re-implement the logic to<br>
>>> differentiate FIELD_DECL in the list of children nodes<br>
>>> For example,<br>
>>><br>
>>> struct A {<br>
>>> struct {int a;} typeanon;<br>
>>> struct {<br>
>>>   int bariton;<br>
>>>   union {<br>
>>>     int foo;<br>
>>>     int foo2;<br>
>>>   };<br>
>>> };<br>
>>> int c;<br>
>>> } ;<br>
>>><br>
>>> Some children are STRUCT_DECL, some are FIELD_DECL, some are attributes.<br>
>>> Worse,<br>
>>> children[0] == STRUCT_DECL (struct {int a;})<br>
>>> children[1] == FIELD_DECL (typeanon)<br>
>>> children[2] == STRUCT_DECL (anonymous structure)<br>
>>> children[3] == FIELD_DECL (int c)<br>
>>><br>
>>> Sometime a STRUCT_DECL is a field (children[2]) sometimes it is just a<br>
>>> STRUCT_DECL.<br>
>>><br>
>>> The  new function clang_Type_visitFields will expose the existing<br>
>>> libclang capabilities to list only fields, and not all children node,<br>
>>> as does clang_visitChildren.<br>
>>><br>
>>> fields[0] == FIELD_DECL (first structure - typeanon)<br>
>>> fields[1] == FIELD_DECL (second anonymous structure)<br>
>>> fields[2] == FIELD_DECL (int c)<br>
>>><br>
>>><br>
>>><br>
>>><br>
>>><br>
>>><br>
>>><br>
>>> --<br>
>>> Loïc Jaquemet<br>
>>> <libclang-visit-fields.201116><br>
>><br>
><br>
><br>
><br>
> --<br>
> Loïc Jaquemet<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br></div></div>