q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=522c021a36e07632b1be42d9d5e8a98fe0b46923
commit 522c021a36e07632b1be42d9d5e8a98fe0b46923 Author: Daniel Kolesa <d.kol...@osg.samsung.com> Date: Mon Jun 1 14:32:19 2015 +0100 eolian: initial exposed declaration API - not yet very useful This API allows you to retrieve a list of declarations in the file (classes, types, vars) in the order they were declared in. @feature --- src/lib/eolian/Eolian.h | 30 ++++++++++++++++++++++++++++++ src/lib/eolian/database_type.c | 6 +++--- src/lib/eolian/database_var.c | 4 ++-- src/lib/eolian/eo_parser.c | 3 ++- src/lib/eolian/eolian_database.c | 19 ++++++++++++++++++- src/lib/eolian/eolian_database.h | 11 ++--------- 6 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index c10db83..8d2b7de 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -154,6 +154,12 @@ typedef struct _Eolian_Struct_Type_Field Eolian_Struct_Type_Field; */ typedef struct _Eolian_Enum_Type_Field Eolian_Enum_Type_Field; +/* Declaration information + * + * @ingroup Eolian + */ +typedef struct _Eolian_Declaration Eolian_Declaration; + typedef enum { EOLIAN_UNRESOLVED, @@ -302,6 +308,15 @@ typedef enum EOLIAN_UNOP_BNOT, /* ~ int */ } Eolian_Unary_Operator; +typedef enum +{ + EOLIAN_DECL_CLASS, + EOLIAN_DECL_ALIAS, + EOLIAN_DECL_STRUCT, + EOLIAN_DECL_ENUM, + EOLIAN_DECL_VAR +} Eolian_Declaration_Type; + /* * @brief Parse the given .eo or .eot file and fill the database. * @@ -2040,6 +2055,21 @@ EAPI Eina_Iterator *eolian_variable_namespaces_get(const Eolian_Variable *var); */ EAPI Eina_Bool eolian_variable_is_extern(const Eolian_Variable *var); +/* + * @brief Get a list of declarations in a file. + * + * This function gets an iterator to a list of declarations in a particular + * file. Declarations are either a class, a type alias, a struct, an enum + * or a variable. This way you can get them all in the original order they + * were declared in, which is useful during generation. + * + * @param[in] fname the filename. + * @return the iterator or NULL. + * + * @ingroup Eolian + */ +EAPI Eina_Iterator *eolian_declarations_get_by_file(const char *fname); + #endif /** diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 60a4f0e..930f9e1 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -51,7 +51,7 @@ database_type_add(Eolian_Type *def) eina_hash_set(_aliases, def->full_name, def); eina_hash_set(_aliasesf, def->base.file, eina_list_append ((Eina_List*)eina_hash_find(_aliasesf, def->base.file), def)); - database_decl_add(def->full_name, EOLIAN_DECL_ALIAS, def); + database_decl_add(def->full_name, EOLIAN_DECL_ALIAS, def->base.file, def); } void @@ -60,7 +60,7 @@ database_struct_add(Eolian_Type *tp) eina_hash_set(_structs, tp->full_name, tp); eina_hash_set(_structsf, tp->base.file, eina_list_append ((Eina_List*)eina_hash_find(_structsf, tp->base.file), tp)); - database_decl_add(tp->full_name, EOLIAN_DECL_STRUCT, tp); + database_decl_add(tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, tp); } void @@ -69,7 +69,7 @@ database_enum_add(Eolian_Type *tp) eina_hash_set(_enums, tp->full_name, tp); eina_hash_set(_enumsf, tp->base.file, eina_list_append ((Eina_List*)eina_hash_find(_enumsf, tp->base.file), tp)); - database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp); + database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp); } static void diff --git a/src/lib/eolian/database_var.c b/src/lib/eolian/database_var.c index 39bb52a..5d8c2ad 100644 --- a/src/lib/eolian/database_var.c +++ b/src/lib/eolian/database_var.c @@ -28,7 +28,7 @@ database_var_global_add(Eolian_Variable *var) eina_hash_set(_globals, var->full_name, var); eina_hash_set(_globalsf, var->base.file, eina_list_append ((Eina_List*)eina_hash_find(_globalsf, var->base.file), var)); - database_decl_add(var->full_name, EOLIAN_DECL_VAR, var); + database_decl_add(var->full_name, EOLIAN_DECL_VAR, var->base.file, var); } static void @@ -37,7 +37,7 @@ database_var_constant_add(Eolian_Variable *var) eina_hash_set(_constants, var->full_name, var); eina_hash_set(_constantsf, var->base.file, eina_list_append ((Eina_List*)eina_hash_find(_constantsf, var->base.file), var)); - database_decl_add(var->full_name, EOLIAN_DECL_VAR, var); + database_decl_add(var->full_name, EOLIAN_DECL_VAR, var->base.file, var); } void diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 02938d8..88d1a1e 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -1950,7 +1950,8 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot) } return EINA_FALSE; found_class: - database_decl_add(ls->tmp.kls->full_name, EOLIAN_DECL_CLASS, ls->tmp.kls); + database_decl_add(ls->tmp.kls->full_name, EOLIAN_DECL_CLASS, + ls->tmp.kls->base.file, ls->tmp.kls); return EINA_TRUE; } diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index 31a6d86..2deecca 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -22,6 +22,7 @@ Eina_Hash *_constantsf = NULL; Eina_Hash *_filenames = NULL; Eina_Hash *_tfilenames = NULL; Eina_Hash *_decls = NULL; +Eina_Hash *_declsf = NULL; Eina_Hash *_parsedeos = NULL; Eina_Hash *_parsingeos = NULL; @@ -54,6 +55,7 @@ database_init() _filenames = eina_hash_string_small_new(free); _tfilenames = eina_hash_string_small_new(free); _decls = eina_hash_stringshared_new(free); + _declsf = eina_hash_stringshared_new(_hashlist_free); _parsedeos = eina_hash_string_small_new(NULL); _parsingeos = eina_hash_string_small_new(NULL); return ++_database_init_count; @@ -86,6 +88,7 @@ database_shutdown() eina_hash_free(_filenames ); _filenames = NULL; eina_hash_free(_tfilenames); _tfilenames = NULL; eina_hash_free(_decls ); _decls = NULL; + eina_hash_free(_declsf ); _declsf = NULL; eina_hash_free(_parsedeos ); _parsedeos = NULL; eina_hash_free(_parsingeos); _parsingeos = NULL; eina_shutdown(); @@ -94,13 +97,27 @@ database_shutdown() } void -database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type, void *ptr) +database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type, + Eina_Stringshare *file, void *ptr) { Eolian_Declaration *decl = calloc(1, sizeof(Eolian_Declaration)); decl->type = type; decl->name = name; decl->data = ptr; eina_hash_set(_decls, name, decl); + eina_hash_set(_declsf, file, eina_list_append + ((Eina_List*)eina_hash_find(_declsf, file), decl)); +} + +EAPI Eina_Iterator * +eolian_declarations_get_by_file(const char *fname) +{ + if (!_declsf) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(fname); + Eina_List *l = eina_hash_find(_declsf, shr); + eina_stringshare_del(shr); + if (!l) return NULL; + return eina_list_iterator_new(l); } #define EO_SUFFIX ".eo" diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 9bc76d4..86b0180 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -60,14 +60,6 @@ typedef struct _Eolian_Object int column; } Eolian_Object; -typedef enum { - EOLIAN_DECL_CLASS, - EOLIAN_DECL_ALIAS, - EOLIAN_DECL_STRUCT, - EOLIAN_DECL_ENUM, - EOLIAN_DECL_VAR -} Eolian_Declaration_Type; - typedef struct _Eolian_Declaration { Eolian_Declaration_Type type; @@ -270,7 +262,8 @@ char *database_class_to_filename(const char *cname); Eina_Bool database_validate(void); Eina_Bool database_class_name_validate(const char *class_name, const Eolian_Class **cl); -void database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type, void *ptr); +void database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type, + Eina_Stringshare *file, void *ptr); /* types */ --