[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