summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@osg.samsung.com>2018-01-31 18:06:17 +0100
committerDaniel Kolesa <d.kolesa@osg.samsung.com>2018-01-31 18:13:29 +0100
commitb5794afa580e1aa40222544abeb8dcd3239a5af7 (patch)
treef8ab2bd8caa6590fb3b5b5582f2d3cc476471daf
parentd2df4b382f6ef20640f8872e6a354004ab611aae (diff)
downloadefl-b5794afa580e1aa40222544abeb8dcd3239a5af7.tar.gz
eolian: all dependency parsing is now deferred
-rw-r--r--src/lib/eolian/database_part.c4
-rw-r--r--src/lib/eolian/database_validate.c13
-rw-r--r--src/lib/eolian/eo_parser.c44
-rw-r--r--src/lib/eolian/eolian_database.h7
4 files changed, 32 insertions, 36 deletions
diff --git a/src/lib/eolian/database_part.c b/src/lib/eolian/database_part.c
index dca036aba5..853eeadfca 100644
--- a/src/lib/eolian/database_part.c
+++ b/src/lib/eolian/database_part.c
@@ -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);
}
diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c
index 66cf97fb66..1a4c83f6a8 100644
--- a/src/lib/eolian/database_validate.c
+++ b/src/lib/eolian/database_validate.c
@@ -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);
}
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index f7445bf9bf..3441ad4b84 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -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);
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index d6393a9462..69bd5630ac 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -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;
};