eolian: all dependency parsing is now deferred
This commit is contained in:
parent
d2df4b382f
commit
b5794afa58
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue