eolian: fill parts into db
authorDaniel Kolesa <d.kolesa@osg.samsung.com>
Tue, 31 Oct 2017 11:10:59 +0000 (12:10 +0100)
committerDaniel Kolesa <d.kolesa@osg.samsung.com>
Tue, 31 Oct 2017 11:15:23 +0000 (12:15 +0100)
src/lib/eolian/eo_parser.c
src/lib/eolian/eolian_database.h

index aa46dd9..2250dda 100644 (file)
@@ -1482,14 +1482,42 @@ end:
 static void
 parse_part(Eo_Lexer *ls)
 {
-   check_next(ls, TOK_VALUE);
+   Eolian_Part *part = calloc(1, sizeof(Eolian_Part));
+   ls->tmp.kls->parts = eina_list_append(ls->tmp.kls->parts, part);
+   check(ls, TOK_VALUE);
+   part->name = eina_stringshare_ref(ls->t.value.s);
+   eo_lexer_get(ls);
    check_next(ls, ':');
    Eina_Strbuf *buf = push_strbuf(ls);
+   eo_lexer_context_push(ls);
    parse_name(ls, buf);
-   check_next(ls, ';');
-   if (ls->t.token == TOK_DOC)
-     eo_lexer_get(ls);
+   const char *nm = eina_strbuf_string_get(buf);
+   const char *bnm = eina_stringshare_ref(ls->filename);
+   char *fnm = database_class_to_filename(nm);
+   if (!compare_class_file(bnm, fnm))
+     {
+        const char *fname = eina_hash_find(_filenames, fnm);
+        eina_stringshare_del(bnm);
+        free(fnm);
+        if (fname)
+          _parse_dep(ls, fname, nm);
+        /* FIXME: pass unit properly */
+        Eolian_Class *dep = (Eolian_Class *)eolian_class_get_by_name(NULL, nm);
+        if (!dep)
+          {
+             char ebuf[PATH_MAX];
+             eo_lexer_context_restore(ls);
+             snprintf(ebuf, sizeof(ebuf), "unknown class '%s'", nm);
+             eo_lexer_syntax_error(ls, ebuf);
+             return;
+          }
+        part->klass = dep;
+     }
+   else
+     part->klass = ls->tmp.kls;
    pop_strbuf(ls);
+   check_next(ls, ';');
+   FILL_DOC(ls, part, doc);
 }
 
 static void
index ae53ff9..7d134d4 100644 (file)
@@ -91,12 +91,13 @@ struct _Eolian_Class
    Eina_Stringshare *eo_prefix;
    Eina_Stringshare *ev_prefix;
    Eina_Stringshare *data_type;
-   Eina_List *inherits; /* List Eolian_Class * */
-   Eina_List *properties; /* List prop_name -> Eolian_Function */
-   Eina_List *methods; /* List meth_name -> Eolian_Function */
-   Eina_List *implements; /* List implements name -> Eolian_Implement */
-   Eina_List *constructors; /* List constructors name -> Eolian_Constructor */
-   Eina_List *events; /* List event_name -> Eolian_Event */
+   Eina_List *inherits; /* Eolian_Class */
+   Eina_List *properties; /* Eolian_Function */
+   Eina_List *methods; /* Eolian_Function */
+   Eina_List *implements; /* Eolian_Implement */
+   Eina_List *constructors; /* Eolian_Constructor */
+   Eina_List *events; /* Eolian_Event */
+   Eina_List *parts; /* Eolian_Part */
    Eina_Bool class_ctor_enable:1;
    Eina_Bool class_dtor_enable:1;
    Eina_Bool toplevel:1;
@@ -146,6 +147,7 @@ struct _Eolian_Part
    Eolian_Object base;
    Eina_Stringshare *name;
    Eolian_Class *klass;
+   Eolian_Documentation *doc;
 };
 
 struct _Eolian_Function_Parameter