forked from enlightenment/efl
eolian: remove _cunit and prepare for returning actual units
This commit is contained in:
parent
2259b6f16f
commit
9aaa5cf839
|
@ -1035,6 +1035,12 @@ eo_lexer_set_input(Eo_Lexer *ls, Eolian *state, const char *source)
|
|||
ls->icolumn = ls->column = -1;
|
||||
ls->decpoint = '.';
|
||||
next_char(ls);
|
||||
|
||||
Eolian_Unit *ncunit = calloc(1, sizeof(Eolian_Unit));
|
||||
ls->unit = ncunit;
|
||||
database_unit_init(state, ncunit);
|
||||
eina_hash_add(state->units, ls->filename, ncunit);
|
||||
|
||||
if (ls->current != 0xEF)
|
||||
return;
|
||||
next_char(ls);
|
||||
|
@ -1044,11 +1050,6 @@ eo_lexer_set_input(Eo_Lexer *ls, Eolian *state, const char *source)
|
|||
if (ls->current != 0xBF)
|
||||
return;
|
||||
next_char(ls);
|
||||
|
||||
Eolian_Unit *ncunit = calloc(1, sizeof(Eolian_Unit));
|
||||
ls->unit = ncunit;
|
||||
database_unit_init(state, ncunit, ls->filename);
|
||||
eina_hash_add(state->units, ls->filename, ncunit);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -683,7 +683,7 @@ _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->state, fname, EINA_FALSE, &cl) || !cl)
|
||||
if (!eo_parser_database_fill(ls->unit, fname, EINA_FALSE, &cl) || !cl)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
eo_lexer_context_restore(ls);
|
||||
|
@ -2496,19 +2496,30 @@ end:
|
|||
return ret;
|
||||
}
|
||||
|
||||
Eina_Bool
|
||||
eo_parser_database_fill(Eolian *state, const char *filename, Eina_Bool eot, Eolian_Class **fcl)
|
||||
Eolian_Unit *
|
||||
eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool eot, Eolian_Class **fcl)
|
||||
{
|
||||
Eolian_Class *cl = eina_hash_find(state->parsed, filename);
|
||||
Eolian_Class *cl = eina_hash_find(parent->state->parsed, filename);
|
||||
if (cl)
|
||||
{
|
||||
if (!eot && fcl) *fcl = cl;
|
||||
return EINA_TRUE;
|
||||
const char *fsl = strrchr(filename, '/');
|
||||
const char *bsl = strrchr(filename, '\\');
|
||||
const char *fname = NULL;
|
||||
if (fsl || bsl)
|
||||
fname = eina_stringshare_add((fsl > bsl) ? (fsl + 1) : (bsl + 1));
|
||||
if (fname)
|
||||
{
|
||||
Eolian_Unit *ret = eina_hash_find(parent->state->units, fname);
|
||||
eina_stringshare_del(fname);
|
||||
return ret;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
eina_hash_set(state->parsing, filename, (void *)EINA_TRUE);
|
||||
eina_hash_set(parent->state->parsing, filename, (void *)EINA_TRUE);
|
||||
|
||||
Eo_Lexer *ls = eo_lexer_new(state, filename);
|
||||
Eo_Lexer *ls = eo_lexer_new(parent->state, filename);
|
||||
if (!ls)
|
||||
{
|
||||
_eolian_log("unable to create lexer for file '%s'", filename);
|
||||
|
@ -2544,14 +2555,15 @@ eo_parser_database_fill(Eolian *state, const char *filename, Eina_Bool eot, Eoli
|
|||
if (fcl) *fcl = cl;
|
||||
|
||||
done:
|
||||
eina_hash_set(state->parsed, filename, eot ? (void *)EINA_TRUE : cl);
|
||||
eina_hash_set(state->parsing, filename, (void *)EINA_FALSE);
|
||||
eina_hash_set(ls->state->parsed, filename, eot ? (void *)EINA_TRUE : cl);
|
||||
eina_hash_set(ls->state->parsing, filename, (void *)EINA_FALSE);
|
||||
eina_hash_add(parent->children, filename, ls->unit);
|
||||
|
||||
eo_lexer_free(ls);
|
||||
return EINA_TRUE;
|
||||
return ls->unit;
|
||||
|
||||
error:
|
||||
eina_hash_set(state->parsing, filename, (void *)EINA_FALSE);
|
||||
eina_hash_set(ls->state->parsing, filename, (void *)EINA_FALSE);
|
||||
eo_lexer_free(ls);
|
||||
return EINA_FALSE;
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,6 @@
|
|||
|
||||
#include "eo_lexer.h"
|
||||
|
||||
Eina_Bool eo_parser_database_fill(Eolian *state, const char *filename, Eina_Bool eot, Eolian_Class **cl);
|
||||
Eolian_Unit *eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool eot, Eolian_Class **cl);
|
||||
|
||||
#endif /* __EO_PARSER_H__ */
|
|
@ -11,8 +11,6 @@
|
|||
Eina_Hash *_decls = NULL;
|
||||
Eina_Hash *_declsf = NULL;
|
||||
|
||||
static Eolian_Unit *_cunit = NULL;
|
||||
|
||||
static int _database_init_count = 0;
|
||||
|
||||
static void
|
||||
|
@ -542,17 +540,10 @@ eolian_doc_token_ref_get(const Eolian_Unit *unit, const Eolian_Doc_Token *tok,
|
|||
}
|
||||
|
||||
void
|
||||
database_unit_init(Eolian *state, Eolian_Unit *unit, Eina_Stringshare *fname)
|
||||
database_unit_init(Eolian *state, Eolian_Unit *unit)
|
||||
{
|
||||
unit->state = state;
|
||||
|
||||
if (fname)
|
||||
{
|
||||
Eolian_Unit *ocunit = _cunit;
|
||||
if (ocunit)
|
||||
eina_hash_add(ocunit->children, fname, unit);
|
||||
}
|
||||
|
||||
unit->children = eina_hash_stringshared_new(NULL);
|
||||
unit->classes = eina_hash_stringshared_new(EINA_FREE_CB(database_class_del));
|
||||
unit->globals = eina_hash_stringshared_new(EINA_FREE_CB(database_var_del));
|
||||
|
@ -560,9 +551,6 @@ database_unit_init(Eolian *state, Eolian_Unit *unit, Eina_Stringshare *fname)
|
|||
unit->aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
|
||||
unit->structs = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
|
||||
unit->enums = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
|
||||
|
||||
if (fname)
|
||||
_cunit = unit;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -586,7 +574,7 @@ eolian_new(void)
|
|||
if (!state)
|
||||
return NULL;
|
||||
|
||||
database_unit_init(state, &state->unit, NULL);
|
||||
database_unit_init(state, &state->unit);
|
||||
|
||||
state->filenames_eo = eina_hash_string_small_new(free);
|
||||
state->filenames_eot = eina_hash_string_small_new(free);
|
||||
|
@ -699,61 +687,62 @@ database_class_to_filename(const char *cname)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_eolian_file_parse_nodep(Eolian *state, const char *filepath)
|
||||
static Eolian_Unit *
|
||||
_eolian_file_parse_nodep(Eolian_Unit *parent, const char *filepath)
|
||||
{
|
||||
Eina_Bool is_eo;
|
||||
const char *eopath;
|
||||
if (_database_init_count <= 0)
|
||||
return EINA_FALSE;
|
||||
return NULL;
|
||||
is_eo = eina_str_has_suffix(filepath, EO_SUFFIX);
|
||||
if (!is_eo && !eina_str_has_suffix(filepath, EOT_SUFFIX))
|
||||
{
|
||||
_eolian_log("file '%s' doesn't have a correct extension", filepath);
|
||||
return EINA_FALSE;
|
||||
return NULL;
|
||||
}
|
||||
if (!(eopath = eina_hash_find(is_eo ? state->filenames_eo : state->filenames_eot, filepath)))
|
||||
if (!(eopath = eina_hash_find(is_eo ? parent->state->filenames_eo : parent->state->filenames_eot, filepath)))
|
||||
{
|
||||
char *vpath = eina_file_path_sanitize(filepath);
|
||||
Eina_Bool ret = eo_parser_database_fill(state, vpath, !is_eo, NULL);
|
||||
Eolian_Unit *ret = eo_parser_database_fill(parent, vpath, !is_eo, NULL);
|
||||
free(vpath);
|
||||
return ret;
|
||||
}
|
||||
return eo_parser_database_fill(state, eopath, !is_eo, NULL);
|
||||
return eo_parser_database_fill(parent, eopath, !is_eo, NULL);
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_parse_deferred(Eolian *state)
|
||||
_parse_deferred(Eolian_Unit *parent)
|
||||
{
|
||||
Eina_Hash *defer = state->defer;
|
||||
Eina_Hash *defer = parent->state->defer;
|
||||
if (!defer || !eina_hash_population(defer))
|
||||
return EINA_TRUE;
|
||||
/* clean room for more deps for later parsing */
|
||||
state->defer = eina_hash_string_small_new(NULL);
|
||||
parent->state->defer = eina_hash_string_small_new(NULL);
|
||||
Eina_Iterator *itr = eina_hash_iterator_data_new(defer);
|
||||
const char *dep;
|
||||
EINA_ITERATOR_FOREACH(itr, dep)
|
||||
{
|
||||
if (!_eolian_file_parse_nodep(state, dep))
|
||||
Eolian_Unit *pdep = _eolian_file_parse_nodep(parent, dep);
|
||||
if (!pdep || !_parse_deferred(pdep))
|
||||
{
|
||||
eina_iterator_free(itr);
|
||||
eina_hash_free_buckets(state->defer);
|
||||
eina_hash_free_buckets(parent->state->defer);
|
||||
eina_hash_free(defer);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
}
|
||||
eina_iterator_free(itr);
|
||||
eina_hash_free(defer);
|
||||
/* in case more deps were queued in, parse them */
|
||||
return _parse_deferred(state);
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
EAPI const Eolian_Unit *
|
||||
eolian_file_parse(Eolian *state, const char *filepath)
|
||||
{
|
||||
if (!_eolian_file_parse_nodep(state, filepath))
|
||||
Eolian_Unit *ret = _eolian_file_parse_nodep((Eolian_Unit *)state, filepath);
|
||||
if (!ret)
|
||||
return NULL;
|
||||
if (!_parse_deferred(state))
|
||||
if (!_parse_deferred(ret))
|
||||
return NULL;
|
||||
/* FIXME: pass unit properly */
|
||||
if (!database_validate(state, &state->unit))
|
||||
|
@ -770,8 +759,11 @@ typedef struct _Parse_Data
|
|||
static Eina_Bool _tfile_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
|
||||
{
|
||||
Parse_Data *pd = fdata;
|
||||
if (pd->ret) pd->ret = eo_parser_database_fill(pd->state, data, EINA_TRUE, NULL);
|
||||
if (pd->ret) pd->ret = _parse_deferred(pd->state);
|
||||
Eolian_Unit *unit = NULL;
|
||||
if (pd->ret)
|
||||
unit = eo_parser_database_fill((Eolian_Unit *)pd->state, data, EINA_TRUE, NULL);
|
||||
pd->ret = !!unit;
|
||||
if (pd->ret) pd->ret = _parse_deferred(unit);
|
||||
return pd->ret;
|
||||
}
|
||||
|
||||
|
@ -795,8 +787,11 @@ eolian_all_eot_files_parse(Eolian *state)
|
|||
static Eina_Bool _file_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
|
||||
{
|
||||
Parse_Data *pd = fdata;
|
||||
if (pd->ret) pd->ret = eo_parser_database_fill(pd->state, data, EINA_FALSE, NULL);
|
||||
if (pd->ret) pd->ret = _parse_deferred(pd->state);
|
||||
Eolian_Unit *unit = NULL;
|
||||
if (pd->ret)
|
||||
unit = eo_parser_database_fill((Eolian_Unit *)pd->state, data, EINA_FALSE, NULL);
|
||||
pd->ret = !!unit;
|
||||
if (pd->ret) pd->ret = _parse_deferred(unit);
|
||||
return pd->ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -327,7 +327,7 @@ void database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type,
|
|||
|
||||
void database_doc_del(Eolian_Documentation *doc);
|
||||
|
||||
void database_unit_init(Eolian *state, Eolian_Unit *unit, Eina_Stringshare *fname);
|
||||
void database_unit_init(Eolian *state, Eolian_Unit *unit);
|
||||
void database_unit_del(Eolian_Unit *unit);
|
||||
|
||||
/* types */
|
||||
|
|
Loading…
Reference in New Issue