forked from enlightenment/efl
eolian: fix auto/empty parsing/fill and add tests
This commit is contained in:
parent
cfba724a37
commit
e67b52c514
|
@ -233,6 +233,28 @@ _func_error(Eolian_Class *cl, Eolian_Implement *impl)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
_get_impl_func(Eolian_Class *cl, Eolian_Implement *impl,
|
||||||
|
Eolian_Function_Type ftype, Eolian_Function **foo_id)
|
||||||
|
{
|
||||||
|
size_t cllen = strlen(cl->full_name);
|
||||||
|
size_t imlen = strlen(impl->full_name);
|
||||||
|
const char *imstr = impl->full_name;
|
||||||
|
*foo_id = NULL;
|
||||||
|
if (imstr[0] == '.')
|
||||||
|
++imstr;
|
||||||
|
else if ((imlen > (cllen + 1)) && (*(imstr + cllen) == '.')
|
||||||
|
&& !strncmp(imstr, cl->full_name, cllen))
|
||||||
|
imstr += cllen + 1;
|
||||||
|
else
|
||||||
|
return EINA_TRUE;
|
||||||
|
if (strchr(imstr, '.'))
|
||||||
|
return EINA_FALSE;
|
||||||
|
*foo_id = (Eolian_Function*)eolian_class_function_get_by_name(cl, imstr,
|
||||||
|
ftype);
|
||||||
|
return !!*foo_id;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
|
_db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
|
||||||
{
|
{
|
||||||
|
@ -248,9 +270,7 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
|
||||||
if (impl->is_virtual)
|
if (impl->is_virtual)
|
||||||
{
|
{
|
||||||
Eolian_Function *foo_id = (Eolian_Function*)
|
Eolian_Function *foo_id = (Eolian_Function*)
|
||||||
eolian_class_function_get_by_name(cl,
|
eolian_class_function_get_by_name(cl, impl_name, ftype);
|
||||||
impl_name,
|
|
||||||
ftype);
|
|
||||||
if (!foo_id) return _func_error(cl, impl);
|
if (!foo_id) return _func_error(cl, impl);
|
||||||
|
|
||||||
if (impl->is_prop_set)
|
if (impl->is_prop_set)
|
||||||
|
@ -262,13 +282,11 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
|
||||||
}
|
}
|
||||||
else if (impl->is_auto)
|
else if (impl->is_auto)
|
||||||
{
|
{
|
||||||
const char *inm = impl_name;
|
Eolian_Function *foo_id;
|
||||||
if (inm[0] == '.') ++inm;
|
if (!_get_impl_func(cl, impl, ftype, &foo_id))
|
||||||
if (strchr(inm, '.')) goto pasttags;
|
return _func_error(cl, impl);
|
||||||
Eolian_Function *foo_id = (Eolian_Function*)
|
if (!foo_id)
|
||||||
eolian_class_function_get_by_name(cl, inm,
|
goto pasttags;
|
||||||
ftype);
|
|
||||||
if (!foo_id) return _func_error(cl, impl);
|
|
||||||
if (impl->is_prop_set)
|
if (impl->is_prop_set)
|
||||||
foo_id->set_auto = EINA_TRUE;
|
foo_id->set_auto = EINA_TRUE;
|
||||||
else
|
else
|
||||||
|
@ -276,13 +294,11 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
|
||||||
}
|
}
|
||||||
else if (impl->is_empty)
|
else if (impl->is_empty)
|
||||||
{
|
{
|
||||||
const char *inm = impl_name;
|
Eolian_Function *foo_id;
|
||||||
if (inm[0] == '.') ++inm;
|
if (!_get_impl_func(cl, impl, ftype, &foo_id))
|
||||||
if (strchr(inm, '.')) goto pasttags;
|
return _func_error(cl, impl);
|
||||||
Eolian_Function *foo_id = (Eolian_Function*)
|
if (!foo_id)
|
||||||
eolian_class_function_get_by_name(cl, inm,
|
goto pasttags;
|
||||||
ftype);
|
|
||||||
if (!foo_id) return _func_error(cl, impl);
|
|
||||||
if (impl->is_prop_set)
|
if (impl->is_prop_set)
|
||||||
foo_id->set_empty = EINA_TRUE;
|
foo_id->set_empty = EINA_TRUE;
|
||||||
else
|
else
|
||||||
|
|
|
@ -1546,13 +1546,6 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
|
||||||
check_kw_next(ls, KW_get);
|
check_kw_next(ls, KW_get);
|
||||||
impl->is_prop_get = EINA_TRUE;
|
impl->is_prop_get = EINA_TRUE;
|
||||||
}
|
}
|
||||||
if (!impl->is_virtual)
|
|
||||||
{
|
|
||||||
const char *ofname = impl->full_name;
|
|
||||||
impl->full_name = eina_stringshare_printf("%s%s", ofname,
|
|
||||||
impl->is_prop_get ? ".get" : "set");
|
|
||||||
eina_stringshare_del(ofname);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
check_next(ls, ';');
|
check_next(ls, ';');
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -6,14 +6,24 @@ class Override (Base) {
|
||||||
get {
|
get {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
b {
|
||||||
|
set {
|
||||||
|
}
|
||||||
|
get {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
methods {
|
methods {
|
||||||
foo {
|
foo {
|
||||||
}
|
}
|
||||||
|
bar {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
implements {
|
implements {
|
||||||
Base.constructor;
|
Base.constructor;
|
||||||
@virtual .a.set;
|
@virtual .a.set;
|
||||||
@virtual .foo;
|
@virtual .foo;
|
||||||
|
@auto .b.set;
|
||||||
|
@empty .bar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,13 +155,6 @@ START_TEST(eolian_override)
|
||||||
/* Base ctor */
|
/* Base ctor */
|
||||||
fail_if(!(fid = eolian_class_function_get_by_name(base, "constructor", EOLIAN_UNRESOLVED)));
|
fail_if(!(fid = eolian_class_function_get_by_name(base, "constructor", EOLIAN_UNRESOLVED)));
|
||||||
fail_if(!eolian_function_is_virtual_pure(fid, EOLIAN_UNRESOLVED));
|
fail_if(!eolian_function_is_virtual_pure(fid, EOLIAN_UNRESOLVED));
|
||||||
fail_if(!(iter = eolian_class_implements_get(class)));
|
|
||||||
fail_if(!(eina_iterator_next(iter, (void**)&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"));
|
|
||||||
eina_iterator_free(iter);
|
|
||||||
|
|
||||||
/* Property */
|
/* Property */
|
||||||
fail_if(!(fid = eolian_class_function_get_by_name(class, "a", EOLIAN_PROPERTY)));
|
fail_if(!(fid = eolian_class_function_get_by_name(class, "a", EOLIAN_PROPERTY)));
|
||||||
|
@ -172,6 +165,41 @@ START_TEST(eolian_override)
|
||||||
fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)));
|
fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)));
|
||||||
fail_if(!eolian_function_is_virtual_pure(fid, EOLIAN_METHOD));
|
fail_if(!eolian_function_is_virtual_pure(fid, EOLIAN_METHOD));
|
||||||
|
|
||||||
|
/* Implements */
|
||||||
|
fail_if(!(iter = eolian_class_implements_get(class)));
|
||||||
|
|
||||||
|
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
|
||||||
|
fail_if(eolian_implement_is_auto(impl));
|
||||||
|
fail_if(eolian_implement_is_empty(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(!(impl_class = eolian_implement_class_get(impl)));
|
||||||
|
fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
|
||||||
|
fail_if(impl_class != class);
|
||||||
|
fail_if(strcmp(eolian_function_name_get(impl_func), "b"));
|
||||||
|
fail_if(!eolian_function_is_auto(impl_func, EOLIAN_PROP_SET));
|
||||||
|
fail_if(eolian_function_is_auto(impl_func, EOLIAN_PROP_GET));
|
||||||
|
fail_if(eolian_function_is_empty(impl_func, EOLIAN_METHOD));
|
||||||
|
|
||||||
|
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
|
||||||
|
fail_if(eolian_implement_is_auto(impl));
|
||||||
|
fail_if(!eolian_implement_is_empty(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);
|
||||||
|
fail_if(strcmp(eolian_function_name_get(impl_func), "bar"));
|
||||||
|
fail_if(eolian_function_is_auto(impl_func, EOLIAN_PROP_SET));
|
||||||
|
fail_if(eolian_function_is_auto(impl_func, EOLIAN_PROP_GET));
|
||||||
|
fail_if(!eolian_function_is_empty(impl_func, EOLIAN_METHOD));
|
||||||
|
|
||||||
|
eina_iterator_free(iter);
|
||||||
|
|
||||||
eolian_shutdown();
|
eolian_shutdown();
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
Loading…
Reference in New Issue