eolian: initial exposed declaration API - not yet very useful
authorDaniel Kolesa <d.kolesa@osg.samsung.com>
Mon, 1 Jun 2015 13:32:19 +0000 (14:32 +0100)
committerDaniel Kolesa <d.kolesa@osg.samsung.com>
Mon, 1 Jun 2015 13:32:45 +0000 (14:32 +0100)
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
src/lib/eolian/database_type.c
src/lib/eolian/database_var.c
src/lib/eolian/eo_parser.c
src/lib/eolian/eolian_database.c
src/lib/eolian/eolian_database.h

index c10db83..8d2b7de 100644 (file)
@@ -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
 
 /**
index 60a4f0e..930f9e1 100644 (file)
@@ -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
index 39bb52a..5d8c2ad 100644 (file)
@@ -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
index 02938d8..88d1a1e 100644 (file)
@@ -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;
 }
 
index 31a6d86..2deecca 100644 (file)
@@ -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"
index 9bc76d4..86b0180 100644 (file)
@@ -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 */