eolian: remove _cunit and prepare for returning actual units

This commit is contained in:
Daniel Kolesa 2017-12-14 17:18:32 +01:00
parent 2259b6f16f
commit 9aaa5cf839
5 changed files with 61 additions and 53 deletions

View File

@ -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

View File

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

View File

@ -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__ */

View File

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

View File

@ -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 */