diff options
author | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2018-01-31 18:06:17 +0100 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2018-01-31 18:13:29 +0100 |
commit | b5794afa580e1aa40222544abeb8dcd3239a5af7 (patch) | |
tree | f8ab2bd8caa6590fb3b5b5582f2d3cc476471daf | |
parent | d2df4b382f6ef20640f8872e6a354004ab611aae (diff) | |
download | efl-b5794afa580e1aa40222544abeb8dcd3239a5af7.tar.gz |
eolian: all dependency parsing is now deferred
-rw-r--r-- | src/lib/eolian/database_part.c | 4 | ||||
-rw-r--r-- | src/lib/eolian/database_validate.c | 13 | ||||
-rw-r--r-- | src/lib/eolian/eo_parser.c | 44 | ||||
-rw-r--r-- | src/lib/eolian/eolian_database.h | 7 |
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; }; |