From 0d291ac43eeb96ffb8dc2dec5c21d8d375135897 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 10 Dec 2015 13:08:34 +0000 Subject: [PATCH 01/23] eolian: add typedef enumeration for type definitions --- src/lib/eolian/Eolian.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index a5748eb09e..ec6a126321 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -197,6 +197,15 @@ typedef enum EOLIAN_SCOPE_PROTECTED } Eolian_Object_Scope; +typedef enum +{ + EOLIAN_TYPEDEF_UNKNOWN = 0, + EOLIAN_TYPEDEF_STRUCT, + EOLIAN_TYPEDEF_STRUCT_OPAQUE, + EOLIAN_TYPEDEF_ENUM, + EOLIAN_TYPEDEF_ALIAS +} Eolian_Typedef_Type; + typedef enum { EOLIAN_TYPE_UNKNOWN_TYPE, From ff7e2b5b6b72ae4ebdd08b89bd53a9bd00fe67da Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 10 Dec 2015 13:09:28 +0000 Subject: [PATCH 02/23] eolian: always define the first enum value for consistency --- src/lib/eolian/Eolian.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index ec6a126321..dc55f4e0c9 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -167,7 +167,7 @@ typedef struct _Eolian_Documentation Eolian_Documentation; typedef enum { - EOLIAN_UNRESOLVED, + EOLIAN_UNRESOLVED = 0, EOLIAN_PROPERTY, EOLIAN_PROP_SET, EOLIAN_PROP_GET, @@ -176,14 +176,14 @@ typedef enum typedef enum { - EOLIAN_IN_PARAM, + EOLIAN_IN_PARAM = 0, EOLIAN_OUT_PARAM, EOLIAN_INOUT_PARAM } Eolian_Parameter_Dir; typedef enum { - EOLIAN_CLASS_UNKNOWN_TYPE, + EOLIAN_CLASS_UNKNOWN_TYPE = 0, EOLIAN_CLASS_REGULAR, EOLIAN_CLASS_ABSTRACT, EOLIAN_CLASS_MIXIN, @@ -192,7 +192,7 @@ typedef enum typedef enum { - EOLIAN_SCOPE_PUBLIC, + EOLIAN_SCOPE_PUBLIC = 0, EOLIAN_SCOPE_PRIVATE, EOLIAN_SCOPE_PROTECTED } Eolian_Object_Scope; @@ -208,7 +208,7 @@ typedef enum typedef enum { - EOLIAN_TYPE_UNKNOWN_TYPE, + EOLIAN_TYPE_UNKNOWN_TYPE = 0, EOLIAN_TYPE_VOID, EOLIAN_TYPE_REGULAR, EOLIAN_TYPE_COMPLEX, From 87c763ac8bdbb2c37383803e241d74e5ffc42c87 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Mon, 14 Dec 2015 15:48:29 +0000 Subject: [PATCH 03/23] eolian: add a structure + hashes representing type decls --- src/lib/eolian/eolian_database.c | 3 +++ src/lib/eolian/eolian_database.h | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index fa0931088e..b6da857b7e 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -9,8 +9,11 @@ Eina_Hash *_classes = NULL; Eina_Hash *_aliases = NULL; +Eina_Hash *_aliasesd = NULL; Eina_Hash *_structs = NULL; +Eina_Hash *_structsd = NULL; Eina_Hash *_enums = NULL; +Eina_Hash *_enumsd = NULL; Eina_Hash *_globals = NULL; Eina_Hash *_constants = NULL; Eina_Hash *_classesf = NULL; diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 6bc470bd3a..eb4d1893e5 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -33,8 +33,11 @@ extern Eina_Prefix *_eolian_prefix; extern Eina_Hash *_classes; extern Eina_Hash *_aliases; +extern Eina_Hash *_aliasesd; extern Eina_Hash *_structs; +extern Eina_Hash *_structsd; extern Eina_Hash *_enums; +extern Eina_Hash *_enumsd; extern Eina_Hash *_globals; extern Eina_Hash *_constants; extern Eina_Hash *_classesf; @@ -180,6 +183,20 @@ struct _Eolian_Type Eina_Bool is_extern :1; }; +struct _Eolian_Typedef +{ + Eolian_Object base; + Eolian_Typedef_Type type; + Eina_Stringshare *name; + Eina_Stringshare *full_name; + Eina_List *namespaces; + Eina_Hash *fields; + Eina_List *field_list; + Eolian_Documentation *doc; + Eina_Stringshare *legacy; + Eina_Bool is_extern :1; +}; + struct _Eolian_Implement { Eolian_Object base; From 67f17f1068ba804605a81dc0b0fe0dfb90567bf7 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Mon, 14 Dec 2015 15:52:30 +0000 Subject: [PATCH 04/23] eolian: rename typedef to typedecl to clear name confusion --- src/lib/eolian/Eolian.h | 12 ++++++------ src/lib/eolian/eolian_database.h | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index dc55f4e0c9..0acdf81a67 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -199,12 +199,12 @@ typedef enum typedef enum { - EOLIAN_TYPEDEF_UNKNOWN = 0, - EOLIAN_TYPEDEF_STRUCT, - EOLIAN_TYPEDEF_STRUCT_OPAQUE, - EOLIAN_TYPEDEF_ENUM, - EOLIAN_TYPEDEF_ALIAS -} Eolian_Typedef_Type; + EOLIAN_TYPEDECL_UNKNOWN = 0, + EOLIAN_TYPEDECL_STRUCT, + EOLIAN_TYPEDECL_STRUCT_OPAQUE, + EOLIAN_TYPEDECL_ENUM, + EOLIAN_TYPEDECL_ALIAS +} Eolian_Typedecl_Type; typedef enum { diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index eb4d1893e5..f06949df4f 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -183,10 +183,10 @@ struct _Eolian_Type Eina_Bool is_extern :1; }; -struct _Eolian_Typedef +struct _Eolian_Typedecl { Eolian_Object base; - Eolian_Typedef_Type type; + Eolian_Typedecl_Type type; Eina_Stringshare *name; Eina_Stringshare *full_name; Eina_List *namespaces; From 8944cc44c1e21496411ec8923968dab8542ae401 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 15 Dec 2015 16:01:02 +0000 Subject: [PATCH 05/23] eolian: add typedecl delete func and init hashes correctly --- src/lib/eolian/Eolian.h | 6 ++++++ src/lib/eolian/database_type.c | 21 +++++++++++++++++++-- src/lib/eolian/eolian_database.c | 3 +++ src/lib/eolian/eolian_database.h | 3 +++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 0acdf81a67..f88dd45582 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -105,6 +105,12 @@ typedef struct _Eolian_Function Eolian_Function; */ typedef struct _Eolian_Type Eolian_Type; +/* Type declaration. + * + * @ingroup Eolian + */ +typedef struct _Eolian_Typedecl Eolian_Typedecl; + /* Class function parameter information * * @ingroup Eolian diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 787cc3d6d3..e809858078 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -14,8 +14,7 @@ database_type_del(Eolian_Type *tp) if (tp->base.file) eina_stringshare_del(tp->base.file); if (tp->subtypes) EINA_LIST_FREE(tp->subtypes, stp) database_type_del(stp); - if (tp->base_type) - database_type_del(tp->base_type); + database_type_del(tp->base_type); if (tp->name) eina_stringshare_del(tp->name); if (tp->full_name) eina_stringshare_del(tp->full_name); if (tp->fields) eina_hash_free(tp->fields); @@ -28,6 +27,24 @@ database_type_del(Eolian_Type *tp) free(tp); } +void +database_typedecl_del(Eolian_Typedecl *tp) +{ + if (!tp) return; + const char *sp; + if (tp->base.file) eina_stringshare_del(tp->base.file); + database_type_del(tp->base_type); + if (tp->name) eina_stringshare_del(tp->name); + if (tp->full_name) eina_stringshare_del(tp->full_name); + if (tp->fields) eina_hash_free(tp->fields); + if (tp->field_list) eina_list_free(tp->field_list); + if (tp->namespaces) EINA_LIST_FREE(tp->namespaces, sp) + eina_stringshare_del(sp); + if (tp->legacy) eina_stringshare_del(tp->legacy); + database_doc_del(tp->doc); + free(tp); +} + void database_typedef_del(Eolian_Type *tp) { diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index b6da857b7e..c2caac4f91 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -47,8 +47,11 @@ database_init() eina_init(); _classes = eina_hash_stringshared_new(EINA_FREE_CB(database_class_del)); _aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedef_del)); + _aliasesd = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del)); _structs = eina_hash_stringshared_new(EINA_FREE_CB(database_type_del)); + _structsd = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del)); _enums = eina_hash_stringshared_new(EINA_FREE_CB(database_type_del)); + _enumsd = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_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); diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index f06949df4f..ac06cc2692 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -187,6 +187,7 @@ struct _Eolian_Typedecl { Eolian_Object base; Eolian_Typedecl_Type type; + Eolian_Type *base_type; Eina_Stringshare *name; Eina_Stringshare *full_name; Eina_List *namespaces; @@ -304,6 +305,8 @@ void database_enum_add(Eolian_Type *tp); void database_type_del(Eolian_Type *tp); void database_typedef_del(Eolian_Type *tp); +void database_typedecl_del(Eolian_Typedecl *tp); + void database_type_print(Eolian_Type *type); void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name); From 06c246ee27b1b727e63e6caece8796a8fcc442c9 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 15 Dec 2015 16:06:22 +0000 Subject: [PATCH 06/23] eolian: free the hashes (prevent leaks) --- src/lib/eolian/eolian_database.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index c2caac4f91..68512c8b57 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -84,8 +84,11 @@ database_shutdown() { eina_hash_free(_classes ); _classes = NULL; eina_hash_free(_aliases ); _aliases = NULL; + eina_hash_free(_aliasesd ); _aliasesd = NULL; eina_hash_free(_structs ); _structs = NULL; + eina_hash_free(_structsd ); _structsd = NULL; eina_hash_free(_enums ); _enums = NULL; + eina_hash_free(_enumsd ); _enumsd = NULL; eina_hash_free(_globals ); _globals = NULL; eina_hash_free(_constants ); _constants = NULL; eina_hash_free(_classesf ); _classesf = NULL; From 1425523bd4f36b62a98bf4ae8e0aa590fe92111a Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Wed, 16 Dec 2015 14:36:00 +0000 Subject: [PATCH 07/23] eolian: actually generate typedecls as necessary --- src/lib/eolian/database_type.c | 37 ++++++++++++++++++++++++++++---- src/lib/eolian/eolian_database.h | 1 + 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index e809858078..0d0440dac3 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -24,24 +24,26 @@ database_type_del(Eolian_Type *tp) if (tp->legacy) eina_stringshare_del(tp->legacy); if (tp->freefunc) eina_stringshare_del(tp->freefunc); database_doc_del(tp->doc); + database_typedecl_del(tp->decl); free(tp); } void database_typedecl_del(Eolian_Typedecl *tp) { + /* TODO: own storage for typedecls for several fields */ if (!tp) return; const char *sp; if (tp->base.file) eina_stringshare_del(tp->base.file); - database_type_del(tp->base_type); + /*database_type_del(tp->base_type);*/ if (tp->name) eina_stringshare_del(tp->name); if (tp->full_name) eina_stringshare_del(tp->full_name); - if (tp->fields) eina_hash_free(tp->fields); - if (tp->field_list) eina_list_free(tp->field_list); + /*if (tp->fields) eina_hash_free(tp->fields); + if (tp->field_list) eina_list_free(tp->field_list);*/ if (tp->namespaces) EINA_LIST_FREE(tp->namespaces, sp) eina_stringshare_del(sp); if (tp->legacy) eina_stringshare_del(tp->legacy); - database_doc_del(tp->doc); + /*database_doc_del(tp->doc);*/ free(tp); } @@ -62,9 +64,34 @@ database_typedef_del(Eolian_Type *tp) database_type_del(tp); } +static Eolian_Typedecl * +_typedecl_add(Eolian_Type *type) +{ + const char *nm; + Eina_List *l; + + Eolian_Typedecl *ret = calloc(1, sizeof(Eolian_Typedecl)); + ret->base.file = eina_stringshare_ref(type->base.file); + ret->base.line = type->base.line; + ret->base.column = type->base.column; + ret->base_type = type->base_type; + ret->name = eina_stringshare_ref(type->name); + ret->full_name = eina_stringshare_ref(type->full_name); + if (type->namespaces) EINA_LIST_FOREACH(type->namespaces, l, nm) + ret->namespaces = eina_list_append(ret->namespaces, eina_stringshare_ref(nm)); + ret->fields = type->fields; + ret->field_list = type->field_list; + ret->doc = type->doc; + ret->legacy = eina_stringshare_ref(type->legacy); + ret->is_extern = type->is_extern; + + return ret; +} + void database_type_add(Eolian_Type *def) { + def->decl = _typedecl_add(def); eina_hash_set(_aliases, def->full_name, def); eina_hash_set(_aliasesf, def->base.file, eina_list_append ((Eina_List*)eina_hash_find(_aliasesf, def->base.file), def)); @@ -74,6 +101,7 @@ database_type_add(Eolian_Type *def) void database_struct_add(Eolian_Type *tp) { + tp->decl = _typedecl_add(tp); eina_hash_set(_structs, tp->full_name, tp); eina_hash_set(_structsf, tp->base.file, eina_list_append ((Eina_List*)eina_hash_find(_structsf, tp->base.file), tp)); @@ -83,6 +111,7 @@ database_struct_add(Eolian_Type *tp) void database_enum_add(Eolian_Type *tp) { + tp->decl = _typedecl_add(tp); eina_hash_set(_enums, tp->full_name, tp); eina_hash_set(_enumsf, tp->base.file, eina_list_append ((Eina_List*)eina_hash_find(_enumsf, tp->base.file), tp)); diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index ac06cc2692..9825a6f23c 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -178,6 +178,7 @@ struct _Eolian_Type Eolian_Documentation *doc; Eina_Stringshare *legacy; Eina_Stringshare *freefunc; + Eolian_Typedecl *decl; Eina_Bool is_const :1; Eina_Bool is_own :1; Eina_Bool is_extern :1; From 2be79061fd106348722beca41e2921ec1b14a26d Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Wed, 16 Dec 2015 14:37:57 +0000 Subject: [PATCH 08/23] eolian: remove unneeded hashes --- src/lib/eolian/eolian_database.c | 9 --------- src/lib/eolian/eolian_database.h | 3 --- 2 files changed, 12 deletions(-) diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index 68512c8b57..fa0931088e 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -9,11 +9,8 @@ Eina_Hash *_classes = NULL; Eina_Hash *_aliases = NULL; -Eina_Hash *_aliasesd = NULL; Eina_Hash *_structs = NULL; -Eina_Hash *_structsd = NULL; Eina_Hash *_enums = NULL; -Eina_Hash *_enumsd = NULL; Eina_Hash *_globals = NULL; Eina_Hash *_constants = NULL; Eina_Hash *_classesf = NULL; @@ -47,11 +44,8 @@ database_init() eina_init(); _classes = eina_hash_stringshared_new(EINA_FREE_CB(database_class_del)); _aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedef_del)); - _aliasesd = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del)); _structs = eina_hash_stringshared_new(EINA_FREE_CB(database_type_del)); - _structsd = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del)); _enums = eina_hash_stringshared_new(EINA_FREE_CB(database_type_del)); - _enumsd = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_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); @@ -84,11 +78,8 @@ database_shutdown() { eina_hash_free(_classes ); _classes = NULL; eina_hash_free(_aliases ); _aliases = NULL; - eina_hash_free(_aliasesd ); _aliasesd = NULL; eina_hash_free(_structs ); _structs = NULL; - eina_hash_free(_structsd ); _structsd = NULL; eina_hash_free(_enums ); _enums = NULL; - eina_hash_free(_enumsd ); _enumsd = NULL; eina_hash_free(_globals ); _globals = NULL; eina_hash_free(_constants ); _constants = NULL; eina_hash_free(_classesf ); _classesf = NULL; diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 9825a6f23c..28327c54af 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -33,11 +33,8 @@ extern Eina_Prefix *_eolian_prefix; extern Eina_Hash *_classes; extern Eina_Hash *_aliases; -extern Eina_Hash *_aliasesd; extern Eina_Hash *_structs; -extern Eina_Hash *_structsd; extern Eina_Hash *_enums; -extern Eina_Hash *_enumsd; extern Eina_Hash *_globals; extern Eina_Hash *_constants; extern Eina_Hash *_classesf; From 6e2497bc014397c4ec9fe78cf06b1f9412cabb68 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 26 Jan 2016 15:28:41 +0000 Subject: [PATCH 09/23] eolian: add wrappers for most of typedecl APIs --- src/lib/eolian/Eolian.h | 21 +++++ src/lib/eolian/database_type_api.c | 124 +++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index f88dd45582..f91989d0a1 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -1276,6 +1276,7 @@ EAPI Eina_Stringshare *eolian_class_c_get_function_name_get(const Eolian_Class * * @ingroup Eolian */ EAPI const Eolian_Type *eolian_type_alias_get_by_name(const char *name); +EAPI const Eolian_Typedecl *eolian_typedecl_alias_get_by_name(const char *name); /* * @brief Get a struct by name. Supports namespaces. @@ -1286,6 +1287,7 @@ EAPI const Eolian_Type *eolian_type_alias_get_by_name(const char *name); * @ingroup Eolian */ EAPI const Eolian_Type *eolian_type_struct_get_by_name(const char *name); +EAPI const Eolian_Typedecl *eolian_typedecl_struct_get_by_name(const char *name); /* * @brief Get an enum by name. Supports namespaces. @@ -1296,6 +1298,7 @@ EAPI const Eolian_Type *eolian_type_struct_get_by_name(const char *name); * @ingroup Eolian */ EAPI const Eolian_Type *eolian_type_enum_get_by_name(const char *name); +EAPI const Eolian_Typedecl *eolian_typedecl_enum_get_by_name(const char *name); /* * @brief Get an iterator to all aliases contained in a file. @@ -1342,6 +1345,7 @@ EAPI Eina_Iterator *eolian_type_enums_get_by_file(const char *fname); * @ingroup Eolian */ EAPI Eolian_Type_Type eolian_type_type_get(const Eolian_Type *tp); +EAPI Eolian_Typedecl_Type eolian_typedecl_type_get(const Eolian_Typedecl *tp); /* * @brief Get an iterator to all subtypes of a type. @@ -1362,6 +1366,7 @@ EAPI Eina_Iterator *eolian_type_subtypes_get(const Eolian_Type *tp); * @ingroup Eolian */ EAPI Eina_Iterator *eolian_type_struct_fields_get(const Eolian_Type *tp); +EAPI Eina_Iterator *eolian_typedecl_struct_fields_get(const Eolian_Typedecl *tp); /* * @brief Get a field of a struct type. @@ -1374,6 +1379,7 @@ EAPI Eina_Iterator *eolian_type_struct_fields_get(const Eolian_Type *tp); * @ingroup Eolian */ EAPI const Eolian_Struct_Type_Field *eolian_type_struct_field_get(const Eolian_Type *tp, const char *field); +EAPI const Eolian_Struct_Type_Field *eolian_typedecl_struct_field_get(const Eolian_Typedecl *tp, const char *field); /* * @brief Get the name of a field of a struct type. @@ -1384,6 +1390,7 @@ EAPI const Eolian_Struct_Type_Field *eolian_type_struct_field_get(const Eolian_T * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_struct_field_name_get(const Eolian_Struct_Type_Field *fl); +#define eolian_typedecl_struct_field_name_get eolian_type_struct_field_name_get /* * @brief Get the documentation of a field of a struct type. @@ -1394,6 +1401,7 @@ EAPI Eina_Stringshare *eolian_type_struct_field_name_get(const Eolian_Struct_Typ * @ingroup Eolian */ EAPI const Eolian_Documentation *eolian_type_struct_field_documentation_get(const Eolian_Struct_Type_Field *fl); +#define eolian_typedecl_struct_field_documentation_get eolian_type_struct_field_documentation_get /* * @brief Get the type of a field of a struct type. @@ -1404,6 +1412,7 @@ EAPI const Eolian_Documentation *eolian_type_struct_field_documentation_get(cons * @ingroup Eolian */ EAPI const Eolian_Type *eolian_type_struct_field_type_get(const Eolian_Struct_Type_Field *fl); +#define eolian_typedecl_struct_field_type_get eolian_type_struct_field_type_get /* * @brief Get an iterator to all fields of an enum type. @@ -1414,6 +1423,7 @@ EAPI const Eolian_Type *eolian_type_struct_field_type_get(const Eolian_Struct_Ty * @ingroup Eolian */ EAPI Eina_Iterator *eolian_type_enum_fields_get(const Eolian_Type *tp); +EAPI Eina_Iterator *eolian_typedecl_enum_fields_get(const Eolian_Typedecl *tp); /* * @brief Get a field of an enum type. @@ -1429,6 +1439,7 @@ EAPI Eina_Iterator *eolian_type_enum_fields_get(const Eolian_Type *tp); * @ingroup Eolian */ EAPI const Eolian_Enum_Type_Field *eolian_type_enum_field_get(const Eolian_Type *tp, const char *field); +EAPI const Eolian_Enum_Type_Field *eolian_typedecl_enum_field_get(const Eolian_Typedecl *tp, const char *field); /* * @brief Get the name of a field of an enum type. @@ -1439,6 +1450,7 @@ EAPI const Eolian_Enum_Type_Field *eolian_type_enum_field_get(const Eolian_Type * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl); +#define eolian_typedecl_enum_field_name_get eolian_type_enum_field_name_get /* * @brief Get the C name of a field of an enum type. @@ -1451,6 +1463,7 @@ EAPI Eina_Stringshare *eolian_type_enum_field_name_get(const Eolian_Enum_Type_Fi * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl); +#define eolian_typedecl_enum_field_c_name_get eolian_type_enum_field_c_name_get /* * @brief Get the documentation of a field of an enum type. @@ -1461,6 +1474,7 @@ EAPI Eina_Stringshare *eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_ * @ingroup Eolian */ EAPI const Eolian_Documentation *eolian_type_enum_field_documentation_get(const Eolian_Enum_Type_Field *fl); +#define eolian_typedecl_enum_field_documentation_get eolian_type_enum_field_documentation_get /* * @brief Get the value of a field of an enum type. @@ -1476,6 +1490,7 @@ EAPI const Eolian_Documentation *eolian_type_enum_field_documentation_get(const * @ingroup Eolian */ EAPI const Eolian_Expression *eolian_type_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force); +#define eolian_typedecl_enum_field_value_get eolian_type_enum_field_value_get /* * @brief Get the legacy prefix of enum field names. When not specified, @@ -1487,6 +1502,7 @@ EAPI const Eolian_Expression *eolian_type_enum_field_value_get(const Eolian_Enum * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_enum_legacy_prefix_get(const Eolian_Type *tp); +EAPI Eina_Stringshare *eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typedecl *tp); /* * @brief Get the documentation of a struct/alias type. @@ -1498,6 +1514,7 @@ EAPI Eina_Stringshare *eolian_type_enum_legacy_prefix_get(const Eolian_Type *tp) * @ingroup Eolian */ EAPI const Eolian_Documentation *eolian_type_documentation_get(const Eolian_Type *tp); +EAPI const Eolian_Documentation *eolian_typedecl_documentation_get(const Eolian_Typedecl *tp); /* * @brief Get the filename of a struct/alias type. @@ -1508,6 +1525,7 @@ EAPI const Eolian_Documentation *eolian_type_documentation_get(const Eolian_Type * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_file_get(const Eolian_Type *tp); +EAPI Eina_Stringshare *eolian_typedecl_file_get(const Eolian_Typedecl *tp); /* * @brief Get the base type of a pointer, alias or regular type. @@ -1521,6 +1539,7 @@ EAPI Eina_Stringshare *eolian_type_file_get(const Eolian_Type *tp); * @ingroup Eolian */ EAPI const Eolian_Type *eolian_type_base_type_get(const Eolian_Type *tp); +EAPI const Eolian_Type *eolian_typedecl_base_type_get(const Eolian_Typedecl *tp); /* * @brief Get the lowest base type of an alias stack. @@ -1538,6 +1557,7 @@ EAPI const Eolian_Type *eolian_type_base_type_get(const Eolian_Type *tp); * @ingroup Eolian */ EAPI const Eolian_Type *eolian_type_aliased_base_get(const Eolian_Type *tp); +EAPI const Eolian_Type *eolian_typedecl_aliased_base_get(const Eolian_Typedecl *tp); /* * @brief Get the class associated with an EOLIAN_TYPE_CLASS type. @@ -1580,6 +1600,7 @@ EAPI Eina_Bool eolian_type_is_const(const Eolian_Type *tp); * @ingroup Eolian */ EAPI Eina_Bool eolian_type_is_extern(const Eolian_Type *tp); +EAPI Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp); /* * @brief Get the full C type name of the given type with a name. diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index 392d40a64b..ddfdcb46dd 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -16,6 +16,14 @@ eolian_type_alias_get_by_name(const char *name) return tp; } +EAPI const Eolian_Typedecl * +eolian_typedecl_alias_get_by_name(const char *name) +{ + const Eolian_Type *ret = eolian_type_alias_get_by_name(name); + if (!ret) return NULL; + return ret->decl; +} + EAPI const Eolian_Type * eolian_type_struct_get_by_name(const char *name) { @@ -26,6 +34,14 @@ eolian_type_struct_get_by_name(const char *name) return tp; } +EAPI const Eolian_Typedecl * +eolian_typedecl_struct_get_by_name(const char *name) +{ + const Eolian_Type *ret = eolian_type_struct_get_by_name(name); + if (!ret) return NULL; + return ret->decl; +} + EAPI const Eolian_Type * eolian_type_enum_get_by_name(const char *name) { @@ -36,6 +52,14 @@ eolian_type_enum_get_by_name(const char *name) return tp; } +EAPI const Eolian_Typedecl * +eolian_typedecl_enum_get_by_name(const char *name) +{ + const Eolian_Type *ret = eolian_type_enum_get_by_name(name); + if (!ret) return NULL; + return ret->decl; +} + EAPI Eina_Iterator * eolian_type_aliases_get_by_file(const char *fname) { @@ -76,6 +100,13 @@ eolian_type_type_get(const Eolian_Type *tp) return tp->type; } +EAPI Eolian_Typedecl_Type +eolian_typedecl_type_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EOLIAN_TYPEDECL_UNKNOWN); + return tp->type; +} + EAPI Eina_Iterator * eolian_type_subtypes_get(const Eolian_Type *tp) { @@ -96,6 +127,15 @@ eolian_type_struct_fields_get(const Eolian_Type *tp) return eina_list_iterator_new(tp->field_list); } +EAPI Eina_Iterator * +eolian_typedecl_struct_fields_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + if (tp->type != EOLIAN_TYPEDECL_STRUCT) + return NULL; + return eina_list_iterator_new(tp->field_list); +} + EAPI const Eolian_Struct_Type_Field * eolian_type_struct_field_get(const Eolian_Type *tp, const char *field) { @@ -109,6 +149,19 @@ eolian_type_struct_field_get(const Eolian_Type *tp, const char *field) return sf; } +EAPI const Eolian_Struct_Type_Field * +eolian_typedecl_struct_field_get(const Eolian_Typedecl *tp, const char *field) +{ + Eolian_Struct_Type_Field *sf = NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL); + if (tp->type != EOLIAN_TYPEDECL_STRUCT) + return NULL; + sf = eina_hash_find(tp->fields, field); + if (!sf) return NULL; + return sf; +} + EAPI Eina_Stringshare * eolian_type_struct_field_name_get(const Eolian_Struct_Type_Field *fl) { @@ -139,6 +192,15 @@ eolian_type_enum_fields_get(const Eolian_Type *tp) return eina_list_iterator_new(tp->field_list); } +EAPI Eina_Iterator * +eolian_typedecl_enum_fields_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + if (tp->type != EOLIAN_TYPEDECL_ENUM) + return NULL; + return eina_list_iterator_new(tp->field_list); +} + EAPI const Eolian_Enum_Type_Field * eolian_type_enum_field_get(const Eolian_Type *tp, const char *field) { @@ -152,6 +214,19 @@ eolian_type_enum_field_get(const Eolian_Type *tp, const char *field) return ef; } +EAPI const Eolian_Enum_Type_Field * +eolian_typedecl_enum_field_get(const Eolian_Typedecl *tp, const char *field) +{ + Eolian_Enum_Type_Field *ef = NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL); + if (tp->type != EOLIAN_TYPEDECL_ENUM) + return NULL; + ef = eina_hash_find(tp->fields, field); + if (!ef) return NULL; + return ef; +} + EAPI Eina_Stringshare * eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl) { @@ -206,6 +281,15 @@ eolian_type_enum_legacy_prefix_get(const Eolian_Type *tp) return tp->legacy; } +EAPI Eina_Stringshare * +eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + if (tp->type != EOLIAN_TYPEDECL_ENUM) + return NULL; + return tp->legacy; +} + EAPI const Eolian_Documentation * eolian_type_documentation_get(const Eolian_Type *tp) { @@ -213,6 +297,13 @@ eolian_type_documentation_get(const Eolian_Type *tp) return tp->doc; } +EAPI const Eolian_Documentation * +eolian_typedecl_documentation_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + return tp->doc; +} + EAPI Eina_Stringshare * eolian_type_file_get(const Eolian_Type *tp) { @@ -220,6 +311,13 @@ eolian_type_file_get(const Eolian_Type *tp) return tp->base.file; } +EAPI Eina_Stringshare * +eolian_typedecl_file_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + return tp->base.file; +} + EAPI const Eolian_Type * eolian_type_base_type_get(const Eolian_Type *tp) { @@ -248,6 +346,17 @@ eolian_type_base_type_get(const Eolian_Type *tp) return tp->base_type; } +EAPI const Eolian_Type * +eolian_typedecl_base_type_get(const Eolian_Typedecl *tp) +{ + Eolian_Typedecl_Type tpt; + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + tpt = eolian_typedecl_type_get(tp); + if (tpt != EOLIAN_TYPEDECL_ALIAS) + return NULL; + return tp->base_type; +} + EAPI const Eolian_Type * eolian_type_aliased_base_get(const Eolian_Type *tp) { @@ -265,6 +374,14 @@ eolian_type_aliased_base_get(const Eolian_Type *tp) return eolian_type_aliased_base_get(tp->base_type); } +EAPI const Eolian_Type * +eolian_typedecl_aliased_base_get(const Eolian_Typedecl *tp) +{ + if (!tp || tp->type != EOLIAN_TYPEDECL_ALIAS) + return NULL; + return eolian_type_aliased_base_get(tp->base_type); +} + EAPI const Eolian_Class * eolian_type_class_get(const Eolian_Type *tp) { @@ -295,6 +412,13 @@ eolian_type_is_extern(const Eolian_Type *tp) return tp->is_extern; } +EAPI Eina_Bool +eolian_typedecl_is_extern(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EINA_FALSE); + return tp->is_extern; +} + EAPI Eina_Stringshare * eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name) { From cf9dbaa7dac5a51a414784149eea3cc4d17f5b6d Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 11 Feb 2016 15:21:12 +0000 Subject: [PATCH 10/23] eolian: add matching APIs to get typedecls by file --- src/lib/eolian/Eolian.h | 3 +++ src/lib/eolian/database_type.c | 6 +++++ src/lib/eolian/database_type_api.c | 35 +++++++++++++++++++++++++++++- src/lib/eolian/eolian_database.c | 9 ++++++++ src/lib/eolian/eolian_database.h | 3 +++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index f91989d0a1..18e0e53e2d 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -1311,6 +1311,7 @@ EAPI const Eolian_Typedecl *eolian_typedecl_enum_get_by_name(const char *name); * @ingroup Eolian */ EAPI Eina_Iterator *eolian_type_aliases_get_by_file(const char *fname); +EAPI Eina_Iterator *eolian_typedecl_aliases_get_by_file(const char *fname); /* * @brief Get an iterator to all named structs contained in a file. @@ -1323,6 +1324,7 @@ EAPI Eina_Iterator *eolian_type_aliases_get_by_file(const char *fname); * @ingroup Eolian */ EAPI Eina_Iterator *eolian_type_structs_get_by_file(const char *fname); +EAPI Eina_Iterator *eolian_typedecl_structs_get_by_file(const char *fname); /* * @brief Get an iterator to all enums contained in a file. @@ -1335,6 +1337,7 @@ EAPI Eina_Iterator *eolian_type_structs_get_by_file(const char *fname); * @ingroup Eolian */ EAPI Eina_Iterator *eolian_type_enums_get_by_file(const char *fname); +EAPI Eina_Iterator *eolian_typedecl_enums_get_by_file(const char *fname); /* * @brief Get the type of a type (regular, function, pointer) diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 0d0440dac3..03bea33ce2 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -95,6 +95,8 @@ database_type_add(Eolian_Type *def) eina_hash_set(_aliases, def->full_name, def); eina_hash_set(_aliasesf, def->base.file, eina_list_append ((Eina_List*)eina_hash_find(_aliasesf, def->base.file), def)); + eina_hash_set(_aliasesd, def->base.file, eina_list_append + ((Eina_List*)eina_hash_find(_aliasesd, def->base.file), def->decl)); database_decl_add(def->full_name, EOLIAN_DECL_ALIAS, def->base.file, def); } @@ -105,6 +107,8 @@ database_struct_add(Eolian_Type *tp) eina_hash_set(_structs, tp->full_name, tp); eina_hash_set(_structsf, tp->base.file, eina_list_append ((Eina_List*)eina_hash_find(_structsf, tp->base.file), tp)); + eina_hash_set(_structsd, tp->base.file, eina_list_append + ((Eina_List*)eina_hash_find(_structsd, tp->base.file), tp->decl)); database_decl_add(tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, tp); } @@ -115,6 +119,8 @@ database_enum_add(Eolian_Type *tp) eina_hash_set(_enums, tp->full_name, tp); eina_hash_set(_enumsf, tp->base.file, eina_list_append ((Eina_List*)eina_hash_find(_enumsf, tp->base.file), tp)); + eina_hash_set(_enumsd, tp->base.file, eina_list_append + ((Eina_List*)eina_hash_find(_enumsd, tp->base.file), tp->decl)); database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp); } diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index ddfdcb46dd..97fb00d683 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -71,6 +71,17 @@ eolian_type_aliases_get_by_file(const char *fname) return eina_list_iterator_new(l); } +EAPI Eina_Iterator * +eolian_typedecl_aliases_get_by_file(const char *fname) +{ + if (!_aliasesd) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(fname); + Eina_List *l = eina_hash_find(_aliasesd, shr); + eina_stringshare_del(shr); + if (!l) return NULL; + return eina_list_iterator_new(l); +} + EAPI Eina_Iterator * eolian_type_structs_get_by_file(const char *fname) { @@ -82,10 +93,21 @@ eolian_type_structs_get_by_file(const char *fname) return eina_list_iterator_new(l); } +EAPI Eina_Iterator * +eolian_typedecl_structs_get_by_file(const char *fname) +{ + if (!_structsd) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(fname); + Eina_List *l = eina_hash_find(_structsd, shr); + eina_stringshare_del(shr); + if (!l) return NULL; + return eina_list_iterator_new(l); +} + EAPI Eina_Iterator * eolian_type_enums_get_by_file(const char *fname) { - if (!_structsf) return NULL; + if (!_enumsf) return NULL; Eina_Stringshare *shr = eina_stringshare_add(fname); Eina_List *l = eina_hash_find(_enumsf, shr); eina_stringshare_del(shr); @@ -93,6 +115,17 @@ eolian_type_enums_get_by_file(const char *fname) return eina_list_iterator_new(l); } +EAPI Eina_Iterator * +eolian_typedecl_enums_get_by_file(const char *fname) +{ + if (!_enumsd) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(fname); + Eina_List *l = eina_hash_find(_enumsd, shr); + eina_stringshare_del(shr); + if (!l) return NULL; + return eina_list_iterator_new(l); +} + EAPI Eolian_Type_Type eolian_type_type_get(const Eolian_Type *tp) { diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index fa0931088e..a9bcd97968 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -17,6 +17,9 @@ Eina_Hash *_classesf = NULL; Eina_Hash *_aliasesf = NULL; Eina_Hash *_structsf = NULL; Eina_Hash *_enumsf = NULL; +Eina_Hash *_aliasesd = NULL; +Eina_Hash *_structsd = NULL; +Eina_Hash *_enumsd = NULL; Eina_Hash *_globalsf = NULL; Eina_Hash *_constantsf = NULL; Eina_Hash *_filenames = NULL; @@ -54,6 +57,9 @@ database_init() _enumsf = eina_hash_stringshared_new(_hashlist_free); _globalsf = eina_hash_stringshared_new(_hashlist_free); _constantsf = eina_hash_stringshared_new(_hashlist_free); + _aliasesd = eina_hash_stringshared_new(_hashlist_free); + _structsd = eina_hash_stringshared_new(_hashlist_free); + _enumsd = eina_hash_stringshared_new(_hashlist_free); _filenames = eina_hash_string_small_new(free); _tfilenames = eina_hash_string_small_new(free); _decls = eina_hash_stringshared_new(free); @@ -88,6 +94,9 @@ database_shutdown() eina_hash_free(_enumsf ); _enumsf = NULL; eina_hash_free(_globalsf ); _globalsf = NULL; eina_hash_free(_constantsf); _constantsf = NULL; + eina_hash_free(_aliasesd ); _aliasesd = NULL; + eina_hash_free(_structsd ); _structsd = NULL; + eina_hash_free(_enumsd ); _enumsd = NULL; eina_hash_free(_filenames ); _filenames = NULL; eina_hash_free(_tfilenames); _tfilenames = NULL; eina_hash_free(_decls ); _decls = NULL; diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 28327c54af..ca9f23f2e9 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -41,6 +41,9 @@ extern Eina_Hash *_classesf; extern Eina_Hash *_aliasesf; extern Eina_Hash *_structsf; extern Eina_Hash *_enumsf; +extern Eina_Hash *_aliasesd; +extern Eina_Hash *_structsd; +extern Eina_Hash *_enumsd; extern Eina_Hash *_globalsf; extern Eina_Hash *_constantsf; extern Eina_Hash *_filenames; /* Hash: filename without extension -> full path */ From c0287a2752f9abd056cee668b479de607aec83ed Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 11 Feb 2016 15:32:02 +0000 Subject: [PATCH 11/23] eolian: add some missing typedecl APIs --- src/lib/eolian/Eolian.h | 5 +++++ src/lib/eolian/database_type.c | 1 + src/lib/eolian/database_type_api.c | 35 ++++++++++++++++++++++++++++++ src/lib/eolian/eolian_database.h | 1 + 4 files changed, 42 insertions(+) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 18e0e53e2d..46ba77019f 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -1626,6 +1626,7 @@ EAPI Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp); * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name); +EAPI Eina_Stringshare *eolian_typedecl_c_type_named_get(const Eolian_Typedecl *tp, const char *name); /* * @brief Get the full C type name of the given type without a name. @@ -1643,6 +1644,7 @@ EAPI Eina_Stringshare *eolian_type_c_type_named_get(const Eolian_Type *tp, const * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_c_type_get(const Eolian_Type *tp); +EAPI Eina_Stringshare *eolian_typedecl_c_type_get(const Eolian_Typedecl *tp); /* * @brief Get the name of the given type. For regular or complex types, this @@ -1657,6 +1659,7 @@ EAPI Eina_Stringshare *eolian_type_c_type_get(const Eolian_Type *tp); * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_name_get(const Eolian_Type *tp); +EAPI Eina_Stringshare *eolian_typedecl_name_get(const Eolian_Typedecl *tp); /* * @brief Get the full (namespaced) name of a function. Only works on named @@ -1668,6 +1671,7 @@ EAPI Eina_Stringshare *eolian_type_name_get(const Eolian_Type *tp); * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_full_name_get(const Eolian_Type *tp); +EAPI Eina_Stringshare *eolian_typedecl_full_name_get(const Eolian_Typedecl *tp); /* * @brief Get an iterator to the list of namespaces of the given type. Only @@ -1679,6 +1683,7 @@ EAPI Eina_Stringshare *eolian_type_full_name_get(const Eolian_Type *tp); * @ingroup Eolian */ EAPI Eina_Iterator *eolian_type_namespaces_get(const Eolian_Type *tp); +EAPI Eina_Iterator *eolian_typedecl_namespaces_get(const Eolian_Typedecl *tp); /* * @brief Get the name of the function used to free this type. diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 03bea33ce2..08b6fd58b3 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -84,6 +84,7 @@ _typedecl_add(Eolian_Type *type) ret->doc = type->doc; ret->legacy = eina_stringshare_ref(type->legacy); ret->is_extern = type->is_extern; + ret->parent = type; return ret; } diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index 97fb00d683..b942f175b0 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -465,12 +465,25 @@ eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name) return ret; } +EAPI Eina_Stringshare * +eolian_typedecl_c_type_named_get(const Eolian_Typedecl *tp, const char *name) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + return eolian_type_c_type_named_get(tp->parent, name); +} + EAPI Eina_Stringshare * eolian_type_c_type_get(const Eolian_Type *tp) { return eolian_type_c_type_named_get(tp, NULL); } +EAPI Eina_Stringshare * +eolian_typedecl_c_type_get(const Eolian_Typedecl *tp) +{ + return eolian_typedecl_c_type_named_get(tp, NULL); +} + EAPI Eina_Stringshare * eolian_type_name_get(const Eolian_Type *tp) { @@ -478,6 +491,13 @@ eolian_type_name_get(const Eolian_Type *tp) return tp->name; } +EAPI Eina_Stringshare * +eolian_typedecl_name_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + return tp->name; +} + EAPI Eina_Stringshare * eolian_type_full_name_get(const Eolian_Type *tp) { @@ -485,6 +505,13 @@ eolian_type_full_name_get(const Eolian_Type *tp) return tp->full_name; } +EAPI Eina_Stringshare * +eolian_typedecl_full_name_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + return tp->full_name; +} + EAPI Eina_Iterator * eolian_type_namespaces_get(const Eolian_Type *tp) { @@ -493,6 +520,14 @@ eolian_type_namespaces_get(const Eolian_Type *tp) return eina_list_iterator_new(tp->namespaces); } +EAPI Eina_Iterator * +eolian_typedecl_namespaces_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + if (!tp->namespaces) return NULL; + return eina_list_iterator_new(tp->namespaces); +} + EAPI Eina_Stringshare * eolian_type_free_func_get(const Eolian_Type *tp) { diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index ca9f23f2e9..853b138e83 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -188,6 +188,7 @@ struct _Eolian_Typedecl { Eolian_Object base; Eolian_Typedecl_Type type; + Eolian_Type *parent; Eolian_Type *base_type; Eina_Stringshare *name; Eina_Stringshare *full_name; From 8514c1846f5706b051f72beb09113f84f8e17b69 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 11 Feb 2016 15:34:26 +0000 Subject: [PATCH 12/23] eolian: add api to deal with typedecl free funcs --- src/lib/eolian/Eolian.h | 1 + src/lib/eolian/database_type.c | 2 ++ src/lib/eolian/database_type_api.c | 7 +++++++ src/lib/eolian/eolian_database.h | 1 + 4 files changed, 11 insertions(+) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 46ba77019f..50c0f7c7f7 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -1698,6 +1698,7 @@ EAPI Eina_Iterator *eolian_typedecl_namespaces_get(const Eolian_Typedecl *tp); * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_free_func_get(const Eolian_Type *tp); +EAPI Eina_Stringshare *eolian_typedecl_free_func_get(const Eolian_Typedecl *tp); /* * @brief Evaluate an Eolian expression. diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 08b6fd58b3..2166a62212 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -43,6 +43,7 @@ database_typedecl_del(Eolian_Typedecl *tp) if (tp->namespaces) EINA_LIST_FREE(tp->namespaces, sp) eina_stringshare_del(sp); if (tp->legacy) eina_stringshare_del(tp->legacy); + if (tp->freefunc) eina_stringshare_del(tp->freefunc); /*database_doc_del(tp->doc);*/ free(tp); } @@ -83,6 +84,7 @@ _typedecl_add(Eolian_Type *type) ret->field_list = type->field_list; ret->doc = type->doc; ret->legacy = eina_stringshare_ref(type->legacy); + ret->freefunc = eina_stringshare_ref(type->freefunc); ret->is_extern = type->is_extern; ret->parent = type; diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index b942f175b0..db0e09c7ca 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -534,3 +534,10 @@ eolian_type_free_func_get(const Eolian_Type *tp) EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); return tp->freefunc; } + +EAPI Eina_Stringshare * +eolian_typedecl_free_func_get(const Eolian_Typedecl *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + return tp->freefunc; +} diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 853b138e83..bf9c107a5c 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -197,6 +197,7 @@ struct _Eolian_Typedecl Eina_List *field_list; Eolian_Documentation *doc; Eina_Stringshare *legacy; + Eina_Stringshare *freefunc; Eina_Bool is_extern :1; }; From cb42da514bf95f6e458dee0486d667d840c35635 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Fri, 19 Feb 2016 13:18:36 +0000 Subject: [PATCH 13/23] eolian: initial conversion of C gen and tests to new type APIs --- src/bin/eolian/docs_generator.c | 10 +- src/bin/eolian/types_generator.c | 54 +++--- src/lib/eolian/Eolian.h | 3 +- src/lib/eolian/database_type.c | 10 +- src/lib/eolian/database_type_api.c | 22 ++- src/lib/eolian/eolian_database.c | 4 +- src/tests/eolian/eolian_parsing.c | 258 +++++++++++++++-------------- 7 files changed, 194 insertions(+), 167 deletions(-) diff --git a/src/bin/eolian/docs_generator.c b/src/bin/eolian/docs_generator.c index eb008bd30e..886bf9e185 100644 --- a/src/bin/eolian/docs_generator.c +++ b/src/bin/eolian/docs_generator.c @@ -42,10 +42,10 @@ _generate_ref(const char *refn, Eina_Strbuf *wbuf, Eina_Bool use_legacy) Eina_Stringshare *bname = eina_stringshare_add_length(refn, sfx - refn); - const Eolian_Type *tp = eolian_type_struct_get_by_name(bname); + const Eolian_Typedecl *tp = eolian_typedecl_struct_get_by_name(bname); if (tp) { - if (!eolian_type_struct_field_get(tp, sfx + 1)) + if (!eolian_typedecl_struct_field_get(tp, sfx + 1)) { eina_stringshare_del(bname); goto noref; @@ -56,17 +56,17 @@ _generate_ref(const char *refn, Eina_Strbuf *wbuf, Eina_Bool use_legacy) return; } - tp = eolian_type_enum_get_by_name(bname); + tp = eolian_typedecl_enum_get_by_name(bname); if (tp) { - const Eolian_Enum_Type_Field *efl = eolian_type_enum_field_get(tp, sfx + 1); + const Eolian_Enum_Type_Field *efl = eolian_typedecl_enum_field_get(tp, sfx + 1); if (!efl) { eina_stringshare_del(bname); goto noref; } _generate_ref(bname, wbuf, use_legacy); - Eina_Stringshare *str = eolian_type_enum_field_c_name_get(efl); + Eina_Stringshare *str = eolian_typedecl_enum_field_c_name_get(efl); eina_strbuf_append_char(wbuf, '.'); eina_strbuf_append(wbuf, str); eina_stringshare_del(str); diff --git a/src/bin/eolian/types_generator.c b/src/bin/eolian/types_generator.c index 32864fded7..adea8196c2 100644 --- a/src/bin/eolian/types_generator.c +++ b/src/bin/eolian/types_generator.c @@ -12,16 +12,16 @@ #include "common_funcs.h" static char * -_concat_name(const Eolian_Type *tp) +_concat_name(const Eolian_Typedecl *tp) { const char *name; char *str = NULL; Eina_Strbuf *buf = eina_strbuf_new(); - Eina_Iterator *itr = eolian_type_namespaces_get(tp); + Eina_Iterator *itr = eolian_typedecl_namespaces_get(tp); EINA_ITERATOR_FOREACH(itr, name) if (name) eina_strbuf_append_printf(buf, "%s_", name); eina_iterator_free(itr); - name = eolian_type_name_get(tp); + name = eolian_typedecl_name_get(tp); if (name) eina_strbuf_append_printf(buf, "%s", name); if (eina_strbuf_length_get(buf)) { @@ -34,51 +34,51 @@ _concat_name(const Eolian_Type *tp) } static Eina_Strbuf * -_type_generate(const Eolian_Type *tp, Eina_Bool full, Eina_Bool use_legacy) +_type_generate(const Eolian_Typedecl *tp, Eina_Bool full, Eina_Bool use_legacy) { - char *grp = strdup(eolian_type_full_name_get(tp)); + char *grp = strdup(eolian_typedecl_full_name_get(tp)); char *p = strrchr(grp, '.'); if (p) *p = '\0'; - Eina_Strbuf *buf = docs_generate_full(eolian_type_documentation_get(tp), + Eina_Strbuf *buf = docs_generate_full(eolian_typedecl_documentation_get(tp), grp, 0, use_legacy); free(grp); if (!buf) buf = eina_strbuf_new(); else eina_strbuf_append_char(buf, '\n'); - Eolian_Type_Type tp_type = eolian_type_type_get(tp); + Eolian_Typedecl_Type tp_type = eolian_typedecl_type_get(tp); switch(tp_type) { - case EOLIAN_TYPE_ALIAS: + case EOLIAN_TYPEDECL_ALIAS: { char *name = _concat_name(tp); Eina_Stringshare *c_type = eolian_type_c_type_named_get( - eolian_type_base_type_get(tp), name); + eolian_typedecl_base_type_get(tp), name); eina_strbuf_append_printf(buf, "typedef %s", c_type); eina_stringshare_del(c_type); free(name); break; } - case EOLIAN_TYPE_STRUCT: - case EOLIAN_TYPE_STRUCT_OPAQUE: + case EOLIAN_TYPEDECL_STRUCT: + case EOLIAN_TYPEDECL_STRUCT_OPAQUE: { const Eolian_Struct_Type_Field *member; char *name = _concat_name(tp); - if (tp_type == EOLIAN_TYPE_STRUCT_OPAQUE || !full) + if (tp_type == EOLIAN_TYPEDECL_STRUCT_OPAQUE || !full) { eina_strbuf_append_printf(buf, "typedef struct _%s %s", name, name); free(name); break; } eina_strbuf_append_printf(buf, "typedef struct _%s\n{\n", name); - Eina_Iterator *members = eolian_type_struct_fields_get(tp); + Eina_Iterator *members = eolian_typedecl_struct_fields_get(tp); EINA_ITERATOR_FOREACH(members, member) { - const Eolian_Type *type = eolian_type_struct_field_type_get(member); + const Eolian_Type *type = eolian_typedecl_struct_field_type_get(member); Eina_Stringshare *c_type = eolian_type_c_type_get(type); eina_strbuf_append_printf(buf, " %s%s%s;", c_type, strchr(c_type, '*')?"":" ", - eolian_type_struct_field_name_get(member)); + eolian_typedecl_struct_field_name_get(member)); const Eolian_Documentation *fdoc - = eolian_type_struct_field_documentation_get(member); + = eolian_typedecl_struct_field_documentation_get(member); if (fdoc) { const char *nl = strrchr(eina_strbuf_string_get(buf), '\n'); @@ -98,7 +98,7 @@ _type_generate(const Eolian_Type *tp, Eina_Bool full, Eina_Bool use_legacy) free(name); break; } - case EOLIAN_TYPE_ENUM: + case EOLIAN_TYPEDECL_ENUM: { const Eolian_Enum_Type_Field *member; char *name; @@ -107,18 +107,18 @@ _type_generate(const Eolian_Type *tp, Eina_Bool full, Eina_Bool use_legacy) name = _concat_name(tp); char *pre = NULL; eina_strbuf_append_printf(buf, "typedef enum\n{\n"); - if (eolian_type_enum_legacy_prefix_get(tp)) - pre = strdup(eolian_type_enum_legacy_prefix_get(tp)); + if (eolian_typedecl_enum_legacy_prefix_get(tp)) + pre = strdup(eolian_typedecl_enum_legacy_prefix_get(tp)); else pre = strdup(name); eina_str_toupper(&pre); - Eina_Iterator *members = eolian_type_enum_fields_get(tp); + Eina_Iterator *members = eolian_typedecl_enum_fields_get(tp); Eina_Bool next = eina_iterator_next(members, (void**)&member); Eina_Strbuf *membuf = eina_strbuf_new(); while (next) { - const Eolian_Expression *value = eolian_type_enum_field_value_get(member, EINA_FALSE); - char *memb_u = strdup(eolian_type_enum_field_name_get(member)); + const Eolian_Expression *value = eolian_typedecl_enum_field_value_get(member, EINA_FALSE); + char *memb_u = strdup(eolian_typedecl_enum_field_name_get(member)); eina_str_toupper(&memb_u); eina_strbuf_reset(membuf); eina_strbuf_append(membuf, pre); @@ -141,7 +141,7 @@ _type_generate(const Eolian_Type *tp, Eina_Bool full, Eina_Bool use_legacy) eina_stringshare_del(lit); } const Eolian_Documentation *fdoc - = eolian_type_enum_field_documentation_get(member); + = eolian_typedecl_enum_field_documentation_get(member); next = eina_iterator_next(members, (void**)&member); if (next) eina_strbuf_append(buf, ","); @@ -191,13 +191,13 @@ types_header_generate(const char *eo_filename, Eina_Strbuf *buf, Eina_Bool full, if (dt == EOLIAN_DECL_ENUM && !full) continue; - const Eolian_Type *tp = eolian_declaration_data_type_get(decl); - if (!tp || eolian_type_is_extern(tp)) + const Eolian_Typedecl *tp = eolian_declaration_data_type_get(decl); + if (!tp || eolian_typedecl_is_extern(tp)) continue; - if (eolian_type_type_get(tp) == EOLIAN_TYPE_ALIAS) + if (eolian_typedecl_type_get(tp) == EOLIAN_TYPEDECL_ALIAS) { - const Eolian_Type *btp = eolian_type_base_type_get(tp); + const Eolian_Type *btp = eolian_typedecl_base_type_get(tp); if (eolian_type_type_get(btp) == EOLIAN_TYPE_UNDEFINED) continue; } diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 50c0f7c7f7..bbecbce9d2 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -1543,6 +1543,7 @@ EAPI Eina_Stringshare *eolian_typedecl_file_get(const Eolian_Typedecl *tp); */ EAPI const Eolian_Type *eolian_type_base_type_get(const Eolian_Type *tp); EAPI const Eolian_Type *eolian_typedecl_base_type_get(const Eolian_Typedecl *tp); +EAPI const Eolian_Typedecl *eolian_type_typedecl_get(const Eolian_Type *tp); /* * @brief Get the lowest base type of an alias stack. @@ -2049,7 +2050,7 @@ EAPI const Eolian_Class *eolian_declaration_class_get(const Eolian_Declaration * * * @ingroup Eolian */ -EAPI const Eolian_Type *eolian_declaration_data_type_get(const Eolian_Declaration *decl); +EAPI const Eolian_Typedecl *eolian_declaration_data_type_get(const Eolian_Declaration *decl); /* * @brief Get the variable of a variable (constant, global) declaration. diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 2166a62212..fc24d9beb9 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -95,36 +95,40 @@ void database_type_add(Eolian_Type *def) { def->decl = _typedecl_add(def); + def->decl->type = EOLIAN_TYPEDECL_ALIAS; 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)); eina_hash_set(_aliasesd, def->base.file, eina_list_append ((Eina_List*)eina_hash_find(_aliasesd, def->base.file), def->decl)); - database_decl_add(def->full_name, EOLIAN_DECL_ALIAS, def->base.file, def); + database_decl_add(def->full_name, EOLIAN_DECL_ALIAS, def->base.file, def->decl); } void database_struct_add(Eolian_Type *tp) { tp->decl = _typedecl_add(tp); + tp->decl->type = (tp->type == EOLIAN_TYPE_STRUCT_OPAQUE) ? EOLIAN_TYPEDECL_STRUCT_OPAQUE + : EOLIAN_TYPEDECL_STRUCT; 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)); eina_hash_set(_structsd, tp->base.file, eina_list_append ((Eina_List*)eina_hash_find(_structsd, tp->base.file), tp->decl)); - database_decl_add(tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, tp); + database_decl_add(tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, tp->decl); } void database_enum_add(Eolian_Type *tp) { tp->decl = _typedecl_add(tp); + tp->decl->type = EOLIAN_TYPEDECL_ENUM; 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)); eina_hash_set(_enumsd, tp->base.file, eina_list_append ((Eina_List*)eina_hash_find(_enumsd, tp->base.file), tp->decl)); - database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp); + database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp->decl); } static void diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index db0e09c7ca..79df964a5f 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -372,13 +372,33 @@ eolian_type_base_type_get(const Eolian_Type *tp) Eolian_Declaration *decl = eina_hash_find(_decls, tp->full_name); if (decl && decl->type != EOLIAN_DECL_CLASS && decl->type != EOLIAN_DECL_VAR) - return decl->data; + return ((const Eolian_Typedecl *)decl->data)->parent; } return NULL; } return tp->base_type; } +EAPI const Eolian_Typedecl * +eolian_type_typedecl_get(const Eolian_Type *tp) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); + if (eolian_type_type_get(tp) != EOLIAN_TYPE_REGULAR) + return NULL; + /* try looking up if it belongs to a struct, enum or an alias... otherwise + * return NULL, but first check for builtins + */ + int kw = eo_lexer_keyword_str_to_id(tp->full_name); + if (!kw || kw < KW_byte || kw >= KW_true) + { + Eolian_Declaration *decl = eina_hash_find(_decls, tp->full_name); + if (decl && decl->type != EOLIAN_DECL_CLASS + && decl->type != EOLIAN_DECL_VAR) + return decl->data; + } + return NULL; +} + EAPI const Eolian_Type * eolian_typedecl_base_type_get(const Eolian_Typedecl *tp) { diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index a9bcd97968..f957bd46c1 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -165,14 +165,14 @@ eolian_declaration_class_get(const Eolian_Declaration *decl) return (const Eolian_Class *)decl->data; } -EAPI const Eolian_Type * +EAPI const Eolian_Typedecl * eolian_declaration_data_type_get(const Eolian_Declaration *decl) { EINA_SAFETY_ON_NULL_RETURN_VAL(decl, NULL); EINA_SAFETY_ON_FALSE_RETURN_VAL(decl->type == EOLIAN_DECL_ALIAS || decl->type == EOLIAN_DECL_STRUCT || decl->type == EOLIAN_DECL_ENUM, NULL); - return (const Eolian_Type *)decl->data; + return (const Eolian_Typedecl *)decl->data; } diff --git a/src/tests/eolian/eolian_parsing.c b/src/tests/eolian/eolian_parsing.c index feec478cd9..13e93bbf45 100644 --- a/src/tests/eolian/eolian_parsing.c +++ b/src/tests/eolian/eolian_parsing.c @@ -346,7 +346,8 @@ END_TEST START_TEST(eolian_typedef) { - const Eolian_Type *atype = NULL, *type = NULL; + const Eolian_Type *type = NULL; + const Eolian_Typedecl *tdl = NULL; const char *type_name = NULL; Eina_Iterator *iter = NULL; const Eolian_Class *class; @@ -361,14 +362,14 @@ START_TEST(eolian_typedef) fail_if(!eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)); /* Basic type */ - fail_if(!(atype = eolian_type_alias_get_by_name("Evas.Coord"))); - fail_if(eolian_type_type_get(atype) != EOLIAN_TYPE_ALIAS); - fail_if(!(type_name = eolian_type_name_get(atype))); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Evas.Coord"))); + fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_ALIAS); + fail_if(!(type_name = eolian_typedecl_name_get(tdl))); fail_if(strcmp(type_name, "Coord")); - fail_if(!(type_name = eolian_type_c_type_get(atype))); + fail_if(!(type_name = eolian_typedecl_c_type_get(tdl))); fail_if(strcmp(type_name, "typedef int Evas_Coord")); eina_stringshare_del(type_name); - fail_if(!(type = eolian_type_base_type_get(atype))); + fail_if(!(type = eolian_typedecl_base_type_get(tdl))); fail_if(!(type_name = eolian_type_name_get(type))); fail_if(eolian_type_is_own(type)); fail_if(eolian_type_is_const(type)); @@ -376,19 +377,19 @@ START_TEST(eolian_typedef) fail_if(strcmp(type_name, "int")); /* File */ - fail_if(!(file = eolian_type_file_get(atype))); + fail_if(!(file = eolian_typedecl_file_get(tdl))); fail_if(strcmp(file, "typedef.eo")); /* Lowest alias base */ - fail_if(!(atype = eolian_type_alias_get_by_name("Evas.Coord3"))); - fail_if(!(atype = eolian_type_aliased_base_get(atype))); - fail_if(strcmp(eolian_type_name_get(atype), "int")); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Evas.Coord3"))); + fail_if(!(type = eolian_typedecl_aliased_base_get(tdl))); + fail_if(strcmp(eolian_type_name_get(type), "int")); /* Complex type */ - fail_if(!(atype = eolian_type_alias_get_by_name("List_Objects"))); - fail_if(!(type_name = eolian_type_name_get(atype))); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("List_Objects"))); + fail_if(!(type_name = eolian_typedecl_name_get(tdl))); fail_if(strcmp(type_name, "List_Objects")); - fail_if(!(type = eolian_type_base_type_get(atype))); + fail_if(!(type = eolian_typedecl_base_type_get(tdl))); fail_if(!(type_name = eolian_type_c_type_get(type))); fail_if(!eolian_type_is_own(type)); fail_if(strcmp(type_name, "Eina_List *")); @@ -403,21 +404,21 @@ START_TEST(eolian_typedef) eina_iterator_free(iter); /* List */ - fail_if(!(iter = eolian_type_aliases_get_by_file("typedef.eo"))); - fail_if(!eina_iterator_next(iter, (void**)&atype)); - fail_if(!(type_name = eolian_type_name_get(atype))); + fail_if(!(iter = eolian_typedecl_aliases_get_by_file("typedef.eo"))); + fail_if(!eina_iterator_next(iter, (void**)&tdl)); + fail_if(!(type_name = eolian_typedecl_name_get(tdl))); fail_if(strcmp(type_name, "Coord")); - fail_if(!eina_iterator_next(iter, (void**)&atype)); - fail_if(!(type_name = eolian_type_name_get(atype))); + fail_if(!eina_iterator_next(iter, (void**)&tdl)); + fail_if(!(type_name = eolian_typedecl_name_get(tdl))); fail_if(strcmp(type_name, "List_Objects")); /* coord2 and coord3, skip */ - fail_if(!eina_iterator_next(iter, (void**)&atype)); - fail_if(!eina_iterator_next(iter, (void**)&atype)); + fail_if(!eina_iterator_next(iter, (void**)&tdl)); + fail_if(!eina_iterator_next(iter, (void**)&tdl)); /* not generated extern, skip */ - fail_if(!eina_iterator_next(iter, (void**)&atype)); + fail_if(!eina_iterator_next(iter, (void**)&tdl)); /* not generated undefined type, skip */ - fail_if(!eina_iterator_next(iter, (void**)&atype)); - fail_if(eina_iterator_next(iter, (void**)&atype)); + fail_if(!eina_iterator_next(iter, (void**)&tdl)); + fail_if(eina_iterator_next(iter, (void**)&tdl)); eolian_shutdown(); } @@ -664,6 +665,7 @@ START_TEST(eolian_struct) { const Eolian_Struct_Type_Field *field = NULL; const Eolian_Type *type = NULL, *ftype = NULL; + const Eolian_Typedecl *tdl = NULL; const Eolian_Class *class; const Eolian_Function *func; const char *type_name; @@ -679,42 +681,40 @@ START_TEST(eolian_struct) fail_if(!eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)); /* named struct */ - fail_if(!(type = eolian_type_struct_get_by_name("Named"))); - fail_if(!(type_name = eolian_type_name_get(type))); - fail_if(!(file = eolian_type_file_get(type))); - fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_STRUCT); - fail_if(eolian_type_is_own(type)); - fail_if(eolian_type_is_const(type)); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Named"))); + fail_if(!(type_name = eolian_typedecl_name_get(tdl))); + fail_if(!(file = eolian_typedecl_file_get(tdl))); + fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_STRUCT); fail_if(strcmp(type_name, "Named")); fail_if(strcmp(file, "struct.eo")); - fail_if(!(field = eolian_type_struct_field_get(type, "field"))); - fail_if(!(ftype = eolian_type_struct_field_type_get(field))); + fail_if(!(field = eolian_typedecl_struct_field_get(tdl, "field"))); + fail_if(!(ftype = eolian_typedecl_struct_field_type_get(field))); fail_if(!(type_name = eolian_type_name_get(ftype))); fail_if(strcmp(type_name, "int")); - fail_if(!(field = eolian_type_struct_field_get(type, "something"))); - fail_if(!(ftype = eolian_type_struct_field_type_get(field))); + fail_if(!(field = eolian_typedecl_struct_field_get(tdl, "something"))); + fail_if(!(ftype = eolian_typedecl_struct_field_type_get(field))); fail_if(!(type_name = eolian_type_c_type_get(ftype))); fail_if(strcmp(type_name, "const char *")); eina_stringshare_del(type_name); /* referencing */ - fail_if(!(type = eolian_type_struct_get_by_name("Another"))); - fail_if(!(type_name = eolian_type_name_get(type))); - fail_if(!(file = eolian_type_file_get(type))); - fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_STRUCT); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Another"))); + fail_if(!(type_name = eolian_typedecl_name_get(tdl))); + fail_if(!(file = eolian_typedecl_file_get(tdl))); + fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_STRUCT); fail_if(strcmp(type_name, "Another")); fail_if(strcmp(file, "struct.eo")); - fail_if(!(field = eolian_type_struct_field_get(type, "field"))); - fail_if(!(ftype = eolian_type_struct_field_type_get(field))); + fail_if(!(field = eolian_typedecl_struct_field_get(tdl, "field"))); + fail_if(!(ftype = eolian_typedecl_struct_field_type_get(field))); fail_if(!(type_name = eolian_type_name_get(ftype))); fail_if(strcmp(type_name, "Named")); fail_if(eolian_type_type_get(ftype) != EOLIAN_TYPE_REGULAR); - fail_if(eolian_type_type_get(eolian_type_base_type_get(ftype)) - != EOLIAN_TYPE_STRUCT); + fail_if(eolian_typedecl_type_get(eolian_type_typedecl_get(ftype)) + != EOLIAN_TYPEDECL_STRUCT); /* opaque struct */ - fail_if(!(type = eolian_type_struct_get_by_name("Opaque"))); - fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_STRUCT_OPAQUE); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Opaque"))); + fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_STRUCT_OPAQUE); /* use in function */ fail_if(!(func = eolian_class_function_get_by_name(class, "bar", EOLIAN_METHOD))); @@ -722,8 +722,8 @@ START_TEST(eolian_struct) fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_POINTER); fail_if(!(type = eolian_type_base_type_get(type))); fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_REGULAR); - fail_if(!(type = eolian_type_base_type_get(type))); - fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_STRUCT); + fail_if(!(tdl = eolian_type_typedecl_get(type))); + fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_STRUCT); eolian_shutdown(); } @@ -731,7 +731,7 @@ END_TEST START_TEST(eolian_extern) { - const Eolian_Type *type = NULL; + const Eolian_Typedecl *tdl = NULL; const Eolian_Class *class; eolian_init(); @@ -744,20 +744,20 @@ START_TEST(eolian_extern) fail_if(!eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)); /* regular type */ - fail_if(!(type = eolian_type_alias_get_by_name("Foo"))); - fail_if(eolian_type_is_extern(type)); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Foo"))); + fail_if(eolian_typedecl_is_extern(tdl)); /* extern type */ - fail_if(!(type = eolian_type_alias_get_by_name("Evas.Coord"))); - fail_if(!eolian_type_is_extern(type)); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Evas.Coord"))); + fail_if(!eolian_typedecl_is_extern(tdl)); /* regular struct */ - fail_if(!(type = eolian_type_struct_get_by_name("X"))); - fail_if(eolian_type_is_extern(type)); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("X"))); + fail_if(eolian_typedecl_is_extern(tdl)); /* extern struct */ - fail_if(!(type = eolian_type_struct_get_by_name("Y"))); - fail_if(!eolian_type_is_extern(type)); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Y"))); + fail_if(!eolian_typedecl_is_extern(tdl)); eolian_shutdown(); } @@ -831,6 +831,7 @@ START_TEST(eolian_enum) { const Eolian_Enum_Type_Field *field = NULL; const Eolian_Variable *var = NULL; + const Eolian_Typedecl *tdl = NULL; const Eolian_Type *type = NULL; const Eolian_Class *class; const Eolian_Expression *exp; @@ -847,60 +848,60 @@ START_TEST(eolian_enum) fail_if(!(class = eolian_class_get_by_name("Enum"))); fail_if(!eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)); - fail_if(!(type = eolian_type_enum_get_by_name("Foo"))); + fail_if(!(tdl = eolian_typedecl_enum_get_by_name("Foo"))); - fail_if(!(field = eolian_type_enum_field_get(type, "first"))); - fail_if(!(exp = eolian_type_enum_field_value_get(field, EINA_FALSE))); + fail_if(!(field = eolian_typedecl_enum_field_get(tdl, "first"))); + fail_if(!(exp = eolian_typedecl_enum_field_value_get(field, EINA_FALSE))); v = eolian_expression_eval(exp, EOLIAN_MASK_ALL); fail_if(v.type != EOLIAN_EXPR_INT); fail_if(v.value.i != 0); - fail_if(!(field = eolian_type_enum_field_get(type, "bar"))); - fail_if(eolian_type_enum_field_value_get(field, EINA_FALSE)); + fail_if(!(field = eolian_typedecl_enum_field_get(tdl, "bar"))); + fail_if(eolian_typedecl_enum_field_value_get(field, EINA_FALSE)); - fail_if(!(field = eolian_type_enum_field_get(type, "baz"))); - fail_if(!(exp = eolian_type_enum_field_value_get(field, EINA_FALSE))); + fail_if(!(field = eolian_typedecl_enum_field_get(tdl, "baz"))); + fail_if(!(exp = eolian_typedecl_enum_field_value_get(field, EINA_FALSE))); v = eolian_expression_eval(exp, EOLIAN_MASK_ALL); fail_if(v.type != EOLIAN_EXPR_INT); fail_if(v.value.i != 15); - fail_if(!(type = eolian_type_enum_get_by_name("Bar"))); - fail_if(strcmp(eolian_type_enum_legacy_prefix_get(type), "test")); + fail_if(!(tdl = eolian_typedecl_enum_get_by_name("Bar"))); + fail_if(strcmp(eolian_typedecl_enum_legacy_prefix_get(tdl), "test")); - fail_if(!(field = eolian_type_enum_field_get(type, "foo"))); - fail_if(!(exp = eolian_type_enum_field_value_get(field, EINA_FALSE))); + fail_if(!(field = eolian_typedecl_enum_field_get(tdl, "foo"))); + fail_if(!(exp = eolian_typedecl_enum_field_value_get(field, EINA_FALSE))); v = eolian_expression_eval(exp, EOLIAN_MASK_ALL); fail_if(v.type != EOLIAN_EXPR_INT); fail_if(v.value.i != 15); - cname = eolian_type_enum_field_c_name_get(field); + cname = eolian_typedecl_enum_field_c_name_get(field); fail_if(strcmp(cname, "TEST_FOO")); eina_stringshare_del(cname); - fail_if(!(type = eolian_type_enum_get_by_name("Baz"))); + fail_if(!(tdl = eolian_typedecl_enum_get_by_name("Baz"))); - fail_if(!(field = eolian_type_enum_field_get(type, "flag1"))); - fail_if(!(exp = eolian_type_enum_field_value_get(field, EINA_FALSE))); + fail_if(!(field = eolian_typedecl_enum_field_get(tdl, "flag1"))); + fail_if(!(exp = eolian_typedecl_enum_field_value_get(field, EINA_FALSE))); v = eolian_expression_eval(exp, EOLIAN_MASK_ALL); fail_if(v.type != EOLIAN_EXPR_INT); fail_if(v.value.i != (1 << 0)); - fail_if(!(field = eolian_type_enum_field_get(type, "flag2"))); - fail_if(!(exp = eolian_type_enum_field_value_get(field, EINA_FALSE))); + fail_if(!(field = eolian_typedecl_enum_field_get(tdl, "flag2"))); + fail_if(!(exp = eolian_typedecl_enum_field_value_get(field, EINA_FALSE))); v = eolian_expression_eval(exp, EOLIAN_MASK_ALL); fail_if(v.type != EOLIAN_EXPR_INT); fail_if(v.value.i != (1 << 1)); - fail_if(!(field = eolian_type_enum_field_get(type, "flag3"))); - fail_if(!(exp = eolian_type_enum_field_value_get(field, EINA_FALSE))); + fail_if(!(field = eolian_typedecl_enum_field_get(tdl, "flag3"))); + fail_if(!(exp = eolian_typedecl_enum_field_value_get(field, EINA_FALSE))); v = eolian_expression_eval(exp, EOLIAN_MASK_ALL); fail_if(v.type != EOLIAN_EXPR_INT); fail_if(v.value.i != (1 << 2)); - fail_if(!(type = eolian_type_enum_get_by_name("Name.Spaced"))); - fail_if(!(field = eolian_type_enum_field_get(type, "pants"))); + fail_if(!(tdl = eolian_typedecl_enum_get_by_name("Name.Spaced"))); + fail_if(!(field = eolian_typedecl_enum_field_get(tdl, "pants"))); - cname = eolian_type_enum_field_c_name_get(field); + cname = eolian_typedecl_enum_field_c_name_get(field); fail_if(strcmp(cname, "NAME_SPACED_PANTS")); eina_stringshare_del(cname); @@ -963,6 +964,7 @@ END_TEST START_TEST(eolian_free_func) { const Eolian_Class *class; + const Eolian_Typedecl *tdl; const Eolian_Type *type; eolian_init(); @@ -975,29 +977,29 @@ START_TEST(eolian_free_func) fail_if(!eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)); /* regular struct */ - fail_if(!(type = eolian_type_struct_get_by_name("Named1"))); - fail_if(eolian_type_free_func_get(type)); - fail_if(!(type = eolian_type_struct_get_by_name("Named2"))); - fail_if(strcmp(eolian_type_free_func_get(type), "test_free")); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Named1"))); + fail_if(eolian_typedecl_free_func_get(tdl)); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Named2"))); + fail_if(strcmp(eolian_typedecl_free_func_get(tdl), "test_free")); /* typedef */ - fail_if(!(type = eolian_type_alias_get_by_name("Typedef1"))); - fail_if(eolian_type_free_func_get(type)); - fail_if(!(type = eolian_type_alias_get_by_name("Typedef2"))); - fail_if(strcmp(eolian_type_free_func_get(type), "def_free")); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Typedef1"))); + fail_if(eolian_typedecl_free_func_get(tdl)); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Typedef2"))); + fail_if(strcmp(eolian_typedecl_free_func_get(tdl), "def_free")); /* opaque struct */ - fail_if(!(type = eolian_type_struct_get_by_name("Opaque1"))); - fail_if(eolian_type_free_func_get(type)); - fail_if(!(type = eolian_type_struct_get_by_name("Opaque2"))); - fail_if(strcmp(eolian_type_free_func_get(type), "opaque_free")); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Opaque1"))); + fail_if(eolian_typedecl_free_func_get(tdl)); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Opaque2"))); + fail_if(strcmp(eolian_typedecl_free_func_get(tdl), "opaque_free")); /* pointer */ - fail_if(!(type = eolian_type_alias_get_by_name("Pointer1"))); - fail_if(!(type = eolian_type_base_type_get(type))); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Pointer1"))); + fail_if(!(type = eolian_typedecl_base_type_get(tdl))); fail_if(eolian_type_free_func_get(type)); - fail_if(!(type = eolian_type_alias_get_by_name("Pointer2"))); - fail_if(!(type = eolian_type_base_type_get(type))); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Pointer2"))); + fail_if(!(type = eolian_typedecl_base_type_get(tdl))); fail_if(strcmp(eolian_type_free_func_get(type), "ptr_free")); eolian_shutdown(); @@ -1055,7 +1057,7 @@ END_TEST START_TEST(eolian_import) { const Eolian_Class *class; - const Eolian_Type *type; + const Eolian_Typedecl *tdl; eolian_init(); @@ -1064,11 +1066,11 @@ START_TEST(eolian_import) fail_if(!eolian_file_parse(PACKAGE_DATA_DIR"/data/import.eo")); fail_if(!(class = eolian_class_get_by_name("Import"))); - fail_if(!(type = eolian_type_alias_get_by_name("Imported"))); - fail_if(strcmp(eolian_type_file_get(type), "import_types.eot")); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Imported"))); + fail_if(strcmp(eolian_typedecl_file_get(tdl), "import_types.eot")); - fail_if(!(type = eolian_type_struct_get_by_name("Imported_Struct"))); - fail_if(strcmp(eolian_type_file_get(type), "import_types.eot")); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Imported_Struct"))); + fail_if(strcmp(eolian_typedecl_file_get(tdl), "import_types.eot")); eolian_shutdown(); } @@ -1077,7 +1079,7 @@ END_TEST START_TEST(eolian_decl) { const Eolian_Declaration *decl; - const Eolian_Type *type; + const Eolian_Typedecl *tdl; const Eolian_Class *class; const Eolian_Variable *var; Eina_Iterator *itr; @@ -1094,23 +1096,23 @@ START_TEST(eolian_decl) fail_if(!eina_iterator_next(itr, (void**)&decl)); fail_if(eolian_declaration_type_get(decl) != EOLIAN_DECL_STRUCT); fail_if(strcmp(eolian_declaration_name_get(decl), "A")); - fail_if(!(type = eolian_declaration_data_type_get(decl))); - fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_STRUCT); - fail_if(strcmp(eolian_type_name_get(type), "A")); + fail_if(!(tdl = eolian_declaration_data_type_get(decl))); + fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_STRUCT); + fail_if(strcmp(eolian_typedecl_name_get(tdl), "A")); fail_if(!eina_iterator_next(itr, (void**)&decl)); fail_if(eolian_declaration_type_get(decl) != EOLIAN_DECL_ENUM); fail_if(strcmp(eolian_declaration_name_get(decl), "B")); - fail_if(!(type = eolian_declaration_data_type_get(decl))); - fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_ENUM); - fail_if(strcmp(eolian_type_name_get(type), "B")); + fail_if(!(tdl = eolian_declaration_data_type_get(decl))); + fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_ENUM); + fail_if(strcmp(eolian_typedecl_name_get(tdl), "B")); fail_if(!eina_iterator_next(itr, (void**)&decl)); fail_if(eolian_declaration_type_get(decl) != EOLIAN_DECL_ALIAS); fail_if(strcmp(eolian_declaration_name_get(decl), "C")); - fail_if(!(type = eolian_declaration_data_type_get(decl))); - fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_ALIAS); - fail_if(strcmp(eolian_type_name_get(type), "C")); + fail_if(!(tdl = eolian_declaration_data_type_get(decl))); + fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_ALIAS); + fail_if(strcmp(eolian_typedecl_name_get(tdl), "C")); fail_if(!eina_iterator_next(itr, (void**)&decl)); fail_if(eolian_declaration_type_get(decl) != EOLIAN_DECL_VAR); @@ -1137,7 +1139,7 @@ END_TEST START_TEST(eolian_docs) { - const Eolian_Type *type; + const Eolian_Typedecl *tdl; const Eolian_Class *class; const Eolian_Event *event; const Eolian_Variable *var; @@ -1154,8 +1156,8 @@ START_TEST(eolian_docs) fail_if(!eolian_file_parse(PACKAGE_DATA_DIR"/data/docs.eo")); - fail_if(!(type = eolian_type_struct_get_by_name("Foo"))); - fail_if(!(doc = eolian_type_documentation_get(type))); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Foo"))); + fail_if(!(doc = eolian_typedecl_documentation_get(tdl))); fail_if(strcmp(eolian_documentation_summary_get(doc), "This is struct Foo. It does stuff.")); fail_if(strcmp(eolian_documentation_description_get(doc), @@ -1167,45 +1169,45 @@ START_TEST(eolian_docs) fail_if(strcmp(eolian_documentation_since_get(doc), "1.66")); - fail_if(!(sfl = eolian_type_struct_field_get(type, "field1"))); - fail_if(!(doc = eolian_type_struct_field_documentation_get(sfl))); + fail_if(!(sfl = eolian_typedecl_struct_field_get(tdl, "field1"))); + fail_if(!(doc = eolian_typedecl_struct_field_documentation_get(sfl))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Field documentation.")); fail_if(eolian_documentation_description_get(doc)); - fail_if(!(sfl = eolian_type_struct_field_get(type, "field2"))); - fail_if(eolian_type_struct_field_documentation_get(sfl)); + fail_if(!(sfl = eolian_typedecl_struct_field_get(tdl, "field2"))); + fail_if(eolian_typedecl_struct_field_documentation_get(sfl)); - fail_if(!(sfl = eolian_type_struct_field_get(type, "field3"))); - fail_if(!(doc = eolian_type_struct_field_documentation_get(sfl))); + fail_if(!(sfl = eolian_typedecl_struct_field_get(tdl, "field3"))); + fail_if(!(doc = eolian_typedecl_struct_field_documentation_get(sfl))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Another field documentation.")); fail_if(eolian_documentation_description_get(doc)); - fail_if(!(type = eolian_type_enum_get_by_name("Bar"))); - fail_if(!(doc = eolian_type_documentation_get(type))); + fail_if(!(tdl = eolian_typedecl_enum_get_by_name("Bar"))); + fail_if(!(doc = eolian_typedecl_documentation_get(tdl))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Docs for enum Bar.")); fail_if(eolian_documentation_description_get(doc)); fail_if(eolian_documentation_since_get(doc)); - fail_if(!(efl = eolian_type_enum_field_get(type, "blah"))); - fail_if(eolian_type_enum_field_documentation_get(efl)); + fail_if(!(efl = eolian_typedecl_enum_field_get(tdl, "blah"))); + fail_if(eolian_typedecl_enum_field_documentation_get(efl)); - fail_if(!(efl = eolian_type_enum_field_get(type, "foo"))); - fail_if(!(doc = eolian_type_enum_field_documentation_get(efl))); + fail_if(!(efl = eolian_typedecl_enum_field_get(tdl, "foo"))); + fail_if(!(doc = eolian_typedecl_enum_field_documentation_get(efl))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Docs for foo.")); fail_if(eolian_documentation_description_get(doc)); - fail_if(!(efl = eolian_type_enum_field_get(type, "bar"))); - fail_if(!(doc = eolian_type_enum_field_documentation_get(efl))); + fail_if(!(efl = eolian_typedecl_enum_field_get(tdl, "bar"))); + fail_if(!(doc = eolian_typedecl_enum_field_documentation_get(efl))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Docs for bar.")); fail_if(eolian_documentation_description_get(doc)); - fail_if(!(type = eolian_type_alias_get_by_name("Alias"))); - fail_if(!(doc = eolian_type_documentation_get(type))); + fail_if(!(tdl = eolian_typedecl_alias_get_by_name("Alias"))); + fail_if(!(doc = eolian_typedecl_documentation_get(tdl))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Docs for typedef.")); fail_if(strcmp(eolian_documentation_description_get(doc), @@ -1219,8 +1221,8 @@ START_TEST(eolian_docs) "Docs for var.")); fail_if(eolian_documentation_description_get(doc)); - fail_if(!(type = eolian_type_struct_get_by_name("Opaque"))); - fail_if(!(doc = eolian_type_documentation_get(type))); + fail_if(!(tdl = eolian_typedecl_struct_get_by_name("Opaque"))); + fail_if(!(doc = eolian_typedecl_documentation_get(tdl))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Opaque struct docs. See @Foo for another struct.")); fail_if(eolian_documentation_description_get(doc)); From 8614ee1e91020d0a446cb51373d2213b511db3e7 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Fri, 19 Feb 2016 17:09:34 +0000 Subject: [PATCH 14/23] elua: update eolian bindings to new typedecl api --- src/bindings/luajit/eolian.lua | 246 ++++++++++++++++++++++++--------- 1 file changed, 177 insertions(+), 69 deletions(-) diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua index 3192703f7e..f04e06a674 100644 --- a/src/bindings/luajit/eolian.lua +++ b/src/bindings/luajit/eolian.lua @@ -15,6 +15,7 @@ ffi.cdef [[ typedef struct _Eolian_Class Eolian_Class; typedef struct _Eolian_Function Eolian_Function; 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; @@ -29,7 +30,7 @@ ffi.cdef [[ typedef enum { - EOLIAN_UNRESOLVED, + EOLIAN_UNRESOLVED = 0, EOLIAN_PROPERTY, EOLIAN_PROP_SET, EOLIAN_PROP_GET, @@ -38,14 +39,14 @@ ffi.cdef [[ typedef enum { - EOLIAN_IN_PARAM, + EOLIAN_IN_PARAM = 0, EOLIAN_OUT_PARAM, EOLIAN_INOUT_PARAM } Eolian_Parameter_Dir; typedef enum { - EOLIAN_CLASS_UNKNOWN_TYPE, + EOLIAN_CLASS_UNKNOWN_TYPE = 0, EOLIAN_CLASS_REGULAR, EOLIAN_CLASS_ABSTRACT, EOLIAN_CLASS_MIXIN, @@ -54,10 +55,18 @@ ffi.cdef [[ typedef enum { - EOLIAN_SCOPE_PUBLIC, + EOLIAN_SCOPE_PUBLIC = 0, 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_Type; + typedef enum { EOLIAN_TYPE_UNKNOWN_TYPE, @@ -232,7 +241,6 @@ ffi.cdef [[ const Eolian_Documentation *eolian_function_return_documentation_get(const Eolian_Function *foo_id, Eolian_Function_Type ftype); Eina_Bool eolian_function_return_is_warn_unused(const Eolian_Function *foo_id, Eolian_Function_Type ftype); Eina_Bool eolian_function_object_is_const(const Eolian_Function *function_id); - Eina_Bool eolian_type_is_extern(const Eolian_Type *tp); const char *eolian_implement_full_name_get(const Eolian_Implement *impl); const Eolian_Class *eolian_implement_class_get(const Eolian_Implement *impl); const Eolian_Function *eolian_implement_function_get(const Eolian_Implement *impl, Eolian_Function_Type *func_type); @@ -258,40 +266,68 @@ ffi.cdef [[ 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); - const Eolian_Type *eolian_type_alias_get_by_name(const char *name); - const Eolian_Type *eolian_type_struct_get_by_name(const char *name); - const Eolian_Type *eolian_type_enum_get_by_name(const char *name); - Eina_Iterator *eolian_type_aliases_get_by_file(const char *fname); - Eina_Iterator *eolian_type_structs_get_by_file(const char *fname); - Eina_Iterator *eolian_type_enums_get_by_file(const char *fname); + const Eolian_Typedecl *eolian_typedecl_alias_get_by_name(const char *name); + const Eolian_Typedecl *eolian_typedecl_struct_get_by_name(const char *name); + const Eolian_Typedecl *eolian_typedecl_enum_get_by_name(const char *name); + Eina_Iterator *eolian_typedecl_aliases_get_by_file(const char *fname); + Eina_Iterator *eolian_typedecl_structs_get_by_file(const char *fname); + Eina_Iterator *eolian_typedecl_enums_get_by_file(const char *fname); Eolian_Type_Type eolian_type_type_get(const Eolian_Type *tp); - Eina_Iterator *eolian_type_arguments_get(const Eolian_Type *tp); + Eolian_Typedecl_Type eolian_typedecl_type_get(const Eolian_Typedecl *tp); Eina_Iterator *eolian_type_subtypes_get(const Eolian_Type *tp); - Eina_Iterator *eolian_type_struct_fields_get(const Eolian_Type *tp); - const Eolian_Struct_Type_Field *eolian_type_struct_field_get(const Eolian_Type *tp, const char *field); + 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); + + /* TODO */ const char *eolian_type_struct_field_name_get(const Eolian_Struct_Type_Field *fl); const Eolian_Documentation *eolian_type_struct_field_documentation_get(const Eolian_Struct_Type_Field *fl); const Eolian_Type *eolian_type_struct_field_type_get(const Eolian_Struct_Type_Field *fl); - Eina_Iterator *eolian_type_enum_fields_get(const Eolian_Type *tp); - const Eolian_Enum_Type_Field *eolian_type_enum_field_get(const Eolian_Type *tp, const char *field); + + 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); + + /* TODO */ const char *eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl); + const char *eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl); const Eolian_Documentation *eolian_type_enum_field_documentation_get(const Eolian_Enum_Type_Field *fl); const Eolian_Expression *eolian_type_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force); - const char *eolian_type_enum_legacy_prefix_get(const Eolian_Type *tp); - const Eolian_Documentation *eolian_type_documentation_get(const Eolian_Type *tp); + + const char *eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typedecl *tp); + const Eolian_Documentation *eolian_typedecl_documentation_get(const Eolian_Typedecl *tp); const char *eolian_type_file_get(const Eolian_Type *tp); - const Eolian_Type *eolian_type_return_type_get(const Eolian_Type *tp); + const char *eolian_typedecl_file_get(const Eolian_Typedecl *tp); + const Eolian_Type *eolian_type_base_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); Eina_Bool eolian_type_is_own(const Eolian_Type *tp); Eina_Bool eolian_type_is_const(const Eolian_Type *tp); + + Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp); + const char *eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name); + const char *eolian_typedecl_c_type_named_get(const Eolian_Typedecl *tp, const char *name); + 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_type_name_get(const Eolian_Type *tp); + const char *eolian_typedecl_name_get(const Eolian_Typedecl *tp); + const char *eolian_type_full_name_get(const Eolian_Type *tp); + const char *eolian_typedecl_full_name_get(const Eolian_Typedecl *tp); + Eina_Iterator *eolian_type_namespaces_get(const Eolian_Type *tp); + Eina_Iterator *eolian_typedecl_namespaces_get(const Eolian_Typedecl *tp); + const char *eolian_type_free_func_get(const Eolian_Type *tp); + const char *eolian_typedecl_free_func_get(const Eolian_Typedecl *tp); + Eolian_Value_t eolian_expression_eval(const Eolian_Expression *expr, Eolian_Expression_Mask m); Eolian_Value_t eolian_expression_eval_type(const Eolian_Expression *expr, const Eolian_Type *type); const char *eolian_expression_value_to_literal(const Eolian_Value *v); @@ -416,20 +452,29 @@ M.declaration_type = { } M.type_type = { - UNKNOWN = 0, - VOID = 1, - REGULAR = 2, - COMPLEX = 3, - POINTER = 4, - FUNCTION = 5, - STRUCT = 6, - STRUCT_OPAQUE = 7, - ENUM = 8, - ALIAS = 9, - CLASS = 10, - UNDEFINED = 11 + UNKNOWN = 0, + VOID = 1, + REGULAR = 2, + COMPLEX = 3, + POINTER = 4, + FUNCTION = 5, + STRUCT = 6, + STRUCT_OPAQUE = 7, + ENUM = 8, + ALIAS = 9, + CLASS = 10, + UNDEFINED = 11 } +M.typedecl_type = { + UNKNOWN = 0, + STRUCT = 1, + STRUCT_OPAQUE = 2, + ENUM = 3, + ALIAS = 4 +} + +-- TODO change func sigs ffi.metatype("Eolian_Struct_Type_Field", { __index = { name_get = function(self) @@ -452,6 +497,7 @@ ffi.metatype("Eolian_Struct_Type_Field", { } }) +-- TODO change func sigs ffi.metatype("Eolian_Enum_Type_Field", { __index = { name_get = function(self) @@ -460,6 +506,12 @@ ffi.metatype("Eolian_Enum_Type_Field", { return ffi.string(v) end, + c_name_get = function(self) + local v = eolian.eolian_type_enum_field_c_name_get(self) + if v == nil then return nil end + return ffi_stringshare(v) + end, + documentation_get = function(self) local v = eolian.eolian_type_enum_field_documentation_get(self) if v == nil then return nil end @@ -474,70 +526,130 @@ ffi.metatype("Eolian_Enum_Type_Field", { } }) -M.Type = ffi.metatype("Eolian_Type", { +M.Typedecl = ffi.metatype("Eolian_Typedecl", { __index = { type_get = function(self) - return tonumber(eolian.eolian_type_type_get(self)) - end, - - arguments_get = function(self) - return Ptr_Iterator("const Eolian_Type*", - eolian.eolian_type_arguments_get(self)) - end, - - subtypes_get = function(self) - return Ptr_Iterator("const Eolian_Type*", - eolian.eolian_type_subtypes_get(self)) + return tonumber(eolian.eolian_typedecl_type_get(self)) end, struct_fields_get = function(self) return Ptr_Iterator("const Eolian_Struct_Type_Field*", - eolian.eolian_type_struct_fields_get(self)) + eolian.eolian_typedecl_struct_fields_get(self)) end, struct_field_get = function(self, name) - local v = eolian.eolian_type_struct_field_get(self, name) + local v = eolian.eolian_typedecl_struct_field_get(self, name) if v == nil then return nil end return v end, enum_fields_get = function(self) return Ptr_Iterator("const Eolian_Enum_Type_Field*", - eolian.eolian_type_enum_fields_get(self)) + eolian.eolian_typedecl_enum_fields_get(self)) end, enum_field_get = function(self, field) - local v = eolian.eolian_type_enum_field_get(self, field) + local v = eolian.eolian_typedecl_enum_field_get(self, field) if v == nil then return nil end return v end, enum_legacy_prefix_get = function(self) - local v = eolian.eolian_type_enum_legacy_prefix_get(self) + local v = eolian.eolian_typedecl_enum_legacy_prefix_get(self) if v == nil then return nil end return ffi.string(v) end, documentation_get = function(self, name) - local v = eolian.eolian_type_documentation_get(self) + local v = eolian.eolian_typedecl_documentation_get(self) if v == nil then return nil end return v end, + file_get = function(self, name) + local v = eolian.eolian_typedecl_file_get(self) + if v == nil then return nil end + return ffi.string(v) + end, + + base_type_get = function(self) + local v = eolian.eolian_typedecl_base_type_get(self) + if v == nil then return nil end + return v + end, + + aliased_base_get = function(self) + local v = eolian.eolian_typedecl_aliased_byse_get(self) + if v == nil then return nil end + return v + end, + + is_extern = function(self) + return eolian.eolian_typedecl_is_extern(self) ~= 0 + end, + + c_type_named_get = function(self, name) + local v = eolian.eolian_typedecl_c_type_named_get(self, name) + if v == nil then return nil end + return ffi_stringshare(v) + end, + + c_type_get = function(self) + local v = eolian.eolian_typedecl_c_type_get(self) + if v == nil then return nil end + return ffi_stringshare(v) + end, + + name_get = function(self) + local v = eolian.eolian_typedecl_name_get(self) + if v == nil then return nil end + return ffi.string(v) + end, + + full_name_get = function(self) + local v = eolian.eolian_typedecl_full_name_get(self) + if v == nil then return nil end + return ffi.string(v) + end, + + namespaces_get = function(self) + return iterator.String_Iterator( + eolian.eolian_typedecl_namespaces_get(self)) + end, + + free_func_get = function(self) + local v = eolian.eolian_typedecl_free_func_get(self) + if v == nil then return nil end + return ffi.string(v) + end + } +}) + +M.Type = ffi.metatype("Eolian_Type", { + __index = { + type_get = function(self) + return tonumber(eolian.eolian_type_type_get(self)) + end, + + subtypes_get = function(self) + return Ptr_Iterator("const Eolian_Type*", + eolian.eolian_type_subtypes_get(self)) + end, + file_get = function(self, name) local v = eolian.eolian_type_file_get(self) if v == nil then return nil end return ffi.string(v) end, - return_type_get = function(self) - local v = eolian.eolian_type_return_type_get(self) + base_type_get = function(self) + local v = eolian.eolian_type_base_type_get(self) if v == nil then return nil end return v end, - base_type_get = function(self) - local v = eolian.eolian_type_base_type_get(self) + typedecl_get = function(self) + local v = eolian.eolian_type_typedecl_get(self) if v == nil then return nil end return v end, @@ -562,10 +674,6 @@ M.Type = ffi.metatype("Eolian_Type", { return eolian.eolian_type_is_const(self) ~= 0 end, - is_extern = function(self) - return eolian.eolian_type_is_extern(self) ~= 0 - end, - c_type_named_get = function(self, name) local v = eolian.eolian_type_c_type_named_get(self, name) if v == nil then return nil end @@ -1002,36 +1110,36 @@ M.Class = ffi.metatype("Eolian_Class", { } }) -M.type_alias_get_by_name = function(name) - local v = eolian.eolian_type_alias_get_by_name(name) +M.typedecl_alias_get_by_name = function(name) + local v = eolian.eolian_typedecl_alias_get_by_name(name) if v == nil then return nil end return v end -M.type_struct_get_by_name = function(name) - local v = eolian.eolian_type_struct_get_by_name(name) +M.typedecl_struct_get_by_name = function(name) + local v = eolian.eolian_typedecl_struct_get_by_name(name) if v == nil then return nil end return v end -M.type_enum_get_by_name = function(name) - local v = eolian.eolian_type_enum_get_by_name(name) +M.typedecl_enum_get_by_name = function(name) + local v = eolian.eolian_typedecl_enum_get_by_name(name) if v == nil then return nil end return v end -M.type_aliases_get_by_file = function(fname) - return Ptr_Iterator("const Eolian_Type*", +M.typedecl_aliases_get_by_file = function(fname) + return Ptr_Iterator("const Eolian_Typedecl *", eolian.eolian_type_aliases_get_by_file(self)) end -M.type_structs_get_by_file = function(fname) - return Ptr_Iterator("const Eolian_Type*", +M.typedecl_structs_get_by_file = function(fname) + return Ptr_Iterator("const Eolian_Typedecl *", eolian.eolian_type_structs_get_by_file(self)) end -M.type_enums_get_by_file = function(fname) - return Ptr_Iterator("const Eolian_Type*", +M.typedecl_enums_get_by_file = function(fname) + return Ptr_Iterator("const Eolian_Typedecl *", eolian.eolian_type_enums_get_by_file(self)) end From 4e40b60f0642480f925fea30fa87a1d05b857fcc Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Fri, 19 Feb 2016 17:20:08 +0000 Subject: [PATCH 15/23] eolian: remove retrieval funcs for type-style enums/aliases/structs --- src/lib/eolian/Eolian.h | 12 ++--- src/lib/eolian/database_expr.c | 20 +++++--- src/lib/eolian/database_type_api.c | 80 +++++------------------------- src/lib/eolian/database_validate.c | 12 ++--- 4 files changed, 34 insertions(+), 90 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index bbecbce9d2..4d62c59f3d 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -1268,36 +1268,33 @@ EAPI Eina_Bool eolian_class_dtor_enable_get(const Eolian_Class *klass); EAPI Eina_Stringshare *eolian_class_c_get_function_name_get(const Eolian_Class *klass); /* - * @brief Get an alias type by name. Supports namespaces. + * @brief Get an alias type declaration by name. Supports namespaces. * * @param[in] name the name of the alias * @return the alias type or NULL * * @ingroup Eolian */ -EAPI const Eolian_Type *eolian_type_alias_get_by_name(const char *name); EAPI const Eolian_Typedecl *eolian_typedecl_alias_get_by_name(const char *name); /* - * @brief Get a struct by name. Supports namespaces. + * @brief Get a struct declaration by name. Supports namespaces. * * @param[in] name the name of the struct * @return the struct or NULL * * @ingroup Eolian */ -EAPI const Eolian_Type *eolian_type_struct_get_by_name(const char *name); EAPI const Eolian_Typedecl *eolian_typedecl_struct_get_by_name(const char *name); /* - * @brief Get an enum by name. Supports namespaces. + * @brief Get an enum declaration by name. Supports namespaces. * * @param[in] name the name of the struct * @return the struct or NULL * * @ingroup Eolian */ -EAPI const Eolian_Type *eolian_type_enum_get_by_name(const char *name); EAPI const Eolian_Typedecl *eolian_typedecl_enum_get_by_name(const char *name); /* @@ -1310,7 +1307,6 @@ EAPI const Eolian_Typedecl *eolian_typedecl_enum_get_by_name(const char *name); * * @ingroup Eolian */ -EAPI Eina_Iterator *eolian_type_aliases_get_by_file(const char *fname); EAPI Eina_Iterator *eolian_typedecl_aliases_get_by_file(const char *fname); /* @@ -1323,7 +1319,6 @@ EAPI Eina_Iterator *eolian_typedecl_aliases_get_by_file(const char *fname); * * @ingroup Eolian */ -EAPI Eina_Iterator *eolian_type_structs_get_by_file(const char *fname); EAPI Eina_Iterator *eolian_typedecl_structs_get_by_file(const char *fname); /* @@ -1336,7 +1331,6 @@ EAPI Eina_Iterator *eolian_typedecl_structs_get_by_file(const char *fname); * * @ingroup Eolian */ -EAPI Eina_Iterator *eolian_type_enums_get_by_file(const char *fname); EAPI Eina_Iterator *eolian_typedecl_enums_get_by_file(const char *fname); /* diff --git a/src/lib/eolian/database_expr.c b/src/lib/eolian/database_expr.c index 0076f7ca27..2ff9beba32 100644 --- a/src/lib/eolian/database_expr.c +++ b/src/lib/eolian/database_expr.c @@ -497,7 +497,7 @@ eval_exp(const Eolian_Expression *expr, Eolian_Expression_Mask mask, if (!var) { - const Eolian_Type *etp; + const Eolian_Typedecl *etpd; const Eolian_Enum_Type_Field *fl; /* try aliases, hoping it'll be enum */ @@ -510,19 +510,23 @@ eval_exp(const Eolian_Expression *expr, Eolian_Expression_Mask mask, if (!(mask & EOLIAN_MASK_INT)) return expr_type_error(expr, EOLIAN_MASK_INT, mask); - etp = eolian_type_alias_get_by_name(fulln); - while (etp && (etp->type == EOLIAN_TYPE_ALIAS - || etp->type == EOLIAN_TYPE_REGULAR)) - etp = eolian_type_base_type_get(etp); + etpd = eolian_typedecl_alias_get_by_name(fulln); + while (etpd && etpd->type == EOLIAN_TYPEDECL_ALIAS) + { + const Eolian_Type *etp = eolian_typedecl_base_type_get(etpd); + if (!etp || etp->type != EOLIAN_TYPE_REGULAR) + break; + etpd = eolian_type_typedecl_get(etp); + } - if (!etp) etp = eolian_type_enum_get_by_name(fulln); - if (!etp || etp->type != EOLIAN_TYPE_ENUM) + if (!etpd) etpd = eolian_typedecl_enum_get_by_name(fulln); + if (!etpd || etpd->type != EOLIAN_TYPEDECL_ENUM) { free(fulln); return expr_error(expr, "undefined variable"); } - fl = eolian_type_enum_field_get(etp, memb); + fl = eolian_typedecl_enum_field_get(etpd, memb); if (fl) exp = eolian_type_enum_field_value_get(fl, EINA_TRUE); free(fulln); diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index 79df964a5f..458793cb6e 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -6,69 +6,37 @@ #include "eolian_database.h" #include "eo_lexer.h" -EAPI const Eolian_Type * -eolian_type_alias_get_by_name(const char *name) +EAPI const Eolian_Typedecl * +eolian_typedecl_alias_get_by_name(const char *name) { if (!_aliases) return NULL; Eina_Stringshare *shr = eina_stringshare_add(name); Eolian_Type *tp = eina_hash_find(_aliases, shr); eina_stringshare_del(shr); - return tp; -} - -EAPI const Eolian_Typedecl * -eolian_typedecl_alias_get_by_name(const char *name) -{ - const Eolian_Type *ret = eolian_type_alias_get_by_name(name); - if (!ret) return NULL; - return ret->decl; -} - -EAPI const Eolian_Type * -eolian_type_struct_get_by_name(const char *name) -{ - if (!_structs) return NULL; - Eina_Stringshare *shr = eina_stringshare_add(name); - Eolian_Type *tp = eina_hash_find(_structs, shr); - eina_stringshare_del(shr); - return tp; + if (!tp) return NULL; + return tp->decl; } EAPI const Eolian_Typedecl * eolian_typedecl_struct_get_by_name(const char *name) { - const Eolian_Type *ret = eolian_type_struct_get_by_name(name); - if (!ret) return NULL; - return ret->decl; -} - -EAPI const Eolian_Type * -eolian_type_enum_get_by_name(const char *name) -{ - if (!_enums) return NULL; + if (!_structs) return NULL; Eina_Stringshare *shr = eina_stringshare_add(name); - Eolian_Type *tp = eina_hash_find(_enums, shr); + Eolian_Type *tp = eina_hash_find(_structs, shr); eina_stringshare_del(shr); - return tp; + if (!tp) return NULL; + return tp->decl; } EAPI const Eolian_Typedecl * eolian_typedecl_enum_get_by_name(const char *name) { - const Eolian_Type *ret = eolian_type_enum_get_by_name(name); - if (!ret) return NULL; - return ret->decl; -} - -EAPI Eina_Iterator * -eolian_type_aliases_get_by_file(const char *fname) -{ - if (!_aliasesf) return NULL; - Eina_Stringshare *shr = eina_stringshare_add(fname); - Eina_List *l = eina_hash_find(_aliasesf, shr); + if (!_enums) return NULL; + Eina_Stringshare *shr = eina_stringshare_add(name); + Eolian_Type *tp = eina_hash_find(_enums, shr); eina_stringshare_del(shr); - if (!l) return NULL; - return eina_list_iterator_new(l); + if (!tp) return NULL; + return tp->decl; } EAPI Eina_Iterator * @@ -82,17 +50,6 @@ eolian_typedecl_aliases_get_by_file(const char *fname) return eina_list_iterator_new(l); } -EAPI Eina_Iterator * -eolian_type_structs_get_by_file(const char *fname) -{ - if (!_structsf) return NULL; - Eina_Stringshare *shr = eina_stringshare_add(fname); - Eina_List *l = eina_hash_find(_structsf, shr); - eina_stringshare_del(shr); - if (!l) return NULL; - return eina_list_iterator_new(l); -} - EAPI Eina_Iterator * eolian_typedecl_structs_get_by_file(const char *fname) { @@ -104,17 +61,6 @@ eolian_typedecl_structs_get_by_file(const char *fname) return eina_list_iterator_new(l); } -EAPI Eina_Iterator * -eolian_type_enums_get_by_file(const char *fname) -{ - if (!_enumsf) return NULL; - Eina_Stringshare *shr = eina_stringshare_add(fname); - Eina_List *l = eina_hash_find(_enumsf, shr); - eina_stringshare_del(shr); - if (!l) return NULL; - return eina_list_iterator_new(l); -} - EAPI Eina_Iterator * eolian_typedecl_enums_get_by_file(const char *fname) { diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c index 2a44a3d3dd..d72b213d4d 100644 --- a/src/lib/eolian/database_validate.c +++ b/src/lib/eolian/database_validate.c @@ -27,20 +27,20 @@ _validate_ref(const Validator *vs EINA_UNUSED, const char *ref, Eina_Stringshare *base = eina_stringshare_add_length(ref, suffix - ref); - const Eolian_Type *tp = eolian_type_struct_get_by_name(base); - if (tp) + const Eolian_Typedecl *tpd = eolian_typedecl_struct_get_by_name(base); + if (tpd) { eina_stringshare_del(base); - if (!eolian_type_struct_field_get(tp, suffix + 1)) + if (!eolian_typedecl_struct_field_get(tpd, suffix + 1)) goto failed; return EINA_TRUE; } - tp = eolian_type_enum_get_by_name(base); - if (tp) + tpd = eolian_typedecl_enum_get_by_name(base); + if (tpd) { eina_stringshare_del(base); - if (!eolian_type_enum_field_get(tp, suffix + 1)) + if (!eolian_typedecl_enum_field_get(tpd, suffix + 1)) goto failed; return EINA_TRUE; } From 863212f84a88a8920ebfb9721bbc42e6bf97c0ed Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Fri, 19 Feb 2016 17:26:27 +0000 Subject: [PATCH 16/23] eolian: more old type api removals --- src/bindings/luajit/eolian.lua | 35 ++++++++---------- src/lib/eolian/Eolian.h | 25 ++++--------- src/lib/eolian/database_expr.c | 2 +- src/lib/eolian/database_type_api.c | 58 ++++-------------------------- 4 files changed, 29 insertions(+), 91 deletions(-) diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua index f04e06a674..af36a20c2e 100644 --- a/src/bindings/luajit/eolian.lua +++ b/src/bindings/luajit/eolian.lua @@ -277,20 +277,15 @@ ffi.cdef [[ Eina_Iterator *eolian_type_subtypes_get(const Eolian_Type *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); - - /* TODO */ - const char *eolian_type_struct_field_name_get(const Eolian_Struct_Type_Field *fl); - const Eolian_Documentation *eolian_type_struct_field_documentation_get(const Eolian_Struct_Type_Field *fl); - const Eolian_Type *eolian_type_struct_field_type_get(const Eolian_Struct_Type_Field *fl); - + const char *eolian_typedecl_struct_field_name_get(const Eolian_Struct_Type_Field *fl); + 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_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); - - /* TODO */ - const char *eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl); - const char *eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl); - const Eolian_Documentation *eolian_type_enum_field_documentation_get(const Eolian_Enum_Type_Field *fl); - const Eolian_Expression *eolian_type_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force); + const char *eolian_typedecl_enum_field_name_get(const Eolian_Enum_Type_Field *fl); + const char *eolian_typedecl_enum_field_c_name_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); @@ -474,52 +469,50 @@ M.typedecl_type = { ALIAS = 4 } --- TODO change func sigs ffi.metatype("Eolian_Struct_Type_Field", { __index = { name_get = function(self) - local v = eolian.eolian_type_struct_field_name_get(self) + local v = eolian.eolian_typedecl_struct_field_name_get(self) if v == nil then return nil end return ffi.string(v) end, documentation_get = function(self) - local v = eolian.eolian_type_struct_field_documentation_get(self) + local v = eolian.eolian_typedecl_struct_field_documentation_get(self) if v == nil then return nil end return v end, type_get = function(self) - local v = eolian.eolian_type_struct_field_type_get(self) + local v = eolian.eolian_typedecl_struct_field_type_get(self) if v == nil then return nil end return v end } }) --- TODO change func sigs ffi.metatype("Eolian_Enum_Type_Field", { __index = { name_get = function(self) - local v = eolian.eolian_type_enum_field_name_get(self) + local v = eolian.eolian_typedecl_enum_field_name_get(self) if v == nil then return nil end return ffi.string(v) end, c_name_get = function(self) - local v = eolian.eolian_type_enum_field_c_name_get(self) + local v = eolian.eolian_typedecl_enum_field_c_name_get(self) if v == nil then return nil end return ffi_stringshare(v) end, documentation_get = function(self) - local v = eolian.eolian_type_enum_field_documentation_get(self) + local v = eolian.eolian_typedecl_enum_field_documentation_get(self) if v == nil then return nil end return v end, value_get = function(self, force) - local v = eolian.eolian_type_enum_field_value_get(self, force and 1 or 0) + local v = eolian.eolian_typedecl_enum_field_value_get(self, force and 1 or 0) if v == nil then return nil end return v end diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 4d62c59f3d..39c486ff03 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -1362,7 +1362,6 @@ EAPI Eina_Iterator *eolian_type_subtypes_get(const Eolian_Type *tp); * * @ingroup Eolian */ -EAPI Eina_Iterator *eolian_type_struct_fields_get(const Eolian_Type *tp); EAPI Eina_Iterator *eolian_typedecl_struct_fields_get(const Eolian_Typedecl *tp); /* @@ -1375,7 +1374,6 @@ EAPI Eina_Iterator *eolian_typedecl_struct_fields_get(const Eolian_Typedecl *tp) * * @ingroup Eolian */ -EAPI const Eolian_Struct_Type_Field *eolian_type_struct_field_get(const Eolian_Type *tp, const char *field); EAPI const Eolian_Struct_Type_Field *eolian_typedecl_struct_field_get(const Eolian_Typedecl *tp, const char *field); /* @@ -1386,8 +1384,7 @@ EAPI const Eolian_Struct_Type_Field *eolian_typedecl_struct_field_get(const Eoli * * @ingroup Eolian */ -EAPI Eina_Stringshare *eolian_type_struct_field_name_get(const Eolian_Struct_Type_Field *fl); -#define eolian_typedecl_struct_field_name_get eolian_type_struct_field_name_get +EAPI Eina_Stringshare *eolian_typedecl_struct_field_name_get(const Eolian_Struct_Type_Field *fl); /* * @brief Get the documentation of a field of a struct type. @@ -1397,8 +1394,7 @@ EAPI Eina_Stringshare *eolian_type_struct_field_name_get(const Eolian_Struct_Typ * * @ingroup Eolian */ -EAPI const Eolian_Documentation *eolian_type_struct_field_documentation_get(const Eolian_Struct_Type_Field *fl); -#define eolian_typedecl_struct_field_documentation_get eolian_type_struct_field_documentation_get +EAPI const Eolian_Documentation *eolian_typedecl_struct_field_documentation_get(const Eolian_Struct_Type_Field *fl); /* * @brief Get the type of a field of a struct type. @@ -1408,8 +1404,7 @@ EAPI const Eolian_Documentation *eolian_type_struct_field_documentation_get(cons * * @ingroup Eolian */ -EAPI const Eolian_Type *eolian_type_struct_field_type_get(const Eolian_Struct_Type_Field *fl); -#define eolian_typedecl_struct_field_type_get eolian_type_struct_field_type_get +EAPI const Eolian_Type *eolian_typedecl_struct_field_type_get(const Eolian_Struct_Type_Field *fl); /* * @brief Get an iterator to all fields of an enum type. @@ -1419,7 +1414,6 @@ EAPI const Eolian_Type *eolian_type_struct_field_type_get(const Eolian_Struct_Ty * * @ingroup Eolian */ -EAPI Eina_Iterator *eolian_type_enum_fields_get(const Eolian_Type *tp); EAPI Eina_Iterator *eolian_typedecl_enum_fields_get(const Eolian_Typedecl *tp); /* @@ -1435,7 +1429,6 @@ EAPI Eina_Iterator *eolian_typedecl_enum_fields_get(const Eolian_Typedecl *tp); * * @ingroup Eolian */ -EAPI const Eolian_Enum_Type_Field *eolian_type_enum_field_get(const Eolian_Type *tp, const char *field); EAPI const Eolian_Enum_Type_Field *eolian_typedecl_enum_field_get(const Eolian_Typedecl *tp, const char *field); /* @@ -1446,8 +1439,7 @@ EAPI const Eolian_Enum_Type_Field *eolian_typedecl_enum_field_get(const Eolian_T * * @ingroup Eolian */ -EAPI Eina_Stringshare *eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl); -#define eolian_typedecl_enum_field_name_get eolian_type_enum_field_name_get +EAPI Eina_Stringshare *eolian_typedecl_enum_field_name_get(const Eolian_Enum_Type_Field *fl); /* * @brief Get the C name of a field of an enum type. @@ -1459,8 +1451,7 @@ EAPI Eina_Stringshare *eolian_type_enum_field_name_get(const Eolian_Enum_Type_Fi * * @ingroup Eolian */ -EAPI Eina_Stringshare *eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl); -#define eolian_typedecl_enum_field_c_name_get eolian_type_enum_field_c_name_get +EAPI Eina_Stringshare *eolian_typedecl_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl); /* * @brief Get the documentation of a field of an enum type. @@ -1470,8 +1461,7 @@ EAPI Eina_Stringshare *eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_ * * @ingroup Eolian */ -EAPI const Eolian_Documentation *eolian_type_enum_field_documentation_get(const Eolian_Enum_Type_Field *fl); -#define eolian_typedecl_enum_field_documentation_get eolian_type_enum_field_documentation_get +EAPI const Eolian_Documentation *eolian_typedecl_enum_field_documentation_get(const Eolian_Enum_Type_Field *fl); /* * @brief Get the value of a field of an enum type. @@ -1486,8 +1476,7 @@ EAPI const Eolian_Documentation *eolian_type_enum_field_documentation_get(const * * @ingroup Eolian */ -EAPI const Eolian_Expression *eolian_type_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force); -#define eolian_typedecl_enum_field_value_get eolian_type_enum_field_value_get +EAPI const Eolian_Expression *eolian_typedecl_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force); /* * @brief Get the legacy prefix of enum field names. When not specified, diff --git a/src/lib/eolian/database_expr.c b/src/lib/eolian/database_expr.c index 2ff9beba32..862c30bd71 100644 --- a/src/lib/eolian/database_expr.c +++ b/src/lib/eolian/database_expr.c @@ -527,7 +527,7 @@ eval_exp(const Eolian_Expression *expr, Eolian_Expression_Mask mask, } fl = eolian_typedecl_enum_field_get(etpd, memb); - if (fl) exp = eolian_type_enum_field_value_get(fl, EINA_TRUE); + if (fl) exp = eolian_typedecl_enum_field_value_get(fl, EINA_TRUE); free(fulln); if (!exp) diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index 458793cb6e..ffbde9088c 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -97,15 +97,6 @@ eolian_type_subtypes_get(const Eolian_Type *tp) return eina_list_iterator_new(tp->subtypes); } -EAPI Eina_Iterator * -eolian_type_struct_fields_get(const Eolian_Type *tp) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - if (tp->type != EOLIAN_TYPE_STRUCT) - return NULL; - return eina_list_iterator_new(tp->field_list); -} - EAPI Eina_Iterator * eolian_typedecl_struct_fields_get(const Eolian_Typedecl *tp) { @@ -115,19 +106,6 @@ eolian_typedecl_struct_fields_get(const Eolian_Typedecl *tp) return eina_list_iterator_new(tp->field_list); } -EAPI const Eolian_Struct_Type_Field * -eolian_type_struct_field_get(const Eolian_Type *tp, const char *field) -{ - Eolian_Struct_Type_Field *sf = NULL; - EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL); - if (tp->type != EOLIAN_TYPE_STRUCT) - return NULL; - sf = eina_hash_find(tp->fields, field); - if (!sf) return NULL; - return sf; -} - EAPI const Eolian_Struct_Type_Field * eolian_typedecl_struct_field_get(const Eolian_Typedecl *tp, const char *field) { @@ -142,35 +120,26 @@ eolian_typedecl_struct_field_get(const Eolian_Typedecl *tp, const char *field) } EAPI Eina_Stringshare * -eolian_type_struct_field_name_get(const Eolian_Struct_Type_Field *fl) +eolian_typedecl_struct_field_name_get(const Eolian_Struct_Type_Field *fl) { EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL); return fl->name; } EAPI const Eolian_Documentation * -eolian_type_struct_field_documentation_get(const Eolian_Struct_Type_Field *fl) +eolian_typedecl_struct_field_documentation_get(const Eolian_Struct_Type_Field *fl) { EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL); return fl->doc; } EAPI const Eolian_Type * -eolian_type_struct_field_type_get(const Eolian_Struct_Type_Field *fl) +eolian_typedecl_struct_field_type_get(const Eolian_Struct_Type_Field *fl) { EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL); return fl->type; } -EAPI Eina_Iterator * -eolian_type_enum_fields_get(const Eolian_Type *tp) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - if (tp->type != EOLIAN_TYPE_ENUM) - return NULL; - return eina_list_iterator_new(tp->field_list); -} - EAPI Eina_Iterator * eolian_typedecl_enum_fields_get(const Eolian_Typedecl *tp) { @@ -180,19 +149,6 @@ eolian_typedecl_enum_fields_get(const Eolian_Typedecl *tp) return eina_list_iterator_new(tp->field_list); } -EAPI const Eolian_Enum_Type_Field * -eolian_type_enum_field_get(const Eolian_Type *tp, const char *field) -{ - Eolian_Enum_Type_Field *ef = NULL; - EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - EINA_SAFETY_ON_NULL_RETURN_VAL(field, NULL); - if (tp->type != EOLIAN_TYPE_ENUM) - return NULL; - ef = eina_hash_find(tp->fields, field); - if (!ef) return NULL; - return ef; -} - EAPI const Eolian_Enum_Type_Field * eolian_typedecl_enum_field_get(const Eolian_Typedecl *tp, const char *field) { @@ -207,14 +163,14 @@ eolian_typedecl_enum_field_get(const Eolian_Typedecl *tp, const char *field) } EAPI Eina_Stringshare * -eolian_type_enum_field_name_get(const Eolian_Enum_Type_Field *fl) +eolian_typedecl_enum_field_name_get(const Eolian_Enum_Type_Field *fl) { EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL); return fl->name; } EAPI Eina_Stringshare * -eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl) +eolian_typedecl_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl) { Eina_Stringshare *ret; Eina_Strbuf *buf; @@ -237,14 +193,14 @@ eolian_type_enum_field_c_name_get(const Eolian_Enum_Type_Field *fl) } EAPI const Eolian_Documentation * -eolian_type_enum_field_documentation_get(const Eolian_Enum_Type_Field *fl) +eolian_typedecl_enum_field_documentation_get(const Eolian_Enum_Type_Field *fl) { EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL); return fl->doc; } EAPI const Eolian_Expression * -eolian_type_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force) +eolian_typedecl_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force) { EINA_SAFETY_ON_NULL_RETURN_VAL(fl, NULL); if (!force && !fl->is_public_value) return NULL; From 4c4fbfae0bfb739fd0d87d452022d7026d0645f9 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 1 Mar 2016 13:40:24 +0000 Subject: [PATCH 17/23] eolian: remove most of the old type APIs --- src/lib/eolian/Eolian.h | 3 -- src/lib/eolian/database_expr_api.c | 13 +++--- src/lib/eolian/database_type_api.c | 64 ++++-------------------------- src/lib/eolian/database_validate.c | 60 +++++++++++++++++----------- 4 files changed, 50 insertions(+), 90 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 39c486ff03..da3a212786 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -1487,7 +1487,6 @@ EAPI const Eolian_Expression *eolian_typedecl_enum_field_value_get(const Eolian_ * * @ingroup Eolian */ -EAPI Eina_Stringshare *eolian_type_enum_legacy_prefix_get(const Eolian_Type *tp); EAPI Eina_Stringshare *eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typedecl *tp); /* @@ -1499,7 +1498,6 @@ EAPI Eina_Stringshare *eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typed * * @ingroup Eolian */ -EAPI const Eolian_Documentation *eolian_type_documentation_get(const Eolian_Type *tp); EAPI const Eolian_Documentation *eolian_typedecl_documentation_get(const Eolian_Typedecl *tp); /* @@ -1586,7 +1584,6 @@ EAPI Eina_Bool eolian_type_is_const(const Eolian_Type *tp); * * @ingroup Eolian */ -EAPI Eina_Bool eolian_type_is_extern(const Eolian_Type *tp); EAPI Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp); /* diff --git a/src/lib/eolian/database_expr_api.c b/src/lib/eolian/database_expr_api.c index eb0d119d68..81d4200a31 100644 --- a/src/lib/eolian/database_expr_api.c +++ b/src/lib/eolian/database_expr_api.c @@ -23,8 +23,6 @@ _eval_type(const Eolian_Expression *expr, const Eolian_Type *type) return err; switch (type->type) { - case EOLIAN_TYPE_ALIAS: - return _eval_type(expr, eolian_type_base_type_get(type)); case EOLIAN_TYPE_POINTER: { int mask = EOLIAN_MASK_NULL; @@ -36,15 +34,18 @@ _eval_type(const Eolian_Expression *expr, const Eolian_Type *type) } case EOLIAN_TYPE_CLASS: return database_expr_eval(expr, EOLIAN_MASK_NULL); - case EOLIAN_TYPE_ENUM: - return database_expr_eval(expr, EOLIAN_MASK_INT); case EOLIAN_TYPE_REGULAR: { int kw = eo_lexer_keyword_str_to_id(type->name); if (!kw || kw < KW_byte || kw >= KW_void) { - const Eolian_Type *base = eolian_type_base_type_get(type); - if (base) return _eval_type(expr, base); + const Eolian_Typedecl *base = eolian_type_typedecl_get(type); + if (!base) + return err; + if (base->type == EOLIAN_TYPEDECL_ALIAS) + return _eval_type(expr, eolian_typedecl_base_type_get(base)); + else if (base->type == EOLIAN_TYPEDECL_ENUM) + return database_expr_eval(expr, EOLIAN_MASK_INT); return err; } switch (kw) diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index ffbde9088c..c64cd78911 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -207,15 +207,6 @@ eolian_typedecl_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool return fl->value; } -EAPI Eina_Stringshare * -eolian_type_enum_legacy_prefix_get(const Eolian_Type *tp) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - if (tp->type != EOLIAN_TYPE_ENUM) - return NULL; - return tp->legacy; -} - EAPI Eina_Stringshare * eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typedecl *tp) { @@ -225,13 +216,6 @@ eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typedecl *tp) return tp->legacy; } -EAPI const Eolian_Documentation * -eolian_type_documentation_get(const Eolian_Type *tp) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - return tp->doc; -} - EAPI const Eolian_Documentation * eolian_typedecl_documentation_get(const Eolian_Typedecl *tp) { @@ -256,28 +240,9 @@ eolian_typedecl_file_get(const Eolian_Typedecl *tp) EAPI const Eolian_Type * eolian_type_base_type_get(const Eolian_Type *tp) { - Eolian_Type_Type tpt; EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - tpt = eolian_type_type_get(tp); - if ((tpt != EOLIAN_TYPE_POINTER) && (tpt != EOLIAN_TYPE_ALIAS) && - (tpt != EOLIAN_TYPE_REGULAR)) + if (tp->type != EOLIAN_TYPE_POINTER) return NULL; - if (tpt == EOLIAN_TYPE_REGULAR) - { - /* for regular types, try looking up if it belongs to a struct, - * enum or an alias... otherwise return NULL - * but first check for builtins - */ - int kw = eo_lexer_keyword_str_to_id(tp->full_name); - if (!kw || kw < KW_byte || kw >= KW_true) - { - Eolian_Declaration *decl = eina_hash_find(_decls, tp->full_name); - if (decl && decl->type != EOLIAN_DECL_CLASS - && decl->type != EOLIAN_DECL_VAR) - return ((const Eolian_Typedecl *)decl->data)->parent; - } - return NULL; - } return tp->base_type; } @@ -304,10 +269,8 @@ eolian_type_typedecl_get(const Eolian_Type *tp) EAPI const Eolian_Type * eolian_typedecl_base_type_get(const Eolian_Typedecl *tp) { - Eolian_Typedecl_Type tpt; EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - tpt = eolian_typedecl_type_get(tp); - if (tpt != EOLIAN_TYPEDECL_ALIAS) + if (tp->type != EOLIAN_TYPEDECL_ALIAS) return NULL; return tp->base_type; } @@ -315,18 +278,12 @@ eolian_typedecl_base_type_get(const Eolian_Typedecl *tp) EAPI const Eolian_Type * eolian_type_aliased_base_get(const Eolian_Type *tp) { - if (!tp) - return NULL; - if (eolian_type_type_get(tp) == EOLIAN_TYPE_REGULAR) - { - const Eolian_Type *btp = eolian_type_base_type_get(tp); - if (btp && (eolian_type_type_get(btp) == EOLIAN_TYPE_ALIAS)) - return eolian_type_aliased_base_get(btp); - return tp; - } - else if (eolian_type_type_get(tp) != EOLIAN_TYPE_ALIAS) + if (!tp || tp->type != EOLIAN_TYPE_REGULAR) return tp; - return eolian_type_aliased_base_get(tp->base_type); + const Eolian_Typedecl *btp = eolian_type_typedecl_get(tp); + if (btp && (btp->type == EOLIAN_TYPEDECL_ALIAS)) + return eolian_typedecl_aliased_base_get(btp); + return tp; } EAPI const Eolian_Type * @@ -360,13 +317,6 @@ eolian_type_is_const(const Eolian_Type *tp) return tp->is_const; } -EAPI Eina_Bool -eolian_type_is_extern(const Eolian_Type *tp) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EINA_FALSE); - return tp->is_extern; -} - EAPI Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp) { diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c index d72b213d4d..63e1f3728a 100644 --- a/src/lib/eolian/database_validate.c +++ b/src/lib/eolian/database_validate.c @@ -189,11 +189,42 @@ _type_error(const Validator *vs, const Eolian_Type *tp, const char *msg) } static Eina_Bool -_validate_type(const Validator *vs, const Eolian_Type *tp) +_validate_typedecl(const Validator *vs, const Eolian_Typedecl *tp) { if (!_validate_doc(vs, tp->doc)) return EINA_FALSE; + switch (tp->type) + { + case EOLIAN_TYPEDECL_ALIAS: + return _validate_type(vs, tp->base_type); + case EOLIAN_TYPEDECL_STRUCT: + { + Val_Success succ; + succ.vs = vs; + succ.success = EINA_TRUE; + eina_hash_foreach(tp->fields, (Eina_Hash_Foreach)_sf_map_cb, &succ); + return succ.success; + } + case EOLIAN_TYPEDECL_STRUCT_OPAQUE: + return EINA_TRUE; + case EOLIAN_TYPEDECL_ENUM: + { + Val_Success succ; + succ.vs = vs; + succ.success = EINA_TRUE; + eina_hash_foreach(tp->fields, (Eina_Hash_Foreach)_ef_map_cb, &succ); + return succ.success; + } + default: + return EINA_FALSE; + } + return EINA_TRUE; +} + +static Eina_Bool +_validate_type(const Validator *vs, const Eolian_Type *tp) +{ switch (tp->type) { case EOLIAN_TYPE_VOID: @@ -202,42 +233,23 @@ _validate_type(const Validator *vs, const Eolian_Type *tp) return EINA_TRUE; case EOLIAN_TYPE_REGULAR: { - const Eolian_Type *tpp; + const Eolian_Typedecl *tpp; /* builtins */ int id = eo_lexer_keyword_str_to_id(tp->full_name); if (id) return eo_lexer_is_type_keyword(id); /* user defined */ - tpp = eolian_type_base_type_get(tp); + tpp = eolian_type_typedecl_get(tp); if (!tpp) { char buf[256]; snprintf(buf, sizeof(buf), "undefined type %s", tp->full_name); return _type_error(vs, tp, buf); } - return _validate_type(vs, tpp); + return _validate_typedecl(vs, tpp); } case EOLIAN_TYPE_POINTER: - case EOLIAN_TYPE_ALIAS: return _validate_type(vs, tp->base_type); - case EOLIAN_TYPE_STRUCT: - { - Val_Success succ; - succ.vs = vs; - succ.success = EINA_TRUE; - eina_hash_foreach(tp->fields, (Eina_Hash_Foreach)_sf_map_cb, &succ); - return succ.success; - } - case EOLIAN_TYPE_STRUCT_OPAQUE: - return EINA_TRUE; - case EOLIAN_TYPE_ENUM: - { - Val_Success succ; - succ.vs = vs; - succ.success = EINA_TRUE; - eina_hash_foreach(tp->fields, (Eina_Hash_Foreach)_ef_map_cb, &succ); - return succ.success; - } case EOLIAN_TYPE_CLASS: { if (!eolian_type_class_get(tp)) @@ -391,7 +403,7 @@ static Eina_Bool _type_map_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, const Eolian_Type *tp, Val_Success *sc) { - sc->success = _validate_type(sc->vs, tp); + sc->success = _validate_typedecl(sc->vs, tp->decl); return sc->success; } From 5401c775ec3ca95ad3c7d303238d9d53134414f4 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 1 Mar 2016 13:44:43 +0000 Subject: [PATCH 18/23] eolian: remove database_type_print (unused) --- src/lib/eolian/database_type.c | 80 -------------------------------- src/lib/eolian/eolian_database.h | 1 - 2 files changed, 81 deletions(-) diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index fc24d9beb9..2d5b11a092 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -291,83 +291,3 @@ database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) eina_strbuf_append(buf, name); } } - -static void -_typedef_print(Eolian_Type *tp) -{ - printf("type %s: ", tp->full_name); - database_type_print(tp->base_type); -} - -void -database_expr_print(Eolian_Expression *exp) -{ - Eolian_Value val = eolian_expression_eval(exp, EOLIAN_MASK_ALL); - const char *ret = eolian_expression_value_to_literal(&val); - printf("%s", ret); - eina_stringshare_del(ret); -} - -void -database_type_print(Eolian_Type *tp) -{ - if (tp->type == EOLIAN_TYPE_ALIAS) - { - _typedef_print(tp); - return; - } - if (tp->is_own) - printf("own("); - if (tp->is_const) - printf("const("); - if (tp->type == EOLIAN_TYPE_REGULAR || tp->type == EOLIAN_TYPE_COMPLEX - || tp->type == EOLIAN_TYPE_CLASS) - printf("%s", tp->full_name); - else if (tp->type == EOLIAN_TYPE_VOID) - printf("void"); - else if (tp->type == EOLIAN_TYPE_STRUCT_OPAQUE) - printf("struct %s", tp->full_name); - else if (tp->type == EOLIAN_TYPE_POINTER) - { - database_type_print(tp->base_type); - putchar('*'); - } - else if (tp->type == EOLIAN_TYPE_STRUCT) - { - Eolian_Struct_Type_Field *sf; - Eina_List *m; - printf("struct "); - if (tp->full_name) printf("%s ", tp->full_name); - printf("{ "); - EINA_LIST_FOREACH(tp->field_list, m, sf) - { - printf("%s: ", sf->name); - database_type_print(sf->type); - printf("; "); - } - printf("}"); - } - else if (tp->type == EOLIAN_TYPE_ENUM) - { - Eolian_Enum_Type_Field *ef; - Eina_List *m; - printf("enum %s ", tp->full_name); - printf("{ "); - EINA_LIST_FOREACH(tp->field_list, m, ef) - { - printf("%s", ef->name); - if (ef->value) - { - printf(" = "); - database_expr_print(ef->value); - } - if (m != eina_list_last(tp->field_list)) - printf(", "); - } - printf(" }"); - } - if (tp->is_own) - putchar(')'); - if (tp->is_const) - putchar(')'); -} diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index bf9c107a5c..4919c55bf5 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -310,7 +310,6 @@ void database_typedef_del(Eolian_Type *tp); void database_typedecl_del(Eolian_Typedecl *tp); -void database_type_print(Eolian_Type *type); void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name); /* expressions */ From c3a33653f3c37fb70b0d14625e3ef9a06a83d543 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 1 Mar 2016 14:55:10 +0000 Subject: [PATCH 19/23] eolian: separate type_to_str for decls --- src/lib/eolian/database_type.c | 240 +++++++++++++++-------------- src/lib/eolian/database_type_api.c | 8 +- src/lib/eolian/eolian_database.h | 1 + 3 files changed, 134 insertions(+), 115 deletions(-) diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 2d5b11a092..edbf27c0af 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -131,123 +131,9 @@ database_enum_add(Eolian_Type *tp) database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp->decl); } -static void -_stype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) -{ - Eolian_Struct_Type_Field *sf; - Eina_List *l; - eina_strbuf_append(buf, "struct "); - if (tp->name) - { - Eina_List *m; - const char *sp; - EINA_LIST_FOREACH(tp->namespaces, m, sp) - { - eina_strbuf_append(buf, sp); - eina_strbuf_append_char(buf, '_'); - } - eina_strbuf_append(buf, tp->name); - eina_strbuf_append_char(buf, ' '); - } - if (tp->type == EOLIAN_TYPE_STRUCT_OPAQUE) - goto append_name; - eina_strbuf_append(buf, "{ "); - EINA_LIST_FOREACH(tp->field_list, l, sf) - { - database_type_to_str(sf->type, buf, sf->name); - eina_strbuf_append(buf, "; "); - } - eina_strbuf_append(buf, "}"); -append_name: - if (name) - { - eina_strbuf_append_char(buf, ' '); - eina_strbuf_append(buf, name); - } -} - -static void -_etype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) -{ - Eolian_Enum_Type_Field *ef; - Eina_List *l; - eina_strbuf_append(buf, "enum "); - if (tp->name) - { - Eina_List *m; - const char *sp; - EINA_LIST_FOREACH(tp->namespaces, m, sp) - { - eina_strbuf_append(buf, sp); - eina_strbuf_append_char(buf, '_'); - } - eina_strbuf_append(buf, tp->name); - eina_strbuf_append_char(buf, ' '); - } - eina_strbuf_append(buf, "{ "); - EINA_LIST_FOREACH(tp->field_list, l, ef) - { - eina_strbuf_append(buf, ef->name); - if (ef->value) - { - Eolian_Value val = eolian_expression_eval(ef->value, - EOLIAN_MASK_INT); - const char *ret; - eina_strbuf_append(buf, " = "); - ret = eolian_expression_value_to_literal(&val); - eina_strbuf_append(buf, ret); - eina_stringshare_del(ret); - } - if (l != eina_list_last(tp->field_list)) - eina_strbuf_append(buf, ", "); - } - eina_strbuf_append(buf, " }"); - if (name) - { - eina_strbuf_append_char(buf, ' '); - eina_strbuf_append(buf, name); - } -} - -static void -_atype_to_str(const Eolian_Type *tp, Eina_Strbuf *buf) -{ - Eina_Strbuf *fulln = eina_strbuf_new(); - Eina_List *l; - const char *sp; - - eina_strbuf_append(buf, "typedef "); - - EINA_LIST_FOREACH(tp->namespaces, l, sp) - { - eina_strbuf_append(fulln, sp); - eina_strbuf_append_char(fulln, '_'); - } - eina_strbuf_append(fulln, tp->name); - - database_type_to_str(tp->base_type, buf, eina_strbuf_string_get(fulln)); - eina_strbuf_free(fulln); -} - void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) { - if (tp->type == EOLIAN_TYPE_ALIAS) - { - _atype_to_str(tp, buf); - return; - } - else if (tp->type == EOLIAN_TYPE_STRUCT - || tp->type == EOLIAN_TYPE_STRUCT_OPAQUE) - { - _stype_to_str(tp, buf, name); - return; - } - else if (tp->type == EOLIAN_TYPE_ENUM) - { - _etype_to_str(tp, buf, name); - return; - } if ((tp->type == EOLIAN_TYPE_REGULAR || tp->type == EOLIAN_TYPE_COMPLEX || tp->type == EOLIAN_TYPE_VOID @@ -291,3 +177,129 @@ database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) eina_strbuf_append(buf, name); } } + +static void +_stype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf, const char *name) +{ + Eolian_Struct_Type_Field *sf; + Eina_List *l; + eina_strbuf_append(buf, "struct "); + if (tp->name) + { + Eina_List *m; + const char *sp; + EINA_LIST_FOREACH(tp->namespaces, m, sp) + { + eina_strbuf_append(buf, sp); + eina_strbuf_append_char(buf, '_'); + } + eina_strbuf_append(buf, tp->name); + eina_strbuf_append_char(buf, ' '); + } + if (tp->type == EOLIAN_TYPEDECL_STRUCT_OPAQUE) + goto append_name; + eina_strbuf_append(buf, "{ "); + EINA_LIST_FOREACH(tp->field_list, l, sf) + { + database_type_to_str(sf->type, buf, sf->name); + eina_strbuf_append(buf, "; "); + } + eina_strbuf_append(buf, "}"); +append_name: + if (name) + { + eina_strbuf_append_char(buf, ' '); + eina_strbuf_append(buf, name); + } +} + +static void +_etype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf, const char *name) +{ + Eolian_Enum_Type_Field *ef; + Eina_List *l; + eina_strbuf_append(buf, "enum "); + if (tp->name) + { + Eina_List *m; + const char *sp; + EINA_LIST_FOREACH(tp->namespaces, m, sp) + { + eina_strbuf_append(buf, sp); + eina_strbuf_append_char(buf, '_'); + } + eina_strbuf_append(buf, tp->name); + eina_strbuf_append_char(buf, ' '); + } + eina_strbuf_append(buf, "{ "); + EINA_LIST_FOREACH(tp->field_list, l, ef) + { + eina_strbuf_append(buf, ef->name); + if (ef->value) + { + Eolian_Value val = eolian_expression_eval(ef->value, + EOLIAN_MASK_INT); + const char *ret; + eina_strbuf_append(buf, " = "); + ret = eolian_expression_value_to_literal(&val); + eina_strbuf_append(buf, ret); + eina_stringshare_del(ret); + } + if (l != eina_list_last(tp->field_list)) + eina_strbuf_append(buf, ", "); + } + eina_strbuf_append(buf, " }"); + if (name) + { + eina_strbuf_append_char(buf, ' '); + eina_strbuf_append(buf, name); + } +} + +static void +_atype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf) +{ + Eina_Strbuf *fulln = eina_strbuf_new(); + Eina_List *l; + const char *sp; + + eina_strbuf_append(buf, "typedef "); + + EINA_LIST_FOREACH(tp->namespaces, l, sp) + { + eina_strbuf_append(fulln, sp); + eina_strbuf_append_char(fulln, '_'); + } + eina_strbuf_append(fulln, tp->name); + + database_type_to_str(tp->base_type, buf, eina_strbuf_string_get(fulln)); + eina_strbuf_free(fulln); +} + +void +database_typedecl_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf, const char *name) +{ + if (tp->type == EOLIAN_TYPEDECL_ALIAS) + { + _atype_to_str(tp, buf); + return; + } + else if (tp->type == EOLIAN_TYPEDECL_STRUCT + || tp->type == EOLIAN_TYPEDECL_STRUCT_OPAQUE) + { + _stype_to_str(tp, buf, name); + return; + } + else if (tp->type == EOLIAN_TYPEDECL_ENUM) + { + _etype_to_str(tp, buf, name); + return; + } + else + return; + if (name) + { + eina_strbuf_append_char(buf, ' '); + eina_strbuf_append(buf, name); + } +} diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index c64cd78911..f167004f22 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -340,8 +340,14 @@ eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name) EAPI Eina_Stringshare * eolian_typedecl_c_type_named_get(const Eolian_Typedecl *tp, const char *name) { + Eina_Stringshare *ret; + Eina_Strbuf *buf; EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - return eolian_type_c_type_named_get(tp->parent, name); + buf = eina_strbuf_new(); + database_typedecl_to_str(tp, buf, name); + ret = eina_stringshare_add(eina_strbuf_string_get(buf)); + eina_strbuf_free(buf); + return ret; } EAPI Eina_Stringshare * diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 4919c55bf5..0a14d21382 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -311,6 +311,7 @@ void database_typedef_del(Eolian_Type *tp); void database_typedecl_del(Eolian_Typedecl *tp); void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name); +void database_typedecl_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf, const char *name); /* expressions */ From 1f58ccb49fb53c5025c4dcaf025299d06b8bc94e Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 1 Mar 2016 15:13:12 +0000 Subject: [PATCH 20/23] eolian: clean up some temporary hashes --- src/lib/eolian/database_type.c | 12 +++--------- src/lib/eolian/database_type_api.c | 12 ++++++------ src/lib/eolian/eolian_database.c | 9 --------- src/lib/eolian/eolian_database.h | 3 --- 4 files changed, 9 insertions(+), 27 deletions(-) diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index edbf27c0af..b9678dc504 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -98,9 +98,7 @@ database_type_add(Eolian_Type *def) def->decl->type = EOLIAN_TYPEDECL_ALIAS; 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)); - eina_hash_set(_aliasesd, def->base.file, eina_list_append - ((Eina_List*)eina_hash_find(_aliasesd, def->base.file), def->decl)); + ((Eina_List*)eina_hash_find(_aliasesf, def->base.file), def->decl)); database_decl_add(def->full_name, EOLIAN_DECL_ALIAS, def->base.file, def->decl); } @@ -112,9 +110,7 @@ database_struct_add(Eolian_Type *tp) : EOLIAN_TYPEDECL_STRUCT; 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)); - eina_hash_set(_structsd, tp->base.file, eina_list_append - ((Eina_List*)eina_hash_find(_structsd, tp->base.file), tp->decl)); + ((Eina_List*)eina_hash_find(_structsf, tp->base.file), tp->decl)); database_decl_add(tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, tp->decl); } @@ -125,9 +121,7 @@ database_enum_add(Eolian_Type *tp) tp->decl->type = EOLIAN_TYPEDECL_ENUM; 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)); - eina_hash_set(_enumsd, tp->base.file, eina_list_append - ((Eina_List*)eina_hash_find(_enumsd, tp->base.file), tp->decl)); + ((Eina_List*)eina_hash_find(_enumsf, tp->base.file), tp->decl)); database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp->decl); } diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index f167004f22..00359acaa9 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -42,9 +42,9 @@ eolian_typedecl_enum_get_by_name(const char *name) EAPI Eina_Iterator * eolian_typedecl_aliases_get_by_file(const char *fname) { - if (!_aliasesd) return NULL; + if (!_aliasesf) return NULL; Eina_Stringshare *shr = eina_stringshare_add(fname); - Eina_List *l = eina_hash_find(_aliasesd, shr); + Eina_List *l = eina_hash_find(_aliasesf, shr); eina_stringshare_del(shr); if (!l) return NULL; return eina_list_iterator_new(l); @@ -53,9 +53,9 @@ eolian_typedecl_aliases_get_by_file(const char *fname) EAPI Eina_Iterator * eolian_typedecl_structs_get_by_file(const char *fname) { - if (!_structsd) return NULL; + if (!_structsf) return NULL; Eina_Stringshare *shr = eina_stringshare_add(fname); - Eina_List *l = eina_hash_find(_structsd, shr); + Eina_List *l = eina_hash_find(_structsf, shr); eina_stringshare_del(shr); if (!l) return NULL; return eina_list_iterator_new(l); @@ -64,9 +64,9 @@ eolian_typedecl_structs_get_by_file(const char *fname) EAPI Eina_Iterator * eolian_typedecl_enums_get_by_file(const char *fname) { - if (!_enumsd) return NULL; + if (!_enumsf) return NULL; Eina_Stringshare *shr = eina_stringshare_add(fname); - Eina_List *l = eina_hash_find(_enumsd, shr); + Eina_List *l = eina_hash_find(_enumsf, shr); eina_stringshare_del(shr); if (!l) return NULL; return eina_list_iterator_new(l); diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index f957bd46c1..4fccf77d45 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -17,9 +17,6 @@ Eina_Hash *_classesf = NULL; Eina_Hash *_aliasesf = NULL; Eina_Hash *_structsf = NULL; Eina_Hash *_enumsf = NULL; -Eina_Hash *_aliasesd = NULL; -Eina_Hash *_structsd = NULL; -Eina_Hash *_enumsd = NULL; Eina_Hash *_globalsf = NULL; Eina_Hash *_constantsf = NULL; Eina_Hash *_filenames = NULL; @@ -57,9 +54,6 @@ database_init() _enumsf = eina_hash_stringshared_new(_hashlist_free); _globalsf = eina_hash_stringshared_new(_hashlist_free); _constantsf = eina_hash_stringshared_new(_hashlist_free); - _aliasesd = eina_hash_stringshared_new(_hashlist_free); - _structsd = eina_hash_stringshared_new(_hashlist_free); - _enumsd = eina_hash_stringshared_new(_hashlist_free); _filenames = eina_hash_string_small_new(free); _tfilenames = eina_hash_string_small_new(free); _decls = eina_hash_stringshared_new(free); @@ -94,9 +88,6 @@ database_shutdown() eina_hash_free(_enumsf ); _enumsf = NULL; eina_hash_free(_globalsf ); _globalsf = NULL; eina_hash_free(_constantsf); _constantsf = NULL; - eina_hash_free(_aliasesd ); _aliasesd = NULL; - eina_hash_free(_structsd ); _structsd = NULL; - eina_hash_free(_enumsd ); _enumsd = NULL; eina_hash_free(_filenames ); _filenames = NULL; eina_hash_free(_tfilenames); _tfilenames = NULL; eina_hash_free(_decls ); _decls = NULL; diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 0a14d21382..ee4357f686 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -41,9 +41,6 @@ extern Eina_Hash *_classesf; extern Eina_Hash *_aliasesf; extern Eina_Hash *_structsf; extern Eina_Hash *_enumsf; -extern Eina_Hash *_aliasesd; -extern Eina_Hash *_structsd; -extern Eina_Hash *_enumsd; extern Eina_Hash *_globalsf; extern Eina_Hash *_constantsf; extern Eina_Hash *_filenames; /* Hash: filename without extension -> full path */ From e061d49aaca3be10d98d0e74e04c723465af86bf Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 1 Mar 2016 15:37:57 +0000 Subject: [PATCH 21/23] eolian: completely clean up the type system --- src/lib/eolian/Eolian.h | 4 -- src/lib/eolian/database_type.c | 104 +++++++---------------------- src/lib/eolian/database_type_api.c | 12 ++-- src/lib/eolian/database_validate.c | 12 ++-- src/lib/eolian/eo_lexer.c | 9 +-- src/lib/eolian/eo_lexer.h | 1 + src/lib/eolian/eo_parser.c | 42 ++++++++---- src/lib/eolian/eolian_database.c | 6 +- src/lib/eolian/eolian_database.h | 17 ++--- 9 files changed, 77 insertions(+), 130 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index da3a212786..26f905d7e7 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -219,10 +219,6 @@ typedef enum EOLIAN_TYPE_REGULAR, EOLIAN_TYPE_COMPLEX, EOLIAN_TYPE_POINTER, - EOLIAN_TYPE_STRUCT, - EOLIAN_TYPE_STRUCT_OPAQUE, - EOLIAN_TYPE_ENUM, - EOLIAN_TYPE_ALIAS, EOLIAN_TYPE_CLASS, EOLIAN_TYPE_UNDEFINED } Eolian_Type_Type; diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index b9678dc504..ec3b9a8303 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -17,6 +17,21 @@ database_type_del(Eolian_Type *tp) database_type_del(tp->base_type); if (tp->name) eina_stringshare_del(tp->name); if (tp->full_name) eina_stringshare_del(tp->full_name); + if (tp->namespaces) EINA_LIST_FREE(tp->namespaces, sp) + eina_stringshare_del(sp); + if (tp->freefunc) eina_stringshare_del(tp->freefunc); + free(tp); +} + +void +database_typedecl_del(Eolian_Typedecl *tp) +{ + if (!tp) return; + const char *sp; + if (tp->base.file) eina_stringshare_del(tp->base.file); + database_type_del(tp->base_type); + if (tp->name) eina_stringshare_del(tp->name); + if (tp->full_name) eina_stringshare_del(tp->full_name); if (tp->fields) eina_hash_free(tp->fields); if (tp->field_list) eina_list_free(tp->field_list); if (tp->namespaces) EINA_LIST_FREE(tp->namespaces, sp) @@ -24,105 +39,34 @@ database_type_del(Eolian_Type *tp) if (tp->legacy) eina_stringshare_del(tp->legacy); if (tp->freefunc) eina_stringshare_del(tp->freefunc); database_doc_del(tp->doc); - database_typedecl_del(tp->decl); free(tp); } void -database_typedecl_del(Eolian_Typedecl *tp) +database_type_add(Eolian_Typedecl *def) { - /* TODO: own storage for typedecls for several fields */ - if (!tp) return; - const char *sp; - if (tp->base.file) eina_stringshare_del(tp->base.file); - /*database_type_del(tp->base_type);*/ - if (tp->name) eina_stringshare_del(tp->name); - if (tp->full_name) eina_stringshare_del(tp->full_name); - /*if (tp->fields) eina_hash_free(tp->fields); - if (tp->field_list) eina_list_free(tp->field_list);*/ - if (tp->namespaces) EINA_LIST_FREE(tp->namespaces, sp) - eina_stringshare_del(sp); - if (tp->legacy) eina_stringshare_del(tp->legacy); - if (tp->freefunc) eina_stringshare_del(tp->freefunc); - /*database_doc_del(tp->doc);*/ - free(tp); -} - -void -database_typedef_del(Eolian_Type *tp) -{ - if (!tp) return; - Eolian_Type *btp = tp->base_type; - /* prevent deletion of named structs/enums as they're deleted later on */ - if (btp) - { - if (btp->type == EOLIAN_TYPE_ENUM) - tp->base_type = NULL; - else if ((btp->type == EOLIAN_TYPE_STRUCT - || btp->type == EOLIAN_TYPE_STRUCT_OPAQUE) && btp->name) - tp->base_type = NULL; - } - database_type_del(tp); -} - -static Eolian_Typedecl * -_typedecl_add(Eolian_Type *type) -{ - const char *nm; - Eina_List *l; - - Eolian_Typedecl *ret = calloc(1, sizeof(Eolian_Typedecl)); - ret->base.file = eina_stringshare_ref(type->base.file); - ret->base.line = type->base.line; - ret->base.column = type->base.column; - ret->base_type = type->base_type; - ret->name = eina_stringshare_ref(type->name); - ret->full_name = eina_stringshare_ref(type->full_name); - if (type->namespaces) EINA_LIST_FOREACH(type->namespaces, l, nm) - ret->namespaces = eina_list_append(ret->namespaces, eina_stringshare_ref(nm)); - ret->fields = type->fields; - ret->field_list = type->field_list; - ret->doc = type->doc; - ret->legacy = eina_stringshare_ref(type->legacy); - ret->freefunc = eina_stringshare_ref(type->freefunc); - ret->is_extern = type->is_extern; - ret->parent = type; - - return ret; -} - -void -database_type_add(Eolian_Type *def) -{ - def->decl = _typedecl_add(def); - def->decl->type = EOLIAN_TYPEDECL_ALIAS; 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->decl)); - database_decl_add(def->full_name, EOLIAN_DECL_ALIAS, def->base.file, def->decl); + ((Eina_List*)eina_hash_find(_aliasesf, def->base.file), def)); + database_decl_add(def->full_name, EOLIAN_DECL_ALIAS, def->base.file, def); } void -database_struct_add(Eolian_Type *tp) +database_struct_add(Eolian_Typedecl *tp) { - tp->decl = _typedecl_add(tp); - tp->decl->type = (tp->type == EOLIAN_TYPE_STRUCT_OPAQUE) ? EOLIAN_TYPEDECL_STRUCT_OPAQUE - : EOLIAN_TYPEDECL_STRUCT; 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->decl)); - database_decl_add(tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, tp->decl); + ((Eina_List*)eina_hash_find(_structsf, tp->base.file), tp)); + database_decl_add(tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, tp); } void -database_enum_add(Eolian_Type *tp) +database_enum_add(Eolian_Typedecl *tp) { - tp->decl = _typedecl_add(tp); - tp->decl->type = EOLIAN_TYPEDECL_ENUM; 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->decl)); - database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp->decl); + ((Eina_List*)eina_hash_find(_enumsf, tp->base.file), tp)); + database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp); } void diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index 00359acaa9..d02ad0c942 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -11,10 +11,10 @@ eolian_typedecl_alias_get_by_name(const char *name) { if (!_aliases) return NULL; Eina_Stringshare *shr = eina_stringshare_add(name); - Eolian_Type *tp = eina_hash_find(_aliases, shr); + Eolian_Typedecl *tp = eina_hash_find(_aliases, shr); eina_stringshare_del(shr); if (!tp) return NULL; - return tp->decl; + return tp; } EAPI const Eolian_Typedecl * @@ -22,10 +22,10 @@ eolian_typedecl_struct_get_by_name(const char *name) { if (!_structs) return NULL; Eina_Stringshare *shr = eina_stringshare_add(name); - Eolian_Type *tp = eina_hash_find(_structs, shr); + Eolian_Typedecl *tp = eina_hash_find(_structs, shr); eina_stringshare_del(shr); if (!tp) return NULL; - return tp->decl; + return tp; } EAPI const Eolian_Typedecl * @@ -33,10 +33,10 @@ eolian_typedecl_enum_get_by_name(const char *name) { if (!_enums) return NULL; Eina_Stringshare *shr = eina_stringshare_add(name); - Eolian_Type *tp = eina_hash_find(_enums, shr); + Eolian_Typedecl *tp = eina_hash_find(_enums, shr); eina_stringshare_del(shr); if (!tp) return NULL; - return tp->decl; + return tp; } EAPI Eina_Iterator * diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c index 63e1f3728a..8ce37a172f 100644 --- a/src/lib/eolian/database_validate.c +++ b/src/lib/eolian/database_validate.c @@ -400,10 +400,10 @@ _validate_variable(const Validator *vs, const Eolian_Variable *var) } static Eina_Bool -_type_map_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, - const Eolian_Type *tp, Val_Success *sc) +_typedecl_map_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, + const Eolian_Typedecl *tp, Val_Success *sc) { - sc->success = _validate_typedecl(sc->vs, tp->decl); + sc->success = _validate_typedecl(sc->vs, tp); return sc->success; } @@ -436,15 +436,15 @@ database_validate(Eina_Bool silent_types) succ.vs = &vs; succ.success = EINA_TRUE; - eina_hash_foreach(_aliases, (Eina_Hash_Foreach)_type_map_cb, &succ); + eina_hash_foreach(_aliases, (Eina_Hash_Foreach)_typedecl_map_cb, &succ); if (!succ.success) return EINA_FALSE; - eina_hash_foreach(_structs, (Eina_Hash_Foreach)_type_map_cb, &succ); + eina_hash_foreach(_structs, (Eina_Hash_Foreach)_typedecl_map_cb, &succ); if (!succ.success) return EINA_FALSE; - eina_hash_foreach(_enums, (Eina_Hash_Foreach)_type_map_cb, &succ); + eina_hash_foreach(_enums, (Eina_Hash_Foreach)_typedecl_map_cb, &succ); if (!succ.success) return EINA_FALSE; diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c index d14c70ff23..0e98313d51 100644 --- a/src/lib/eolian/eo_lexer.c +++ b/src/lib/eolian/eo_lexer.c @@ -1015,6 +1015,7 @@ _temps_free(Eo_Lexer_Temps *tmp) { Eina_Strbuf *buf; Eolian_Type *tp; + Eolian_Typedecl *tpd; const char *s; if (tmp->kls) @@ -1027,10 +1028,10 @@ _temps_free(Eo_Lexer_Temps *tmp) eina_strbuf_free(buf); EINA_LIST_FREE(tmp->type_defs, tp) - if (tp->type == EOLIAN_TYPE_ALIAS) - database_typedef_del(tp); - else - database_type_del(tp); + database_type_del(tp); + + EINA_LIST_FREE(tmp->type_decls, tpd) + database_typedecl_del(tpd); EINA_LIST_FREE(tmp->strs, s) if (s) eina_stringshare_del(s); diff --git a/src/lib/eolian/eo_lexer.h b/src/lib/eolian/eo_lexer.h index 9908e265f2..b28a3fc530 100644 --- a/src/lib/eolian/eo_lexer.h +++ b/src/lib/eolian/eo_lexer.h @@ -118,6 +118,7 @@ typedef struct _Eo_Lexer_Temps Eolian_Variable *var; Eina_List *str_bufs; Eina_List *type_defs; + Eina_List *type_decls; Eina_List *expr_defs; Eina_List *strs; } Eo_Lexer_Temps; diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 10fdfd83c5..6b6df140c0 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -117,12 +117,26 @@ push_type(Eo_Lexer *ls) return def; } +static Eolian_Typedecl * +push_typedecl(Eo_Lexer *ls) +{ + Eolian_Typedecl *def = calloc(1, sizeof(Eolian_Typedecl)); + ls->tmp.type_decls = eina_list_prepend(ls->tmp.type_decls, def); + return def; +} + static void pop_type(Eo_Lexer *ls) { ls->tmp.type_defs = eina_list_remove_list(ls->tmp.type_defs, ls->tmp.type_defs); } +static void +pop_typedecl(Eo_Lexer *ls) +{ + ls->tmp.type_decls = eina_list_remove_list(ls->tmp.type_decls, ls->tmp.type_decls); +} + static Eina_Stringshare * push_str(Eo_Lexer *ls, const char *val) { @@ -471,15 +485,15 @@ _struct_field_free(Eolian_Struct_Type_Field *def) free(def); } -static Eolian_Type * +static Eolian_Typedecl * parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern, int line, int column, const char *freefunc) { int bline = ls->line_number, bcolumn = ls->column; - Eolian_Type *def = push_type(ls); + Eolian_Typedecl *def = push_typedecl(ls); def->is_extern = is_extern; if (name) _fill_name(name, &def->full_name, &def->name, &def->namespaces); - def->type = EOLIAN_TYPE_STRUCT; + def->type = EOLIAN_TYPEDECL_STRUCT; def->fields = eina_hash_string_small_new(EINA_FREE_CB(_struct_field_free)); def->freefunc = freefunc; pop_str(ls); @@ -524,15 +538,15 @@ _enum_field_free(Eolian_Enum_Type_Field *def) free(def); } -static Eolian_Type * +static Eolian_Typedecl * parse_enum(Eo_Lexer *ls, const char *name, Eina_Bool is_extern, int line, int column) { int bline = ls->line_number, bcolumn = ls->column; - Eolian_Type *def = push_type(ls); + Eolian_Typedecl *def = push_typedecl(ls); def->is_extern = is_extern; _fill_name(name, &def->full_name, &def->name, &def->namespaces); - def->type = EOLIAN_TYPE_ENUM; + def->type = EOLIAN_TYPEDECL_ENUM; def->fields = eina_hash_string_small_new(EINA_FREE_CB(_enum_field_free)); check_next(ls, '{'); FILL_DOC(ls, def, doc); @@ -843,11 +857,11 @@ parse_type_void(Eo_Lexer *ls) return parse_type_void_base(ls, EINA_FALSE); } -static Eolian_Type * +static Eolian_Typedecl * parse_typedef(Eo_Lexer *ls) { Eolian_Declaration *decl; - Eolian_Type *def = push_type(ls); + Eolian_Typedecl *def = push_typedecl(ls); Eina_Bool has_extern; const char *freefunc; Eina_Strbuf *buf; @@ -855,7 +869,7 @@ parse_typedef(Eo_Lexer *ls) parse_struct_attrs(ls, EINA_FALSE, &has_extern, &freefunc); def->freefunc = freefunc; pop_str(ls); - def->type = EOLIAN_TYPE_ALIAS; + def->type = EOLIAN_TYPEDECL_ALIAS; def->is_extern = has_extern; buf = push_strbuf(ls); eo_lexer_context_push(ls); @@ -1856,7 +1870,7 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot) case KW_type: { database_type_add(parse_typedef(ls)); - pop_type(ls); + pop_typedecl(ls); break; } case KW_const: @@ -1895,9 +1909,9 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot) pop_strbuf(ls); if (!is_enum && ls->t.token == ';') { - Eolian_Type *def = push_type(ls); + Eolian_Typedecl *def = push_typedecl(ls); def->is_extern = has_extern; - def->type = EOLIAN_TYPE_STRUCT_OPAQUE; + def->type = EOLIAN_TYPEDECL_STRUCT_OPAQUE; def->freefunc = freefunc; pop_str(ls); _fill_name(name, &def->full_name, &def->name, &def->namespaces); @@ -1905,14 +1919,14 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot) FILL_DOC(ls, def, doc); FILL_BASE(def->base, ls, line, col); database_struct_add(def); - pop_type(ls); + pop_typedecl(ls); break; } if (is_enum) parse_enum(ls, name, has_extern, line, col); else parse_struct(ls, name, has_extern, line, col, freefunc); - pop_type(ls); + pop_typedecl(ls); break; } def: diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index 4fccf77d45..3cdca384ce 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -43,9 +43,9 @@ database_init() if (_database_init_count > 0) return ++_database_init_count; eina_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)); - _enums = eina_hash_stringshared_new(EINA_FREE_CB(database_type_del)); + _aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del)); + _structs = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del)); + _enums = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_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); diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index ee4357f686..20cd91cf25 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -170,22 +170,15 @@ struct _Eolian_Type Eina_Stringshare *name; Eina_Stringshare *full_name; Eina_List *namespaces; - Eina_Hash *fields; - Eina_List *field_list; - Eolian_Documentation *doc; - Eina_Stringshare *legacy; Eina_Stringshare *freefunc; - Eolian_Typedecl *decl; Eina_Bool is_const :1; Eina_Bool is_own :1; - Eina_Bool is_extern :1; }; struct _Eolian_Typedecl { Eolian_Object base; Eolian_Typedecl_Type type; - Eolian_Type *parent; Eolian_Type *base_type; Eina_Stringshare *name; Eina_Stringshare *full_name; @@ -241,7 +234,7 @@ struct _Eolian_Struct_Type_Field struct _Eolian_Enum_Type_Field { - Eolian_Type *base_enum; + Eolian_Typedecl *base_enum; Eina_Stringshare *name; Eolian_Object base; Eolian_Expression *value; @@ -299,12 +292,10 @@ void database_doc_del(Eolian_Documentation *doc); /* 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_add(Eolian_Typedecl *def); +void database_struct_add(Eolian_Typedecl *tp); +void database_enum_add(Eolian_Typedecl *tp); void database_type_del(Eolian_Type *tp); -void database_typedef_del(Eolian_Type *tp); - void database_typedecl_del(Eolian_Typedecl *tp); void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name); From 32e0b60bb4c08225a684e4d4a948e94c122d3baa Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 1 Mar 2016 15:59:46 +0000 Subject: [PATCH 22/23] eolian: type documentation and other cleanups --- src/lib/eolian/Eolian.h | 251 ++++++++++++++++++++--------- src/lib/eolian/database_type_api.c | 4 - 2 files changed, 177 insertions(+), 78 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 26f905d7e7..70c5a1c194 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -1330,31 +1330,20 @@ EAPI Eina_Iterator *eolian_typedecl_structs_get_by_file(const char *fname); EAPI Eina_Iterator *eolian_typedecl_enums_get_by_file(const char *fname); /* - * @brief Get the type of a type (regular, function, pointer) + * @brief Get the type of a type declaration. * - * @param[in] tp the type. - * @return an Eolian_Type_Type. + * @param[in] tp the type declaration. + * @return an Eolian_Typedecl_Type. * * @ingroup Eolian */ -EAPI Eolian_Type_Type eolian_type_type_get(const Eolian_Type *tp); EAPI Eolian_Typedecl_Type eolian_typedecl_type_get(const Eolian_Typedecl *tp); -/* - * @brief Get an iterator to all subtypes of a type. - * - * @param[in] tp the type. - * @return the iterator when @c tp is a complex type. - * - * @ingroup Eolian - */ -EAPI Eina_Iterator *eolian_type_subtypes_get(const Eolian_Type *tp); - /* * @brief Get an iterator to all fields of a struct type. * - * @param[in] tp the type. - * @return the iterator when @c tp is EOLIAN_TYPE_STRUCT, NULL otherwise. + * @param[in] tp the type declaration. + * @return the iterator when @c tp is EOLIAN_TYPEDECL_STRUCT, NULL otherwise. * * @ingroup Eolian */ @@ -1363,9 +1352,9 @@ EAPI Eina_Iterator *eolian_typedecl_struct_fields_get(const Eolian_Typedecl *tp) /* * @brief Get a field of a struct type. * - * @param[in] tp the type. + * @param[in] tp the type declaration. * @param[in] field the field name. - * @return the field when @c tp is EOLIAN_TYPE_STRUCT, @c field is not NULL + * @return the field when @c tp is EOLIAN_TYPEDECL_STRUCT, @c field is not NULL * and the field exists, NULL otherwise. * * @ingroup Eolian @@ -1405,8 +1394,8 @@ EAPI const Eolian_Type *eolian_typedecl_struct_field_type_get(const Eolian_Struc /* * @brief Get an iterator to all fields of an enum type. * - * @param[in] tp the type. - * @return the iterator when @c tp is EOLIAN_TYPE_ENUM, NULL otherwise. + * @param[in] tp the type declaration. + * @return the iterator when @c tp is EOLIAN_TYPEDECL_ENUM, NULL otherwise. * * @ingroup Eolian */ @@ -1415,9 +1404,9 @@ EAPI Eina_Iterator *eolian_typedecl_enum_fields_get(const Eolian_Typedecl *tp); /* * @brief Get a field of an enum type. * - * @param[in] tp the type. + * @param[in] tp the type declaration. * @param[in] field the field name. - * @return the field when @c tp is EOLIAN_TYPE_ENUM, @c field is not NULL, + * @return the field when @c tp is EOLIAN_TYPEDECL_ENUM, @c field is not NULL, * field exists and has a value set, NULL otherwise. * * Keep in mind that this can return NULL for an existing field, particularly @@ -1478,7 +1467,7 @@ EAPI const Eolian_Expression *eolian_typedecl_enum_field_value_get(const Eolian_ * @brief Get the legacy prefix of enum field names. When not specified, * enum name is used. * - * @param[in] tp the type. + * @param[in] tp the type declaration. * @return the legacy prefix or NULL. * * @ingroup Eolian @@ -1488,7 +1477,7 @@ EAPI Eina_Stringshare *eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typed /* * @brief Get the documentation of a struct/alias type. * - * @param[in] tp the type. + * @param[in] tp the type declaration. * @return the documentation when @c tp is EOLIAN_TYPE_STRUCT or * EOLIAN_TYPE_STRUCT_OPAQUE, NULL otherwise. * @@ -1497,7 +1486,145 @@ EAPI Eina_Stringshare *eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typed EAPI const Eolian_Documentation *eolian_typedecl_documentation_get(const Eolian_Typedecl *tp); /* - * @brief Get the filename of a struct/alias type. + * @brief Get the filename of a type declaration. + * + * @param[in] tp the type declaration. + * @return the filename. + * + * @ingroup Eolian + */ +EAPI Eina_Stringshare *eolian_typedecl_file_get(const Eolian_Typedecl *tp); + +/* + * @brief Get the base type of an alias declaration. + * + * @param[in] tp the type declaration. + * @return the base type when @c tp is an alias, NULL otherwise. + * + * @ingroup Eolian + */ +EAPI const Eolian_Type *eolian_typedecl_base_type_get(const Eolian_Typedecl *tp); + +/* + * @brief Get the lowest base type of an alias stack. + * + * If the given typedecl is an alias, it returns the result of + * eolian_type_aliased_base_get on its base type. Otherwise this returns NULL. + * + * @param[in] tp the type declaration. + * @return the lowest alias base or the given type. + * + * @ingroup Eolian + */ +EAPI const Eolian_Type *eolian_typedecl_aliased_base_get(const Eolian_Typedecl *tp); + +/* + * @brief Check if a struct or alias type declaration is extern. + * + * @param[in] tp the type declaration. + * @return EINA_TRUE if it's extern, EINA_FALSE otherwise. + * + * @ingroup Eolian + */ +EAPI Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp); + +/* + * @brief Get the full C type name of the given type declaration with a name. + * + * @param[in] tp the type declaration. + * @param[in] name the name. + * @return The C type name assuming @c tp is not NULL. + * + * Name is ignored for alias types and they're turned into C typedefs. + * + * Keep in mind that if @c name is NULL, the name won't be included. + * Also, you're responsible for deleting the stringshare. + * + * @see eolian_typedecl_c_type_get + * @see eolian_type_c_type_named_get + * + * @ingroup Eolian + */ +EAPI Eina_Stringshare *eolian_typedecl_c_type_named_get(const Eolian_Typedecl *tp, const char *name); + +/* + * @brief Get the full C type name of the given type without a name. + * + * @param[in] tp the type declaration. + * @return The C type name assuming @c tp is not NULL. + * + * This behaves exactly like eolian_typedecl_c_type_named_get when name is NULL. + * + * @see eolian_typedecl_c_type_named_get + * @see eolian_type_c_type_get + * + * @ingroup Eolian + */ +EAPI Eina_Stringshare *eolian_typedecl_c_type_get(const Eolian_Typedecl *tp); + +/* + * @brief Get the name of the given type declaration. Keep in mind that the + * name doesn't include namespaces. + * + * @param[in] tp the type declaration. + * @return the name. + * + * @ingroup Eolian + */ +EAPI Eina_Stringshare *eolian_typedecl_name_get(const Eolian_Typedecl *tp); + +/* + * @brief Get the full (namespaced) name of a type declaration. + * + * @param[in] tp the type declaration. + * @return the name. + * + * @ingroup Eolian + */ +EAPI Eina_Stringshare *eolian_typedecl_full_name_get(const Eolian_Typedecl *tp); + +/* + * @brief Get an iterator to the list of namespaces of the given type decl. + * + * @param[in] tp the type declaration. + * @return the iterator. + * + * @ingroup Eolian + */ +EAPI Eina_Iterator *eolian_typedecl_namespaces_get(const Eolian_Typedecl *tp); + +/* + * @brief Get the name of the function used to free this type declaration. + * + * @param[in] tp the type declaration. + * @return the free func name. + * + * @ingroup Eolian + */ +EAPI Eina_Stringshare *eolian_typedecl_free_func_get(const Eolian_Typedecl *tp); + +/* + * @brief Get the type of a type. + * + * @param[in] tp the type. + * @return an Eolian_Type_Type. + * + * @ingroup Eolian + */ +EAPI Eolian_Type_Type eolian_type_type_get(const Eolian_Type *tp); + +/* + * @brief Get an iterator to all subtypes of a type. + * + * @param[in] tp the type. + * @return the iterator when @c tp is a complex type. + * + * @ingroup Eolian + */ +EAPI Eina_Iterator *eolian_type_subtypes_get(const Eolian_Type *tp); + +/* + * @brief Get the filename of a type. * * @param[in] tp the type. * @return the filename. @@ -1505,32 +1632,37 @@ EAPI const Eolian_Documentation *eolian_typedecl_documentation_get(const Eolian_ * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_file_get(const Eolian_Type *tp); -EAPI Eina_Stringshare *eolian_typedecl_file_get(const Eolian_Typedecl *tp); /* - * @brief Get the base type of a pointer, alias or regular type. - * - * For pointers and aliases, it's a simple lookup. For regular types, it - * tries to look up alias, struct and enum in that order. + * @brief Get the base type of a pointer type. * * @param[in] tp the type. - * @return the base type when @c tp is a pointer or alias, NULL otherwise. + * @return the base type when @c tp is a pointer, NULL otherwise. * * @ingroup Eolian */ EAPI const Eolian_Type *eolian_type_base_type_get(const Eolian_Type *tp); -EAPI const Eolian_Type *eolian_typedecl_base_type_get(const Eolian_Typedecl *tp); + +/* + * @brief Get the declaration a regular type points to. + * + * This tries to look up alias, struct and enum in that order. + * + * @param[in] tp the type. + * @return the pointed to type decalration or NULL. + * + * @ingroup Eolian + */ EAPI const Eolian_Typedecl *eolian_type_typedecl_get(const Eolian_Type *tp); /* * @brief Get the lowest base type of an alias stack. * - * If the given type is an alias, it returns the result of a recursive call - * to this function on its base type. If it's a regular type, it first tries - * to retrieve its base using eolian_type_base_type_get and if the retrieved - * base is an alias, returns a recursive call of this function on it. Otherwise - * it returns the given type. This is useful in order to retrieve what an - * aliased type actually is while still having convenience. + * If this is a regular type, it first tries to retrieve its base declaration + * using eolian_type_typedecl_get and if the retrieved base is an alias, returns + * a call of eolian_typedecl_aliased_base_get function on it. Otherwise it + * returns the given type. This is useful in order to retrieve what an aliased + * type actually is while still having convenience. * * @param[in] tp the type. * @return the lowest alias base or the given type. @@ -1538,7 +1670,6 @@ EAPI const Eolian_Typedecl *eolian_type_typedecl_get(const Eolian_Type *tp); * @ingroup Eolian */ EAPI const Eolian_Type *eolian_type_aliased_base_get(const Eolian_Type *tp); -EAPI const Eolian_Type *eolian_typedecl_aliased_base_get(const Eolian_Typedecl *tp); /* * @brief Get the class associated with an EOLIAN_TYPE_CLASS type. @@ -1572,16 +1703,6 @@ EAPI Eina_Bool eolian_type_is_own(const Eolian_Type *tp); */ EAPI Eina_Bool eolian_type_is_const(const Eolian_Type *tp); -/* - * @brief Check if a struct or alias type is extern. - * - * @param[in] tp the type. - * @return EINA_TRUE if it's extern, EINA_FALSE otherwise. - * - * @ingroup Eolian - */ -EAPI Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp); - /* * @brief Get the full C type name of the given type with a name. * @@ -1589,21 +1710,15 @@ EAPI Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp); * @param[in] name the name. * @return The C type name assuming @c tp is not NULL. * - * Providing the name is useful for function types, as in C a function - * pointer type alone is not valid syntax. For non-function types, the - * name is simply appended to the type (with a space). C type names do - * not include subtypes as C doesn't support them. Name is ignored for - * alias types. Alias types are turned into C typedefs. - * * Keep in mind that if @c name is NULL, the name won't be included. * Also, you're responsible for deleting the stringshare. * * @see eolian_type_c_type_get + * @see eolian_typedecl_c_type_named_get * * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_c_type_named_get(const Eolian_Type *tp, const char *name); -EAPI Eina_Stringshare *eolian_typedecl_c_type_named_get(const Eolian_Typedecl *tp, const char *name); /* * @brief Get the full C type name of the given type without a name. @@ -1612,23 +1727,18 @@ EAPI Eina_Stringshare *eolian_typedecl_c_type_named_get(const Eolian_Typedecl *t * @return The C type name assuming @c tp is not NULL. * * This behaves exactly like eolian_type_c_type_named_get when name is NULL. - * Keep in mind that this is not useful for function types as a function - * pointer type in C cannot be used without a name. - * Also, you're responsible for deleting the stringshare. * * @see eolian_type_c_type_named_get + * @see eolian_typedecl_c_type_get * * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_c_type_get(const Eolian_Type *tp); -EAPI Eina_Stringshare *eolian_typedecl_c_type_get(const Eolian_Typedecl *tp); /* * @brief Get the name of the given type. For regular or complex types, this - * is for example "int". For EOLIAN_TYPE_STRUCT, EOLIAN_TYPE_STRUCT_OPAQUE and - * EOLIAN_TYPE_ALIAS, this is the name of the alias or of the struct. For - * EOLIAN_TYPE_CLASS, this can be "Button". Keep in mind that the name doesn't - * include namespaces for structs and aliases. + * is for example "int". For EOLIAN_TYPE_CLASS, this can be "Button". Keep in + * mind that the name doesn't include namespaces. * * @param[in] tp the type. * @return the name. @@ -1636,11 +1746,9 @@ EAPI Eina_Stringshare *eolian_typedecl_c_type_get(const Eolian_Typedecl *tp); * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_name_get(const Eolian_Type *tp); -EAPI Eina_Stringshare *eolian_typedecl_name_get(const Eolian_Typedecl *tp); /* - * @brief Get the full (namespaced) name of a function. Only works on named - * types (not pointers, not functions, not void). + * @brief Get the full (namespaced) name of a type. * * @param[in] tp the type. * @return the name. @@ -1648,11 +1756,9 @@ EAPI Eina_Stringshare *eolian_typedecl_name_get(const Eolian_Typedecl *tp); * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_full_name_get(const Eolian_Type *tp); -EAPI Eina_Stringshare *eolian_typedecl_full_name_get(const Eolian_Typedecl *tp); /* - * @brief Get an iterator to the list of namespaces of the given type. Only - * works on named types (not pointers, not functions, not void). + * @brief Get an iterator to the list of namespaces of the given type. * * @param[in] tp the type. * @return the iterator. @@ -1660,7 +1766,6 @@ EAPI Eina_Stringshare *eolian_typedecl_full_name_get(const Eolian_Typedecl *tp); * @ingroup Eolian */ EAPI Eina_Iterator *eolian_type_namespaces_get(const Eolian_Type *tp); -EAPI Eina_Iterator *eolian_typedecl_namespaces_get(const Eolian_Typedecl *tp); /* * @brief Get the name of the function used to free this type. @@ -1669,13 +1774,11 @@ EAPI Eina_Iterator *eolian_typedecl_namespaces_get(const Eolian_Typedecl *tp); * @return the free func name. * * For pointer types, this returns name of the func used to free the pointer. - * For struct and alias types, this returns name of the func used to free a - * pointer to that type. For other types, this returns NULL. + * For other types, this returns NULL. * * @ingroup Eolian */ EAPI Eina_Stringshare *eolian_type_free_func_get(const Eolian_Type *tp); -EAPI Eina_Stringshare *eolian_typedecl_free_func_get(const Eolian_Typedecl *tp); /* * @brief Evaluate an Eolian expression. diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index d02ad0c942..763112ea06 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -241,8 +241,6 @@ EAPI const Eolian_Type * eolian_type_base_type_get(const Eolian_Type *tp) { EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - if (tp->type != EOLIAN_TYPE_POINTER) - return NULL; return tp->base_type; } @@ -270,8 +268,6 @@ EAPI const Eolian_Type * eolian_typedecl_base_type_get(const Eolian_Typedecl *tp) { EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); - if (tp->type != EOLIAN_TYPEDECL_ALIAS) - return NULL; return tp->base_type; } From f57d4b9a3c769d077cf68a46a3d564b38cc04fa7 Mon Sep 17 00:00:00 2001 From: Vitor Sousa Date: Tue, 1 Mar 2016 15:20:06 -0300 Subject: [PATCH 23/23] eolian_cxx: Fix C++ compilation with new Eolian_Type_Type values --- src/bin/eolian_cxx/type_lookup.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/eolian_cxx/type_lookup.hh b/src/bin/eolian_cxx/type_lookup.hh index 38b683d468..7f73a5edda 100644 --- a/src/bin/eolian_cxx/type_lookup.hh +++ b/src/bin/eolian_cxx/type_lookup.hh @@ -49,7 +49,7 @@ type_from_eolian(Eolian_Type const& type) efl::eolian::eolian_type x; Eolian_Type_Type tpt = ::eolian_type_type_get(&type); - if (tpt == EOLIAN_TYPE_POINTER || tpt == EOLIAN_TYPE_ALIAS || tpt == EOLIAN_TYPE_REGULAR) + if (tpt == EOLIAN_TYPE_POINTER || tpt == EOLIAN_TYPE_REGULAR) { Eolian_Type const* base_type = ::eolian_type_base_type_get(&type); if (base_type && ::eolian_type_type_get(base_type) == EOLIAN_TYPE_CLASS)