efl/src/lib/eolian/eolian_database.h

329 lines
8.2 KiB
C

#ifndef __EOLIAN_DATABASE_H
#define __EOLIAN_DATABASE_H
#include <Eolian.h>
extern int _eolian_log_dom;
extern Eina_Prefix *_eolian_prefix;
#ifdef CRI
#undef CRI
#endif
#define CRI(...) EINA_LOG_DOM_CRIT(_eolian_log_dom, __VA_ARGS__)
#ifdef ERR
#undef ERR
#endif
#define ERR(...) EINA_LOG_DOM_ERR(_eolian_log_dom, __VA_ARGS__)
#ifdef WRN
#undef WRN
#endif
#define WRN(...) EINA_LOG_DOM_WARN(_eolian_log_dom, __VA_ARGS__)
#ifdef INF
#undef INF
#endif
#define INF(...) EINA_LOG_DOM_INFO(_eolian_log_dom, __VA_ARGS__)
#ifdef DBG
#undef DBG
#endif
#define DBG(...) EINA_LOG_DOM_DBG(_eolian_log_dom, __VA_ARGS__)
extern Eina_Hash *_classes;
extern Eina_Hash *_aliases;
extern Eina_Hash *_structs;
extern Eina_Hash *_enums;
extern Eina_Hash *_globals;
extern Eina_Hash *_constants;
extern Eina_Hash *_classesf;
extern Eina_Hash *_aliasesf;
extern Eina_Hash *_structsf;
extern Eina_Hash *_enumsf;
extern Eina_Hash *_globalsf;
extern Eina_Hash *_constantsf;
extern Eina_Hash *_filenames; /* Hash: filename without extension -> full path */
extern Eina_Hash *_tfilenames;
/* a hash holding lists of deps */
extern Eina_Hash *_depclasses;
/* a hash holding all declarations, for redef checking etc */
extern Eina_Hash *_decls;
/* holds parsed/currently parsing eot files to keep track */
extern Eina_Hash *_parsedeots;
extern Eina_Hash *_parsingeos;
typedef struct _Eolian_Object
{
const char *file;
int line;
int column;
} Eolian_Object;
typedef struct _Eolian_Dependency
{
Eolian_Object base;
Eina_Stringshare *filename;
Eina_Stringshare *name;
} Eolian_Dependency;
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_Stringshare *name;
void *data;
} Eolian_Declaration;
struct _Eolian_Class
{
Eolian_Object base;
Eina_Stringshare *full_name;
Eina_List *namespaces; /* List Eina_Stringshare * */
Eina_Stringshare *name;
Eolian_Class_Type type;
Eina_Stringshare *description;
Eina_Stringshare *legacy_prefix;
Eina_Stringshare *eo_prefix;
Eina_Stringshare *data_type;
Eina_List *inherits; /* List Eina_Stringshare * */
Eina_List *properties; /* List prop_name -> Eolian_Function */
Eina_List *methods; /* List meth_name -> Eolian_Function */
Eina_List *implements; /* List implements name -> Eolian_Implement */
Eina_List *constructors; /* List constructors name -> Eolian_Constructor */
Eina_List *events; /* List event_name -> Eolian_Event */
Eina_Bool class_ctor_enable:1;
Eina_Bool class_dtor_enable:1;
};
struct _Eolian_Function
{
Eolian_Object base;
Eolian_Object set_base;
Eina_Stringshare *name;
union { /* lists of Eolian_Function_Parameter */
Eina_List *params;
struct {
Eina_List *prop_values;
Eina_List *prop_values_get;
Eina_List *prop_values_set;
Eina_List *prop_keys;
Eina_List *prop_keys_get;
Eina_List *prop_keys_set;
};
};
Eolian_Function_Type type;
Eolian_Object_Scope scope;
Eolian_Type *get_ret_type;
Eolian_Type *set_ret_type;
Eolian_Expression *get_ret_val;
Eolian_Expression *set_ret_val;
Eolian_Implement *get_impl;
Eolian_Implement *set_impl;
Eina_Stringshare *get_legacy;
Eina_Stringshare *set_legacy;
Eina_Stringshare *common_description;
Eina_Stringshare *get_description;
Eina_Stringshare *set_description;
Eina_Stringshare *get_return_comment;
Eina_Stringshare *set_return_comment;
Eina_Bool obj_is_const :1; /* True if the object has to be const. Useful for a few methods. */
Eina_Bool get_virtual_pure :1;
Eina_Bool set_virtual_pure :1;
Eina_Bool get_auto :1;
Eina_Bool set_auto :1;
Eina_Bool get_empty :1;
Eina_Bool set_empty :1;
Eina_Bool get_return_warn_unused :1; /* also used for methods */
Eina_Bool set_return_warn_unused :1;
Eina_Bool get_only_legacy: 1;
Eina_Bool set_only_legacy: 1;
Eina_Bool is_class :1;
Eina_Bool is_c_only :1;
Eina_Bool is_beta :1;
Eina_List *ctor_of;
Eolian_Class *klass;
};
struct _Eolian_Function_Parameter
{
Eolian_Object base;
Eina_Stringshare *name;
Eolian_Type *type;
Eolian_Expression *value;
Eina_Stringshare *description;
Eolian_Parameter_Dir param_dir;
Eina_Bool nonull :1; /* True if this argument cannot be NULL - deprecated */
Eina_Bool nullable :1; /* True if this argument is nullable */
Eina_Bool optional :1; /* True if this argument is optional */
};
struct _Eolian_Type
{
Eolian_Object base;
Eolian_Type_Type type;
Eina_List *subtypes;
Eolian_Type *base_type;
Eina_Stringshare *name;
Eina_Stringshare *full_name;
Eina_List *namespaces;
Eina_Hash *fields;
Eina_List *field_list;
Eina_Stringshare *comment;
Eina_Stringshare *legacy;
Eina_Stringshare *freefunc;
Eina_Bool is_const :1;
Eina_Bool is_own :1;
Eina_Bool is_extern :1;
};
struct _Eolian_Implement
{
Eolian_Object base;
const Eolian_Class *klass;
const Eolian_Function *foo_id;
Eina_Stringshare *full_name;
Eina_Bool is_virtual :1;
Eina_Bool is_prop_get :1;
Eina_Bool is_prop_set :1;
Eina_Bool is_auto: 1;
Eina_Bool is_empty: 1;
};
struct _Eolian_Constructor
{
Eolian_Object base;
const Eolian_Class *klass;
Eina_Stringshare *full_name;
Eina_Bool is_optional: 1;
};
struct _Eolian_Event
{
Eolian_Object base;
Eina_Stringshare *name;
Eina_Stringshare *comment;
Eolian_Type *type;
Eolian_Class *klass;
int scope;
Eina_Bool is_beta :1;
};
struct _Eolian_Struct_Type_Field
{
Eina_Stringshare *name;
Eolian_Object base;
Eolian_Type *type;
Eina_Stringshare *comment;
};
struct _Eolian_Enum_Type_Field
{
Eolian_Type *base_enum;
Eina_Stringshare *name;
Eolian_Object base;
Eolian_Expression *value;
Eina_Stringshare *comment;
Eina_Bool is_public_value :1;
};
struct _Eolian_Expression
{
Eolian_Object base;
Eolian_Expression_Type type;
union
{
struct
{
Eolian_Binary_Operator binop;
Eolian_Expression *lhs;
Eolian_Expression *rhs;
};
struct
{
Eolian_Unary_Operator unop;
Eolian_Expression *expr;
};
Eolian_Value_Union value;
};
Eina_Bool weak_lhs :1;
Eina_Bool weak_rhs :1;
};
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;
Eina_Bool is_extern :1;
};
int database_init();
int database_shutdown();
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);
/* types */
void database_type_add(Eolian_Type *def);
void database_struct_add(Eolian_Type *tp);
void database_enum_add(Eolian_Type *tp);
void database_type_del(Eolian_Type *tp);
void database_typedef_del(Eolian_Type *tp);
void database_type_print(Eolian_Type *type);
void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name);
/* expressions */
Eolian_Value database_expr_eval(const Eolian_Expression *expr, Eolian_Expression_Mask mask);
void database_expr_del(Eolian_Expression *expr);
void database_expr_print(Eolian_Expression *expr);
/* variables */
void database_var_del(Eolian_Variable *var);
void database_var_add(Eolian_Variable *var);
/* classes */
void database_class_del(Eolian_Class *cl);
/* functions */
void database_function_del(Eolian_Function *fid);
void database_function_constructor_add(Eolian_Function *func, const Eolian_Class *klass);
/* func parameters */
void database_parameter_del(Eolian_Function_Parameter *pdesc);
/* implements */
void database_implement_del(Eolian_Implement *impl);
void database_implement_constructor_add(Eolian_Implement *impl, const Eolian_Class *klass);
/* constructors */
void database_constructor_del(Eolian_Constructor *ctor);
/* events */
void database_event_del(Eolian_Event *event);
#endif