[PATCH] libclang: functions to deal with anonymous fields

Loïc Jaquemet loic.jaquemet at gmail.com
Sun Feb 16 11:49:19 PST 2014


>
> +/**
> + * \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 ?


> +enum CXFieldVisitResult {
>
> Could you reuse CXVisitorResult instead of introducing a new enum ?

Yes. I did not see that one.
Will change that.


>
>
> 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




More information about the cfe-commits mailing list