eolian: separate database fill stuff from the parser
authorDaniel Kolesa <d.kolesa@samsung.com>
Fri, 11 Jul 2014 10:31:48 +0000 (11:31 +0100)
committerDaniel Kolesa <d.kolesa@samsung.com>
Fri, 11 Jul 2014 10:31:48 +0000 (11:31 +0100)
src/Makefile_Eolian.am
src/lib/eolian/database_fill.c [new file with mode: 0644]
src/lib/eolian/eo_parser.c

index 22a5c36..29c5e72 100644 (file)
@@ -16,6 +16,7 @@ lib_eolian_libeolian_la_SOURCES = \
                                   lib/eolian/eolian.c \
                                   lib/eolian/eolian_database.c \
                                   lib/eolian/eolian_database.h \
+                                  lib/eolian/database_fill.c \
                                   lib/eolian/database_class.c \
                                   lib/eolian/database_class_api.c \
                                   lib/eolian/database_function.c \
diff --git a/src/lib/eolian/database_fill.c b/src/lib/eolian/database_fill.c
new file mode 100644 (file)
index 0000000..10b9dd9
--- /dev/null
@@ -0,0 +1,494 @@
+#include "eo_parser.h"
+
+static Eina_Bool
+_db_fill_ctor(Eolian_Class *cl, Eo_Method_Def *meth)
+{
+   Eo_Param_Def *param;
+   Eina_List *l;
+
+   Eolian_Function *foo_id = database_function_new(meth->name, EOLIAN_CTOR);
+
+   database_class_function_add(cl, foo_id);
+
+   if (meth->ret)
+     {
+        database_function_return_comment_set(foo_id, EOLIAN_METHOD,
+                                             meth->ret->comment);
+     }
+   database_function_data_set(foo_id, EOLIAN_LEGACY, meth->legacy);
+
+   EINA_LIST_FOREACH(meth->params, l, param)
+     {
+        database_method_parameter_add(foo_id, (Eolian_Parameter_Dir)param->way,
+                                      param->type, param->name, param->comment);
+        param->type = NULL;
+     }
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_ctors(Eolian_Class *cl, Eo_Class_Def *kls)
+{
+   Eo_Method_Def *meth;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(kls->constructors, l, meth)
+     if (!_db_fill_ctor(cl, meth)) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+
+static Eina_Bool
+_db_fill_key(Eolian_Function *foo_id, Eo_Param_Def *param)
+{
+   Eolian_Function_Parameter *p = database_property_key_add(foo_id,
+                                                            param->type,
+                                                            param->name,
+                                                            param->comment);
+   database_parameter_nonull_set(p, param->nonull);
+   param->type = NULL;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_keys(Eolian_Function *foo_id, Eo_Property_Def *prop)
+{
+   Eo_Param_Def *param;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(prop->keys, l, param)
+     if (!_db_fill_key(foo_id, param)) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_value(Eolian_Function *foo_id, Eo_Param_Def *param)
+{
+   Eolian_Function_Parameter *p = database_property_value_add(foo_id,
+                                                              param->type,
+                                                              param->name,
+                                                              param->comment);
+   database_parameter_nonull_set(p, param->nonull);
+   param->type = NULL;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_values(Eolian_Function *foo_id, Eo_Property_Def *prop)
+{
+   Eo_Param_Def *param;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(prop->values, l, param)
+     if (!_db_fill_value(foo_id, param)) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_param(Eolian_Function *foo_id, Eo_Param_Def *param)
+{
+   Eolian_Function_Parameter *p = database_method_parameter_add(foo_id,
+                                                                param->way,
+                                                                param->type,
+                                                                param->name,
+                                                                param->comment);
+   database_parameter_nonull_set(p, param->nonull);
+   param->type = NULL;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_params(Eolian_Function *foo_id, Eo_Method_Def *meth)
+{
+   Eo_Param_Def *param;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(meth->params, l, param)
+     if (!_db_fill_param(foo_id, param)) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_accessor(Eolian_Function *foo_id, Eo_Class_Def *kls,
+                  Eo_Property_Def *prop, Eo_Accessor_Def *accessor)
+{
+   Eo_Accessor_Param *acc_param;
+   Eina_List *l;
+
+   database_function_type_set(foo_id, ((accessor->type == SETTER)
+                                        ? EOLIAN_PROP_SET : EOLIAN_PROP_GET));
+
+   Eolian_Function_Type ftype = (accessor->type == SETTER)
+                                 ? EOLIAN_PROP_SET : EOLIAN_PROP_GET;
+
+   if (accessor->ret && accessor->ret->type)
+     {
+        database_function_return_type_set(foo_id, ftype, accessor->ret->type);
+        database_function_return_comment_set(foo_id, ftype,
+                                             accessor->ret->comment);
+        database_function_return_flag_set_as_warn_unused(foo_id, ftype,
+                                             accessor->ret->warn_unused);
+        database_function_return_dflt_val_set(foo_id, ftype,
+                                             accessor->ret->dflt_ret_val);
+        accessor->ret->type = NULL;
+     }
+
+   if (accessor->legacy)
+     {
+        database_function_data_set(foo_id, ((accessor->type == SETTER)
+                                            ? EOLIAN_LEGACY_SET
+                                            : EOLIAN_LEGACY_GET),
+                                   accessor->legacy);
+     }
+
+   database_function_description_set(foo_id, ((accessor->type == SETTER)
+                                              ? EOLIAN_COMMENT_SET
+                                              : EOLIAN_COMMENT_GET),
+                                     accessor->comment);
+
+   EINA_LIST_FOREACH(accessor->params, l, acc_param)
+     {
+        Eolian_Function_Parameter *desc = (Eolian_Function_Parameter*)
+            eolian_function_parameter_get(foo_id, acc_param->name);
+
+        if (!desc)
+          {
+             ERR("Error - %s not known as parameter of property %s\n",
+                 acc_param->name, prop->name);
+             return EINA_FALSE;
+          }
+        else if (acc_param->is_const)
+          {
+             database_parameter_const_attribute_set(desc,
+                                                    accessor->type == GETTER,
+                                                    EINA_TRUE);
+          }
+     }
+
+   if (kls->type == EOLIAN_CLASS_INTERFACE)
+      database_function_set_as_virtual_pure(foo_id, ftype);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_accessors(Eolian_Function *foo_id, Eo_Class_Def *kls,
+                   Eo_Property_Def *prop)
+{
+   Eo_Accessor_Def *accessor;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(prop->accessors, l, accessor)
+     if (!_db_fill_accessor(foo_id, kls, prop, accessor)) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+
+static Eina_Bool
+_db_fill_property(Eolian_Class *cl, Eo_Class_Def *kls, Eo_Property_Def *prop)
+{
+   Eolian_Function *foo_id = database_function_new(prop->name,
+                                                   EOLIAN_UNRESOLVED);
+
+   database_function_scope_set(foo_id, prop->scope);
+
+   if (!_db_fill_keys     (foo_id,      prop)) return EINA_FALSE;
+   if (!_db_fill_values   (foo_id,      prop)) return EINA_FALSE;
+   if (!_db_fill_accessors(foo_id, kls, prop)) return EINA_FALSE;
+
+   if (!prop->accessors)
+     {
+        database_function_type_set(foo_id, EOLIAN_PROPERTY);
+        if (kls->type == EOLIAN_CLASS_INTERFACE)
+          database_function_set_as_virtual_pure(foo_id, EOLIAN_UNRESOLVED);
+     }
+
+   database_class_function_add(cl, foo_id);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_properties(Eolian_Class *cl, Eo_Class_Def *kls)
+{
+   Eo_Property_Def *prop;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(kls->properties, l, prop)
+     if (!_db_fill_property(cl, kls, prop)) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_method(Eolian_Class *cl, Eo_Class_Def *kls, Eo_Method_Def *meth)
+{
+   Eolian_Function *foo_id = database_function_new(meth->name, EOLIAN_METHOD);
+
+   database_function_scope_set(foo_id, meth->scope);
+
+   database_class_function_add(cl, foo_id);
+
+   if (meth->ret)
+     {
+        database_function_return_type_set(foo_id, EOLIAN_METHOD,
+                                          meth->ret->type);
+        database_function_return_comment_set(foo_id, EOLIAN_METHOD,
+                                          meth->ret->comment);
+        database_function_return_flag_set_as_warn_unused(foo_id, EOLIAN_METHOD,
+                                          meth->ret->warn_unused);
+        database_function_return_dflt_val_set(foo_id, EOLIAN_METHOD,
+                                          meth->ret->dflt_ret_val);
+        meth->ret->type = NULL;
+     }
+
+   database_function_description_set(foo_id, EOLIAN_COMMENT, meth->comment);
+   database_function_data_set(foo_id, EOLIAN_LEGACY, meth->legacy);
+   database_function_object_set_as_const(foo_id, meth->obj_const);
+
+   _db_fill_params(foo_id, meth);
+
+   if (kls->type == EOLIAN_CLASS_INTERFACE)
+     database_function_set_as_virtual_pure(foo_id, EOLIAN_METHOD);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_methods(Eolian_Class *cl, Eo_Class_Def *kls)
+{
+   Eo_Method_Def *meth;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(kls->methods, l, meth)
+     if (!_db_fill_method(cl, kls, meth)) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static int
+_db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
+{
+   const char *impl_name = impl->full_name;
+
+   if (!strcmp(impl_name, "class.constructor"))
+     {
+        database_class_ctor_enable_set(cl, EINA_TRUE);
+        return 1;
+     }
+
+   if (!strcmp(impl_name, "class.destructor"))
+     {
+        database_class_dtor_enable_set(cl, EINA_TRUE);
+        return 1;
+     }
+
+   if (!strncmp(impl_name, "virtual.", 8))
+     {
+        Eolian_Function_Type ftype = EOLIAN_UNRESOLVED;
+        char *type_as_str  = NULL;
+        char *virtual_name = strdup(impl_name);
+        char *func         = strchr(virtual_name, '.');
+
+        if (func) *func = '\0';
+        func += 1;
+
+        if ((type_as_str = strchr(func, '.')))
+          {
+             *type_as_str = '\0';
+
+             if (!strcmp(type_as_str+1, "set"))
+               ftype = EOLIAN_PROP_SET;
+             else if (!strcmp(type_as_str+1, "get"))
+               ftype = EOLIAN_PROP_GET;
+          }
+
+        free(virtual_name);
+
+        Eolian_Function *foo_id = (Eolian_Function*)
+                                   eolian_class_function_find_by_name(cl,
+                                                                      func,
+                                                                      ftype);
+        if (!foo_id)
+          {
+             ERR("Error - %s not known in class %s", impl_name + 8,
+                 eolian_class_name_get(cl));
+             return -1;
+          }
+        database_function_set_as_virtual_pure(foo_id, ftype);
+        return 1;
+     }
+   database_class_implement_add(cl, impl);
+   return 0;
+}
+
+static Eina_Bool
+_db_fill_implements(Eolian_Class *cl, Eo_Class_Def *kls)
+{
+   Eolian_Implement *impl;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(kls->implements, l, impl)
+     {
+        int ret = _db_fill_implement(cl, impl);
+        if (ret < 0) return EINA_FALSE;
+        if (ret > 0) continue;
+        eina_list_data_set(l, NULL); /* prevent double free */
+     }
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_events(Eolian_Class *cl, Eo_Class_Def *kls)
+{
+   Eolian_Event *event;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(kls->events, l, event)
+     {
+        database_class_event_add(cl, event);
+        eina_list_data_set(l, NULL); /* prevent double free */
+     }
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_class(Eo_Class_Def *kls, const char *filename)
+{
+   Eolian_Class *cl = database_class_add(kls->name, kls->type);
+   const char *s;
+   Eina_List *l;
+
+   database_class_file_set(cl, filename);
+
+   if (kls->comment)
+     {
+        database_class_description_set(cl, kls->comment);
+     }
+
+   EINA_LIST_FOREACH(kls->inherits, l, s)
+     {
+        database_class_inherit_add(cl, s);
+     }
+
+   if (kls->legacy_prefix)
+     {
+        database_class_legacy_prefix_set(cl, kls->legacy_prefix);
+     }
+   if (kls->eo_prefix)
+     {
+        database_class_eo_prefix_set(cl, kls->eo_prefix);
+     }
+   if (kls->data_type)
+     {
+        database_class_data_type_set(cl, kls->data_type);
+     }
+
+   if (!_db_fill_ctors     (cl, kls)) return EINA_FALSE;
+   if (!_db_fill_properties(cl, kls)) return EINA_FALSE;
+   if (!_db_fill_methods   (cl, kls)) return EINA_FALSE;
+   if (!_db_fill_implements(cl, kls)) return EINA_FALSE;
+   if (!_db_fill_events    (cl, kls)) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_db_fill_type(Eolian_Typedef *type_def)
+{
+   return database_type_add(type_def);
+}
+
+static Eina_Bool
+_db_fill_struct(Eolian_Type *struct_def)
+{
+   return database_struct_add(struct_def);
+}
+
+Eina_Bool
+eo_parser_database_fill(const char *filename, Eina_Bool eot)
+{
+   Eina_List *k;
+   Eo_Node *nd;
+   Eina_Bool has_class = EINA_FALSE;
+
+   Eo_Lexer *ls = eo_lexer_new(filename);
+   if (!ls)
+     {
+        ERR("unable to create lexer");
+        return EINA_FALSE;
+     }
+
+   /* read first token */
+   eo_lexer_get(ls);
+
+   if (!eo_parser_walk(ls, eot))
+     {
+        eo_lexer_free(ls);
+        return EINA_FALSE;
+     }
+
+   if (eot) goto nodeloop;
+
+   EINA_LIST_FOREACH(ls->nodes, k, nd) if (nd->type == NODE_CLASS)
+     {
+        has_class = EINA_TRUE;
+        break;
+     }
+
+   if (!has_class)
+     {
+        ERR("No classes for file %s", filename);
+        eo_lexer_free(ls);
+        return EINA_FALSE;
+     }
+
+nodeloop:
+   EINA_LIST_FOREACH(ls->nodes, k, nd)
+     {
+        switch (nd->type)
+          {
+           case NODE_CLASS:
+             if (!_db_fill_class(nd->def_class, filename))
+               goto error;
+             break;
+           case NODE_TYPEDEF:
+             {
+                Eolian_Typedef *def = nd->def_typedef;
+                nd->def_typedef = NULL;
+                if (!_db_fill_type(def))
+                  goto error;
+                break;
+             }
+           case NODE_STRUCT:
+             {
+                Eolian_Type *def = nd->def_struct;
+                nd->def_struct = NULL;
+                if (!_db_fill_struct(def))
+                  goto error;
+                break;
+             }
+           default:
+             break;
+          }
+     }
+
+   eo_lexer_free(ls);
+   return EINA_TRUE;
+
+error:
+   eo_lexer_free(ls);
+   return EINA_FALSE;
+}
index 3b4cdbb..472dd92 100644 (file)
@@ -1195,495 +1195,3 @@ eo_parser_walk(Eo_Lexer *ls, Eina_Bool eot)
    return EINA_FALSE;
 }
 
-static Eina_Bool
-_db_fill_ctor(Eolian_Class *cl, Eo_Method_Def *meth)
-{
-   Eo_Param_Def *param;
-   Eina_List *l;
-
-   Eolian_Function *foo_id = database_function_new(meth->name, EOLIAN_CTOR);
-
-   database_class_function_add(cl, foo_id);
-
-   if (meth->ret)
-     {
-        database_function_return_comment_set(foo_id, EOLIAN_METHOD,
-                                             meth->ret->comment);
-     }
-   database_function_data_set(foo_id, EOLIAN_LEGACY, meth->legacy);
-
-   EINA_LIST_FOREACH(meth->params, l, param)
-     {
-        database_method_parameter_add(foo_id, (Eolian_Parameter_Dir)param->way,
-                                      param->type, param->name, param->comment);
-        param->type = NULL;
-     }
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_ctors(Eolian_Class *cl, Eo_Class_Def *kls)
-{
-   Eo_Method_Def *meth;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(kls->constructors, l, meth)
-     if (!_db_fill_ctor(cl, meth)) return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-
-static Eina_Bool
-_db_fill_key(Eolian_Function *foo_id, Eo_Param_Def *param)
-{
-   Eolian_Function_Parameter *p = database_property_key_add(foo_id,
-                                                            param->type,
-                                                            param->name,
-                                                            param->comment);
-   database_parameter_nonull_set(p, param->nonull);
-   param->type = NULL;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_keys(Eolian_Function *foo_id, Eo_Property_Def *prop)
-{
-   Eo_Param_Def *param;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(prop->keys, l, param)
-     if (!_db_fill_key(foo_id, param)) return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_value(Eolian_Function *foo_id, Eo_Param_Def *param)
-{
-   Eolian_Function_Parameter *p = database_property_value_add(foo_id,
-                                                              param->type,
-                                                              param->name,
-                                                              param->comment);
-   database_parameter_nonull_set(p, param->nonull);
-   param->type = NULL;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_values(Eolian_Function *foo_id, Eo_Property_Def *prop)
-{
-   Eo_Param_Def *param;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(prop->values, l, param)
-     if (!_db_fill_value(foo_id, param)) return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_param(Eolian_Function *foo_id, Eo_Param_Def *param)
-{
-   Eolian_Function_Parameter *p = database_method_parameter_add(foo_id,
-                                                                param->way,
-                                                                param->type,
-                                                                param->name,
-                                                                param->comment);
-   database_parameter_nonull_set(p, param->nonull);
-   param->type = NULL;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_params(Eolian_Function *foo_id, Eo_Method_Def *meth)
-{
-   Eo_Param_Def *param;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(meth->params, l, param)
-     if (!_db_fill_param(foo_id, param)) return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_accessor(Eolian_Function *foo_id, Eo_Class_Def *kls,
-                  Eo_Property_Def *prop, Eo_Accessor_Def *accessor)
-{
-   Eo_Accessor_Param *acc_param;
-   Eina_List *l;
-
-   database_function_type_set(foo_id, ((accessor->type == SETTER)
-                                        ? EOLIAN_PROP_SET : EOLIAN_PROP_GET));
-
-   Eolian_Function_Type ftype = (accessor->type == SETTER)
-                                 ? EOLIAN_PROP_SET : EOLIAN_PROP_GET;
-
-   if (accessor->ret && accessor->ret->type)
-     {
-        database_function_return_type_set(foo_id, ftype, accessor->ret->type);
-        database_function_return_comment_set(foo_id, ftype,
-                                             accessor->ret->comment);
-        database_function_return_flag_set_as_warn_unused(foo_id, ftype,
-                                             accessor->ret->warn_unused);
-        database_function_return_dflt_val_set(foo_id, ftype,
-                                             accessor->ret->dflt_ret_val);
-        accessor->ret->type = NULL;
-     }
-
-   if (accessor->legacy)
-     {
-        database_function_data_set(foo_id, ((accessor->type == SETTER)
-                                            ? EOLIAN_LEGACY_SET
-                                            : EOLIAN_LEGACY_GET),
-                                   accessor->legacy);
-     }
-
-   database_function_description_set(foo_id, ((accessor->type == SETTER)
-                                              ? EOLIAN_COMMENT_SET
-                                              : EOLIAN_COMMENT_GET),
-                                     accessor->comment);
-
-   EINA_LIST_FOREACH(accessor->params, l, acc_param)
-     {
-        Eolian_Function_Parameter *desc = (Eolian_Function_Parameter*)
-            eolian_function_parameter_get(foo_id, acc_param->name);
-
-        if (!desc)
-          {
-             ERR("Error - %s not known as parameter of property %s\n",
-                 acc_param->name, prop->name);
-             return EINA_FALSE;
-          }
-        else if (acc_param->is_const)
-          {
-             database_parameter_const_attribute_set(desc,
-                                                    accessor->type == GETTER,
-                                                    EINA_TRUE);
-          }
-     }
-
-   if (kls->type == EOLIAN_CLASS_INTERFACE)
-      database_function_set_as_virtual_pure(foo_id, ftype);
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_accessors(Eolian_Function *foo_id, Eo_Class_Def *kls,
-                   Eo_Property_Def *prop)
-{
-   Eo_Accessor_Def *accessor;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(prop->accessors, l, accessor)
-     if (!_db_fill_accessor(foo_id, kls, prop, accessor)) return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-
-static Eina_Bool
-_db_fill_property(Eolian_Class *cl, Eo_Class_Def *kls, Eo_Property_Def *prop)
-{
-   Eolian_Function *foo_id = database_function_new(prop->name,
-                                                   EOLIAN_UNRESOLVED);
-
-   database_function_scope_set(foo_id, prop->scope);
-
-   if (!_db_fill_keys     (foo_id,      prop)) return EINA_FALSE;
-   if (!_db_fill_values   (foo_id,      prop)) return EINA_FALSE;
-   if (!_db_fill_accessors(foo_id, kls, prop)) return EINA_FALSE;
-
-   if (!prop->accessors)
-     {
-        database_function_type_set(foo_id, EOLIAN_PROPERTY);
-        if (kls->type == EOLIAN_CLASS_INTERFACE)
-          database_function_set_as_virtual_pure(foo_id, EOLIAN_UNRESOLVED);
-     }
-
-   database_class_function_add(cl, foo_id);
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_properties(Eolian_Class *cl, Eo_Class_Def *kls)
-{
-   Eo_Property_Def *prop;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(kls->properties, l, prop)
-     if (!_db_fill_property(cl, kls, prop)) return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_method(Eolian_Class *cl, Eo_Class_Def *kls, Eo_Method_Def *meth)
-{
-   Eolian_Function *foo_id = database_function_new(meth->name, EOLIAN_METHOD);
-
-   database_function_scope_set(foo_id, meth->scope);
-
-   database_class_function_add(cl, foo_id);
-
-   if (meth->ret)
-     {
-        database_function_return_type_set(foo_id, EOLIAN_METHOD,
-                                          meth->ret->type);
-        database_function_return_comment_set(foo_id, EOLIAN_METHOD,
-                                          meth->ret->comment);
-        database_function_return_flag_set_as_warn_unused(foo_id, EOLIAN_METHOD,
-                                          meth->ret->warn_unused);
-        database_function_return_dflt_val_set(foo_id, EOLIAN_METHOD,
-                                          meth->ret->dflt_ret_val);
-        meth->ret->type = NULL;
-     }
-
-   database_function_description_set(foo_id, EOLIAN_COMMENT, meth->comment);
-   database_function_data_set(foo_id, EOLIAN_LEGACY, meth->legacy);
-   database_function_object_set_as_const(foo_id, meth->obj_const);
-
-   _db_fill_params(foo_id, meth);
-
-   if (kls->type == EOLIAN_CLASS_INTERFACE)
-     database_function_set_as_virtual_pure(foo_id, EOLIAN_METHOD);
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_methods(Eolian_Class *cl, Eo_Class_Def *kls)
-{
-   Eo_Method_Def *meth;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(kls->methods, l, meth)
-     if (!_db_fill_method(cl, kls, meth)) return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-static int
-_db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
-{
-   const char *impl_name = impl->full_name;
-
-   if (!strcmp(impl_name, "class.constructor"))
-     {
-        database_class_ctor_enable_set(cl, EINA_TRUE);
-        return 1;
-     }
-
-   if (!strcmp(impl_name, "class.destructor"))
-     {
-        database_class_dtor_enable_set(cl, EINA_TRUE);
-        return 1;
-     }
-
-   if (!strncmp(impl_name, "virtual.", 8))
-     {
-        Eolian_Function_Type ftype = EOLIAN_UNRESOLVED;
-        char *type_as_str  = NULL;
-        char *virtual_name = strdup(impl_name);
-        char *func         = strchr(virtual_name, '.');
-
-        if (func) *func = '\0';
-        func += 1;
-
-        if ((type_as_str = strchr(func, '.')))
-          {
-             *type_as_str = '\0';
-
-             if (!strcmp(type_as_str+1, "set"))
-               ftype = EOLIAN_PROP_SET;
-             else if (!strcmp(type_as_str+1, "get"))
-               ftype = EOLIAN_PROP_GET;
-          }
-
-        free(virtual_name);
-
-        Eolian_Function *foo_id = (Eolian_Function*)
-                                   eolian_class_function_find_by_name(cl,
-                                                                      func,
-                                                                      ftype);
-        if (!foo_id)
-          {
-             ERR("Error - %s not known in class %s", impl_name + 8,
-                 eolian_class_name_get(cl));
-             return -1;
-          }
-        database_function_set_as_virtual_pure(foo_id, ftype);
-        return 1;
-     }
-   database_class_implement_add(cl, impl);
-   return 0;
-}
-
-static Eina_Bool
-_db_fill_implements(Eolian_Class *cl, Eo_Class_Def *kls)
-{
-   Eolian_Implement *impl;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(kls->implements, l, impl)
-     {
-        int ret = _db_fill_implement(cl, impl);
-        if (ret < 0) return EINA_FALSE;
-        if (ret > 0) continue;
-        eina_list_data_set(l, NULL); /* prevent double free */
-     }
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_events(Eolian_Class *cl, Eo_Class_Def *kls)
-{
-   Eolian_Event *event;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(kls->events, l, event)
-     {
-        database_class_event_add(cl, event);
-        eina_list_data_set(l, NULL); /* prevent double free */
-     }
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_class(Eo_Class_Def *kls, const char *filename)
-{
-   Eolian_Class *cl = database_class_add(kls->name, kls->type);
-   const char *s;
-   Eina_List *l;
-
-   database_class_file_set(cl, filename);
-
-   if (kls->comment)
-     {
-        database_class_description_set(cl, kls->comment);
-     }
-
-   EINA_LIST_FOREACH(kls->inherits, l, s)
-     {
-        database_class_inherit_add(cl, s);
-     }
-
-   if (kls->legacy_prefix)
-     {
-        database_class_legacy_prefix_set(cl, kls->legacy_prefix);
-     }
-   if (kls->eo_prefix)
-     {
-        database_class_eo_prefix_set(cl, kls->eo_prefix);
-     }
-   if (kls->data_type)
-     {
-        database_class_data_type_set(cl, kls->data_type);
-     }
-
-   if (!_db_fill_ctors     (cl, kls)) return EINA_FALSE;
-   if (!_db_fill_properties(cl, kls)) return EINA_FALSE;
-   if (!_db_fill_methods   (cl, kls)) return EINA_FALSE;
-   if (!_db_fill_implements(cl, kls)) return EINA_FALSE;
-   if (!_db_fill_events    (cl, kls)) return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_db_fill_type(Eolian_Typedef *type_def)
-{
-   return database_type_add(type_def);
-}
-
-static Eina_Bool
-_db_fill_struct(Eolian_Type *struct_def)
-{
-   return database_struct_add(struct_def);
-}
-
-Eina_Bool
-eo_parser_database_fill(const char *filename, Eina_Bool eot)
-{
-   Eina_List *k;
-   Eo_Node *nd;
-   Eina_Bool has_class = EINA_FALSE;
-
-   Eo_Lexer *ls = eo_lexer_new(filename);
-   if (!ls)
-     {
-        ERR("unable to create lexer");
-        return EINA_FALSE;
-     }
-
-   /* read first token */
-   eo_lexer_get(ls);
-
-   if (!eo_parser_walk(ls, eot))
-     {
-        eo_lexer_free(ls);
-        return EINA_FALSE;
-     }
-
-   if (eot) goto nodeloop;
-
-   EINA_LIST_FOREACH(ls->nodes, k, nd) if (nd->type == NODE_CLASS)
-     {
-        has_class = EINA_TRUE;
-        break;
-     }
-
-   if (!has_class)
-     {
-        ERR("No classes for file %s", filename);
-        eo_lexer_free(ls);
-        return EINA_FALSE;
-     }
-
-nodeloop:
-   EINA_LIST_FOREACH(ls->nodes, k, nd)
-     {
-        switch (nd->type)
-          {
-           case NODE_CLASS:
-             if (!_db_fill_class(nd->def_class, filename))
-               goto error;
-             break;
-           case NODE_TYPEDEF:
-             {
-                Eolian_Typedef *def = nd->def_typedef;
-                nd->def_typedef = NULL;
-                if (!_db_fill_type(def))
-                  goto error;
-                break;
-             }
-           case NODE_STRUCT:
-             {
-                Eolian_Type *def = nd->def_struct;
-                nd->def_struct = NULL;
-                if (!_db_fill_struct(def))
-                  goto error;
-                break;
-             }
-           default:
-             break;
-          }
-     }
-
-   eo_lexer_free(ls);
-   return EINA_TRUE;
-
-error:
-   eo_lexer_free(ls);
-   return EINA_FALSE;
-}