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

-- 


Reply via email to