q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=c4fd68f08a60e587df4feb6b0cde8b3b5e6f9d64

commit c4fd68f08a60e587df4feb6b0cde8b3b5e6f9d64
Author: Daniel Kolesa <[email protected]>
Date:   Mon Jul 21 12:03:51 2014 +0100

    eolian: add API to retrieve filename for each typedef and struct
---
 src/lib/eolian/Eolian.h            | 20 ++++++++++++++++++++
 src/lib/eolian/database_type.c     |  2 ++
 src/lib/eolian/database_type_api.c | 25 +++++++++++++++++++++----
 src/lib/eolian/eo_parser.c         | 12 ++++++++++++
 src/lib/eolian/eolian_database.h   |  2 ++
 src/tests/eolian/eolian_parsing.c  | 13 +++++++++++++
 6 files changed, 70 insertions(+), 4 deletions(-)

diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index fa37c19..833cead 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -780,6 +780,16 @@ EAPI const Eolian_Type *eolian_type_find_by_alias(const 
char *alias);
 EAPI Eina_Bool eolian_typedef_is_extern(const char *alias);
 
 /*
+ * @brief Find the filename for a certain alias
+ *
+ * @param[in] alias alias of the type definition
+ * @return the filename or NULL if @c alias is not found
+ *
+ * @ingroup Eolian
+ */
+EAPI const Eina_Stringshare *eolian_typedef_file_get(const char *alias);
+
+/*
  * @brief Find a struct by name
  *
  * @param[in] name the name of the struct
@@ -866,6 +876,16 @@ EAPI Eina_Stringshare 
*eolian_type_struct_field_description_get(const Eolian_Typ
 EAPI Eina_Stringshare *eolian_type_struct_description_get(const Eolian_Type 
*tp);
 
 /*
+ * @brief Get the filename of a struct type.
+ *
+ * @param[in] tp the type.
+ * @return the filename when @c tp is EOLIAN_TYPE_STRUCT, NULL otherwise.
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Stringshare *eolian_type_struct_file_get(const Eolian_Type *tp);
+
+/*
  * @brief Get the return type of a function type.
  *
  * @param[in] tp the type.
diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c
index 83e44bb..c58ce76 100644
--- a/src/lib/eolian/database_type.c
+++ b/src/lib/eolian/database_type.c
@@ -11,6 +11,7 @@ database_type_del(Eolian_Type *tp)
    if (tp->type == EOLIAN_TYPE_STRUCT)
      {
         eina_hash_free(tp->fields);
+        eina_stringshare_del(tp->file);
         free(tp);
         return;
      }
@@ -27,6 +28,7 @@ database_typedef_del(Eolian_Typedef *def)
 {
    if (!def) return;
    eina_stringshare_del(def->alias);
+   eina_stringshare_del(def->file);
    /* prevent deletion of named structs: stored in another hash */
    if (def->type->type != EOLIAN_TYPE_STRUCT || !def->type->name)
      database_type_del(def->type);
diff --git a/src/lib/eolian/database_type_api.c 
b/src/lib/eolian/database_type_api.c
index bbb9e0b..7face47 100644
--- a/src/lib/eolian/database_type_api.c
+++ b/src/lib/eolian/database_type_api.c
@@ -7,9 +7,9 @@ eolian_type_find_by_alias(const char *alias)
 {
    if (!_types) return NULL;
    Eina_Stringshare *shr = eina_stringshare_add(alias);
-   Eolian_Typedef *cl = eina_hash_find(_types, shr);
+   Eolian_Typedef *def = eina_hash_find(_types, shr);
    eina_stringshare_del(shr);
-   return cl ? cl->type : NULL;
+   return def ? def->type : NULL;
 }
 
 EAPI Eina_Bool
@@ -17,11 +17,20 @@ eolian_typedef_is_extern(const char *alias)
 {
    if (!_types) return EINA_FALSE;
    Eina_Stringshare *shr = eina_stringshare_add(alias);
-   Eolian_Typedef *cl = eina_hash_find(_types, shr);
+   Eolian_Typedef *def = eina_hash_find(_types, shr);
    eina_stringshare_del(shr);
-   return cl ? cl->is_extern : EINA_FALSE;
+   return def ? def->is_extern : EINA_FALSE;
 }
 
+EAPI Eina_Stringshare *
+eolian_typedef_file_get(const char *alias)
+{
+   if (!_types) return EINA_FALSE;
+   Eina_Stringshare *shr = eina_stringshare_add(alias);
+   Eolian_Typedef *def = eina_hash_find(_types, shr);
+   eina_stringshare_del(shr);
+   return def ? eina_stringshare_ref(def->file) : NULL;
+}
 
 EAPI const Eolian_Type *
 eolian_type_struct_find_by_name(const char *name)
@@ -102,6 +111,14 @@ eolian_type_struct_description_get(const Eolian_Type *tp)
    return tp->comment;
 }
 
+EAPI Eina_Stringshare *
+eolian_type_struct_file_get(const Eolian_Type *tp)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(tp->type == EOLIAN_TYPE_STRUCT, NULL);
+   return eina_stringshare_ref(tp->file);
+}
+
 EAPI const Eolian_Type *
 eolian_type_return_type_get(const Eolian_Type *tp)
 {
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 81735ad..0ebd950 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -123,6 +123,16 @@ append_node(Eo_Lexer *ls, int type, void *def)
    ls->nodes = eina_list_append(ls->nodes, nd);
 }
 
+static const char *
+get_filename(Eo_Lexer *ls)
+{
+   Eina_Array *arr = eina_file_split(strdup(ls->source));
+   const char *file = eina_stringshare_add(eina_array_data_get(arr,
+                                           eina_array_count_get(arr) - 1));
+   eina_array_free(arr);
+   return file;
+}
+
 static Eina_Strbuf *
 parse_name(Eo_Lexer *ls, Eina_Strbuf *buf)
 {
@@ -234,6 +244,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool 
is_extern)
    int line = ls->line_number, column = ls->column;
    Eolian_Type *def = push_type(ls);
    def->is_extern = is_extern;
+   def->file = get_filename(ls);
    def->name = name;
    def->type = EOLIAN_TYPE_STRUCT;
    def->fields = eina_hash_string_small_new(EINA_FREE_CB(_struct_field_free));
@@ -421,6 +432,7 @@ parse_typedef(Eo_Lexer *ls)
    if (eina_hash_find(_types, ls->t.value))
      eo_lexer_syntax_error(ls, "typedef redefinition");
    ls->tmp.typedef_def->alias = eina_stringshare_ref(ls->t.value);
+   ls->tmp.typedef_def->file = get_filename(ls);
    eo_lexer_get(ls);
    (void)!!test_next(ls, ':');
    ls->tmp.typedef_def->type = parse_type_struct_nonvoid(ls, EINA_TRUE,
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index e09a31e..6b94a6d 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -112,6 +112,7 @@ struct _Eolian_Type
       struct {
          Eina_Hash        *fields;
          Eina_Stringshare *comment;
+         Eina_Stringshare *file;
       };
    };
    Eina_Bool is_const  :1;
@@ -134,6 +135,7 @@ struct _Eolian_Event
 typedef struct _Eolian_Typedef
 {
    Eina_Stringshare *alias;
+   Eina_Stringshare *file;
    Eolian_Type *type;
    Eina_Bool is_extern :1;
 } Eolian_Typedef;
diff --git a/src/tests/eolian/eolian_parsing.c 
b/src/tests/eolian/eolian_parsing.c
index 96334e4..3b88d72 100644
--- a/src/tests/eolian/eolian_parsing.c
+++ b/src/tests/eolian/eolian_parsing.c
@@ -225,6 +225,7 @@ START_TEST(eolian_typedef)
    const char *type_name = NULL;
    Eina_Iterator *iter = NULL;
    const Eolian_Class *class;
+   const char *file;
 
    eolian_init();
    /* Parsing */
@@ -243,6 +244,11 @@ START_TEST(eolian_typedef)
    fail_if(strcmp(type_name, "int"));
    eina_stringshare_del(type_name);
 
+   /* File */
+   fail_if(!(file = eolian_typedef_file_get("Evas_Coord")));
+   fail_if(strcmp(file, "typedef.eo"));
+   eina_stringshare_del(file);
+
    /* Complex type */
    fail_if(!(type = eolian_type_find_by_alias("List_Objects")));
    fail_if(!(type_name = eolian_type_c_type_get(type)));
@@ -488,6 +494,7 @@ START_TEST(eolian_struct)
    const Eolian_Type *type = NULL, *field = NULL;
    const Eolian_Class *class;
    const char *type_name;
+   const char *file;
 
    eolian_init();
 
@@ -501,11 +508,14 @@ START_TEST(eolian_struct)
    /* named struct */
    fail_if(!(type = eolian_type_struct_find_by_name("Named")));
    fail_if(!(type_name = eolian_type_name_get(type)));
+   fail_if(!(file = eolian_type_struct_file_get(type)));
    fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_STRUCT);
    fail_if(eolian_type_is_own(type));
    fail_if(eolian_type_is_const(type));
    fail_if(strcmp(type_name, "Named"));
    eina_stringshare_del(type_name);
+   fail_if(strcmp(file, "struct.eo"));
+   eina_stringshare_del(file);
    fail_if(!(field = eolian_type_struct_field_get(type, "field")));
    fail_if(!(type_name = eolian_type_name_get(field)));
    fail_if(strcmp(type_name, "int"));
@@ -518,9 +528,12 @@ START_TEST(eolian_struct)
    /* referencing */
    fail_if(!(type = eolian_type_struct_find_by_name("Another")));
    fail_if(!(type_name = eolian_type_name_get(type)));
+   fail_if(!(file = eolian_type_struct_file_get(type)));
    fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_STRUCT);
    fail_if(strcmp(type_name, "Another"));
    eina_stringshare_del(type_name);
+   fail_if(strcmp(file, "struct.eo"));
+   eina_stringshare_del(file);
    fail_if(!(field = eolian_type_struct_field_get(type, "field")));
    fail_if(!(type_name = eolian_type_name_get(field)));
    fail_if(strcmp(type_name, "Named"));

-- 


Reply via email to