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)
{
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)
}
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
}
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
/* 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)));
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