summaryrefslogtreecommitdiff
path: root/src/bindings/lua/eolian.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/bindings/lua/eolian.lua')
-rw-r--r--src/bindings/lua/eolian.lua1885
1 files changed, 1885 insertions, 0 deletions
diff --git a/src/bindings/lua/eolian.lua b/src/bindings/lua/eolian.lua
new file mode 100644
index 0000000000..687d824243
--- /dev/null
+++ b/src/bindings/lua/eolian.lua
@@ -0,0 +1,1885 @@
+-- EFL LuaJIT bindings: Eolian
+-- For use with Elua
+
+local ffi = require("ffi")
+
+ffi.cdef [[
+ void eina_stringshare_del(const char *str);
+ void free(void *ptr);
+]]
+
+ffi.cdef [[
+ typedef unsigned char Eina_Bool;
+ typedef struct _Eina_Iterator Eina_Iterator;
+
+ typedef struct _Eolian_State Eolian_State;
+ typedef struct _Eolian_Object Eolian_Object;
+ typedef struct _Eolian_Class Eolian_Class;
+ typedef struct _Eolian_Function Eolian_Function;
+ typedef struct _Eolian_Part Eolian_Part;
+ typedef struct _Eolian_Type Eolian_Type;
+ typedef struct _Eolian_Typedecl Eolian_Typedecl;
+ typedef struct _Eolian_Function_Parameter Eolian_Function_Parameter;
+ typedef struct _Eolian_Implement Eolian_Implement;
+ typedef struct _Eolian_Constructor Eolian_Constructor;
+ typedef struct _Eolian_Event Eolian_Event;
+ typedef struct _Eolian_Expression Eolian_Expression;
+ typedef struct _Eolian_Constant Eolian_Constant;
+ typedef struct _Eolian_Error Eolian_Error;
+ typedef struct _Eolian_Struct_Type_Field Eolian_Struct_Type_Field;
+ typedef struct _Eolian_Enum_Type_Field Eolian_Enum_Type_Field;
+ typedef struct _Eolian_Documentation Eolian_Documentation;
+ typedef struct _Eolian_Value Eolian_Value;
+ typedef struct _Eolian_Unit Eolian_Unit;
+
+ typedef void (*Eolian_Panic_Cb)(const Eolian_State *state, const char *msg);
+ typedef void (*Eolian_Error_Cb)(const Eolian_Object *obj, const char *msg, void *data);
+
+ typedef enum {
+ EOLIAN_OBJECT_UNKNOWN = 0,
+ EOLIAN_OBJECT_CLASS,
+ EOLIAN_OBJECT_TYPEDECL,
+ EOLIAN_OBJECT_STRUCT_FIELD,
+ EOLIAN_OBJECT_ENUM_FIELD,
+ EOLIAN_OBJECT_TYPE,
+ EOLIAN_OBJECT_CONSTANT,
+ EOLIAN_OBJECT_EXPRESSION,
+ EOLIAN_OBJECT_FUNCTION,
+ EOLIAN_OBJECT_FUNCTION_PARAMETER,
+ EOLIAN_OBJECT_EVENT,
+ EOLIAN_OBJECT_PART,
+ EOLIAN_OBJECT_IMPLEMENT,
+ EOLIAN_OBJECT_CONSTRUCTOR,
+ EOLIAN_OBJECT_DOCUMENTATION,
+ EOLIAN_OBJECT_ERROR
+ } Eolian_Object_Type;
+
+ typedef enum
+ {
+ EOLIAN_UNRESOLVED = 0,
+ EOLIAN_PROPERTY,
+ EOLIAN_PROP_SET,
+ EOLIAN_PROP_GET,
+ EOLIAN_METHOD,
+ EOLIAN_FUNCTION_POINTER
+ } Eolian_Function_Type;
+
+ typedef enum
+ {
+ EOLIAN_PARAMETER_UNKNOWN = 0,
+ EOLIAN_PARAMETER_IN,
+ EOLIAN_PARAMETER_OUT,
+ EOLIAN_PARAMETER_INOUT
+ } Eolian_Parameter_Direction;
+
+ typedef enum
+ {
+ EOLIAN_CLASS_UNKNOWN_TYPE = 0,
+ EOLIAN_CLASS_REGULAR,
+ EOLIAN_CLASS_ABSTRACT,
+ EOLIAN_CLASS_MIXIN,
+ EOLIAN_CLASS_INTERFACE
+ } Eolian_Class_Type;
+
+ typedef enum
+ {
+ EOLIAN_SCOPE_UNKNOWN = 0,
+ EOLIAN_SCOPE_PUBLIC,
+ EOLIAN_SCOPE_PRIVATE,
+ EOLIAN_SCOPE_PROTECTED
+ } Eolian_Object_Scope;
+
+ typedef enum {
+ EOLIAN_TYPEDECL_UNKNOWN = 0,
+ EOLIAN_TYPEDECL_STRUCT,
+ EOLIAN_TYPEDECL_STRUCT_OPAQUE,
+ EOLIAN_TYPEDECL_ENUM,
+ EOLIAN_TYPEDECL_ALIAS,
+ EOLIAN_TYPEDECL_FUNCTION_POINTER
+ } Eolian_Typedecl_Type;
+
+ typedef enum
+ {
+ EOLIAN_TYPE_UNKNOWN_TYPE = 0,
+ EOLIAN_TYPE_VOID,
+ EOLIAN_TYPE_REGULAR,
+ EOLIAN_TYPE_CLASS,
+ EOLIAN_TYPE_UNDEFINED
+ } Eolian_Type_Type;
+
+ typedef enum
+ {
+ EOLIAN_TYPE_BUILTIN_INVALID = 0,
+
+ EOLIAN_TYPE_BUILTIN_BYTE,
+ EOLIAN_TYPE_BUILTIN_UBYTE,
+ EOLIAN_TYPE_BUILTIN_CHAR,
+ EOLIAN_TYPE_BUILTIN_SHORT,
+ EOLIAN_TYPE_BUILTIN_USHORT,
+ EOLIAN_TYPE_BUILTIN_INT,
+ EOLIAN_TYPE_BUILTIN_UINT,
+ EOLIAN_TYPE_BUILTIN_LONG,
+ EOLIAN_TYPE_BUILTIN_ULONG,
+ EOLIAN_TYPE_BUILTIN_LLONG,
+ EOLIAN_TYPE_BUILTIN_ULLONG,
+
+ EOLIAN_TYPE_BUILTIN_INT8,
+ EOLIAN_TYPE_BUILTIN_UINT8,
+ EOLIAN_TYPE_BUILTIN_INT16,
+ EOLIAN_TYPE_BUILTIN_UINT16,
+ EOLIAN_TYPE_BUILTIN_INT32,
+ EOLIAN_TYPE_BUILTIN_UINT32,
+ EOLIAN_TYPE_BUILTIN_INT64,
+ EOLIAN_TYPE_BUILTIN_UINT64,
+ EOLIAN_TYPE_BUILTIN_INT128,
+ EOLIAN_TYPE_BUILTIN_UINT128,
+
+ EOLIAN_TYPE_BUILTIN_SIZE,
+ EOLIAN_TYPE_BUILTIN_SSIZE,
+ EOLIAN_TYPE_BUILTIN_INTPTR,
+ EOLIAN_TYPE_BUILTIN_UINTPTR,
+ EOLIAN_TYPE_BUILTIN_PTRDIFF,
+
+ EOLIAN_TYPE_BUILTIN_TIME,
+
+ EOLIAN_TYPE_BUILTIN_FLOAT,
+ EOLIAN_TYPE_BUILTIN_DOUBLE,
+
+ EOLIAN_TYPE_BUILTIN_BOOL,
+
+ EOLIAN_TYPE_BUILTIN_SLICE,
+ EOLIAN_TYPE_BUILTIN_RW_SLICE,
+
+ EOLIAN_TYPE_BUILTIN_VOID,
+
+ EOLIAN_TYPE_BUILTIN_ACCESSOR,
+ EOLIAN_TYPE_BUILTIN_ARRAY,
+ EOLIAN_TYPE_BUILTIN_FUTURE,
+ EOLIAN_TYPE_BUILTIN_ITERATOR,
+ EOLIAN_TYPE_BUILTIN_LIST,
+
+ EOLIAN_TYPE_BUILTIN_ANY_VALUE,
+ EOLIAN_TYPE_BUILTIN_ANY_VALUE_REF,
+ EOLIAN_TYPE_BUILTIN_BINBUF,
+ EOLIAN_TYPE_BUILTIN_EVENT,
+ EOLIAN_TYPE_BUILTIN_MSTRING,
+ EOLIAN_TYPE_BUILTIN_STRING,
+ EOLIAN_TYPE_BUILTIN_STRINGSHARE,
+ EOLIAN_TYPE_BUILTIN_STRBUF,
+
+ EOLIAN_TYPE_BUILTIN_HASH,
+ EOLIAN_TYPE_BUILTIN_VOID_PTR
+ } Eolian_Type_Builtin_Type;
+
+ typedef enum {
+ EOLIAN_EXPR_UNKNOWN = 0,
+ EOLIAN_EXPR_INT,
+ EOLIAN_EXPR_UINT,
+ EOLIAN_EXPR_LONG,
+ EOLIAN_EXPR_ULONG,
+ EOLIAN_EXPR_LLONG,
+ EOLIAN_EXPR_ULLONG,
+ EOLIAN_EXPR_FLOAT,
+ EOLIAN_EXPR_DOUBLE,
+ EOLIAN_EXPR_STRING,
+ EOLIAN_EXPR_CHAR,
+ EOLIAN_EXPR_NULL,
+ EOLIAN_EXPR_BOOL,
+ EOLIAN_EXPR_NAME,
+ EOLIAN_EXPR_UNARY,
+ EOLIAN_EXPR_BINARY
+ } Eolian_Expression_Type;
+
+ typedef enum {
+ EOLIAN_MASK_SINT = 1 << 0,
+ EOLIAN_MASK_UINT = 1 << 1,
+ EOLIAN_MASK_INT = EOLIAN_MASK_SINT | EOLIAN_MASK_UINT,
+ EOLIAN_MASK_FLOAT = 1 << 2,
+ EOLIAN_MASK_BOOL = 1 << 3,
+ EOLIAN_MASK_STRING = 1 << 4,
+ EOLIAN_MASK_CHAR = 1 << 5,
+ EOLIAN_MASK_NULL = 1 << 6,
+ EOLIAN_MASK_SIGNED = EOLIAN_MASK_SINT | EOLIAN_MASK_FLOAT,
+ EOLIAN_MASK_NUMBER = EOLIAN_MASK_INT | EOLIAN_MASK_FLOAT,
+ EOLIAN_MASK_ALL = EOLIAN_MASK_NUMBER | EOLIAN_MASK_BOOL
+ | EOLIAN_MASK_STRING | EOLIAN_MASK_CHAR
+ | EOLIAN_MASK_NULL
+ } Eolian_Expression_Mask;
+
+ typedef union {
+ char c;
+ Eina_Bool b;
+ const char *s;
+ signed int i;
+ unsigned int u;
+ signed long l;
+ unsigned long ul;
+ signed long long ll;
+ unsigned long long ull;
+ float f;
+ double d;
+ } Eolian_Value_Union;
+
+ typedef struct _Eolian_Value_t {
+ Eolian_Expression_Type type;
+ Eolian_Value_Union value;
+ } Eolian_Value_t;
+
+ typedef enum {
+ EOLIAN_BINOP_INVALID = 0,
+
+ EOLIAN_BINOP_ADD, /* + int, float */
+ EOLIAN_BINOP_SUB, /* - int, float */
+ EOLIAN_BINOP_MUL, /* * int, float */
+ EOLIAN_BINOP_DIV, /* / int, float */
+ EOLIAN_BINOP_MOD, /* % int */
+
+ EOLIAN_BINOP_EQ, /* == all types */
+ EOLIAN_BINOP_NQ, /* != all types */
+ EOLIAN_BINOP_GT, /* > int, float */
+ EOLIAN_BINOP_LT, /* < int, float */
+ EOLIAN_BINOP_GE, /* >= int, float */
+ EOLIAN_BINOP_LE, /* <= int, float */
+
+ EOLIAN_BINOP_AND, /* && all types */
+ EOLIAN_BINOP_OR, /* || all types */
+
+ EOLIAN_BINOP_BAND, /* & int */
+ EOLIAN_BINOP_BOR, /* | int */
+ EOLIAN_BINOP_BXOR, /* ^ int */
+ EOLIAN_BINOP_LSH, /* << int */
+ EOLIAN_BINOP_RSH /* >> int */
+ } Eolian_Binary_Operator;
+
+ typedef enum {
+ EOLIAN_UNOP_INVALID = 0,
+
+ EOLIAN_UNOP_UNM, /* - sint */
+ EOLIAN_UNOP_UNP, /* + sint */
+
+ EOLIAN_UNOP_NOT, /* ! int, float, bool */
+ EOLIAN_UNOP_BNOT, /* ~ int */
+ } Eolian_Unary_Operator;
+
+ typedef enum {
+ EOLIAN_DOC_TOKEN_UNKNOWN = 0,
+ EOLIAN_DOC_TOKEN_TEXT,
+ EOLIAN_DOC_TOKEN_REF,
+ EOLIAN_DOC_TOKEN_MARK_NOTE,
+ EOLIAN_DOC_TOKEN_MARK_WARNING,
+ EOLIAN_DOC_TOKEN_MARK_REMARK,
+ EOLIAN_DOC_TOKEN_MARK_TODO,
+ EOLIAN_DOC_TOKEN_MARKUP_MONOSPACE
+ } Eolian_Doc_Token_Type;
+
+ typedef struct _Eolian_Doc_Token {
+ Eolian_Doc_Token_Type type;
+ const char *text;
+ const char *text_end;
+ } Eolian_Doc_Token;
+
+ void *malloc(size_t sz);
+ void free(void *ptr);
+
+ int eolian_init(void);
+ int eolian_shutdown(void);
+ unsigned short eolian_file_format_version_get(void);
+ Eolian_State *eolian_state_new(void);
+ void eolian_state_free(Eolian_State *state);
+ Eolian_Panic_Cb eolian_state_panic_cb_set(Eolian_State *state, Eolian_Panic_Cb cb);
+ Eolian_Error_Cb eolian_state_error_cb_set(Eolian_State *state, Eolian_Error_Cb cb);
+ void *eolian_state_error_data_set(Eolian_State *state, void *data);
+ Eolian_Object_Type eolian_object_type_get(const Eolian_Object *obj);
+ const Eolian_Unit *eolian_object_unit_get(const Eolian_Object *obj);
+ const char *eolian_object_file_get(const Eolian_Object *obj);
+ int eolian_object_line_get(const Eolian_Object *obj);
+ int eolian_object_column_get(const Eolian_Object *obj);
+ const char *eolian_object_name_get(const Eolian_Object *obj);
+ const char *eolian_object_c_name_get(const Eolian_Object *obj);
+ const char *eolian_object_short_name_get(const Eolian_Object *obj);
+ Eina_Iterator *eolian_object_namespaces_get(const Eolian_Object *obj);
+ Eina_Bool eolian_object_is_beta(const Eolian_Object *obj);
+ Eina_Bool eolian_state_directory_add(Eolian_State *state, const char *dir);
+ Eina_Bool eolian_state_system_directory_add(Eolian_State *state);
+ Eina_Iterator *eolian_state_eo_file_paths_get(const Eolian_State *state);
+ Eina_Iterator *eolian_state_eot_file_paths_get(const Eolian_State *state);
+ Eina_Iterator *eolian_state_eo_files_get(const Eolian_State *state);
+ Eina_Iterator *eolian_state_eot_files_get(const Eolian_State *state);
+ const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filename);
+ const Eolian_Unit *eolian_state_file_path_parse(Eolian_State *state, const char *filepath);
+ Eina_Bool eolian_state_all_eo_files_parse(Eolian_State *state);
+ Eina_Bool eolian_state_all_eot_files_parse(Eolian_State *state);
+ Eina_Bool eolian_state_check(const Eolian_State *state);
+ const Eolian_Unit *eolian_state_unit_by_file_get(const Eolian_State *state, const char *file_name);
+ Eina_Iterator *eolian_state_units_get(const Eolian_State *state);
+
+ const Eolian_State *eolian_unit_state_get(const Eolian_Unit *unit);
+ Eina_Iterator *eolian_unit_children_get(const Eolian_Unit *unit);
+ const char *eolian_unit_file_get(const Eolian_Unit *unit);
+ const char *eolian_unit_file_path_get(const Eolian_Unit *unit);
+ unsigned short eolian_unit_version_get(const Eolian_Unit *unit);
+ const Eolian_Object *eolian_unit_object_by_name_get(const Eolian_Unit *unit, const char *name);
+ Eina_Iterator *eolian_unit_objects_get(const Eolian_Unit *unit);
+ const Eolian_Class *eolian_unit_class_by_name_get(const Eolian_Unit *unit, const char *class_name);
+ Eina_Iterator *eolian_unit_classes_get(const Eolian_Unit *unit);
+ const Eolian_Constant *eolian_unit_constant_by_name_get(const Eolian_Unit *unit, const char *name);
+ const Eolian_Error *eolian_unit_error_by_name_get(const Eolian_Unit *unit, const char *name);
+ Eina_Iterator *eolian_unit_constants_get(const Eolian_Unit *unit);
+ Eina_Iterator *eolian_unit_errors_get(const Eolian_Unit *unit);
+ const Eolian_Typedecl *eolian_unit_alias_by_name_get(const Eolian_Unit *unit, const char *name);
+ const Eolian_Typedecl *eolian_unit_struct_by_name_get(const Eolian_Unit *unit, const char *name);
+ const Eolian_Typedecl *eolian_unit_enum_by_name_get(const Eolian_Unit *unit, const char *name);
+ Eina_Iterator *eolian_unit_aliases_get(const Eolian_Unit *unit);
+ Eina_Iterator *eolian_unit_structs_get(const Eolian_Unit *unit);
+ Eina_Iterator *eolian_unit_enums_get(const Eolian_Unit *unit);
+ Eina_Iterator *eolian_state_objects_by_file_get(const Eolian_State *state, const char *file_name);
+ const Eolian_Class *eolian_state_class_by_file_get(const Eolian_State *state, const char *file_name);
+ Eina_Iterator *eolian_state_constants_by_file_get(const Eolian_State *state, const char *file_name);
+ Eina_Iterator *eolian_state_errors_by_file_get(const Eolian_State *state, const char *file_name);
+ Eina_Iterator *eolian_state_aliases_by_file_get(const Eolian_State *state, const char *file_name);
+ Eina_Iterator *eolian_state_structs_by_file_get(const Eolian_State *state, const char *file_name);
+ Eina_Iterator *eolian_state_enums_by_file_get(const Eolian_State *state, const char *file_name);
+
+ Eolian_Class_Type eolian_class_type_get(const Eolian_Class *klass);
+ const Eolian_Documentation *eolian_class_documentation_get(const Eolian_Class *klass);
+ const char *eolian_class_c_prefix_get(const Eolian_Class *klass);
+ const char *eolian_class_event_c_prefix_get(const Eolian_Class *klass);
+ const char *eolian_class_data_type_get(const Eolian_Class *klass);
+ const Eolian_Class *eolian_class_parent_get(const Eolian_Class *klass);
+ Eina_Iterator *eolian_class_requires_get(const Eolian_Class *klass);
+ Eina_Iterator *eolian_class_extensions_get(const Eolian_Class *klass);
+ Eina_Iterator *eolian_class_functions_get(const Eolian_Class *klass, Eolian_Function_Type func_type);
+ Eolian_Function_Type eolian_function_type_get(const Eolian_Function *function_id);
+ Eolian_Object_Scope eolian_function_scope_get(const Eolian_Function *function_id, Eolian_Function_Type ftype);
+ const char *eolian_function_full_c_name_get(const Eolian_Function *function_id, Eolian_Function_Type ftype);
+ const Eolian_Function *eolian_class_function_by_name_get(const Eolian_Class *klass, const char *func_name, Eolian_Function_Type f_type);
+ const Eolian_Implement *eolian_function_implement_get(const Eolian_Function *function_id);
+ Eina_Bool eolian_function_is_static(const Eolian_Function *function_id);
+ Eina_Bool eolian_function_is_constructor(const Eolian_Function *function_id, const Eolian_Class *klass);
+ Eina_Bool eolian_function_is_function_pointer(const Eolian_Function *function_id);
+ Eina_Iterator *eolian_property_keys_get(const Eolian_Function *foo_id, Eolian_Function_Type ftype);
+ Eina_Iterator *eolian_property_values_get(const Eolian_Function *foo_id, Eolian_Function_Type ftype);
+ Eina_Iterator *eolian_function_parameters_get(const Eolian_Function *function_id);
+ Eolian_Parameter_Direction eolian_parameter_direction_get(const Eolian_Function_Parameter *param);
+ const Eolian_Type *eolian_parameter_type_get(const Eolian_Function_Parameter *param);
+ const Eolian_Expression *eolian_parameter_default_value_get(const Eolian_Function_Parameter *param);
+ const Eolian_Documentation *eolian_parameter_documentation_get(const Eolian_Function_Parameter *param);
+ Eina_Bool eolian_parameter_is_optional(const Eolian_Function_Parameter *param_desc);
+ Eina_Bool eolian_parameter_is_by_ref(const Eolian_Function_Parameter *param_desc);
+ Eina_Bool eolian_parameter_is_move(const Eolian_Function_Parameter *param_desc);
+ const Eolian_Type *eolian_function_return_type_get(const Eolian_Function *function_id, Eolian_Function_Type ftype);
+ const Eolian_Expression *eolian_function_return_default_value_get(const Eolian_Function *foo_id, Eolian_Function_Type ftype);
+ const Eolian_Documentation *eolian_function_return_documentation_get(const Eolian_Function *foo_id, Eolian_Function_Type ftype);
+ Eina_Bool eolian_function_return_allow_unused(const Eolian_Function *foo_id, Eolian_Function_Type ftype);
+ Eina_Bool eolian_function_return_is_by_ref(const Eolian_Function *foo_id, Eolian_Function_Type ftype);
+ Eina_Bool eolian_function_return_is_move(const Eolian_Function *foo_id, Eolian_Function_Type ftype);
+ Eina_Bool eolian_function_object_is_const(const Eolian_Function *function_id);
+ const Eolian_Class *eolian_function_class_get(const Eolian_Function *function_id);
+ const Eolian_Class *eolian_implement_class_get(const Eolian_Implement *impl);
+ const Eolian_Class *eolian_implement_implementing_class_get(const Eolian_Implement *impl);
+ const Eolian_Function *eolian_implement_function_get(const Eolian_Implement *impl, Eolian_Function_Type *func_type);
+ const Eolian_Documentation *eolian_implement_documentation_get(const Eolian_Implement *impl, Eolian_Function_Type f_type);
+ Eina_Bool eolian_implement_is_auto(const Eolian_Implement *impl, Eolian_Function_Type ftype);
+ Eina_Bool eolian_implement_is_empty(const Eolian_Implement *impl, Eolian_Function_Type ftype);
+ Eina_Bool eolian_implement_is_pure_virtual(const Eolian_Implement *impl, Eolian_Function_Type ftype);
+ Eina_Bool eolian_implement_is_prop_get(const Eolian_Implement *impl);
+ Eina_Bool eolian_implement_is_prop_set(const Eolian_Implement *impl);
+ Eina_Iterator *eolian_class_implements_get(const Eolian_Class *klass);
+ const Eolian_Class *eolian_constructor_class_get(const Eolian_Constructor *ctor);
+ const Eolian_Function *eolian_constructor_function_get(const Eolian_Constructor *ctor);
+ Eina_Bool eolian_constructor_is_optional(const Eolian_Constructor *ctor);
+ Eina_Iterator *eolian_class_constructors_get(const Eolian_Class *klass);
+ Eina_Iterator *eolian_class_events_get(const Eolian_Class *klass);
+ const Eolian_Type *eolian_event_type_get(const Eolian_Event *event);
+ const Eolian_Class *eolian_event_class_get(const Eolian_Event *event);
+ const Eolian_Documentation *eolian_event_documentation_get(const Eolian_Event *event);
+ Eolian_Object_Scope eolian_event_scope_get(const Eolian_Event *event);
+ Eina_Bool eolian_event_is_hot(const Eolian_Event *event);
+ Eina_Bool eolian_event_is_restart(const Eolian_Event *event);
+ Eina_Iterator *eolian_class_parts_get(const Eolian_Class *klass);
+ const char *eolian_event_c_macro_get(const Eolian_Event *event);
+ const Eolian_Class *eolian_part_class_get(const Eolian_Part *part);
+ const Eolian_Documentation *eolian_part_documentation_get(const Eolian_Part *part);
+ const Eolian_Event *eolian_class_event_by_name_get(const Eolian_Class *klass, const char *event_name);
+ Eina_Bool eolian_class_ctor_enable_get(const Eolian_Class *klass);
+ Eina_Bool eolian_class_dtor_enable_get(const Eolian_Class *klass);
+ const char *eolian_class_c_get_function_name_get(const Eolian_Class *klass);
+ Eolian_Type_Type eolian_type_type_get(const Eolian_Type *tp);
+ Eolian_Type_Builtin_Type eolian_type_builtin_type_get(const Eolian_Type *tp);
+ const char *eolian_class_c_macro_get(const Eolian_Class *klass);
+ const char *eolian_class_c_data_type_get(const Eolian_Class *klass);
+ Eolian_Typedecl_Type eolian_typedecl_type_get(const Eolian_Typedecl *tp);
+ Eina_Iterator *eolian_typedecl_struct_fields_get(const Eolian_Typedecl *tp);
+ const Eolian_Struct_Type_Field *eolian_typedecl_struct_field_get(const Eolian_Typedecl *tp, const char *field);
+ const Eolian_Documentation *eolian_typedecl_struct_field_documentation_get(const Eolian_Struct_Type_Field *fl);
+ const Eolian_Type *eolian_typedecl_struct_field_type_get(const Eolian_Struct_Type_Field *fl);
+ Eina_Bool eolian_typedecl_struct_field_is_by_ref(const Eolian_Struct_Type_Field *fl);
+ Eina_Bool eolian_typedecl_struct_field_is_move(const Eolian_Struct_Type_Field *fl);
+ Eina_Iterator *eolian_typedecl_enum_fields_get(const Eolian_Typedecl *tp);
+ const Eolian_Enum_Type_Field *eolian_typedecl_enum_field_get(const Eolian_Typedecl *tp, const char *field);
+ const char *eolian_typedecl_enum_field_c_constant_get(const Eolian_Enum_Type_Field *fl);
+ const Eolian_Documentation *eolian_typedecl_enum_field_documentation_get(const Eolian_Enum_Type_Field *fl);
+ const Eolian_Expression *eolian_typedecl_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force);
+
+ const char *eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typedecl *tp);
+ const Eolian_Documentation *eolian_typedecl_documentation_get(const Eolian_Typedecl *tp);
+
+ const Eolian_Type *eolian_type_base_type_get(const Eolian_Type *tp);
+ const Eolian_Type *eolian_type_next_type_get(const Eolian_Type *tp);
+ const Eolian_Type *eolian_typedecl_base_type_get(const Eolian_Typedecl *tp);
+ const Eolian_Typedecl *eolian_type_typedecl_get(const Eolian_Type *tp);
+
+ const Eolian_Type *eolian_type_aliased_base_get(const Eolian_Type *tp);
+ const Eolian_Type *eolian_typedecl_aliased_base_get(const Eolian_Typedecl *tp);
+
+ const Eolian_Class *eolian_type_class_get(const Eolian_Type *tp);
+ const Eolian_Error *eolian_type_error_get(const Eolian_Type *tp);
+ Eina_Bool eolian_type_is_move(const Eolian_Type *tp);
+ Eina_Bool eolian_type_is_const(const Eolian_Type *tp);
+ Eina_Bool eolian_type_is_ptr(const Eolian_Type *tp);
+
+ Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp);
+
+ const char *eolian_type_c_type_get(const Eolian_Type *tp);
+ const char *eolian_typedecl_c_type_get(const Eolian_Typedecl *tp);
+ const char *eolian_typedecl_free_func_get(const Eolian_Typedecl *tp);
+
+ const Eolian_Function *eolian_typedecl_function_pointer_get(const Eolian_Typedecl *tp);
+
+ Eina_Bool eolian_expression_eval_fill(const Eolian_Expression *expr, Eolian_Expression_Mask m, Eolian_Value_t *val);
+ const char *eolian_expression_value_to_literal(const Eolian_Value *v);
+ const char *eolian_expression_serialize(const Eolian_Expression *expr);
+ Eolian_Expression_Type eolian_expression_type_get(const Eolian_Expression *expr);
+ Eolian_Binary_Operator eolian_expression_binary_operator_get(const Eolian_Expression *expr);
+ const Eolian_Expression *eolian_expression_binary_lhs_get(const Eolian_Expression *expr);
+ const Eolian_Expression *eolian_expression_binary_rhs_get(const Eolian_Expression *expr);
+ Eolian_Unary_Operator eolian_expression_unary_operator_get(const Eolian_Expression *expr);
+ const Eolian_Expression *eolian_expression_unary_expression_get(const Eolian_Expression *expr);
+ Eina_Bool eolian_expression_value_get_fill(const Eolian_Expression *expr, Eolian_Value_t *val);
+ const Eolian_Documentation *eolian_constant_documentation_get(const Eolian_Constant *var);
+ const Eolian_Type *eolian_constant_type_get(const Eolian_Constant *var);
+ const Eolian_Expression *eolian_constant_value_get(const Eolian_Constant *var);
+ Eina_Bool eolian_constant_is_extern(const Eolian_Constant *var);
+ const char *eolian_documentation_summary_get(const Eolian_Documentation *doc);
+ const char *eolian_documentation_description_get(const Eolian_Documentation *doc);
+ const char *eolian_documentation_since_get(const Eolian_Documentation *doc);
+
+ const char *eolian_documentation_tokenize(const char *doc, Eolian_Doc_Token *ret);
+ void eolian_doc_token_init(Eolian_Doc_Token *tok);
+ Eolian_Doc_Token_Type eolian_doc_token_type_get(const Eolian_Doc_Token *tok);
+ char *eolian_doc_token_text_get(const Eolian_Doc_Token *tok);
+ Eolian_Object_Type eolian_doc_token_ref_resolve(const Eolian_Doc_Token *tok, const Eolian_State *state, const Eolian_Object **data, const Eolian_Object **data2);
+
+ const char *eolian_error_message_get(const Eolian_Error *err);
+ const Eolian_Documentation *eolian_error_documentation_get(const Eolian_Error *err);
+ Eina_Bool eolian_error_is_extern(const Eolian_Error *err);
+]]
+
+local cutil = require("cutil")
+local util = require("util")
+
+local tonum = ffi.tonumber or tonumber
+
+local iterator = require("eina.iterator")
+
+local Ptr_Iterator = iterator.Ptr_Iterator
+
+local M = {}
+
+local eolian
+local eina
+
+local init = function()
+ eolian = util.lib_load("eolian")
+ eina = util.lib_load("eina")
+ eolian.eolian_init()
+ M.file_format_version = eolian.eolian_file_format_version_get()
+end
+
+local shutdown = function()
+ eolian.eolian_shutdown()
+ util.lib_unload("eolian")
+ util.lib_unload("eina")
+end
+
+local ffi_stringshare = function(s)
+ local r = ffi.string(s)
+ eina.eina_stringshare_del(s)
+ return r
+end
+
+cutil.init_module(init, shutdown)
+
+M.object_type = {
+ UNKNOWN = 0,
+ CLASS = 1,
+ TYPEDECL = 2,
+ STRUCT_FIELD = 3,
+ ENUM_FIELD = 4,
+ TYPE = 5,
+ CONSTANT = 6,
+ EXPRESSION = 7,
+ FUNCTION = 8,
+ FUNCTION_PARAMETER = 9,
+ EVENT = 10,
+ PART = 11,
+ IMPLEMENT = 12,
+ CONSTRUCTOR = 13,
+ DOCUMENTATION = 14,
+ ERROR = 15
+}
+
+M.object_scope = {
+ UNKNOWN = 0,
+ PUBLIC = 1,
+ PRIVATE = 2,
+ PROTECTED = 3
+}
+
+local cast_obj = function(self)
+ return ffi.cast("const Eolian_Object *", self)
+end
+
+local cast_unit = function(self)
+ return ffi.cast("const Eolian_Unit *", self)
+end
+
+local gen_wrap = function(t)
+ return t, function(tt)
+ return setmetatable(tt, { __index = t })
+ end
+end
+
+local object_idx, wrap_object = gen_wrap {
+ object_get = function(self)
+ return cast_obj(self)
+ end,
+
+ type_get = function(self)
+ return tonum(eolian.eolian_object_type_get(cast_obj(self)))
+ end,
+
+ unit_get = function(self)
+ local v = eolian.eolian_object_unit_get(cast_obj(self))
+ if v == ffi.nullptr then
+ return nil
+ end
+ return v
+ end,
+
+ line_get = function(self)
+ return tonum(eolian.eolian_object_line_get(cast_obj(self)))
+ end,
+
+ column_get = function(self)
+ return tonum(eolian.eolian_object_column_get(cast_obj(self)))
+ end,
+
+ file_get = function(self)
+ local v = eolian.eolian_object_file_get(cast_obj(self))
+ if v == ffi.nullptr then
+ return nil
+ end
+ return ffi.string(v)
+ end,
+
+ name_get = function(self)
+ local v = eolian.eolian_object_name_get(cast_obj(self))
+ if v == ffi.nullptr then
+ return nil
+ end
+ return ffi.string(v)
+ end,
+
+ c_name_get = function(self)
+ local v = eolian.eolian_object_c_name_get(cast_obj(self))
+ if v == ffi.nullptr then
+ return nil
+ end
+ return ffi.string(v)
+ end,
+
+ short_name_get = function(self)
+ local v = eolian.eolian_object_short_name_get(cast_obj(self))
+ if v == ffi.nullptr then
+ return nil
+ end
+ return ffi.string(v)
+ end,
+
+ namespaces_get = function(self)
+ return iterator.String_Iterator(
+ eolian.eolian_object_namespaces_get(cast_obj(self)))
+ end,
+
+ is_beta = function(self)
+ return eolian.eolian_object_is_beta(cast_obj(self)) ~= 0
+ end
+}
+
+ffi.metatype("Eolian_Object", { __index = object_idx })
+
+local unit_idx, wrap_unit = gen_wrap {
+ state_get = function(self)
+ local v = eolian.eolian_unit_state_get(cast_unit(self))
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ children_get = function(self)
+ return Ptr_Iterator("const Eolian_Unit*",
+ eolian.eolian_unit_children_get(cast_unit(self)))
+ end,
+
+ file_get = function(self)
+ local v = eolian.eolian_unit_file_get(cast_unit(self))
+ if v == ffi.nullptr then return nil end
+ return ffi.string(v)
+ end,
+
+ file_path_get = function(self)
+ local v = eolian.eolian_unit_file_path_get(cast_unit(self))
+ if v == ffi.nullptr then return nil end
+ return ffi.string(v)
+ end,
+
+ version_get = function(self)
+ return tonum(eolian.eolian_unit_version_get(cast_unit(self)))
+ end,
+
+ object_by_name_get = function(self, name)
+ local v = eolian.eolian_unit_object_by_name_get(cast_unit(self), name)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ objects_get = function(self, fname)
+ return Ptr_Iterator("const Eolian_Object *",
+ eolian.eolian_unit_objects_get(cast_unit(self), fname))
+ end,
+
+ class_by_name_get = function(self, cname)
+ local v = eolian.eolian_unit_class_by_name_get(cast_unit(self), cname)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ classes_get = function(self)
+ return Ptr_Iterator("const Eolian_Class*",
+ eolian.eolian_unit_classes_get(cast_unit(self)))
+ end,
+
+ constant_by_name_get = function(self, name)
+ local v = eolian.eolian_unit_constant_by_name_get(cast_unit(self), name)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ error_by_name_get = function(self, name)
+ local v = eolian.eolian_unit_error_by_name_get(cast_unit(self), name)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ constants_get = function(self)
+ return Ptr_Iterator("const Eolian_Constant *",
+ eolian.eolian_unit_constants_get(cast_unit(self)))
+ end,
+
+ errors_get = function(self)
+ return Ptr_Iterator("const Eolian_Error *",
+ eolian.eolian_unit_errors_get(cast_unit(self)))
+ end,
+
+ alias_by_name_get = function(self, name)
+ local v = eolian.eolian_unit_alias_by_name_get(cast_unit(self), name)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ struct_by_name_get = function(self, name)
+ local v = eolian.eolian_unit_struct_by_name_get(cast_unit(self), name)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ enum_by_name_get = function(self, name)
+ local v = eolian.eolian_unit_enum_by_name_get(cast_unit(self), name)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ aliases_get = function(self)
+ return Ptr_Iterator("const Eolian_Typedecl *",
+ eolian.eolian_unit_aliases_get(cast_unit(self)))
+ end,
+
+ structs_get = function(self)
+ return Ptr_Iterator("const Eolian_Typedecl *",
+ eolian.eolian_unit_structs_get(cast_unit(self)))
+ end,
+
+ enums_get = function(self)
+ return Ptr_Iterator("const Eolian_Typedecl *",
+ eolian.eolian_unit_enums_get(cast_unit(self)))
+ end
+}
+
+ffi.metatype("Eolian_Unit", { __index = unit_idx })
+
+local panic_cbs = {}
+local error_cbs = {}
+
+local obj_to_idx = function(obj)
+ return tonum(ffi.cast("size_t", obj))
+end
+
+local panic_cb, err_cb
+
+panic_cb = ffi.gc(ffi.cast("Eolian_Panic_Cb", function(state, msg)
+ local pcb = panic_cbs[obj_to_idx(self)]
+ assert(pcb, "internal error: no prror cb")
+ pcb(state, ffi.string(msg))
+end), function(cb)
+ cb:free()
+end)
+
+err_cb = ffi.gc(ffi.cast("Eolian_Panic_Cb", function(obj, msg, data)
+ local ecb = error_cbs[obj_to_idx(self)]
+ assert(ecb, "internal error: no error cb")
+ ecb(obj, ffi.string(msg))
+end), function(cb)
+ cb:free()
+end)
+
+ffi.metatype("Eolian_State", {
+ __index = wrap_unit {
+ panic_cb_set = function(self, cb)
+ panic_cbs[obj_to_idx(self)] = cb
+ eolian.eolian_state_panic_cb_set(self, panic_cb)
+ end,
+
+ error_cb_set = function(self, cb)
+ error_cbs[obj_to_idx(self)] = cb
+ eolian.eolian_state_error_cb_set(self, err_cb)
+ end,
+
+ directory_add = function(self, dir)
+ return eolian.eolian_state_directory_add(self, dir) ~= 0
+ end,
+
+ system_directory_add = function(self)
+ return eolian.eolian_state_system_directory_add(self) ~= 0
+ end,
+
+ file_parse = function(self, fname)
+ local v = eolian.eolian_state_file_parse(self, fname)
+ if v == ffi.nullptr then
+ return nil
+ end
+ return v
+ end,
+
+ file_path_parse = function(self, fpath)
+ local v = eolian.eolian_state_file_path_parse(self, fpath)
+ if v == ffi.nullptr then
+ return nil
+ end
+ return v
+ end,
+
+ all_eo_files_parse = function(self)
+ return eolian.eolian_state_all_eo_files_parse(self) ~= 0
+ end,
+
+ all_eot_files_parse = function(self)
+ return eolian.eolian_state_all_eot_files_parse(self) ~= 0
+ end,
+
+ check = function(self)
+ return eolian.eolian_state_check(self) ~= 0
+ end,
+
+ eo_file_paths_get = function(self)
+ return iterator.String_Iterator(eolian.eolian_state_eo_file_paths_get(self))
+ end,
+
+ eot_file_paths_get = function(self)
+ return iterator.String_Iterator(eolian.eolian_state_eot_file_paths_get(self))
+ end,
+
+ eo_files_get = function(self)
+ return iterator.String_Iterator(eolian.eolian_state_eo_files_get(self))
+ end,
+
+ eot_files_get = function(self)
+ return iterator.String_Iterator(eolian.eolian_state_eot_files_get(self))
+ end,
+
+ unit_get = function(self)
+ return ffi.cast("Eolian_Unit *", self)
+ end,
+
+ unit_by_file_get = function(self, fname)
+ local v = eolian.eolian_state_unit_by_file_get(state, fname)
+ if v == ffi.nullptr then
+ return nil
+ end
+ return v
+ end,
+
+ units_get = function(self)
+ return Ptr_Iterator("const Eolian_Unit*",
+ eolian.eolian_state_units_get(self))
+ end,
+
+ objects_by_file_get = function(self, fname)
+ return Ptr_Iterator("const Eolian_Object *",
+ eolian.eolian_state_objects_by_file_get(self, fname))
+ end,
+
+ class_by_file_get = function(self, fname)
+ local v = eolian.eolian_state_class_by_file_get(self, fname)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ constants_by_file_get = function(unit, fname)
+ return Ptr_Iterator("const Eolian_Constant*",
+ eolian.eolian_state_constants_by_file_get(self, fname))
+ end,
+
+ errors_by_file_get = function(unit, fname)
+ return Ptr_Iterator("const Eolian_Error*",
+ eolian.eolian_state_errors_by_file_get(self, fname))
+ end,
+
+ aliases_by_file_get = function(self, fname)
+ return Ptr_Iterator("const Eolian_Typedecl *",
+ eolian.eolian_state_aliases_by_file_get(self, fname))
+ end,
+
+ structs_by_file_get = function(self, fname)
+ return Ptr_Iterator("const Eolian_Typedecl *",
+ eolian.eolian_state_structs_by_file_get(self, fname))
+ end,
+
+ enums_by_file_get = function(self, fname)
+ return Ptr_Iterator("const Eolian_Typedecl *",
+ eolian.eolian_state_enums_by_file_get(self, fname))
+ end
+ },
+ __gc = function(self)
+ local idx = obj_to_idx(self)
+ panic_cbs[idx] = nil
+ error_cbs[idx] = nil
+ eolian.eolian_state_free(self)
+ end
+})
+
+M.new = function()
+ return eolian.eolian_state_new()
+end
+
+M.type_type = {
+ UNKNOWN = 0,
+ VOID = 1,
+ REGULAR = 2,
+ CLASS = 3,
+ ERROR = 4,
+ UNDEFINED = 5
+}
+
+M.type_builtin_type = {
+ INVALID = 0,
+
+ BYTE = 1,
+ UBYTE = 2,
+ CHAR = 3,
+ SHORT = 4,
+ USHORT = 5,
+ INT = 6,
+ UINT = 7,
+ LONG = 8,
+ ULONG = 9,
+ LLONG = 10,
+ ULLONG = 11,
+
+ INT8 = 12,
+ UINT8 = 13,
+ INT16 = 14,
+ UINT16 = 15,
+ INT32 = 16,
+ UINT32 = 17,
+ INT64 = 18,
+ UINT64 = 19,
+ INT128 = 20,
+ UINT128 = 21,
+
+ SIZE = 22,
+ SSIZE = 23,
+ INTPTR = 24,
+ UINTPTR = 25,
+ PTRDIFF = 26,
+
+ TIME = 27,
+
+ FLOAT = 28,
+ DOUBLE = 29,
+
+ BOOL = 30,
+
+ SLICE = 31,
+ RW_SLICE = 32,
+
+ VOID = 33,
+
+ ACCESSOR = 34,
+ ARRAY = 35,
+ FUTURE = 36,
+ ITERATOR = 37,
+ LIST = 38,
+
+ ANY_VALUE = 39,
+ ANY_VALUE_REF = 40,
+ BINBUF = 41,
+ EVENT = 42,
+ MSTRING = 43,
+ STRING = 44,
+ STRINGSHARE = 45,
+ STRBUF = 46,
+
+ HASH = 47,
+ VOID_PTR = 48
+}
+
+M.typedecl_type = {
+ UNKNOWN = 0,
+ STRUCT = 1,
+ STRUCT_OPAQUE = 2,
+ ENUM = 3,
+ ALIAS = 4,
+ FUNCTION_POINTER = 5
+}
+
+ffi.metatype("Eolian_Struct_Type_Field", {
+ __index = wrap_object {
+ documentation_get = function(self)
+ local v = eolian.eolian_typedecl_struct_field_documentation_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ type_get = function(self)
+ local v = eolian.eolian_typedecl_struct_field_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ is_by_ref = function(self)
+ return eolian.eolian_typedecl_struct_field_is_by_ref(self) ~= 0
+ end,
+
+ is_move = function(self)
+ return eolian.eolian_typedecl_struct_field_is_move(self) ~= 0
+ end
+ }
+})
+
+ffi.metatype("Eolian_Enum_Type_Field", {
+ __index = wrap_object {
+ c_name_get = function(self)
+ local v = eolian.eolian_typedecl_enum_field_c_constant_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end,
+
+ documentation_get = function(self)
+ local v = eolian.eolian_typedecl_enum_field_documentation_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ value_get = function(self, force)
+ local v = eolian.eolian_typedecl_enum_field_value_get(self, force and 1 or 0)
+ if v == ffi.nullptr then return nil end
+ return v
+ end
+ }
+})
+
+M.Typedecl = ffi.metatype("Eolian_Typedecl", {
+ __index = wrap_object {
+ type_get = function(self)
+ return tonum(eolian.eolian_typedecl_type_get(self))
+ end,
+
+ struct_fields_get = function(self)
+ return Ptr_Iterator("const Eolian_Struct_Type_Field*",
+ eolian.eolian_typedecl_struct_fields_get(self))
+ end,
+
+ struct_field_get = function(self, name)
+ local v = eolian.eolian_typedecl_struct_field_get(self, name)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ enum_fields_get = function(self)
+ return Ptr_Iterator("const Eolian_Enum_Type_Field*",
+ eolian.eolian_typedecl_enum_fields_get(self))
+ end,
+
+ enum_field_get = function(self, field)
+ local v = eolian.eolian_typedecl_enum_field_get(self, field)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ enum_legacy_prefix_get = function(self)
+ local v = eolian.eolian_typedecl_enum_legacy_prefix_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi.string(v)
+ end,
+
+ documentation_get = function(self, name)
+ local v = eolian.eolian_typedecl_documentation_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ base_type_get = function(self)
+ local v = eolian.eolian_typedecl_base_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ aliased_base_get = function(self)
+ local v = eolian.eolian_typedecl_aliased_byse_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ is_extern = function(self)
+ return eolian.eolian_typedecl_is_extern(self) ~= 0
+ end,
+
+ c_type_get = function(self)
+ local v = eolian.eolian_typedecl_c_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end,
+
+ free_func_get = function(self)
+ local v = eolian.eolian_typedecl_free_func_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi.string(v)
+ end,
+
+ function_pointer_get = function(self)
+ local v = eolian.eolian_typedecl_function_pointer_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end
+ }
+})
+
+M.Type = ffi.metatype("Eolian_Type", {
+ __index = wrap_object {
+ type_get = function(self)
+ return tonum(eolian.eolian_type_type_get(self))
+ end,
+
+ builtin_type_get = function(self)
+ return tonum(eolian.eolian_type_builtin_type_get(self))
+ end,
+
+ base_type_get = function(self)
+ local v = eolian.eolian_type_base_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ next_type_get = function(self)
+ local v = eolian.eolian_type_next_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ typedecl_get = function(self)
+ local v = eolian.eolian_type_typedecl_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ aliased_base_get = function(self)
+ local v = eolian.eolian_type_aliased_byse_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ class_get = function(self)
+ local v = eolian.eolian_type_class_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ error_get = function(self)
+ local v = eolian.eolian_type_error_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ is_move = function(self)
+ return eolian.eolian_type_is_move(self) ~= 0
+ end,
+
+ is_const = function(self)
+ return eolian.eolian_type_is_const(self) ~= 0
+ end,
+
+ is_ptr = function(self)
+ return eolian.eolian_type_is_ptr(self) ~= 0
+ end,
+
+ c_type_get = function(self)
+ local v = eolian.eolian_type_c_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end
+ }
+})
+
+M.function_type = {
+ UNRESOLVED = 0,
+ PROPERTY = 1,
+ PROP_SET = 2,
+ PROP_GET = 3,
+ METHOD = 4,
+ FUNCTION_POINTER = 5
+}
+
+M.Function = ffi.metatype("Eolian_Function", {
+ __index = wrap_object {
+ type_get = function(self)
+ return tonum(eolian.eolian_function_type_get(self))
+ end,
+
+ scope_get = function(self, ftype)
+ return tonum(eolian.eolian_function_scope_get(self, ftype))
+ end,
+
+ full_c_name_get = function(self, ftype)
+ local v = eolian.eolian_function_full_c_name_get(self, ftype)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end,
+
+ implement_get = function(self)
+ local v = eolian.eolian_function_implement_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ is_static = function(self)
+ return eolian.eolian_function_is_static(self) ~= 0
+ end,
+
+ is_constructor = function(self, klass)
+ return eolian.eolian_function_is_constructor(self, klass) ~= 0
+ end,
+
+ is_function_pointer = function(self)
+ return eolian.eolian_function_is_function_pointer(self) ~= 0
+ end,
+
+ property_keys_get = function(self, ftype)
+ return Ptr_Iterator("const Eolian_Function_Parameter*",
+ eolian.eolian_property_keys_get(self, ftype))
+ end,
+
+ property_values_get = function(self, ftype)
+ return Ptr_Iterator("const Eolian_Function_Parameter*",
+ eolian.eolian_property_values_get(self, ftype))
+ end,
+
+ parameters_get = function(self)
+ return Ptr_Iterator("const Eolian_Function_Parameter*",
+ eolian.eolian_function_parameters_get(self))
+ end,
+
+ return_type_get = function(self, ftype)
+ local v = eolian.eolian_function_return_type_get(self, ftype)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ return_default_value_get = function(self, ftype)
+ local v = eolian.eolian_function_return_default_value_get(self, ftype)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ return_documentation_get = function(self, ftype)
+ local v = eolian.eolian_function_return_documentation_get(self, ftype)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ return_allow_unused = function(self, ftype)
+ return eolian.eolian_function_return_allow_unused(self,
+ ftype) ~= 0
+ end,
+
+ return_is_by_ref = function(self, ftype)
+ return eolian.eolian_function_return_is_by_ref(self, ftype) ~= 0
+ end,
+
+ return_is_move = function(self, ftype)
+ return eolian.eolian_function_return_is_move(self, ftype) ~= 0
+ end,
+
+ is_const = function(self)
+ return eolian.eolian_function_object_is_const(self) ~= 0
+ end,
+
+ class_get = function(self)
+ local v = eolian.eolian_function_class_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end
+ }
+})
+
+M.parameter_dir = {
+ UNKNOWN = 0,
+ IN = 1,
+ OUT = 2,
+ INOUT = 3
+}
+
+ffi.metatype("Eolian_Function_Parameter", {
+ __index = wrap_object {
+ direction_get = function(self)
+ return tonum(eolian.eolian_parameter_direction_get(self))
+ end,
+
+ type_get = function(self)
+ local v = eolian.eolian_parameter_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ default_value_get = function(self)
+ local v = eolian.eolian_parameter_default_value_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ documentation_get = function(self)
+ local v = eolian.eolian_parameter_documentation_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ is_optional = function(self)
+ return eolian.eolian_parameter_is_optional(self) ~= 0
+ end,
+
+ is_by_ref = function(self)
+ return eolian.eolian_parameter_is_by_ref(self) ~= 0
+ end,
+
+ is_move = function(self)
+ return eolian.eolian_parameter_is_move(self) ~= 0
+ end
+ }
+})
+
+ffi.metatype("Eolian_Implement", {
+ __index = wrap_object {
+ class_get = function(self)
+ local v = eolian.eolian_implement_class_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ implementing_class_get = function(self)
+ local v = eolian.eolian_implement_implementing_class_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ function_get = function(self)
+ local tp = ffi.new("Eolian_Function_Type[1]")
+ local v = eolian.eolian_implement_function_get(self, tp)
+ if v == ffi.nullptr then return nil end
+ return v, tp[0]
+ end,
+
+ documentation_get = function(self, ftype)
+ local v = eolian.eolian_implement_documentation_get(self, ftype)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ is_auto = function(self, ftype)
+ return eolian.eolian_implement_is_auto(self, ftype) ~= 0
+ end,
+
+ is_empty = function(self, ftype)
+ return eolian.eolian_implement_is_empty(self, ftype) ~= 0
+ end,
+
+ is_pure_virtual = function(self, ftype)
+ return eolian.eolian_implement_is_pure_virtual(self, ftype) ~= 0
+ end,
+
+ is_prop_get = function(self)
+ return eolian.eolian_implement_is_prop_get(self) ~= 0
+ end,
+
+ is_prop_set = function(self)
+ return eolian.eolian_implement_is_prop_set(self) ~= 0
+ end
+ }
+})
+
+ffi.metatype("Eolian_Constructor", {
+ __index = wrap_object {
+ class_get = function(self)
+ local v = eolian.eolian_constructor_class_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ function_get = function(self)
+ local v = eolian.eolian_constructor_function_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ is_optional = function(self)
+ return eolian.eolian_constructor_is_optional(self) ~= 0
+ end
+ }
+})
+
+ffi.metatype("Eolian_Event", {
+ __index = wrap_object {
+ type_get = function(self)
+ local v = eolian.eolian_event_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ class_get = function(self)
+ local v = eolian.eolian_event_class_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ documentation_get = function(self)
+ local v = eolian.eolian_event_documentation_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ scope_get = function(self)
+ return tonum(eolian.eolian_event_scope_get(self))
+ end,
+
+ c_macro_get = function(self)
+ local v = eolian.eolian_event_c_macro_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end,
+
+ is_hot = function(self)
+ return eolian.eolian_event_is_hot(self) ~= 0
+ end,
+
+ is_restart = function(self)
+ return eolian.eolian_event_is_restart(self) ~= 0
+ end
+ }
+})
+
+ffi.metatype("Eolian_Part", {
+ __index = wrap_object {
+ class_get = function(self)
+ local v = eolian.eolian_part_class_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ documentation_get = function(self)
+ local v = eolian.eolian_part_documentation_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end
+ }
+})
+
+M.class_type = {
+ UNKNOWN = 0,
+ REGULAR = 1,
+ ABSTRACT = 2,
+ MIXIN = 3,
+ INTERFACE = 4
+}
+
+M.Class = ffi.metatype("Eolian_Class", {
+ __index = wrap_object {
+ type_get = function(self)
+ return tonum(eolian.eolian_class_type_get(self))
+ end,
+
+ documentation_get = function(self)
+ local v = eolian.eolian_class_documentation_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ c_prefix_get = function(self)
+ local v = eolian.eolian_class_c_prefix_get(self)
+ if v == ffi.nullptr then
+ local buf = self:namespaces_get()
+ buf[#buf + 1] = self:short_name_get()
+ return table.concat(buf, "_"):lower()
+ end
+ return ffi.string(v)
+ end,
+
+ event_c_prefix_get = function(self)
+ local v = eolian.eolian_class_event_c_prefix_get(self)
+ if v == ffi.nullptr then
+ return self:c_prefix_get()
+ end
+ return ffi.string(v)
+ end,
+
+ data_type_get = function(self)
+ local v = eolian.eolian_class_data_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi.string(v)
+ end,
+
+ parent_get = function(self)
+ local v = eolian.eolian_class_parent_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ extensions_get = function(self)
+ return Ptr_Iterator("const Eolian_Class*",
+ eolian.eolian_class_extensions_get(self))
+ end,
+
+ requires_get = function(self)
+ return Ptr_Iterator("const Eolian_Class*",
+ eolian.eolian_class_requires_get(self))
+ end,
+
+ functions_get = function(self, func_type)
+ return Ptr_Iterator("const Eolian_Function*",
+ eolian.eolian_class_functions_get(self, func_type))
+ end,
+
+ function_by_name_get = function(self, fname, ftype)
+ local v = eolian.eolian_class_function_by_name_get(self, fname,
+ ftype)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ implements_get = function(self)
+ return Ptr_Iterator("const Eolian_Implement*",
+ eolian.eolian_class_implements_get(self))
+ end,
+
+ constructors_get = function(self)
+ return Ptr_Iterator("const Eolian_Constructor*",
+ eolian.eolian_class_constructors_get(self))
+ end,
+
+ events_get = function(self)
+ return Ptr_Iterator("const Eolian_Event*",
+ eolian.eolian_class_events_get(self))
+ end,
+
+ event_by_name_get = function(self, name)
+ local v = eolian.eolian_class_event_by_name_get(self, name)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ parts_get = function(self)
+ return Ptr_Iterator("const Eolian_Part*",
+ eolian.eolian_class_parts_get(self))
+ end,
+
+ ctor_enable_get = function(self)
+ return eolian.eolian_class_ctor_enable_get(self) ~= 0
+ end,
+
+ dtor_enable_get = function(self)
+ return eolian.eolian_class_dtor_enable_get(self) ~= 0
+ end,
+
+ c_get_function_name_get = function(self)
+ local v = eolian.eolian_class_c_get_function_name_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end,
+
+ c_macro_get = function(self)
+ local v = eolian.eolian_class_c_macro_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end,
+
+ c_data_type_get = function(self)
+ local v = eolian.eolian_class_c_data_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end
+ }
+})
+
+M.expression_type = {
+ UNKNOWN = 0,
+ INT = 1,
+ UINT = 2,
+ LONG = 3,
+ ULONG = 4,
+ LLONG = 5,
+ ULLONG = 6,
+ FLOAT = 7,
+ DOUBLE = 8,
+ STRING = 9,
+ CHAR = 10,
+ NULL = 11,
+ BOOL = 12,
+ NAME = 13,
+ UNARY = 15,
+ BINARY = 16
+}
+
+local etype = M.expression_type
+
+M.expression_mask = {
+ SINT = 2 ^ 0,
+ UINT = 2 ^ 1,
+ FLOAT = 2 ^ 2,
+ BOOL = 2 ^ 3,
+ STRING = 2 ^ 4,
+ CHAR = 2 ^ 5,
+ NULL = 2 ^ 6
+}
+
+local emask = M.expression_mask
+
+emask.INT = emask.SINT + emask.UINT
+emask.SIGNED = emask.SINT + emask.FLOAT
+emask.NUMBER = emask.INT + emask.FLOAT
+emask.ALL = emask.NUMBER + emask.BOOL + emask.STRING + emask.CHAR + emask.NULL
+
+local value_con = {
+ [etype.INT ] = function(v) return tonum(v.value.i ) end,
+ [etype.UINT ] = function(v) return tonum(v.value.u ) end,
+ [etype.LONG ] = function(v) return v.value.l end,
+ [etype.ULONG ] = function(v) return v.value.ul end,
+ [etype.LLONG ] = function(v) return v.value.ll end,
+ [etype.ULLONG] = function(v) return v.value.ull end,
+ [etype.FLOAT ] = function(v) return tonum(v.value.f ) end,
+ [etype.DOUBLE] = function(v) return tonum(v.value.d ) end,
+ [etype.STRING] = function(v) return ffi.string(v.value.s ) end,
+ [etype.CHAR ] = function(v) return string.char(v.value.c) end,
+ [etype.NULL ] = function(v) return nil end,
+ [etype.BOOL ] = function(v) return v.value.b ~= 0 end
+}
+
+M.Value = ffi.metatype("Eolian_Value", {
+ __index = {
+ get_type = function(self)
+ return tonum(ffi.cast("Eolian_Value_t*", self).type)
+ end,
+
+ get_value = function(self)
+ local tp = self:get_type()
+ local fun = value_con[tonum(tp)]
+ if not fun then return nil end
+ return fun()
+ end,
+
+ to_literal = function(self)
+ local v = eolian.eolian_expression_value_to_literal(self)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end
+ }
+})
+
+M.binary_operator = {
+ INVALID = 0,
+
+ ADD = 1,
+ SUB = 2,
+ MUL = 3,
+ DIV = 4,
+ MOD = 5,
+
+ EQ = 6,
+ NQ = 7,
+ GT = 8,
+ LT = 9,
+ GE = 10,
+ LE = 11,
+
+ AND = 12,
+ OR = 13,
+
+ BAND = 14,
+ BOR = 15,
+ BXOR = 16,
+ LSH = 17,
+ RSH = 18
+}
+
+M.unary_operator = {
+ INVALID = 0,
+
+ UNM = 1,
+ UNP = 2,
+
+ NOT = 3,
+ BNOT = 4
+}
+
+M.Expression = ffi.metatype("Eolian_Expression", {
+ __index = wrap_object {
+ eval = function(self, mask)
+ mask = mask or emask.ALL
+ local vsz = ffi.sizeof("Eolian_Value_t")
+ local p = ffi.cast("Eolian_Value_t *", ffi.C.malloc(vsz))
+ if p == ffi.nullptr then return nil end
+ local v = eolian.eolian_expression_eval_fill(self, mask, p)
+ if v == 0 then
+ ffi.C.free(p)
+ return nil
+ end
+ return ffi.gc(ffi.cast("Eolian_Value *", p), ffi.C.free)
+ end,
+
+ serialize = function(self)
+ local v = eolian.eolian_expression_serialize(self)
+ if v == ffi.nullptr then return nil end
+ return ffi_stringshare(v)
+ end,
+
+ type_get = function(self)
+ return tonum(eolian.eolian_expression_type_get(self))
+ end,
+
+ binary_operator_get = function(self)
+ return tonum(eolian.eolian_expression_binary_operator_get(self))
+ end,
+
+ binary_lhs_get = function(self)
+ local v = eolian.eolian_expression_binary_lhs_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ binary_rhs_get = function(self)
+ local v = eolian.eolian_expression_binary_rhs_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ unary_operator_get = function(self)
+ return tonum(eolian.eolian_expression_unary_operator_get(self))
+ end,
+
+ unary_expression_get = function(self)
+ local v = eolian.eolian_expression_unary_expression_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ value_get = function(self)
+ local vsz = ffi.sizeof("Eolian_Value_t")
+ local p = ffi.cast("Eolian_Value_t *", ffi.C.malloc(vsz))
+ if p == ffi.nullptr then return nil end
+ local v = eolian.eolian_expression_value_get_fill(self, p)
+ if v == 0 then
+ ffi.C.free(p)
+ return nil
+ end
+ return ffi.gc(ffi.cast("Eolian_Value *", p), ffi.C.free)
+ end
+ }
+})
+
+M.Constant = ffi.metatype("Eolian_Constant", {
+ __index = wrap_object {
+ documentation_get = function(self)
+ local v = eolian.eolian_constant_documentation_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ type_get = function(self)
+ local v = eolian.eolian_constant_type_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ value_get = function(self)
+ local v = eolian.eolian_constant_value_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ is_extern = function(self)
+ return eolian.eolian_constant_is_extern(self) ~= 0
+ end
+ }
+})
+
+M.Error = ffi.metatype("Eolian_Error", {
+ __index = wrap_object {
+ documentation_get = function(self)
+ local v = eolian.eolian_error_documentation_get(self)
+ if v == ffi.nullptr then return nil end
+ return v
+ end,
+
+ message_get = function(self)
+ local v = eolian.eolian_error_message_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi.string(v)
+ end,
+
+ is_extern = function(self)
+ return eolian.eolian_error_is_extern(self) ~= 0
+ end
+ }
+})
+
+M.Documentation = ffi.metatype("Eolian_Documentation", {
+ __index = wrap_object {
+ summary_get = function(self)
+ local v = eolian.eolian_documentation_summary_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi.string(v)
+ end,
+
+ description_get = function(self)
+ local v = eolian.eolian_documentation_description_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi.string(v)
+ end,
+
+ since_get = function(self)
+ local v = eolian.eolian_documentation_since_get(self)
+ if v == ffi.nullptr then return nil end
+ return ffi.string(v)
+ end
+ }
+})
+
+M.doc_token_type = {
+ UNKNOWN = 0,
+ TEXT = 1,
+ REF = 2,
+ MARK_NOTE = 3,
+ MARK_WARNING = 4,
+ MARK_REMARK = 5,
+ MARK_TODO = 6,
+ MARKUP_MONOSPACE = 7
+}
+
+M.documentation_string_split = function(str)
+ if not str then
+ return {}
+ end
+ local sep = str:find("\n\n", 1, true)
+ local ret = {}
+ while true do
+ local pstr = (sep and str:sub(1, sep - 1) or str):match("^%s*(.-)%s*$")
+ if #pstr > 0 then
+ ret[#ret + 1] = pstr
+ end
+ if not sep then
+ break
+ end
+ str = str:sub(sep + 2)
+ sep = str:find("\n\n", 1, true)
+ end
+ return ret
+end
+
+M.documentation_tokenize = function(doc, ret)
+ local ret = eolian.eolian_documentation_tokenize(doc, ret)
+ if ret == ffi.nullptr then
+ return nil
+ end
+ return ffi.string(ret)
+end
+
+M.doc_token_init = function()
+ local ret = ffi.new("Eolian_Doc_Token")
+ eolian.eolian_doc_token_init(ret)
+ return ret
+end
+
+M.Eolian_Doc_Token = ffi.metatype("Eolian_Doc_Token", {
+ __index = {
+ type_get = function(self)
+ return tonum(eolian.eolian_doc_token_type_get(self))
+ end,
+
+ text_get = function(self)
+ local str = eolian.eolian_doc_token_text_get(self)
+ if str == ffi.nullptr then
+ return nil
+ end
+ local ret = ffi.string(str)
+ ffi.C.free(str)
+ return ret
+ end,
+
+ ref_resolve = function(self, state)
+ local stor = ffi.new("const Eolian_Object *[2]")
+ local tp = tonum(eolian.eolian_doc_token_ref_resolve(self, state, stor, stor + 1))
+ local reft = M.object_type
+ if tp == reft.CLASS then
+ return tp, ffi.cast("const Eolian_Class *", stor[0])
+ elseif tp == reft.FUNCTION then
+ return tp, ffi.cast("const Eolian_Class *", stor[0]),
+ ffi.cast("const Eolian_Function *", stor[1])
+ elseif tp == reft.EVENT then
+ return tp, ffi.cast("const Eolian_Class *", stor[0]),
+ ffi.cast("const Eolian_Event *", stor[1])
+ elseif tp == reft.TYPEDECL then
+ return tp, ffi.cast("const Eolian_Typedecl *", stor[0])
+ elseif tp == reft.STRUCT_FIELD then
+ return tp, ffi.cast("const Eolian_Typedecl *", stor[0]),
+ ffi.cast("const Eolian_Struct_Type_Field *", stor[1])
+ elseif tp == reft.ENUM_FIELD then
+ return tp, ffi.cast("const Eolian_Typedecl *", stor[0]),
+ ffi.cast("const Eolian_Enum_Type_Field *", stor[1])
+ elseif tp == reft.CONSTANT then
+ return tp, ffi.cast("const Eolian_Constant *", stor[0])
+ elseif tp == reft.ERROR then
+ return tp, ffi.cast("const Eolian_Error *", stor[0])
+ else
+ return reft.UNKNOWN
+ end
+ end
+ }
+})
+
+return M