eolian: better handling of @virtual implements

Now they're registered correctly. Also, add new API, eolian_implement_is_virtual.
Also, deal with get/set properly (when filling in additional implements)
This commit is contained in:
Daniel Kolesa 2014-09-05 16:04:08 +01:00
parent 95b1b13c5e
commit 977d4fe1a6
5 changed files with 85 additions and 9 deletions

View File

@ -1011,6 +1011,16 @@ EAPI Eina_Bool eolian_implement_is_auto(const Eolian_Implement *impl);
*/
EAPI Eina_Bool eolian_implement_is_empty(const Eolian_Implement *impl);
/*
* @brief Get whether an implement is tagged with @virtual.
*
* @param[in] impl the handle of the implement
* @return EINA_TRUE when it is, EINA_FALSE when it's not.
*
* @ingroup Eolian
*/
EAPI Eina_Bool eolian_implement_is_virtual(const Eolian_Implement *impl);
/*
* @brief Get whether an implement references a property getter.
*

View File

@ -257,6 +257,17 @@ _get_impl_func(Eolian_Class *cl, Eolian_Implement *impl,
return !!*foo_id;
}
static void
_write_impl(Eolian_Function *fid, Eolian_Implement *impl)
{
if (impl->is_prop_set)
fid->set_impl = impl;
else if (impl->is_prop_get)
fid->get_impl = impl;
else
fid->get_impl = fid->set_impl = impl;
}
static int
_db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
{
@ -273,14 +284,19 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
{
Eolian_Function *foo_id = (Eolian_Function*)
eolian_class_function_get_by_name(cl, impl_name, ftype);
if (!foo_id) return _func_error(cl, impl);
if (!foo_id)
return _func_error(cl, impl);
if (impl->is_prop_set)
foo_id->set_virtual_pure = EINA_TRUE;
else
foo_id->get_virtual_pure = EINA_TRUE;
return 1;
impl->full_name = eina_stringshare_printf("%s.%s", cl->full_name,
impl_name);
eina_stringshare_del(impl_name);
impl_name = impl->full_name;
_write_impl(foo_id, impl);
}
else if (impl->is_auto)
{
@ -294,7 +310,7 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
else
foo_id->get_auto = EINA_TRUE;
foo_id->impl = impl;
_write_impl(foo_id, impl);
}
else if (impl->is_empty)
{
@ -308,7 +324,7 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
else
foo_id->get_empty = EINA_TRUE;
foo_id->impl = impl;
_write_impl(foo_id, impl);
}
else if (impl->is_class_ctor)
{
@ -342,9 +358,18 @@ pasttags:
static Eina_Bool
_db_build_implement(Eolian_Class *cl, Eolian_Function *foo_id)
{
if (foo_id->impl)
if (foo_id->type == EOLIAN_PROP_SET)
{
if (foo_id->set_impl)
return EINA_TRUE;
}
else if (foo_id->type == EOLIAN_PROP_GET)
{
if (foo_id->get_impl)
return EINA_TRUE;
}
else if (foo_id->get_impl && foo_id->set_impl)
return EINA_TRUE;
Eolian_Implement *impl = calloc(1, sizeof(Eolian_Implement));
if (foo_id->type == EOLIAN_PROP_SET)
@ -363,7 +388,27 @@ _db_build_implement(Eolian_Class *cl, Eolian_Function *foo_id)
else if (foo_id->type == EOLIAN_PROP_GET)
impl->is_prop_get = EINA_TRUE;
foo_id->impl = impl;
if (foo_id->type == EOLIAN_PROPERTY)
{
if (foo_id->get_impl)
{
impl->is_prop_set = EINA_TRUE;
foo_id->set_impl = impl;
}
else if (foo_id->set_impl)
{
impl->is_prop_get = EINA_TRUE;
foo_id->get_impl = impl;
}
else
foo_id->get_impl = foo_id->set_impl = impl;
}
else if (foo_id->type == EOLIAN_PROP_SET)
foo_id->set_impl = impl;
else if (foo_id->type == EOLIAN_PROP_GET)
foo_id->get_impl = impl;
else
foo_id->get_impl = foo_id->set_impl = impl;
cl->implements = eina_list_append(cl->implements, impl);

View File

@ -103,6 +103,13 @@ eolian_implement_is_empty(const Eolian_Implement *impl)
return impl->is_empty;
}
EAPI Eina_Bool
eolian_implement_is_virtual(const Eolian_Implement *impl)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(impl, EINA_FALSE);
return impl->is_virtual;
}
EAPI Eina_Bool
eolian_implement_is_prop_get(const Eolian_Implement *impl)
{

View File

@ -97,7 +97,8 @@ struct _Eolian_Function
Eolian_Type *set_ret_type;
Eolian_Expression *get_ret_val;
Eolian_Expression *set_ret_val;
Eolian_Implement *impl;
Eolian_Implement *get_impl;
Eolian_Implement *set_impl;
Eina_Stringshare *get_legacy;
Eina_Stringshare *set_legacy;
Eina_Stringshare *get_description;

View File

@ -171,14 +171,26 @@ START_TEST(eolian_override)
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
fail_if(eolian_implement_is_auto(impl));
fail_if(eolian_implement_is_empty(impl));
fail_if(eolian_implement_is_virtual(impl));
fail_if(!(impl_class = eolian_implement_class_get(impl)));
fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
fail_if(impl_class != base);
fail_if(strcmp(eolian_function_name_get(impl_func), "constructor"));
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
fail_if(eolian_implement_is_auto(impl));
fail_if(eolian_implement_is_empty(impl));
fail_if(!eolian_implement_is_virtual(impl));
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
fail_if(eolian_implement_is_auto(impl));
fail_if(eolian_implement_is_empty(impl));
fail_if(!eolian_implement_is_virtual(impl));
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
fail_if(!eolian_implement_is_auto(impl));
fail_if(eolian_implement_is_empty(impl));
fail_if(eolian_implement_is_virtual(impl));
fail_if(!(impl_class = eolian_implement_class_get(impl)));
fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
fail_if(impl_class != class);
@ -190,6 +202,7 @@ START_TEST(eolian_override)
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
fail_if(eolian_implement_is_auto(impl));
fail_if(!eolian_implement_is_empty(impl));
fail_if(eolian_implement_is_virtual(impl));
fail_if(!(impl_class = eolian_implement_class_get(impl)));
fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
fail_if(impl_class != class);