eolian: add eolian_type_aliased_base_get

This adds a new API function that is there mainly for convenience (see doc).
Also added/updated tests as necessary.

@feature
This commit is contained in:
Daniel Kolesa 2015-11-18 16:02:15 +00:00
parent 3da89206bf
commit e089908545
5 changed files with 49 additions and 0 deletions

View File

@ -1495,6 +1495,23 @@ EAPI Eina_Stringshare *eolian_type_file_get(const Eolian_Type *tp);
*/
EAPI const Eolian_Type *eolian_type_base_type_get(const Eolian_Type *tp);
/*
* @brief Get the lowest base type of an alias stack.
*
* If the given type is an alias, it returns the result of a recursive call
* to this function on its base type. If it's a regular type, it first tries
* to retrieve its base using eolian_type_base_type_get and if the retrieved
* base is an alias, returns a recursive call of this function on it. Otherwise
* it returns the given type. This is useful in order to retrieve what an
* aliased type actually is while still having convenience.
*
* @param[in] tp the type.
* @return the lowest alias base or the given type.
*
* @ingroup Eolian
*/
EAPI const Eolian_Type *eolian_type_aliased_base_get(const Eolian_Type *tp);
/*
* @brief Get the class associated with an EOLIAN_TYPE_CLASS type.
*

View File

@ -251,6 +251,23 @@ eolian_type_base_type_get(const Eolian_Type *tp)
return tp->base_type;
}
EAPI const Eolian_Type *
eolian_type_aliased_base_get(const Eolian_Type *tp)
{
if (!tp)
return NULL;
if (eolian_type_type_get(tp) == EOLIAN_TYPE_REGULAR)
{
const Eolian_Type *btp = eolian_type_base_type_get(tp);
if (btp && (eolian_type_type_get(btp) == EOLIAN_TYPE_ALIAS))
return eolian_type_aliased_base_get(btp);
return tp;
}
else if (eolian_type_type_get(tp) != EOLIAN_TYPE_ALIAS)
return tp;
return eolian_type_aliased_base_get(tp->base_type);
}
EAPI const Eolian_Class *
eolian_type_class_get(const Eolian_Type *tp)
{

View File

@ -1,6 +1,9 @@
type Evas.Coord: int; /* Simple type definition */
type List_Objects: own(list<Eo *>*); /* A little more complex */
type Evas.Coord2: Evas.Coord;
type Evas.Coord3: Evas.Coord2;
type @extern Evas.Pants: float; /* not generated */
type Undef: __undefined_type; /* not generated */

View File

@ -15,6 +15,10 @@ typedef int Evas_Coord;
typedef Eina_List *List_Objects;
typedef Evas_Coord Evas_Coord2;
typedef Evas_Coord2 Evas_Coord3;
typedef enum
{
BAR_FIRST_ITEM = 0,

View File

@ -369,6 +369,11 @@ START_TEST(eolian_typedef)
fail_if(!(file = eolian_type_file_get(atype)));
fail_if(strcmp(file, "typedef.eo"));
/* Lowest alias base */
fail_if(!(atype = eolian_type_alias_get_by_name("Evas.Coord3")));
fail_if(!(atype = eolian_type_aliased_base_get(atype)));
fail_if(strcmp(eolian_type_name_get(atype), "int"));
/* Complex type */
fail_if(!(atype = eolian_type_alias_get_by_name("List_Objects")));
fail_if(!(type_name = eolian_type_name_get(atype)));
@ -395,6 +400,9 @@ START_TEST(eolian_typedef)
fail_if(!eina_iterator_next(iter, (void**)&atype));
fail_if(!(type_name = eolian_type_name_get(atype)));
fail_if(strcmp(type_name, "List_Objects"));
/* coord2 and coord3, skip */
fail_if(!eina_iterator_next(iter, (void**)&atype));
fail_if(!eina_iterator_next(iter, (void**)&atype));
/* not generated extern, skip */
fail_if(!eina_iterator_next(iter, (void**)&atype));
/* not generated undefined type, skip */