q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b75014a02487221041563c8689a88820d7db9789

commit b75014a02487221041563c8689a88820d7db9789
Author: Daniel Kolesa <[email protected]>
Date:   Fri Aug 22 16:56:41 2014 +0100

    eolian: refactor the struct/enum field APIs
---
 src/bin/eolian/types_generator.c   | 34 ++++++++--------
 src/lib/eolian/Eolian.h            | 81 +++++++++++++++++++++++++++-----------
 src/lib/eolian/database_expr.c     |  8 +++-
 src/lib/eolian/database_type.c     |  8 ++--
 src/lib/eolian/database_type_api.c | 78 +++++++++++++++++++-----------------
 src/lib/eolian/database_validate.c |  4 +-
 src/lib/eolian/eo_parser.c         | 20 ++++++----
 src/lib/eolian/eolian_database.h   | 10 +++--
 src/tests/eolian/eolian_parsing.c  | 43 +++++++++++---------
 9 files changed, 172 insertions(+), 114 deletions(-)

diff --git a/src/bin/eolian/types_generator.c b/src/bin/eolian/types_generator.c
index 96481f6..acd8d5e 100644
--- a/src/bin/eolian/types_generator.c
+++ b/src/bin/eolian/types_generator.c
@@ -69,7 +69,7 @@ _type_generate(const Eolian_Type *tp, Eina_Bool in_typedef)
       case EOLIAN_TYPE_STRUCT:
       case EOLIAN_TYPE_STRUCT_OPAQUE:
            {
-              const char *member_name;
+              const Eolian_Struct_Type_Field *member;
               char *name = _concat_name(tp);
               if ((in_typedef && name) || tp_type == EOLIAN_TYPE_STRUCT_OPAQUE)
                 {
@@ -79,15 +79,15 @@ _type_generate(const Eolian_Type *tp, Eina_Bool in_typedef)
                 }
               eina_strbuf_append_printf(buf, "struct%s%s {\n", name?" ":"", 
name?name:"");
               free(name);
-              Eina_Iterator *members = eolian_type_struct_field_names_get(tp);
-              EINA_ITERATOR_FOREACH(members, member_name)
+              Eina_Iterator *members = eolian_type_struct_fields_get(tp);
+              EINA_ITERATOR_FOREACH(members, member)
                 {
-                   const char *desc = 
eolian_type_struct_field_description_get(tp, member_name);
-                   const Eolian_Type *member = 
eolian_type_struct_field_get(tp, member_name);
-                   Eina_Stringshare *c_type = eolian_type_c_type_get(member);
+                   const char *desc = 
eolian_type_struct_field_description_get(member);
+                   const Eolian_Type *type = 
eolian_type_struct_field_type_get(member);
+                   Eina_Stringshare *c_type = eolian_type_c_type_get(type);
                    eina_strbuf_append_printf(buf, "  %s%s%s;",
                          c_type, strchr(c_type, '*')?"":" ",
-                         member_name);
+                         eolian_type_struct_field_name_get(member));
                    if (desc) eina_strbuf_append_printf(buf, " /** %s */", 
desc);
                    eina_strbuf_append(buf, "\n");
                 }
@@ -97,7 +97,7 @@ _type_generate(const Eolian_Type *tp, Eina_Bool in_typedef)
            }
       case EOLIAN_TYPE_ENUM:
            {
-              const char *member_name;
+              const Eolian_Enum_Type_Field *member;
               char *name = _concat_name(tp);
               if (in_typedef)
                 {
@@ -115,28 +115,28 @@ _type_generate(const Eolian_Type *tp, Eina_Bool 
in_typedef)
               else
                 pre = name;
               eina_str_toupper(&pre);
-              Eina_Iterator *members = eolian_type_enum_field_names_get(tp);
-              Eina_Bool next = eina_iterator_next(members, 
(void**)&member_name);
+              Eina_Iterator *members = eolian_type_enum_fields_get(tp);
+              Eina_Bool next = eina_iterator_next(members, (void**)&member);
               Eina_Strbuf *membuf = eina_strbuf_new();
               while (next)
                 {
-                   const char *desc = 
eolian_type_enum_field_description_get(tp, member_name);
-                   const Eolian_Expression *member = 
eolian_type_enum_field_get(tp, member_name);
-                   char *memb_u = strdup(member_name);
+                   const char *desc = 
eolian_type_enum_field_description_get(member);
+                   const Eolian_Expression *value = 
eolian_type_enum_field_value_get(member);
+                   char *memb_u = 
strdup(eolian_type_enum_field_name_get(member));
                    eina_str_toupper(&memb_u);
                    eina_strbuf_reset(membuf);
                    eina_strbuf_append(membuf, pre);
                    eina_strbuf_append_char(membuf, '_');
                    eina_strbuf_append(membuf, memb_u);
                    free(memb_u);
-                   if (!member)
+                   if (!value)
                      eina_strbuf_append_printf(buf, "  %s", 
eina_strbuf_string_get(membuf));
                    else
                      {
-                        Eolian_Value val = eolian_expression_eval(member, 
EOLIAN_MASK_INT);
+                        Eolian_Value val = eolian_expression_eval(value, 
EOLIAN_MASK_INT);
                         const char *lit = 
eolian_expression_value_to_literal(&val);
                         eina_strbuf_append_printf(buf, "  %s = %s", 
eina_strbuf_string_get(membuf), lit);
-                        const char *exp = eolian_expression_serialize(member);
+                        const char *exp = eolian_expression_serialize(value);
                         if (exp && strcmp(lit, exp))
                           {
                              eina_strbuf_append_printf(buf, " /* %s */", exp);
@@ -144,7 +144,7 @@ _type_generate(const Eolian_Type *tp, Eina_Bool in_typedef)
                           }
                         eina_stringshare_del(lit);
                      }
-                   next = eina_iterator_next(members, (void**)&member_name);
+                   next = eina_iterator_next(members, (void**)&member);
                    if (next)
                      eina_strbuf_append(buf, ",");
                    if (desc) eina_strbuf_append_printf(buf, " /** %s */", 
desc);
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index 7135a45..84fb1d1 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -86,6 +86,18 @@ typedef struct _Eolian_Expression Eolian_Expression;
  */
 typedef struct _Eolian_Variable Eolian_Variable;
 
+/* Struct field information
+ *
+ * @ingroup Eolian
+ */
+typedef struct _Eolian_Struct_Type_Field Eolian_Struct_Type_Field;
+
+/* Enum field information
+ *
+ * @ingroup Eolian
+ */
+typedef struct _Eolian_Enum_Type_Field Eolian_Enum_Type_Field;
+
 typedef enum
 {
    EOLIAN_UNRESOLVED,
@@ -1094,14 +1106,14 @@ EAPI Eina_Iterator *eolian_type_arguments_get(const 
Eolian_Type *tp);
 EAPI Eina_Iterator *eolian_type_subtypes_get(const Eolian_Type *tp);
 
 /*
- * @brief Get an iterator to all field names of a struct type.
+ * @brief Get an iterator to all fields of a struct type.
  *
  * @param[in] tp the type.
  * @return the iterator when @c tp is EOLIAN_TYPE_STRUCT, NULL otherwise.
  *
  * @ingroup Eolian
  */
-EAPI Eina_Iterator *eolian_type_struct_field_names_get(const Eolian_Type *tp);
+EAPI Eina_Iterator *eolian_type_struct_fields_get(const Eolian_Type *tp);
 
 /*
  * @brief Get a field of a struct type.
@@ -1113,40 +1125,47 @@ EAPI Eina_Iterator 
*eolian_type_struct_field_names_get(const Eolian_Type *tp);
  *
  * @ingroup Eolian
  */
-EAPI const Eolian_Type *eolian_type_struct_field_get(const Eolian_Type *tp, 
const char *field);
+EAPI const Eolian_Struct_Type_Field *eolian_type_struct_field_get(const 
Eolian_Type *tp, const char *field);
+
+/*
+ * @brief Get the name of a field of a struct type.
+ *
+ * @param[in] fl the field.
+ * @return the name.
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Stringshare *eolian_type_struct_field_name_get(const 
Eolian_Struct_Type_Field *fl);
 
 /*
  * @brief Get the description of a field of a struct type.
  *
- * @param[in] tp the type.
- * @param[in] field the field name.
- * @return the description when @c tp is EOLIAN_TYPE_STRUCT, @c field is not 
NULL
- * and the field exists, NULL otherwise.
+ * @param[in] fl the field.
+ * @return the description.
  *
  * @ingroup Eolian
  */
-EAPI Eina_Stringshare *eolian_type_struct_field_description_get(const 
Eolian_Type *tp, const char *field);
+EAPI Eina_Stringshare *eolian_type_struct_field_description_get(const 
Eolian_Struct_Type_Field *fl);
 
 /*
- * @brief Get an iterator to all field names of an enum type.
+ * @brief Get the type of a field of a struct type.
  *
- * @param[in] tp the type.
- * @return the iterator when @c tp is EOLIAN_TYPE_ENUM, NULL otherwise.
+ * @param[in] fl the field.
+ * @return the type.
  *
  * @ingroup Eolian
  */
-EAPI Eina_Iterator *eolian_type_enum_field_names_get(const Eolian_Type *tp);
+EAPI const Eolian_Type *eolian_type_struct_field_type_get(const 
Eolian_Struct_Type_Field *fl);
 
 /*
- * @brief Get whether an enum field exists.
+ * @brief Get an iterator to all fields of an enum type.
  *
  * @param[in] tp the type.
- * @param[in] field the field name.
- * @return EINA_TRUE when the field exists, EINA_FALSE otherwise.
+ * @return the iterator when @c tp is EOLIAN_TYPE_ENUM, NULL otherwise.
  *
  * @ingroup Eolian
  */
-EAPI Eina_Bool eolian_type_enum_field_exists(const Eolian_Type *tp, const char 
*field);
+EAPI Eina_Iterator *eolian_type_enum_fields_get(const Eolian_Type *tp);
 
 /*
  * @brief Get a field of an enum type.
@@ -1161,19 +1180,37 @@ EAPI Eina_Bool eolian_type_enum_field_exists(const 
Eolian_Type *tp, const char *
  *
  * @ingroup Eolian
  */
-EAPI const Eolian_Expression *eolian_type_enum_field_get(const Eolian_Type 
*tp, const char *field);
+EAPI const Eolian_Enum_Type_Field *eolian_type_enum_field_get(const 
Eolian_Type *tp, const char *field);
+
+/*
+ * @brief Get the name of a field of an enum type.
+ *
+ * @param[in] fl the field.
+ * @return the name.
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Stringshare *eolian_type_enum_field_name_get(const 
Eolian_Enum_Type_Field *fl);
 
 /*
  * @brief Get the description of a field of an enum type.
  *
- * @param[in] tp the type.
- * @param[in] field the field name.
- * @return the description when @c tp is EOLIAN_TYPE_ENUM, @c field is not NULL
- * and the field exists, NULL otherwise.
+ * @param[in] fl the field.
+ * @return the description.
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Stringshare *eolian_type_enum_field_description_get(const 
Eolian_Enum_Type_Field *fl);
+
+/*
+ * @brief Get the value of a field of an enum type.
+ *
+ * @param[in] fl the field.
+ * @return the description.
  *
  * @ingroup Eolian
  */
-EAPI Eina_Stringshare *eolian_type_enum_field_description_get(const 
Eolian_Type *tp, const char *field);
+EAPI const Eolian_Expression *eolian_type_enum_field_value_get(const 
Eolian_Enum_Type_Field *fl);
 
 /*
  * @brief Get the legacy prefix of enum field names. When not specified,
diff --git a/src/lib/eolian/database_expr.c b/src/lib/eolian/database_expr.c
index dc5b439..f224079 100644
--- a/src/lib/eolian/database_expr.c
+++ b/src/lib/eolian/database_expr.c
@@ -495,6 +495,7 @@ eval_exp(const Eolian_Expression *expr, 
Eolian_Expression_Mask mask,
            if (!var)
              {
                 const Eolian_Type *etp;
+                const Eolian_Enum_Type_Field *fl;
 
                 /* try aliases, hoping it'll be enum */
                 char *fulln = NULL, *memb = NULL;
@@ -527,7 +528,8 @@ eval_exp(const Eolian_Expression *expr, 
Eolian_Expression_Mask mask,
                      return expr_error(expr, "undefined variable");
                   }
 
-                exp = eolian_type_enum_field_get(etp, memb);
+                fl = eolian_type_enum_field_get(etp, memb);
+                if (fl) exp = eolian_type_enum_field_value_get(fl);
                 free(fulln);
 
                 if (!exp)
@@ -545,6 +547,7 @@ eval_exp(const Eolian_Expression *expr, 
Eolian_Expression_Mask mask,
         {
            const Eolian_Type *etp;
            const Eolian_Expression *exp;
+           const Eolian_Enum_Type_Field *fl;
 
            char *fulln = NULL, *memb = NULL;
            if (!split_enum_name(expr->value.s, &fulln, &memb))
@@ -562,7 +565,8 @@ eval_exp(const Eolian_Expression *expr, 
Eolian_Expression_Mask mask,
                 return expr_error(expr, "invalid enum");
              }
 
-           exp = eolian_type_enum_field_get(etp, memb);
+           fl = eolian_type_enum_field_get(etp, memb);
+           if (fl) exp = eolian_type_enum_field_value_get(fl);
            free(fulln);
 
            if (!exp)
diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c
index 7d80f75..c22e289 100644
--- a/src/lib/eolian/database_type.c
+++ b/src/lib/eolian/database_type.c
@@ -115,7 +115,7 @@ _stype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, 
const char *name)
    eina_strbuf_append(buf, "{ ");
    EINA_LIST_FOREACH(tp->field_list, l, fname)
      {
-        Eolian_Struct_Field *sf = eina_hash_find(tp->fields, fname);
+        Eolian_Struct_Type_Field *sf = eina_hash_find(tp->fields, fname);
         database_type_to_str(sf->type, buf, fname);
         eina_strbuf_append(buf, "; ");
      }
@@ -149,7 +149,7 @@ _etype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, 
const char *name)
    eina_strbuf_append(buf, "{ ");
    EINA_LIST_FOREACH(tp->field_list, l, fname)
      {
-        Eolian_Enum_Field *ef = eina_hash_find(tp->fields, fname);
+        Eolian_Enum_Type_Field *ef = eina_hash_find(tp->fields, fname);
         eina_strbuf_append(buf, fname);
         if (ef->value)
           {
@@ -341,7 +341,7 @@ database_type_print(Eolian_Type *tp)
         printf("{ ");
         EINA_LIST_FOREACH(tp->field_list, m, fname)
           {
-             Eolian_Struct_Field *sf = eina_hash_find(tp->fields, fname);
+             Eolian_Struct_Type_Field *sf = eina_hash_find(tp->fields, fname);
              printf("%s: ", fname);
              database_type_print(sf->type);
              printf("; ");
@@ -356,7 +356,7 @@ database_type_print(Eolian_Type *tp)
         printf("{ ");
         EINA_LIST_FOREACH(tp->field_list, m, fname)
           {
-             Eolian_Enum_Field *ef = eina_hash_find(tp->fields, fname);
+             Eolian_Enum_Type_Field *ef = eina_hash_find(tp->fields, fname);
              printf("%s", fname);
              if (ef->value)
                {
diff --git a/src/lib/eolian/database_type_api.c 
b/src/lib/eolian/database_type_api.c
index 79e5f92..e80455d 100644
--- a/src/lib/eolian/database_type_api.c
+++ b/src/lib/eolian/database_type_api.c
@@ -97,79 +97,85 @@ eolian_type_subtypes_get(const Eolian_Type *tp)
 }
 
 EAPI Eina_Iterator *
-eolian_type_struct_field_names_get(const Eolian_Type *tp)
+eolian_type_struct_fields_get(const Eolian_Type *tp)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
    EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_STRUCT, NULL);
    return eina_list_iterator_new(tp->field_list);
 }
 
-EAPI const Eolian_Type *
+EAPI const Eolian_Struct_Type_Field *
 eolian_type_struct_field_get(const Eolian_Type *tp, const char *field)
 {
-   Eolian_Struct_Field *sf = NULL;
+   Eolian_Struct_Type_Field *sf = NULL;
    EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL);
    EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_STRUCT, NULL);
    sf = eina_hash_find(tp->fields, field);
    if (!sf) return NULL;
-   return sf->type;
+   return sf;
 }
 
 EAPI Eina_Stringshare *
-eolian_type_struct_field_description_get(const Eolian_Type *tp, const char 
*field)
+eolian_type_struct_field_name_get(const Eolian_Struct_Type_Field *fl)
 {
-   Eolian_Struct_Field *sf = NULL;
-   EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL);
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_STRUCT, NULL);
-   sf = eina_hash_find(tp->fields, field);
-   if (!sf) return NULL;
-   return sf->comment;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
+   return fl->name;
+}
+
+EAPI Eina_Stringshare *
+eolian_type_struct_field_description_get(const Eolian_Struct_Type_Field *fl)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
+   return fl->comment;
+}
+
+EAPI const Eolian_Type *
+eolian_type_struct_field_type_get(const Eolian_Struct_Type_Field *fl)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
+   return fl->type;
 }
 
 EAPI Eina_Iterator *
-eolian_type_enum_field_names_get(const Eolian_Type *tp)
+eolian_type_enum_fields_get(const Eolian_Type *tp)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
    EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_ENUM, NULL);
    return eina_list_iterator_new(tp->field_list);
 }
 
-EAPI Eina_Bool
-eolian_type_enum_field_exists(const Eolian_Type *tp, const char *field)
-{
-   Eolian_Enum_Field *ef = NULL;
-   EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EINA_FALSE);
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_ENUM, EINA_FALSE);
-   ef = eina_hash_find(tp->fields, field);
-   if (!ef)
-     return EINA_FALSE;
-   return EINA_TRUE;
-}
-
-EAPI const Eolian_Expression *
+EAPI const Eolian_Enum_Type_Field *
 eolian_type_enum_field_get(const Eolian_Type *tp, const char *field)
 {
-   Eolian_Enum_Field *ef = NULL;
+   Eolian_Enum_Type_Field *ef = NULL;
    EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL);
    EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_ENUM, NULL);
    ef = eina_hash_find(tp->fields, field);
    if (!ef) return NULL;
-   return ef->value;
+   return ef;
 }
 
 EAPI Eina_Stringshare *
-eolian_type_enum_field_description_get(const Eolian_Type *tp, const char 
*field)
+eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl)
 {
-   Eolian_Enum_Field *ef = NULL;
-   EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL);
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_ENUM, NULL);
-   ef = eina_hash_find(tp->fields, field);
-   if (!ef) return NULL;
-   return ef->comment;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
+   return fl->name;
+}
+
+EAPI Eina_Stringshare *
+eolian_type_enum_field_description_get(const Eolian_Enum_Type_Field *fl)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
+   return fl->comment;
+}
+
+EAPI const Eolian_Expression *
+eolian_type_enum_field_value_get(const Eolian_Enum_Type_Field *fl)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL);
+   return fl->value;
 }
 
 EAPI Eina_Stringshare *
diff --git a/src/lib/eolian/database_validate.c 
b/src/lib/eolian/database_validate.c
index 14c38a3..02f9caa 100644
--- a/src/lib/eolian/database_validate.c
+++ b/src/lib/eolian/database_validate.c
@@ -7,7 +7,7 @@ static Eina_Bool _validate_expr(const Eolian_Expression *expr,
 
 static Eina_Bool
 _sf_map_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED,
-           const Eolian_Struct_Field *sf, Eina_Bool *success)
+           const Eolian_Struct_Type_Field *sf, Eina_Bool *success)
 {
    *success = _validate_type(sf->type);
    return *success;
@@ -15,7 +15,7 @@ _sf_map_cb(const Eina_Hash *hash EINA_UNUSED, const void *key 
EINA_UNUSED,
 
 static Eina_Bool
 _ef_map_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED,
-           const Eolian_Enum_Field *ef, Eina_Bool *success)
+           const Eolian_Enum_Type_Field *ef, Eina_Bool *success)
 {
    *success = _validate_expr(ef->value, NULL, EOLIAN_MASK_INT);
    return *success;
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index faff9a5..b0299f0 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -568,9 +568,10 @@ parse_function_type(Eo_Lexer *ls)
 }
 
 static void
-_struct_field_free(Eolian_Struct_Field *def)
+_struct_field_free(Eolian_Struct_Type_Field *def)
 {
    if (def->base.file) eina_stringshare_del(def->base.file);
+   if (def->name) eina_stringshare_del(def->name);
    database_type_del(def->type);
    if (def->comment) eina_stringshare_del(def->comment);
    free(def);
@@ -597,16 +598,16 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool 
is_extern,
    while (ls->t.token != '}')
      {
         const char *fname;
-        Eolian_Struct_Field *fdef;
+        Eolian_Struct_Type_Field *fdef;
         Eolian_Type *tp;
         int fline = ls->line_number, fcol = ls->column;
         check(ls, TOK_VALUE);
         if (eina_hash_find(def->fields, ls->t.value.s))
           eo_lexer_syntax_error(ls, "double field definition");
-        fdef = calloc(1, sizeof(Eolian_Struct_Field));
+        fdef = calloc(1, sizeof(Eolian_Struct_Type_Field));
         fname = eina_stringshare_ref(ls->t.value.s);
         eina_hash_add(def->fields, fname, fdef);
-        def->field_list = eina_list_append(def->field_list, fname);
+        def->field_list = eina_list_append(def->field_list, fdef);
         eo_lexer_get(ls);
         check_next(ls, ':');
         tp = parse_type(ls);
@@ -614,6 +615,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool 
is_extern,
         fdef->base.line = fline;
         fdef->base.column = fcol;
         fdef->type = tp;
+        fdef->name = eina_stringshare_ref(fname);
         pop_type(ls);
         check_next(ls, ';');
         if (ls->t.token == TOK_COMMENT)
@@ -631,9 +633,10 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool 
is_extern,
 }
 
 static void
-_enum_field_free(Eolian_Enum_Field *def)
+_enum_field_free(Eolian_Enum_Type_Field *def)
 {
    if (def->base.file) eina_stringshare_del(def->base.file);
+   if (def->name) eina_stringshare_del(def->name);
    database_expr_del(def->value);
    if (def->comment) eina_stringshare_del(def->comment);
    free(def);
@@ -673,19 +676,20 @@ parse_enum(Eo_Lexer *ls, const char *name, Eina_Bool 
is_extern,
    for (;;)
      {
         const char *fname;
-        Eolian_Enum_Field *fdef;
+        Eolian_Enum_Type_Field *fdef;
         int fline = ls->line_number, fcol = ls->column;
         check(ls, TOK_VALUE);
         if (eina_hash_find(def->fields, ls->t.value.s))
           eo_lexer_syntax_error(ls, "double field definition");
-        fdef = calloc(1, sizeof(Eolian_Enum_Field));
+        fdef = calloc(1, sizeof(Eolian_Enum_Type_Field));
         fname = eina_stringshare_ref(ls->t.value.s);
         eina_hash_add(def->fields, fname, fdef);
-        def->field_list = eina_list_append(def->field_list, fname);
+        def->field_list = eina_list_append(def->field_list, fdef);
         eo_lexer_get(ls);
         fdef->base.file = eina_stringshare_ref(ls->filename);
         fdef->base.line = fline;
         fdef->base.column = fcol;
+        fdef->name = eina_stringshare_ref(fname);
         if (ls->t.token != '=')
           {
              if (!prev_exp)
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 3fbfa97..57ac6fd 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -161,19 +161,21 @@ struct _Eolian_Event
    int scope;
 };
 
-typedef struct _Eolian_Struct_Field
+struct _Eolian_Struct_Type_Field
 {
+   Eina_Stringshare *name;
    Eolian_Object     base;
    Eolian_Type      *type;
    Eina_Stringshare *comment;
-} Eolian_Struct_Field;
+};
 
-typedef struct _Eolian_Enum_Field
+struct _Eolian_Enum_Type_Field
 {
+   Eina_Stringshare  *name;
    Eolian_Object      base;
    Eolian_Expression *value;
    Eina_Stringshare  *comment;
-} Eolian_Enum_Field;
+};
 
 typedef enum
 {
diff --git a/src/tests/eolian/eolian_parsing.c 
b/src/tests/eolian/eolian_parsing.c
index 2025ffe..8e5ba2e 100644
--- a/src/tests/eolian/eolian_parsing.c
+++ b/src/tests/eolian/eolian_parsing.c
@@ -548,7 +548,8 @@ END_TEST
 
 START_TEST(eolian_struct)
 {
-   const Eolian_Type *atype = NULL, *type = NULL, *field = NULL;
+   const Eolian_Struct_Type_Field *field = NULL;
+   const Eolian_Type *atype = NULL, *type = NULL, *ftype = NULL;
    const Eolian_Class *class;
    const char *type_name;
    const char *file;
@@ -572,10 +573,12 @@ START_TEST(eolian_struct)
    fail_if(strcmp(type_name, "Named"));
    fail_if(strcmp(file, "struct.eo"));
    fail_if(!(field = eolian_type_struct_field_get(type, "field")));
-   fail_if(!(type_name = eolian_type_name_get(field)));
+   fail_if(!(ftype = eolian_type_struct_field_type_get(field)));
+   fail_if(!(type_name = eolian_type_name_get(ftype)));
    fail_if(strcmp(type_name, "int"));
    fail_if(!(field = eolian_type_struct_field_get(type, "something")));
-   fail_if(!(type_name = eolian_type_c_type_get(field)));
+   fail_if(!(ftype = eolian_type_struct_field_type_get(field)));
+   fail_if(!(type_name = eolian_type_c_type_get(ftype)));
    fail_if(strcmp(type_name, "const char *"));
    eina_stringshare_del(type_name);
 
@@ -587,9 +590,10 @@ START_TEST(eolian_struct)
    fail_if(strcmp(type_name, "Another"));
    fail_if(strcmp(file, "struct.eo"));
    fail_if(!(field = eolian_type_struct_field_get(type, "field")));
-   fail_if(!(type_name = eolian_type_name_get(field)));
+   fail_if(!(ftype = eolian_type_struct_field_type_get(field)));
+   fail_if(!(type_name = eolian_type_name_get(ftype)));
    fail_if(strcmp(type_name, "Named"));
-   fail_if(eolian_type_type_get(field) != EOLIAN_TYPE_REGULAR_STRUCT);
+   fail_if(eolian_type_type_get(ftype) != EOLIAN_TYPE_REGULAR_STRUCT);
 
    /* typedef */
    fail_if(!(atype = eolian_type_alias_get_by_name("Foo")));
@@ -712,6 +716,7 @@ END_TEST
 
 START_TEST(eolian_enum)
 {
+   const Eolian_Enum_Type_Field *field = NULL;
    const Eolian_Variable *var = NULL;
    const Eolian_Type *type = NULL;
    const Eolian_Class *class;
@@ -730,25 +735,25 @@ START_TEST(eolian_enum)
 
    fail_if(!(type = eolian_type_enum_get_by_name("Foo")));
 
-   fail_if(!(eolian_type_enum_field_exists(type, "first")));
-   fail_if(!(exp = eolian_type_enum_field_get(type, "first")));
+   fail_if(!(field = eolian_type_enum_field_get(type, "first")));
+   fail_if(!(exp = eolian_type_enum_field_value_get(field)));
    v = eolian_expression_eval(exp, EOLIAN_MASK_ALL);
    fail_if(v.type != EOLIAN_EXPR_INT);
    fail_if(v.value.i != 0);
 
-   fail_if(!(eolian_type_enum_field_exists(type, "bar")));
-   fail_if(eolian_type_enum_field_get(type, "bar"));
+   fail_if(!(field = eolian_type_enum_field_get(type, "bar")));
+   fail_if(eolian_type_enum_field_value_get(field));
 
-   fail_if(!(eolian_type_enum_field_exists(type, "baz")));
-   fail_if(!(exp = eolian_type_enum_field_get(type, "baz")));
+   fail_if(!(field = eolian_type_enum_field_get(type, "baz")));
+   fail_if(!(exp = eolian_type_enum_field_value_get(field)));
    v = eolian_expression_eval(exp, EOLIAN_MASK_ALL);
    fail_if(v.type != EOLIAN_EXPR_INT);
    fail_if(v.value.i != 15);
 
    fail_if(!(type = eolian_type_enum_get_by_name("Bar")));
 
-   fail_if(!(eolian_type_enum_field_exists(type, "foo")));
-   fail_if(!(exp = eolian_type_enum_field_get(type, "foo")));
+   fail_if(!(field = eolian_type_enum_field_get(type, "foo")));
+   fail_if(!(exp = eolian_type_enum_field_value_get(field)));
    v = eolian_expression_eval(exp, EOLIAN_MASK_ALL);
    fail_if(v.type != EOLIAN_EXPR_INT);
    fail_if(v.value.i != 15);
@@ -756,20 +761,20 @@ START_TEST(eolian_enum)
    fail_if(!(type = eolian_type_alias_get_by_name("Baz")));
    fail_if(!(type = eolian_type_base_type_get(type)));
 
-   fail_if(!(eolian_type_enum_field_exists(type, "flag1")));
-   fail_if(!(exp = eolian_type_enum_field_get(type, "flag1")));
+   fail_if(!(field = eolian_type_enum_field_get(type, "flag1")));
+   fail_if(!(exp = eolian_type_enum_field_value_get(field)));
    v = eolian_expression_eval(exp, EOLIAN_MASK_ALL);
    fail_if(v.type != EOLIAN_EXPR_INT);
    fail_if(v.value.i != (1 << 0));
 
-   fail_if(!(eolian_type_enum_field_exists(type, "flag2")));
-   fail_if(!(exp = eolian_type_enum_field_get(type, "flag2")));
+   fail_if(!(field = eolian_type_enum_field_get(type, "flag2")));
+   fail_if(!(exp = eolian_type_enum_field_value_get(field)));
    v = eolian_expression_eval(exp, EOLIAN_MASK_ALL);
    fail_if(v.type != EOLIAN_EXPR_INT);
    fail_if(v.value.i != (1 << 1));
 
-   fail_if(!(eolian_type_enum_field_exists(type, "flag3")));
-   fail_if(!(exp = eolian_type_enum_field_get(type, "flag3")));
+   fail_if(!(field = eolian_type_enum_field_get(type, "flag3")));
+   fail_if(!(exp = eolian_type_enum_field_value_get(field)));
    v = eolian_expression_eval(exp, EOLIAN_MASK_ALL);
    fail_if(v.type != EOLIAN_EXPR_INT);
    fail_if(v.value.i != (1 << 2));

-- 


Reply via email to