}
}
-static void
+static Eolian_Class *
_parse_dep(Eo_Lexer *ls, const char *fname, const char *name)
{
if (eina_hash_find(_parsingeos, fname))
- return;
- if (!eo_parser_database_fill(fname, EINA_FALSE))
+ return NULL;
+ Eolian_Class *cl = NULL;
+ if (!eo_parser_database_fill(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 *
char *fnm = database_class_to_filename(nm);
if (!compare_class_file(bnm, fnm))
{
+ Eolian_Class *dep = NULL;
const char *fname = eina_hash_find(_filenames, fnm);
eina_stringshare_del(bnm);
free(fnm);
if (fname)
- _parse_dep(ls, fname, nm);
- /* FIXME: pass unit properly */
- Eolian_Class *dep = (Eolian_Class *)eolian_class_get_by_name(NULL, nm);
+ dep = _parse_dep(ls, fname, nm);
if (!dep)
{
char ebuf[PATH_MAX];
snprintf(ebuf, sizeof(ebuf), "unknown inherit '%s'", iname);
eo_lexer_syntax_error(ls, ebuf);
}
- _parse_dep(ls, fname, iname);
- /* FIXME: pass unit properly */
- Eolian_Class *dep = (Eolian_Class *)eolian_class_get_by_name(NULL, iname);
+ Eolian_Class *dep = _parse_dep(ls, fname, iname);
if (!dep)
{
char ebuf[PATH_MAX];
eo_lexer_syntax_error(ls, errbuf);
}
pop_strbuf(ls);
- if (!eo_parser_database_fill(found, !is_eo))
+ if (!eo_parser_database_fill(found, !is_eo, NULL))
{
pop_strbuf(ls);
snprintf(errbuf, sizeof(errbuf),
}
Eina_Bool
-eo_parser_database_fill(const char *filename, Eina_Bool eot)
+eo_parser_database_fill(const char *filename, Eina_Bool eot, Eolian_Class **fcl)
{
- if (eina_hash_find(_parsedeos, filename))
- return EINA_TRUE;
+ Eolian_Class *cl = eina_hash_find(_parsedeos, filename);
+ if (cl)
+ {
+ if (!eot && fcl) *fcl = cl;
+ return EINA_TRUE;
+ }
eina_hash_set(_parsingeos, filename, (void *)EINA_TRUE);
parse_chunk(ls, eot);
if (eot) goto done;
- Eolian_Class *cl;
-
if (!(cl = ls->tmp.kls))
{
_eolian_log("eolian: no class for file '%s'", filename);
eina_hash_set(_classes, cl->full_name, cl);
eina_hash_set(_classesf, cl->base.file, cl);
+ if (fcl) *fcl = cl;
+
done:
- eina_hash_set(_parsedeos, filename, (void *)EINA_TRUE);
+ eina_hash_set(_parsedeos, filename, eot ? (void *)EINA_TRUE : cl);
eina_hash_set(_parsingeos, filename, (void *)EINA_FALSE);
eo_lexer_free(ls);
if (!(eopath = eina_hash_find(is_eo ? _filenames : _tfilenames, filepath)))
{
char *vpath = eina_file_path_sanitize(filepath);
- Eina_Bool ret = eo_parser_database_fill(vpath, !is_eo);
+ Eina_Bool ret = eo_parser_database_fill(vpath, !is_eo, NULL);
free(vpath);
return ret;
}
- return eo_parser_database_fill(eopath, !is_eo);
+ return eo_parser_database_fill(eopath, !is_eo, NULL);
}
static Eina_Bool
static Eina_Bool _tfile_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
{
Eina_Bool *ret = fdata;
- if (*ret) *ret = eo_parser_database_fill(data, EINA_TRUE);
+ if (*ret) *ret = eo_parser_database_fill(data, EINA_TRUE, NULL);
if (*ret) *ret = _parse_deferred();
return *ret;
}
static Eina_Bool _file_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
{
Eina_Bool *ret = fdata;
- if (*ret) *ret = eo_parser_database_fill(data, EINA_FALSE);
+ if (*ret) *ret = eo_parser_database_fill(data, EINA_FALSE, NULL);
if (*ret) *ret = _parse_deferred();
return *ret;
}