eolian: fix auto/empty parsing/fill and add tests
authorDaniel Kolesa <d.kolesa@samsung.com>
Thu, 4 Sep 2014 10:06:41 +0000 (11:06 +0100)
committerDaniel Kolesa <d.kolesa@samsung.com>
Thu, 4 Sep 2014 10:07:00 +0000 (11:07 +0100)
src/lib/eolian/database_fill.c
src/lib/eolian/eo_parser.c
src/tests/eolian/data/override.eo
src/tests/eolian/eolian_parsing.c

index 3290ae2..4fba89b 100644 (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
index 0697230..8b3e77c 100644 (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;
index 008b139..c728b97 100644 (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;
    }
 }
index 1956504..02ce378 100644 (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