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;