forked from enlightenment/efl
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:
parent
95b1b13c5e
commit
977d4fe1a6
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue