eolian: all dependency parsing is now deferred

This commit is contained in:
Daniel Kolesa 2018-01-31 18:06:17 +01:00
parent d2df4b382f
commit b5794afa58
4 changed files with 32 additions and 36 deletions

View 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);
}

View 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);
}

View 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);

View 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;
};