*/
typedef struct _Eolian_Enum_Type_Field Eolian_Enum_Type_Field;
+/* Declaration information
+ *
+ * @ingroup Eolian
+ */
+typedef struct _Eolian_Declaration Eolian_Declaration;
+
typedef enum
{
EOLIAN_UNRESOLVED,
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.
*
*/
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
/**
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
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
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
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
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
}
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;
}
Eina_Hash *_filenames = NULL;
Eina_Hash *_tfilenames = NULL;
Eina_Hash *_decls = NULL;
+Eina_Hash *_declsf = NULL;
Eina_Hash *_parsedeos = NULL;
Eina_Hash *_parsingeos = NULL;
_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;
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();
}
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"
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;
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 */