[PATCH] libclang: functions to deal with anonymous fields
Argyrios Kyrtzidis
kyrtzidis at apple.com
Thu Feb 13 11:25:57 PST 2014
Hi Loïc,
Apologies for the late review.
+enum CXFieldVisitResult {
+ /**
+ * \brief Terminates the record traversal.
+ */
+ CXFieldVisit_Break,
+ /**
+ * \brief Continues the record traversal with the next field of
+ * the record just visited.
+ */
+ CXFieldVisit_Continue
+};
Could you reuse CXVisitorResult instead of introducing a new enum ?
+/**
+ * \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 ?
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>
More information about the cfe-commits
mailing list