eolian: actually generate typedecls as necessary

This commit is contained in:
Daniel Kolesa 2015-12-16 14:36:00 +00:00
parent 06c246ee27
commit 1425523bd4
2 changed files with 34 additions and 4 deletions

View File

@ -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));

View File

@ -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;