eolian: all dependency parsing is now deferred
authorDaniel Kolesa <d.kolesa@osg.samsung.com>
Wed, 31 Jan 2018 17:06:17 +0000 (18:06 +0100)
committerJiyoun Park <jy0703.park@samsung.com>
Tue, 3 Apr 2018 14:54:24 +0000 (23:54 +0900)
src/lib/eolian/database_part.c
src/lib/eolian/database_validate.c
src/lib/eolian/eo_parser.c
src/lib/eolian/eolian_database.h

index dca036a..853eead 100644 (file)
@@ -9,7 +9,9 @@ void
 database_part_del(Eolian_Part *part)
 {
    if (!part) return;
-   if (part->name) eina_stringshare_del(part->name);
+   eina_stringshare_del(part->name);
+   if (!part->base.validated)
+     eina_stringshare_del(part->klass_name);
    database_doc_del(part->doc);
    free(part);
 }
index 66cf97f..1a4c83f 100644 (file)
@@ -415,6 +415,19 @@ _validate_part(const Eolian_Unit *src, Eolian_Part *part, Eina_Hash *nhash)
    if (!_validate_doc(src, part->doc))
      return EINA_FALSE;
 
+   /* switch the class name for class */
+   Eolian_Class *pcl = eina_hash_find(src->state->unit.classes, part->klass_name);
+   if (!pcl)
+     {
+        char buf[PATH_MAX];
+        snprintf(buf, sizeof(buf), "unknown part class '%s' (incorrect case?)",
+                 part->klass_name);
+        _obj_error(&part->base, buf);
+        return EINA_FALSE;
+     }
+   eina_stringshare_del(part->klass_name);
+   part->klass = pcl;
+
    return _validate(&part->base);
 }
 
index f7445bf..3441ad4 100644 (file)
@@ -677,22 +677,6 @@ parse_struct_attrs(Eo_Lexer *ls, Eina_Bool is_enum, Eina_Bool *is_extern,
      }
 }
 
-static Eolian_Class *
-_parse_dep(Eo_Lexer *ls, const char *fname, const char *name)
-{
-   if (eina_hash_find(ls->state->parsing, fname))
-     return NULL;
-   Eolian_Class *cl = NULL;
-   if (!eo_parser_database_fill(ls->unit, fname, EINA_FALSE, &cl) || !cl)
-     {
-        char buf[PATH_MAX];
-        eo_lexer_context_restore(ls);
-        snprintf(buf, sizeof(buf), "error parsing dependency '%s'", name);
-        eo_lexer_syntax_error(ls, buf);
-     }
-   return cl;
-}
-
 static Eolian_Type *
 parse_type_void(Eo_Lexer *ls)
 {
@@ -1525,28 +1509,20 @@ parse_part(Eo_Lexer *ls)
    eo_lexer_context_push(ls);
    parse_name(ls, buf);
    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(ls->state->filenames_eo, fnm);
+   if (!fname)
      {
-        Eolian_Class *dep = NULL;
-        const char *fname = eina_hash_find(ls->state->filenames_eo, fnm);
-        eina_stringshare_del(bnm);
         free(fnm);
-        if (fname)
-          dep = _parse_dep(ls, fname, 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;
+        char ebuf[PATH_MAX];
+        eo_lexer_context_restore(ls);
+        snprintf(ebuf, sizeof(ebuf), "unknown class '%s'", nm);
+        eo_lexer_syntax_error(ls, ebuf);
+        return;
      }
-   else
-     part->klass = ls->tmp.kls;
+   eina_hash_set(ls->state->defer, fnm, fname);
+   free(fnm);
+   part->klass_name = eina_stringshare_add(nm);
    pop_strbuf(ls);
    check_next(ls, ';');
    FILL_DOC(ls, part, doc);
index d6393a9..69bd563 100644 (file)
@@ -168,7 +168,12 @@ struct _Eolian_Part
 {
    Eolian_Object base;
    Eina_Stringshare *name;
-   Eolian_Class *klass;
+   /* when not validated, class name is stored */
+   union
+   {
+      Eina_Stringshare *klass_name;
+      Eolian_Class *klass;
+   };
    Eolian_Documentation *doc;
 };