diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c index 4da3942c51..e7ed6b1b20 100644 --- a/src/lib/eolian/eo_lexer.c +++ b/src/lib/eolian/eo_lexer.c @@ -1043,6 +1043,10 @@ eo_lexer_set_input(Eo_Lexer *ls, const char *source) if (ls->current != 0xBF) return; next_char(ls); + + Eolian_Unit *ncunit = calloc(1, sizeof(Eolian_Unit)); + database_unit_init(ncunit, ls->filename); + eina_hash_add(_units, ls->filename, ncunit); } static void diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index 0141450275..59cebfa202 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -31,6 +31,8 @@ Eina_Hash *_parsingeos = NULL; Eina_Hash *_defereos = NULL; +static Eolian_Unit *_cunit = NULL; + static int _database_init_count = 0; static void @@ -598,8 +600,35 @@ eolian_doc_token_ref_get(const Eolian_Unit *unit, const Eolian_Doc_Token *tok, } void -database_unit_del(Eolian_Unit *unit EINA_UNUSED) +database_unit_init(Eolian_Unit *unit, Eina_Stringshare *fname) { + Eolian_Unit *ocunit = _cunit; + unit->parent = ocunit; + if (ocunit) + eina_hash_add(ocunit->children, fname, unit); + + unit->children = eina_hash_stringshared_new(NULL); + unit->classes = eina_hash_stringshared_new(NULL); + unit->globals = eina_hash_stringshared_new(NULL); + unit->constants = eina_hash_stringshared_new(NULL); + unit->aliases = eina_hash_stringshared_new(NULL); + unit->structs = eina_hash_stringshared_new(NULL); + unit->enums = eina_hash_stringshared_new(NULL); + _cunit = unit; +} + +void +database_unit_del(Eolian_Unit *unit) +{ + if (!unit) + return; + + eina_hash_free(unit->classes); + eina_hash_free(unit->globals); + eina_hash_free(unit->constants); + eina_hash_free(unit->aliases); + eina_hash_free(unit->structs); + eina_hash_free(unit->enums); } #define EO_SUFFIX ".eo" diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index a8c1dbb637..1ab61b0b66 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -48,6 +48,9 @@ extern Eina_Hash *_tfilenames; /* a hash holding all declarations, for redef checking etc */ extern Eina_Hash *_decls; +extern Eina_Hash *_declsf; + +extern Eina_Hash *_units; /* holds parsed/currently parsing eot files to keep track */ extern Eina_Hash *_parsedeos; @@ -293,13 +296,14 @@ struct _Eolian_Variable struct _Eolian_Unit { - Eina_List *dependencies; - Eina_List *classes; - Eina_List *globals; - Eina_List *constants; - Eina_List *aliases; - Eina_List *structs; - Eina_List *enums; + Eolian_Unit *parent; + Eina_Hash *children; + Eina_Hash *classes; + Eina_Hash *globals; + Eina_Hash *constants; + Eina_Hash *aliases; + Eina_Hash *structs; + Eina_Hash *enums; }; int database_init(void); @@ -313,6 +317,7 @@ void database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type, void database_doc_del(Eolian_Documentation *doc); +void database_unit_init(Eolian_Unit *unit, Eina_Stringshare *fname); void database_unit_del(Eolian_Unit *unit); /* types */