eolian: more relaxed safety in types API

This changes the checks in eolian type API so that you can use the various
type funcs on incompatible types, getting a NULL in return; this allows
simplified generator logic, with error handling done on generator side,
without getting annoying messages from the Eolian lib.
This commit is contained in:
Daniel Kolesa 2015-11-19 15:28:48 +00:00
parent b3867ce395
commit 55be91afc9
1 changed files with 17 additions and 31 deletions

View File

@ -82,8 +82,8 @@ eolian_type_subtypes_get(const Eolian_Type *tp)
Eolian_Type_Type tpt;
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
tpt = tp->type;
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpt == EOLIAN_TYPE_COMPLEX, NULL);
if (!tp->subtypes) return NULL;
if ((tpt != EOLIAN_TYPE_COMPLEX) || !tp->subtypes)
return NULL;
return eina_list_iterator_new(tp->subtypes);
}
@ -91,7 +91,8 @@ EAPI Eina_Iterator *
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);
if (tp->type != EOLIAN_TYPE_STRUCT)
return NULL;
return eina_list_iterator_new(tp->field_list);
}
@ -101,7 +102,8 @@ eolian_type_struct_field_get(const Eolian_Type *tp, const char *field)
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);
if (tp->type != EOLIAN_TYPE_STRUCT)
return NULL;
sf = eina_hash_find(tp->fields, field);
if (!sf) return NULL;
return sf;
@ -132,7 +134,8 @@ EAPI Eina_Iterator *
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);
if (tp->type != EOLIAN_TYPE_ENUM)
return NULL;
return eina_list_iterator_new(tp->field_list);
}
@ -142,7 +145,8 @@ eolian_type_enum_field_get(const Eolian_Type *tp, const char *field)
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);
if (tp->type != EOLIAN_TYPE_ENUM)
return NULL;
ef = eina_hash_find(tp->fields, field);
if (!ef) return NULL;
return ef;
@ -197,29 +201,22 @@ EAPI Eina_Stringshare *
eolian_type_enum_legacy_prefix_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);
if (tp->type != EOLIAN_TYPE_ENUM)
return NULL;
return tp->legacy;
}
EAPI const Eolian_Documentation *
eolian_type_documentation_get(const Eolian_Type *tp)
{
Eolian_Type_Type tpp;
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
tpp = eolian_type_type_get(tp);
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
&& tpp != EOLIAN_TYPE_VOID, NULL);
return tp->doc;
}
EAPI Eina_Stringshare *
eolian_type_file_get(const Eolian_Type *tp)
{
Eolian_Type_Type tpp;
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
tpp = eolian_type_type_get(tp);
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
&& tpp != EOLIAN_TYPE_VOID, NULL);
return tp->base.file;
}
@ -229,9 +226,9 @@ eolian_type_base_type_get(const Eolian_Type *tp)
Eolian_Type_Type tpt;
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
tpt = eolian_type_type_get(tp);
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpt == EOLIAN_TYPE_POINTER
|| tpt == EOLIAN_TYPE_ALIAS
|| tpt == EOLIAN_TYPE_REGULAR, NULL);
if ((tpt != EOLIAN_TYPE_POINTER) && (tpt != EOLIAN_TYPE_ALIAS) &&
(tpt != EOLIAN_TYPE_REGULAR))
return NULL;
if (tpt == EOLIAN_TYPE_REGULAR)
{
/* for regular types, try looking up if it belongs to a struct,
@ -272,7 +269,8 @@ EAPI const Eolian_Class *
eolian_type_class_get(const Eolian_Type *tp)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
EINA_SAFETY_ON_FALSE_RETURN_VAL(eolian_type_type_get(tp) == EOLIAN_TYPE_CLASS, NULL);
if (eolian_type_type_get(tp) != EOLIAN_TYPE_CLASS)
return NULL;
return eolian_class_get_by_name(tp->full_name);
}
@ -319,33 +317,21 @@ eolian_type_c_type_get(const Eolian_Type *tp)
EAPI Eina_Stringshare *
eolian_type_name_get(const Eolian_Type *tp)
{
Eolian_Type_Type tpp;
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
tpp = eolian_type_type_get(tp);
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
&& tpp != EOLIAN_TYPE_VOID, NULL);
return tp->name;
}
EAPI Eina_Stringshare *
eolian_type_full_name_get(const Eolian_Type *tp)
{
Eolian_Type_Type tpp;
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
tpp = eolian_type_type_get(tp);
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
&& tpp != EOLIAN_TYPE_VOID, NULL);
return tp->full_name;
}
EAPI Eina_Iterator *
eolian_type_namespaces_get(const Eolian_Type *tp)
{
Eolian_Type_Type tpp;
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
tpp = eolian_type_type_get(tp);
EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
&& tpp != EOLIAN_TYPE_VOID, NULL);
if (!tp->namespaces) return NULL;
return eina_list_iterator_new(tp->namespaces);
}