diff options
author | Daniel Kolesa <d.kolesa@samsung.com> | 2014-08-22 16:56:41 +0100 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@samsung.com> | 2014-08-22 16:56:41 +0100 |
commit | b75014a02487221041563c8689a88820d7db9789 (patch) | |
tree | d6181f5a1cab4e011401d53f54ea87fafd61424d | |
parent | 894c9a42dbcc2e3c6777092c55413295b486d814 (diff) | |
download | efl-b75014a02487221041563c8689a88820d7db9789.tar.gz |
eolian: refactor the struct/enum field APIs
-rw-r--r-- | src/bin/eolian/types_generator.c | 34 | ||||
-rw-r--r-- | src/lib/eolian/Eolian.h | 81 | ||||
-rw-r--r-- | src/lib/eolian/database_expr.c | 8 | ||||
-rw-r--r-- | src/lib/eolian/database_type.c | 8 | ||||
-rw-r--r-- | src/lib/eolian/database_type_api.c | 78 | ||||
-rw-r--r-- | src/lib/eolian/database_validate.c | 4 | ||||
-rw-r--r-- | src/lib/eolian/eo_parser.c | 20 | ||||
-rw-r--r-- | src/lib/eolian/eolian_database.h | 10 | ||||
-rw-r--r-- | 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 96481f6b02..acd8d5e06c 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 7135a456a0..84fb1d1491 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 dc5b439065..f22407996f 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 7d80f7579b..c22e2895d7 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 79e5f92611..e80455d6e6 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 14c38a390a..02f9caa8b1 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 faff9a5772..b0299f057e 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 3fbfa9733d..57ac6fd926 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 2025ffebd6..8e5ba2eb38 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)); |