eolian: add infrastructure for globals and constants
authorDaniel Kolesa <d.kolesa@samsung.com>
Fri, 8 Aug 2014 14:19:52 +0000 (15:19 +0100)
committerDaniel Kolesa <d.kolesa@samsung.com>
Thu, 21 Aug 2014 08:26:04 +0000 (09:26 +0100)
Nothing parses yet, and no API is exposed. Also, move the remaining instances of file
inside of existing structures to Eolian_Object and parse basename only once.

15 files changed:
src/Makefile_Eolian.am
src/lib/eolian/Eolian.h
src/lib/eolian/database_class.c
src/lib/eolian/database_class_api.c
src/lib/eolian/database_fill.c
src/lib/eolian/database_type.c
src/lib/eolian/database_type_api.c
src/lib/eolian/database_var.c [new file with mode: 0644]
src/lib/eolian/database_var_api.c [new file with mode: 0644]
src/lib/eolian/eo_definitions.c
src/lib/eolian/eo_lexer.c
src/lib/eolian/eo_lexer.h
src/lib/eolian/eo_parser.c
src/lib/eolian/eolian_database.c
src/lib/eolian/eolian_database.h

index 8df6a9d..767cc76 100644 (file)
@@ -31,7 +31,9 @@ lib_eolian_libeolian_la_SOURCES = \
                                   lib/eolian/database_event_api.c \
                                   lib/eolian/database_print.c \
                                   lib/eolian/database_expr.c \
-                                  lib/eolian/database_expr_api.c
+                                  lib/eolian/database_expr_api.c \
+                                  lib/eolian/database_var.c \
+                                  lib/eolian/database_var_api.c
 
 lib_eolian_libeolian_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl @EOLIAN_CFLAGS@ \
        -DPACKAGE_DATA_DIR=\"$(datadir)/eolian\"
index 59eaad5..8f50fbd 100644 (file)
@@ -80,6 +80,12 @@ typedef struct _Eolian_Event Eolian_Event;
  */
 typedef struct _Eolian_Expression Eolian_Expression;
 
+/* Variable information
+ *
+ * @ingroup Eolian
+ */
+typedef struct _Eolian_Variable Eolian_Variable;
+
 #define EOLIAN_LEGACY "legacy"
 #define EOLIAN_LEGACY_GET "legacy_get"
 #define EOLIAN_LEGACY_SET "legacy_set"
@@ -169,6 +175,13 @@ typedef enum
                       | EOLIAN_MASK_NULL
 } Eolian_Expression_Mask;
 
+typedef enum
+{
+   EOLIAN_VAR_UNKNOWN = 0,
+   EOLIAN_VAR_CONSTANT,
+   EOLIAN_VAR_GLOBAL
+} Eolian_Variable_Type;
+
 /*
  * @brief Parse a given .eo file and fill the database.
  *
index 9dc5eee..a93a104 100644 (file)
@@ -30,7 +30,6 @@ database_class_del(Eolian_Class *cl)
 
    eina_stringshare_del(cl->name);
    eina_stringshare_del(cl->full_name);
-   eina_stringshare_del(cl->file);
    eina_stringshare_del(cl->description);
    eina_stringshare_del(cl->legacy_prefix);
    eina_stringshare_del(cl->eo_prefix);
@@ -70,14 +69,6 @@ database_class_add(const char *class_name, Eolian_Class_Type type)
    return cl;
 }
 
-void
-database_class_file_set(Eolian_Class *cl, const char *file_name)
-{
-   EINA_SAFETY_ON_NULL_RETURN(cl);
-   cl->file = eina_stringshare_add(file_name);
-   eina_hash_set(_classesf, cl->file, cl);
-}
-
 /*
  * ret false -> clash, class = NULL
  * ret true && class -> only one class corresponding
index 4d5efa5..2b78518 100644 (file)
@@ -4,7 +4,7 @@
 EAPI Eina_Stringshare *
 eolian_class_file_get(const Eolian_Class *cl)
 {
-   return cl ? cl->file : NULL;
+   return cl ? cl->base.file : NULL;
 }
 
 EAPI Eina_Stringshare *
index 4dd120f..b3e2c58 100644 (file)
@@ -404,7 +404,7 @@ _db_fill_class(Eo_Class_Def *kls)
    const char *s;
    Eina_List *l;
 
-   database_class_file_set(cl, kls->file);
+   eina_hash_set(_classesf, kls->base.file, cl);
 
    if (kls->comment)
      {
index 2c0347b..e1af071 100644 (file)
@@ -18,7 +18,6 @@ database_type_del(Eolian_Type *tp)
    if (tp->namespaces) EINA_LIST_FREE(tp->namespaces, sp)
       eina_stringshare_del(sp);
    if (tp->comment) eina_stringshare_del(tp->comment);
-   if (tp->file) eina_stringshare_del(tp->file);
    free(tp);
 }
 
@@ -38,8 +37,8 @@ database_type_add(Eolian_Type *def)
 {
    if (!_aliases) return EINA_FALSE;
    eina_hash_set(_aliases, def->full_name, def);
-   eina_hash_set(_aliasesf, def->file, eina_list_append
-                ((Eina_List*)eina_hash_find(_aliasesf, def->file), def));
+   eina_hash_set(_aliasesf, def->base.file, eina_list_append
+                ((Eina_List*)eina_hash_find(_aliasesf, def->base.file), def));
    return EINA_TRUE;
 }
 
@@ -47,8 +46,8 @@ Eina_Bool database_struct_add(Eolian_Type *tp)
 {
    if (!_structs) return EINA_FALSE;
    eina_hash_set(_structs, tp->full_name, tp);
-   eina_hash_set(_structsf, tp->file, eina_list_append
-                ((Eina_List*)eina_hash_find(_structsf, tp->file), tp));
+   eina_hash_set(_structsf, tp->base.file, eina_list_append
+                ((Eina_List*)eina_hash_find(_structsf, tp->base.file), tp));
    return EINA_TRUE;
 }
 
index 46ff42d..2fa6404 100644 (file)
@@ -127,7 +127,7 @@ eolian_type_file_get(const Eolian_Type *tp)
    EINA_SAFETY_ON_FALSE_RETURN_VAL(tpp != EOLIAN_TYPE_POINTER
                                 && tpp != EOLIAN_TYPE_FUNCTION
                                 && tpp != EOLIAN_TYPE_VOID, NULL);
-   return eina_stringshare_ref(tp->file);
+   return eina_stringshare_ref(tp->base.file);
 }
 
 EAPI const Eolian_Type *
diff --git a/src/lib/eolian/database_var.c b/src/lib/eolian/database_var.c
new file mode 100644 (file)
index 0000000..e3328e9
--- /dev/null
@@ -0,0 +1,39 @@
+#include <Eina.h>
+#include "eo_lexer.h"
+
+void
+database_var_del(Eolian_Variable *var)
+{
+   if (!var) return;
+   const char *sp;
+   if (var->base.file) eina_stringshare_del(var->base.file);
+   if (var->base_type)
+     database_type_del(var->base_type);
+   if (var->name) eina_stringshare_del(var->name);
+   if (var->full_name) eina_stringshare_del(var->full_name);
+   if (var->namespaces) EINA_LIST_FREE(var->namespaces, sp)
+      eina_stringshare_del(sp);
+   if (var->value) database_expr_del(var->value);
+   if (var->comment) eina_stringshare_del(var->comment);
+   free(var);
+}
+
+Eina_Bool
+database_var_global_add(Eolian_Variable *var)
+{
+   if (!_globals) return EINA_FALSE;
+   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));
+   return EINA_TRUE;
+}
+
+Eina_Bool
+database_var_constant_add(Eolian_Variable *var)
+{
+   if (!_constants) return EINA_FALSE;
+   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));
+   return EINA_TRUE;
+}
diff --git a/src/lib/eolian/database_var_api.c b/src/lib/eolian/database_var_api.c
new file mode 100644 (file)
index 0000000..4d4a971
--- /dev/null
@@ -0,0 +1,95 @@
+#include <Eina.h>
+#include "eolian_database.h"
+#include "eo_definitions.h"
+
+EAPI const Eolian_Variable *
+eolian_variable_global_get_by_name(const char *name)
+{
+   if (!_globals) return NULL;
+   Eina_Stringshare *shr = eina_stringshare_add(name);
+   Eolian_Variable *v = eina_hash_find(_globals, shr);
+   eina_stringshare_del(shr);
+   return v;
+}
+
+EAPI const Eolian_Variable *
+eolian_variable_constant_get_by_name(const char *name)
+{
+   if (!_constants) return NULL;
+   Eina_Stringshare *shr = eina_stringshare_add(name);
+   Eolian_Variable *v = eina_hash_find(_constants, shr);
+   eina_stringshare_del(shr);
+   return v;
+}
+
+EAPI Eina_Iterator *
+eolian_variable_globals_get_by_file(const char *fname)
+{
+   if (!_globalsf) return NULL;
+   Eina_Stringshare *shr = eina_stringshare_add(fname);
+   Eina_List *l = eina_hash_find(_globalsf, shr);
+   eina_stringshare_del(shr);
+   if (!l) return NULL;
+   return eina_list_iterator_new(l);
+}
+
+EAPI Eina_Iterator *
+eolian_variable_constants_get_by_file(const char *fname)
+{
+   if (!_constantsf) return NULL;
+   Eina_Stringshare *shr = eina_stringshare_add(fname);
+   Eina_List *l = eina_hash_find(_constantsf, shr);
+   eina_stringshare_del(shr);
+   if (!l) return NULL;
+   return eina_list_iterator_new(l);
+}
+
+EAPI Eolian_Variable_Type
+eolian_variable_type_get(const Eolian_Variable *var)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(var, EOLIAN_VAR_UNKNOWN);
+   return var->type;
+}
+
+EAPI Eina_Stringshare *
+eolian_variable_description_get(const Eolian_Variable *var)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL);
+   return eina_stringshare_ref(var->comment);
+}
+
+EAPI Eina_Stringshare *
+eolian_variable_file_get(const Eolian_Variable *var)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL);
+   return eina_stringshare_ref(var->base.file);
+}
+
+EAPI const Eolian_Type *
+eolian_variable_base_type_get(const Eolian_Variable *var)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL);
+   return var->base_type;
+}
+
+EAPI Eina_Stringshare *
+eolian_variable_name_get(const Eolian_Variable *var)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL);
+   return eina_stringshare_ref(var->name);
+}
+
+EAPI Eina_Stringshare *
+eolian_variable_full_name_get(const Eolian_Variable *var)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL);
+   return eina_stringshare_ref(var->full_name);
+}
+
+EAPI Eina_Iterator *
+eolian_variable_namespaces_get(const Eolian_Variable *var)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL);
+   if (!var->namespaces) return NULL;
+   return eina_list_iterator_new(var->namespaces);
+}
index a8bb978..f400a48 100644 (file)
@@ -113,8 +113,6 @@ eo_definitions_class_def_free(Eo_Class_Def *kls)
 
    if (kls->name)
      eina_stringshare_del(kls->name);
-   if (kls->file)
-     eina_stringshare_del(kls->file);
    if (kls->comment)
      eina_stringshare_del(kls->comment);
    if (kls->legacy_prefix)
index 79b787a..e5b0721 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <setjmp.h>
 #include <assert.h>
+#include <libgen.h>
 
 #include "eo_lexer.h"
 
@@ -663,6 +664,16 @@ lex_balanced(Eo_Lexer *ls, Eo_Token *tok, char beg, char end)
    return TOK_VALUE;
 }
 
+static const char *
+get_filename(Eo_Lexer *ls)
+{
+   char *dup = strdup(ls->source);
+   char *s = basename(dup);
+   const char *file = eina_stringshare_add(s);
+   free(dup);
+   return file;
+}
+
 static void
 eo_lexer_set_input(Eo_Lexer *ls, const char *source)
 {
@@ -679,6 +690,7 @@ eo_lexer_set_input(Eo_Lexer *ls, const char *source)
    ls->stream_end      = ls->stream + eina_file_size_get(f);
    ls->stream_line     = ls->stream;
    ls->source          = eina_stringshare_add(source);
+   ls->filename        = get_filename(ls);
    ls->line_number     = 1;
    ls->icolumn         = ls->column = 0;
    next_char(ls);
@@ -690,9 +702,10 @@ eo_lexer_free(Eo_Lexer *ls)
    Eo_Node *nd;
 
    if (!ls) return;
-   if (ls->source) eina_stringshare_del(ls->source);
-   if (ls->buff  ) eina_strbuf_free    (ls->buff);
-   if (ls->handle) eina_file_close     (ls->handle);
+   if (ls->source  ) eina_stringshare_del(ls->source);
+   if (ls->filename) eina_stringshare_del(ls->filename);
+   if (ls->buff    ) eina_strbuf_free    (ls->buff);
+   if (ls->handle  ) eina_file_close     (ls->handle);
 
    eo_lexer_context_clear(ls);
 
index 60281c2..042ea9f 100644 (file)
@@ -132,6 +132,8 @@ typedef struct _Eo_Lexer
    Eina_File   *handle;
    /* the source file name */
    const char  *source;
+   /* only basename */
+   const char  *filename;
    /* points to the current character in our mmapped file being lexed, just
     * incremented until the end */
    const char  *stream;
index abf6dff..98aaed4 100644 (file)
@@ -1,5 +1,3 @@
-#include <libgen.h>
-
 #include "eo_parser.h"
 
 #define CASE_LOCK(ls, var, msg) \
@@ -125,16 +123,6 @@ 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)
-{
-   char *dup = strdup(ls->source);
-   char *s = basename(dup);
-   const char *file = eina_stringshare_add(s);
-   free(dup);
-   return file;
-}
-
 static Eina_Bool
 compare_class_file(const char *fn_ext, const char *fn_noext)
 {
@@ -150,9 +138,9 @@ redef_error(Eo_Lexer *ls, Eolian_Type_Type type, Eolian_Type *old)
 {
    char  buf[256];
    char fbuf[256] = { '\0' };
-   const char *file = get_filename(ls);
-   if (file != old->file)
-     snprintf(fbuf, sizeof(fbuf), " in file '%s'", old->file);
+   const char *file = eina_stringshare_ref(ls->filename);
+   if (file != old->base.file)
+     snprintf(fbuf, sizeof(fbuf), " in file '%s'", old->base.file);
    eina_stringshare_del(file);
    snprintf(buf, sizeof(buf),
             "%s '%s' redefined (originally at line %d, column %d%s)",
@@ -330,7 +318,7 @@ parse_expr_simple(Eo_Lexer *ls)
         Eolian_Expression *exp = parse_expr_bin(ls, UNARY_PRECEDENCE);
         pop_expr(ls);
         expr = push_expr(ls);
-        expr->base.file = get_filename(ls);
+        expr->base.file = eina_stringshare_ref(ls->filename);
         expr->base.line = line;
         expr->base.column = col;
         expr->binop = unop;
@@ -344,7 +332,7 @@ parse_expr_simple(Eo_Lexer *ls)
         {
            int line = ls->line_number, col = ls->column;
            expr = push_expr(ls);
-           expr->base.file = get_filename(ls);
+           expr->base.file = eina_stringshare_ref(ls->filename);
            expr->base.line = line;
            expr->base.column = col;
            expr->type = ls->t.kw + 1; /* map Numbers from lexer to expr type */
@@ -356,7 +344,7 @@ parse_expr_simple(Eo_Lexer *ls)
         {
            int line = ls->line_number, col = ls->column;
            expr = push_expr(ls);
-           expr->base.file = get_filename(ls);
+           expr->base.file = eina_stringshare_ref(ls->filename);
            expr->base.line = line;
            expr->base.column = col;
            expr->type = EOLIAN_EXPR_STRING;
@@ -368,7 +356,7 @@ parse_expr_simple(Eo_Lexer *ls)
         {
            int line = ls->line_number, col = ls->column;
            expr = push_expr(ls);
-           expr->base.file = get_filename(ls);
+           expr->base.file = eina_stringshare_ref(ls->filename);
            expr->base.line = line;
            expr->base.column = col;
            expr->type = EOLIAN_EXPR_CHAR;
@@ -406,7 +394,7 @@ parse_expr_simple(Eo_Lexer *ls)
                    break;
                 }
              }
-           expr->base.file = get_filename(ls);
+           expr->base.file = eina_stringshare_ref(ls->filename);
            expr->base.line = line;
            expr->base.column = col;
            break;
@@ -443,7 +431,7 @@ parse_expr_bin(Eo_Lexer *ls, int min_prec)
         pop_expr(ls);
         pop_expr(ls);
         bin = push_expr(ls);
-        bin->base.file = get_filename(ls);
+        bin->base.file = eina_stringshare_ref(ls->filename);
         bin->base.line = line;
         bin->base.column = col;
         bin->binop = op;
@@ -499,6 +487,7 @@ parse_function_type(Eo_Lexer *ls)
 {
    int line, col;
    Eolian_Type *def = push_type(ls);
+   def->base.file = eina_stringshare_ref(ls->filename);
    def->base.line = ls->line_number;
    def->base.column = ls->column;
    eo_lexer_get(ls);
@@ -542,7 +531,6 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
    int bline = ls->line_number, bcolumn = ls->column;
    Eolian_Type *def = push_type(ls);
    def->is_extern = is_extern;
-   def->file = get_filename(ls);
    if (name) _fill_type_name(def, name);
    def->type = EOLIAN_TYPE_STRUCT;
    def->fields = eina_hash_string_small_new(EINA_FREE_CB(_struct_field_free));
@@ -566,6 +554,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
         check_next(ls, ':');
         tp = parse_type(ls);
         fdef = calloc(1, sizeof(Eolian_Struct_Field));
+        fdef->base.file = eina_stringshare_ref(ls->filename);
         fdef->base.line = fline;
         fdef->base.column = fcol;
         fdef->type = tp;
@@ -580,6 +569,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
           }
      }
    check_match(ls, '}', '{', bline, bcolumn);
+   def->base.file = eina_stringshare_ref(ls->filename);
    def->base.line = line;
    def->base.column = column;
    if (name) database_struct_add(def);
@@ -604,6 +594,7 @@ parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct)
            col = ls->column;
            check_next(ls, '(');
            def = parse_type_void(ls);
+           def->base.file = eina_stringshare_ref(ls->filename);
            def->base.line = line;
            def->base.column = col;
            def->is_const = EINA_TRUE;
@@ -625,6 +616,7 @@ parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct)
                 eo_lexer_syntax_error(ls, "pointer type expected");
              }
            eo_lexer_context_pop(ls);
+           def->base.file = eina_stringshare_ref(ls->filename);
            def->base.line = line;
            def->base.column = col;
            def->is_own = EINA_TRUE;
@@ -683,6 +675,7 @@ parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct)
         break;
      }
    def = push_type(ls);
+   def->base.file = eina_stringshare_ref(ls->filename);
    def->base.line = line;
    def->base.column = col;
    if (ls->t.kw == KW_void)
@@ -708,7 +701,7 @@ parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct)
              eo_lexer_context_push(ls);
              parse_name(ls, buf);
              nm = eina_strbuf_string_get(buf);
-             bnm = get_filename(ls);
+             bnm = eina_stringshare_ref(ls->filename);
              fnm = database_class_to_filename(nm);
              if (!compare_class_file(bnm, fnm))
                {
@@ -744,6 +737,7 @@ parse_ptr:
         Eolian_Type *pdef;
         pop_type(ls);
         pdef = push_type(ls);
+        pdef->base.file = eina_stringshare_ref(ls->filename);
         pdef->base.line = ls->line_number;
         pdef->base.column = ls->column;
         pdef->base_type = def;
@@ -777,8 +771,6 @@ static Eolian_Type *
 parse_typedef(Eo_Lexer *ls)
 {
    Eolian_Type *def = push_type(ls);
-   def->base.line = ls->line_number;
-   def->base.column = ls->column;
    Eina_Bool is_extern = EINA_FALSE;
    Eina_Strbuf *buf;
    eo_lexer_get(ls);
@@ -791,6 +783,7 @@ parse_typedef(Eo_Lexer *ls)
    def->is_extern = is_extern;
    buf = push_strbuf(ls);
    eo_lexer_context_push(ls);
+   def->base.file = eina_stringshare_ref(ls->filename);
    def->base.line = ls->line_number;
    def->base.column = ls->column;
    parse_name(ls, buf);
@@ -802,7 +795,6 @@ parse_typedef(Eo_Lexer *ls)
         redef_error(ls, EOLIAN_TYPE_ALIAS, tp);
      }
    eo_lexer_context_pop(ls);
-   def->file = get_filename(ls);
    (void)!!test_next(ls, ':');
    def->base_type = parse_type_struct(ls, EINA_TRUE);
    pop_type(ls);
@@ -853,6 +845,7 @@ static void
 parse_param(Eo_Lexer *ls, Eina_Bool allow_inout)
 {
    Eo_Param_Def *par = calloc(1, sizeof(Eo_Param_Def));
+   par->base.file = eina_stringshare_ref(ls->filename);
    par->base.line = ls->line_number;
    par->base.column = ls->column;
    ls->tmp.param = par;
@@ -942,6 +935,7 @@ parse_accessor(Eo_Lexer *ls)
    Eo_Accessor_Def *acc = NULL;
    Eina_Bool has_return = EINA_FALSE, has_legacy = EINA_FALSE;
    acc = calloc(1, sizeof(Eo_Accessor_Def));
+   acc->base.file = eina_stringshare_ref(ls->filename);
    acc->base.line = ls->line_number;
    acc->base.column = ls->column;
    ls->tmp.accessor = acc;
@@ -1014,6 +1008,7 @@ parse_property(Eo_Lexer *ls)
              has_protected = EINA_FALSE, has_class  = EINA_FALSE,
              has_constructor = EINA_FALSE;
    prop = calloc(1, sizeof(Eo_Property_Def));
+   prop->base.file = eina_stringshare_ref(ls->filename);
    prop->base.line = ls->line_number;
    prop->base.column = ls->column;
    ls->tmp.prop = prop;
@@ -1094,6 +1089,7 @@ parse_method(Eo_Lexer *ls, Eina_Bool ctor)
              has_protected   = EINA_FALSE, has_class  = EINA_FALSE,
              has_constructor = EINA_FALSE;
    meth = calloc(1, sizeof(Eo_Method_Def));
+   meth->base.file = eina_stringshare_ref(ls->filename);
    meth->base.line = ls->line_number;
    meth->base.column = ls->column;
    ls->tmp.meth = meth;
@@ -1187,6 +1183,7 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
    Eolian_Implement *impl = NULL;
    buf = push_strbuf(ls);
    impl = calloc(1, sizeof(Eolian_Implement));
+   impl->base.file = eina_stringshare_ref(ls->filename);
    impl->base.line = ls->line_number;
    impl->base.column = ls->column;
    ls->tmp.impl = impl;
@@ -1279,6 +1276,7 @@ static void
 parse_event(Eo_Lexer *ls)
 {
    Eolian_Event *ev = calloc(1, sizeof(Eolian_Event));
+   ev->base.file = eina_stringshare_ref(ls->filename);
    ev->base.line = ls->line_number;
    ev->base.column = ls->column;
    Eina_Strbuf *buf = push_strbuf(ls);
@@ -1470,13 +1468,14 @@ parse_class(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
    int line, col;
    Eina_Strbuf *buf = push_strbuf(ls);
    ls->tmp.kls = calloc(1, sizeof(Eo_Class_Def));
+   ls->tmp.kls->base.file = eina_stringshare_ref(ls->filename);
    ls->tmp.kls->base.line = ls->line_number;
    ls->tmp.kls->base.column = ls->column;
    eo_lexer_get(ls);
    ls->tmp.kls->type = type;
    eo_lexer_context_push(ls);
    parse_name(ls, buf);
-   bnm = get_filename(ls);
+   bnm = eina_stringshare_ref(ls->filename);
    fnm = database_class_to_filename(eina_strbuf_string_get(buf));
    same = compare_class_file(bnm, fnm);
    eina_stringshare_del(bnm);
@@ -1489,7 +1488,6 @@ parse_class(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
    eo_lexer_context_pop(ls);
    ls->tmp.kls->name = eina_stringshare_add(eina_strbuf_string_get(buf));
    pop_strbuf(ls);
-   ls->tmp.kls->file = get_filename(ls);
    if (ls->t.token != '{')
      {
         line = ls->line_number;
index 5b9ba97..3873206 100644 (file)
@@ -6,9 +6,13 @@
 Eina_Hash *_classes = NULL;
 Eina_Hash *_aliases = NULL;
 Eina_Hash *_structs = NULL;
+Eina_Hash *_globals = NULL;
+Eina_Hash *_constants = NULL;
 Eina_Hash *_classesf = NULL;
 Eina_Hash *_aliasesf = NULL;
 Eina_Hash *_structsf = NULL;
+Eina_Hash *_globalsf = NULL;
+Eina_Hash *_constantsf = NULL;
 Eina_Hash *_filenames = NULL;
 Eina_Hash *_tfilenames = NULL;
 
@@ -28,9 +32,13 @@ database_init()
    _classes = eina_hash_stringshared_new(EINA_FREE_CB(database_class_del));
    _aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedef_del));
    _structs = eina_hash_stringshared_new(EINA_FREE_CB(database_type_del));
+   _globals = eina_hash_stringshared_new(EINA_FREE_CB(database_var_del));
+   _constants = eina_hash_stringshared_new(EINA_FREE_CB(database_var_del));
    _classesf = eina_hash_stringshared_new(NULL);
    _aliasesf = eina_hash_stringshared_new(_hashlist_free);
    _structsf = eina_hash_stringshared_new(_hashlist_free);
+   _globalsf = eina_hash_stringshared_new(_hashlist_free);
+   _constantsf = eina_hash_stringshared_new(_hashlist_free);
    _filenames = eina_hash_string_small_new(free);
    _tfilenames = eina_hash_string_small_new(free);
    return ++_database_init_count;
@@ -51,9 +59,13 @@ database_shutdown()
         eina_hash_free(_classes);
         eina_hash_free(_aliases);
         eina_hash_free(_structs);
+        eina_hash_free(_globals);
+        eina_hash_free(_constants);
         eina_hash_free(_classesf);
         eina_hash_free(_aliasesf);
         eina_hash_free(_structsf);
+        eina_hash_free(_globalsf);
+        eina_hash_free(_constantsf);
         eina_hash_free(_filenames);
         eina_hash_free(_tfilenames);
         eina_shutdown();
index e4e5e0b..29b8854 100644 (file)
@@ -38,9 +38,13 @@ extern Eina_Prefix *_eolian_prefix;
 extern Eina_Hash *_classes;
 extern Eina_Hash *_aliases;
 extern Eina_Hash *_structs;
+extern Eina_Hash *_globals;
+extern Eina_Hash *_constants;
 extern Eina_Hash *_classesf;
 extern Eina_Hash *_aliasesf;
 extern Eina_Hash *_structsf;
+extern Eina_Hash *_globalsf;
+extern Eina_Hash *_constantsf;
 extern Eina_Hash *_filenames; /* Hash: filename without extension -> full path */
 extern Eina_Hash *_tfilenames;
 
@@ -57,7 +61,6 @@ struct _Eolian_Class
    Eina_Stringshare *full_name;
    Eina_List *namespaces; /* List Eina_Stringshare * */
    Eina_Stringshare *name;
-   Eina_Stringshare *file;
    Eolian_Class_Type type;
    Eina_Stringshare *description;
    Eina_Stringshare *legacy_prefix;
@@ -126,7 +129,6 @@ struct _Eolian_Type
          Eina_List        *namespaces;
          Eina_Hash        *fields;
          Eina_Stringshare *comment;
-         Eina_Stringshare *file;
       };
    };
    Eina_Bool is_const  :1;
@@ -230,6 +232,18 @@ struct _Eolian_Expression
    };
 };
 
+struct _Eolian_Variable
+{
+   Eolian_Object         base;
+   Eolian_Variable_Type  type;
+   Eina_Stringshare     *name;
+   Eina_Stringshare     *full_name;
+   Eina_List            *namespaces;
+   Eolian_Type          *base_type;
+   Eolian_Expression    *value;
+   Eina_Stringshare     *comment;
+};
+
 int database_init();
 int database_shutdown();
 
@@ -248,6 +262,12 @@ void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *n
 Eolian_Expression_Type database_expr_eval(const Eolian_Expression *expr, Eolian_Expression_Mask mask, Eina_Value **out);
 void database_expr_del(Eolian_Expression *expr);
 
+/* variables */
+
+void database_var_del(Eolian_Variable *var);
+Eina_Bool database_var_global_add(Eolian_Variable *var);
+Eina_Bool database_var_constant_add(Eolian_Variable *var);
+
 /* classes */
 
 Eolian_Class *database_class_add(const char *class_name, Eolian_Class_Type type);
@@ -264,7 +284,6 @@ void database_class_description_set(Eolian_Class *cl, const char *description);
 void database_class_legacy_prefix_set(Eolian_Class *cl, const char *legacy_prefix);
 void database_class_eo_prefix_set(Eolian_Class *cl, const char *eo_prefix);
 void database_class_data_type_set(Eolian_Class *cl, const char *data_type);
-void database_class_file_set(Eolian_Class *cl, const char *file_name);
 Eina_Bool database_class_ctor_enable_set(Eolian_Class *cl, Eina_Bool enable);
 Eina_Bool database_class_dtor_enable_set(Eolian_Class *cl, Eina_Bool enable);