eolian: fix auto/empty parsing/fill and add tests

This commit is contained in:
Daniel Kolesa 2014-09-04 11:06:41 +01:00
parent cfba724a37
commit e67b52c514
4 changed files with 78 additions and 31 deletions

View File

@ -233,6 +233,28 @@ _func_error(Eolian_Class *cl, Eolian_Implement *impl)
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
_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)
{
Eolian_Function *foo_id = (Eolian_Function*)
eolian_class_function_get_by_name(cl,
impl_name,
ftype);
eolian_class_function_get_by_name(cl, impl_name, ftype);
if (!foo_id) return _func_error(cl, impl);
if (impl->is_prop_set)
@ -262,13 +282,11 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
}
else if (impl->is_auto)
{
const char *inm = impl_name;
if (inm[0] == '.') ++inm;
if (strchr(inm, '.')) goto pasttags;
Eolian_Function *foo_id = (Eolian_Function*)
eolian_class_function_get_by_name(cl, inm,
ftype);
if (!foo_id) return _func_error(cl, impl);
Eolian_Function *foo_id;
if (!_get_impl_func(cl, impl, ftype, &foo_id))
return _func_error(cl, impl);
if (!foo_id)
goto pasttags;
if (impl->is_prop_set)
foo_id->set_auto = EINA_TRUE;
else
@ -276,13 +294,11 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
}
else if (impl->is_empty)
{
const char *inm = impl_name;
if (inm[0] == '.') ++inm;
if (strchr(inm, '.')) goto pasttags;
Eolian_Function *foo_id = (Eolian_Function*)
eolian_class_function_get_by_name(cl, inm,
ftype);
if (!foo_id) return _func_error(cl, impl);
Eolian_Function *foo_id;
if (!_get_impl_func(cl, impl, ftype, &foo_id))
return _func_error(cl, impl);
if (!foo_id)
goto pasttags;
if (impl->is_prop_set)
foo_id->set_empty = EINA_TRUE;
else

View File

@ -1546,13 +1546,6 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
check_kw_next(ls, KW_get);
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, ';');
return;

View File

@ -6,14 +6,24 @@ class Override (Base) {
get {
}
}
b {
set {
}
get {
}
}
}
methods {
foo {
}
bar {
}
}
implements {
Base.constructor;
@virtual .a.set;
@virtual .foo;
@auto .b.set;
@empty .bar;
}
}

View File

@ -155,13 +155,6 @@ START_TEST(eolian_override)
/* Base ctor */
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(!(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 */
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(!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();
}
END_TEST