From e67b52c514fcd2cddbc1092b05c7ed97d773562b Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 4 Sep 2014 11:06:41 +0100 Subject: [PATCH] eolian: fix auto/empty parsing/fill and add tests --- src/lib/eolian/database_fill.c | 50 ++++++++++++++++++++----------- src/lib/eolian/eo_parser.c | 7 ----- src/tests/eolian/data/override.eo | 10 +++++++ src/tests/eolian/eolian_parsing.c | 42 +++++++++++++++++++++----- 4 files changed, 78 insertions(+), 31 deletions(-) diff --git a/src/lib/eolian/database_fill.c b/src/lib/eolian/database_fill.c index 3290ae21a6..4fba89b6d1 100644 --- a/src/lib/eolian/database_fill.c +++ b/src/lib/eolian/database_fill.c @@ -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 diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 069723052c..8b3e77c08b 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -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; diff --git a/src/tests/eolian/data/override.eo b/src/tests/eolian/data/override.eo index 008b1394b4..c728b97940 100644 --- a/src/tests/eolian/data/override.eo +++ b/src/tests/eolian/data/override.eo @@ -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; } } diff --git a/src/tests/eolian/eolian_parsing.c b/src/tests/eolian/eolian_parsing.c index 19565042a4..02ce378ce6 100644 --- a/src/tests/eolian/eolian_parsing.c +++ b/src/tests/eolian/eolian_parsing.c @@ -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