Eolian: Format changes

- Support keys/values for properties instead of params
- Direction for parameters syntax changed from in to @in...
- obj:const changed to const in .eo
This commit is contained in:
Daniel Zaoui 2014-02-26 20:02:10 +02:00
parent a8661af73e
commit 5ae7cc962f
10 changed files with 1114 additions and 969 deletions

View File

@ -158,6 +158,20 @@ eo1_fundef_generate(const char *classname, Eolian_Function func, Eolian_Function
eina_strbuf_append_printf(str_typecheck, ", EO_TYPECHECK(%s*, ret)", rettype);
}
EINA_LIST_FOREACH(eolian_property_keys_list_get(func), l, data)
{
const char *pname;
const char *ptype;
eolian_parameter_information_get((Eolian_Function_Parameter)data, NULL, &ptype, &pname, NULL);
eina_strbuf_append_printf(str_pardesc, tmpl_eo_pardesc, "in", pname);
if (eina_strbuf_length_get(str_par)) eina_strbuf_append(str_par, ", ");
eina_strbuf_append(str_par, pname);
eina_strbuf_append_printf(str_typecheck, ", EO_TYPECHECK(%s, %s)", ptype, pname);
}
EINA_LIST_FOREACH(eolian_parameters_list_get(func), l, data)
{
const char *pname;
@ -329,6 +343,20 @@ eo1_bind_func_generate(const char *classname, Eolian_Function funcid, Eolian_Fun
const Eina_List *l;
void *data;
EINA_LIST_FOREACH(eolian_property_keys_list_get(funcid), l, data)
{
const char *pname;
const char *ptype;
eolian_parameter_information_get((Eolian_Function_Parameter)data, NULL, &ptype, &pname, NULL);
Eina_Bool is_const = eolian_parameter_get_const_attribute_get(data);
eina_strbuf_append_printf(va_args, " %s%s %s = va_arg(*list, %s%s);\n",
ftype == GET && is_const?"const ":"", ptype, pname,
ftype == GET && is_const?"const ":"", _varg_upgr(ptype));
eina_strbuf_append_printf(params, ", %s", pname);
eina_strbuf_append_printf(full_params, ", %s%s %s",
ftype == GET && eolian_parameter_get_const_attribute_get(data)?"const ":"",
ptype, pname);
}
if (!var_as_ret)
{
EINA_LIST_FOREACH(eolian_parameters_list_get(funcid), l, data)
@ -369,7 +397,8 @@ eo1_bind_func_generate(const char *classname, Eolian_Function funcid, Eolian_Fun
eina_strbuf_replace_all(fbody, "@#ret_type", "void");
}
if (eina_list_count(eolian_parameters_list_get(funcid)) == 0)
if (eina_list_count(eolian_parameters_list_get(funcid)) == 0 &&
(eina_list_count(eolian_property_keys_list_get(funcid)) == 0))
{
eina_strbuf_replace_all(fbody, "@#list_unused", " EINA_UNUSED");
}

View File

@ -96,6 +96,17 @@ _eapi_decl_func_generate(const char *classname, Eolian_Function funcid, Eolian_F
const Eina_List *l;
void *data;
EINA_LIST_FOREACH(eolian_property_keys_list_get(funcid), l, data)
{
const char *pname;
const char *pdesc;
const char *ptype;
eolian_parameter_information_get((Eolian_Function_Parameter)data, NULL, &ptype, &pname, &pdesc);
eina_strbuf_append_printf(fparam, ", %s%s %s",
eolian_parameter_get_const_attribute_get(data)?"const":"",
ptype, pname);
eina_strbuf_append_printf(descparam, " * @param %s\n", pname);
}
if (!var_as_ret)
{
EINA_LIST_FOREACH(eolian_parameters_list_get(funcid), l, data)
@ -187,6 +198,17 @@ _eapi_func_generate(const char *classname, Eolian_Function funcid, Eolian_Functi
tmpstr[0] = '\0';
EINA_LIST_FOREACH(eolian_property_keys_list_get(funcid), l, data)
{
const char *pname;
const char *ptype;
eolian_parameter_information_get((Eolian_Function_Parameter)data, NULL, &ptype, &pname, NULL);
eina_strbuf_append_printf(fparam, ", %s%s %s",
ftype == GET && eolian_parameter_get_const_attribute_get(data)?"const ":"",
ptype, pname);
if (eina_strbuf_length_get(eoparam)) eina_strbuf_append(eoparam, ", ");
eina_strbuf_append_printf(eoparam, "%s", pname);
}
if (!var_as_ret)
{
EINA_LIST_FOREACH(eolian_parameters_list_get(funcid), l, data)

View File

@ -296,10 +296,30 @@ EAPI const char *eolian_function_data_get(Eolian_Function function_id, const cha
EAPI Eolian_Function_Parameter eolian_function_parameter_get(const Eolian_Function function_id, const char *param_name);
/*
* @brief Returns a list of parameter handles for a function pointed by its id.
* @brief Returns a list of keys params of a given function.
*
* @param[in] function_id Id of the function
* @return a handle to this parameter.
* @return list of Eolian_Function_Parameter
*
* @ingroup Eolian
*/
EAPI const Eina_List *eolian_property_keys_list_get(Eolian_Function foo_id);
/*
* @brief Returns a list of values params of a given function.
*
* @param[in] function_id Id of the function
* @return list of Eolian_Function_Parameter
*
* @ingroup Eolian
*/
EAPI const Eina_List *eolian_property_values_list_get(Eolian_Function foo_id);
/*
* @brief Returns a list of parameter handles for a method/ctor/dtor.
*
* @param[in] function_id Id of the function
* @return list of Eolian_Function_Parameter
*
* @ingroup Eolian
*/

View File

@ -43,7 +43,10 @@ eo_definitions_property_def_free(Eo_Property_Def *prop)
if (prop->name)
eina_stringshare_del(prop->name);
EINA_LIST_FREE(prop->params, param)
EINA_LIST_FREE(prop->keys, param)
eo_definitions_param_free(param);
EINA_LIST_FREE(prop->values, param)
eo_definitions_param_free(param);
EINA_LIST_FREE(prop->accessors, accessor)

View File

@ -59,7 +59,8 @@ typedef struct _eo_accessor_def
typedef struct _eo_property_def
{
const char *name;
Eina_List *params;
Eina_List *keys;
Eina_List *values;
Eina_List *accessors;
} Eo_Property_Def;

File diff suppressed because it is too large Load Diff

View File

@ -35,6 +35,7 @@ typedef struct _eo_tokenizer
Eina_List *classes;
struct {
Eina_List **params;
Eolian_Class_Type kls_type;
Eo_Class_Def *kls;
Eo_Property_Def *prop;

View File

@ -194,17 +194,17 @@ _eo_tokenizer_param_get(Eo_Tokenizer *toknz, char *p)
s++;
param->way = PARAM_IN;
if (strncmp(toknz->saved.tok, "in ", 3) == 0)
if (strncmp(toknz->saved.tok, "@in ", 3) == 0)
{
toknz->saved.tok += 3;
param->way = PARAM_IN;
}
else if (strncmp(toknz->saved.tok, "out ", 4) == 0)
else if (strncmp(toknz->saved.tok, "@out ", 4) == 0)
{
toknz->saved.tok += 4;
param->way = PARAM_OUT;
}
else if (strncmp(toknz->saved.tok, "inout ", 6) == 0)
else if (strncmp(toknz->saved.tok, "@inout ", 6) == 0)
{
toknz->saved.tok += 6;
param->way = PARAM_INOUT;
@ -423,10 +423,8 @@ _eo_tokenizer_implement_get(Eo_Tokenizer *toknz, char *p)
action end_param {
toknz->tmp.param = _eo_tokenizer_param_get(toknz, fpc);
if (toknz->tmp.prop)
toknz->tmp.prop->params = eina_list_append(toknz->tmp.prop->params, toknz->tmp.param);
else if (toknz->tmp.meth)
toknz->tmp.meth->params = eina_list_append(toknz->tmp.meth->params, toknz->tmp.param);
if (toknz->tmp.params)
*(toknz->tmp.params) = eina_list_append(*(toknz->tmp.params), toknz->tmp.param);
else
ABORT(toknz, "got a param but there is no property nor method waiting for it");
INF(" %s : %s", toknz->tmp.param->name, toknz->tmp.param->type);
@ -445,7 +443,7 @@ _eo_tokenizer_implement_get(Eo_Tokenizer *toknz, char *p)
}
param_comment = ws* eo_comment %end_param_comment;
param = alpha+ >save_fpc (alnum_u | '*' | ws )+ %end_param end_statement param_comment?;
param = ('@'|alpha+) >save_fpc (alnum_u | '*' | ws )+ %end_param end_statement param_comment?;
tokenize_params := |*
ignore+; #=> show_ignore;
@ -471,15 +469,23 @@ _eo_tokenizer_implement_get(Eo_Tokenizer *toknz, char *p)
fgoto tokenize_accessor;
}
action begin_property_params {
INF(" params {");
action begin_property_keys {
INF(" keys {");
toknz->current_nesting++;
toknz->tmp.params = &(toknz->tmp.prop->keys);
fgoto tokenize_params;
}
action begin_property_values {
INF(" values {");
toknz->current_nesting++;
toknz->tmp.params = &(toknz->tmp.prop->values);
fgoto tokenize_params;
}
action end_property {
if (eina_list_count(toknz->tmp.prop->params) == 0)
WRN("property '%s' has no parameters.", toknz->tmp.prop->name);
if (eina_list_count(toknz->tmp.prop->values) == 0)
WRN("property '%s' has no values.", toknz->tmp.prop->name);
if (eina_list_count(toknz->tmp.prop->accessors) == 0)
WRN("property '%s' has no accessors.", toknz->tmp.prop->name);
INF(" }");
@ -491,14 +497,16 @@ _eo_tokenizer_implement_get(Eo_Tokenizer *toknz, char *p)
prop_get = 'get' ignore* begin_def;
prop_set = 'set' ignore* begin_def;
prop_params = 'params' ignore* begin_def;
prop_keys = 'keys' ignore* begin_def;
prop_values = 'values' ignore* begin_def;
tokenize_property := |*
ignore+; #=> show_ignore;
comment => show_comment;
prop_get => begin_property_get;
prop_set => begin_property_set;
prop_params => begin_property_params;
prop_keys => begin_property_keys;
prop_values => begin_property_values;
end_def => end_property;
any => show_error;
*|;
@ -545,6 +553,7 @@ _eo_tokenizer_implement_get(Eo_Tokenizer *toknz, char *p)
action begin_method_params {
INF(" params {");
toknz->current_nesting++;
toknz->tmp.params = &(toknz->tmp.meth->params);
fgoto tokenize_params;
}
@ -600,7 +609,7 @@ _eo_tokenizer_implement_get(Eo_Tokenizer *toknz, char *p)
meth_legacy = 'legacy' ws+ ident %end_method_legacy end_statement;
meth_rettype_comment = ws* eo_comment %end_method_rettype_comment;
meth_rettype = 'return' ws+ alpha+ >save_fpc (alnum_u | '*' | ws )+ %end_method_rettype end_statement meth_rettype_comment?;
meth_obj_const = 'object' ws* colon ws* 'const' %end_method_obj_const end_statement;
meth_obj_const = 'const' %end_method_obj_const end_statement;
tokenize_method := |*
ignore+; #=> show_ignore;
@ -1034,9 +1043,14 @@ eo_tokenizer_dump(Eo_Tokenizer *toknz)
EINA_LIST_FOREACH(kls->properties, l, prop)
{
printf(" property: %s\n", prop->name);
EINA_LIST_FOREACH(prop->params, m, param)
EINA_LIST_FOREACH(prop->keys, m, param)
{
printf(" param: %s : %s (%s)\n",
printf(" key: %s : %s (%s)\n",
param->name, param->type, param->comment);
}
EINA_LIST_FOREACH(prop->values, m, param)
{
printf(" value: %s : %s (%s)\n",
param->name, param->type, param->comment);
}
EINA_LIST_FOREACH(prop->accessors, m, accessor)
@ -1117,7 +1131,7 @@ eo_tokenizer_database_fill(const char *filename)
database_function_data_set(foo_id, EOLIAN_LEGACY, meth->legacy);
EINA_LIST_FOREACH(meth->params, m, param)
{
database_function_parameter_add(foo_id, (Eolian_Parameter_Dir)param->way, param->type, param->name, param->comment);
database_method_parameter_add(foo_id, (Eolian_Parameter_Dir)param->way, param->type, param->name, param->comment);
}
}
@ -1129,18 +1143,17 @@ eo_tokenizer_database_fill(const char *filename)
database_function_data_set(foo_id, EOLIAN_LEGACY, meth->legacy);
EINA_LIST_FOREACH(meth->params, m, param)
{
database_function_parameter_add(foo_id, (Eolian_Parameter_Dir)param->way, param->type, param->name, param->comment);
database_method_parameter_add(foo_id, (Eolian_Parameter_Dir)param->way, param->type, param->name, param->comment);
}
}
EINA_LIST_FOREACH(kls->properties, l, prop)
{
Eolian_Function foo_id = database_function_new(prop->name, UNRESOLVED);
EINA_LIST_FOREACH(prop->params, m, param)
{
/* IN_PARAM doesn't care */
database_function_parameter_add(foo_id, EOLIAN_IN_PARAM, param->type, param->name, param->comment);
}
EINA_LIST_FOREACH(prop->keys, m, param)
database_property_key_add(foo_id, param->type, param->name, param->comment);
EINA_LIST_FOREACH(prop->values, m, param)
database_property_value_add(foo_id, param->type, param->name, param->comment);
EINA_LIST_FOREACH(prop->accessors, m, accessor)
{
database_function_type_set(foo_id, (accessor->type == SETTER?SET:GET));
@ -1184,9 +1197,7 @@ eo_tokenizer_database_fill(const char *filename)
database_function_data_set(foo_id, EOLIAN_LEGACY, meth->legacy);
database_function_object_set_as_const(foo_id, meth->obj_const);
EINA_LIST_FOREACH(meth->params, m, param)
{
database_function_parameter_add(foo_id, (Eolian_Parameter_Dir)param->way, param->type, param->name, param->comment);
}
database_method_parameter_add(foo_id, (Eolian_Parameter_Dir)param->way, param->type, param->name, param->comment);
}
EINA_LIST_FOREACH(kls->implements, l, impl)

View File

@ -25,6 +25,7 @@ typedef struct
typedef struct
{
Eina_Stringshare *name;
Eina_List *keys; /* list of _Parameter_Desc */
Eina_List *params; /* list of _Parameter_Desc */
Eolian_Function_Type type;
Eina_Hash *data;
@ -581,21 +582,55 @@ eolian_function_data_get(Eolian_Function function_id, const char *key)
return (fid ? eina_hash_find(fid->data, key) : NULL);
}
Eolian_Function_Parameter
database_function_parameter_add(Eolian_Function foo_id, Eolian_Parameter_Dir param_dir, const char *type, const char *name, const char *description)
static _Parameter_Desc *
_parameter_new(const char *type, const char *name, const char *description)
{
_Parameter_Desc *param = NULL;
param = calloc(1, sizeof(*param));
param->name = eina_stringshare_add(name);
param->type = eina_stringshare_add(type);
param->description = eina_stringshare_add(description);
return param;
}
Eolian_Function_Parameter
database_property_key_add(Eolian_Function foo_id, const char *type, const char *name, const char *description)
{
_Function_Id *fid = (_Function_Id *)foo_id;
_Parameter_Desc *param = NULL;
if (fid)
{
param = calloc(1, sizeof(*param));
param->param_dir = param_dir;
param->name = eina_stringshare_add(name);
param->type = eina_stringshare_add(type);
param->description = eina_stringshare_add(description);
fid->params = eina_list_append(fid->params, param);
param = _parameter_new(type, name, description);
fid->keys = eina_list_append(fid->keys, param);
}
return (Eolian_Function_Parameter) param;
return (Eolian_Function_Parameter)param;
}
Eolian_Function_Parameter
database_property_value_add(Eolian_Function foo_id, const char *type, const char *name, const char *description)
{
_Function_Id *fid = (_Function_Id *)foo_id;
_Parameter_Desc *param = NULL;
if (fid)
{
param = _parameter_new(type, name, description);
fid->params= eina_list_append(fid->params, param);
}
return (Eolian_Function_Parameter)param;
}
Eolian_Function_Parameter
database_method_parameter_add(Eolian_Function foo_id, Eolian_Parameter_Dir param_dir, const char *type, const char *name, const char *description)
{
_Function_Id *fid = (_Function_Id *)foo_id;
_Parameter_Desc *param = NULL;
if (fid)
{
param = _parameter_new(type, name, description);
param->param_dir = param_dir;
fid->params= eina_list_append(fid->params, param);
}
return (Eolian_Function_Parameter)param;
}
EAPI Eolian_Function_Parameter
@ -606,6 +641,8 @@ eolian_function_parameter_get(const Eolian_Function foo_id, const char *param_na
{
Eina_List *itr;
_Parameter_Desc *param;
EINA_LIST_FOREACH(fid->keys, itr, param)
if (!strcmp(param->name, param_name)) return (Eolian_Function_Parameter)param;
EINA_LIST_FOREACH(fid->params, itr, param)
if (!strcmp(param->name, param_name)) return (Eolian_Function_Parameter)param;
}
@ -626,6 +663,19 @@ eolian_parameter_name_get(const Eolian_Function_Parameter param)
return ((_Parameter_Desc*)param)->name;
}
EAPI const Eina_List *
eolian_property_keys_list_get(Eolian_Function foo_id)
{
_Function_Id *fid = (_Function_Id *)foo_id;
return (fid?fid->keys:NULL);
}
EAPI const Eina_List *
eolian_property_values_list_get(Eolian_Function foo_id)
{
return eolian_parameters_list_get(foo_id);
}
EAPI const Eina_List *
eolian_parameters_list_get(Eolian_Function foo_id)
{

View File

@ -42,8 +42,14 @@ void database_function_data_set(Eolian_Function function_id, const char *key, co
/* Add a description to a function */
#define database_function_description_set(foo_id, key, desc) database_function_data_set((foo_id), (key), (desc))
/* Add a parameter to a function */
Eolian_Function_Parameter database_function_parameter_add(Eolian_Function foo_id, Eolian_Parameter_Dir param_dir, const char *type, const char *name, const char *description);
/* Add a key to a property */
Eolian_Function_Parameter database_property_key_add(Eolian_Function foo_id, const char *type, const char *name, const char *description);
/* Add a value to a property */
Eolian_Function_Parameter database_property_value_add(Eolian_Function foo_id, const char *type, const char *name, const char *description);
/* Add a parameter to a method */
Eolian_Function_Parameter database_method_parameter_add(Eolian_Function foo_id, Eolian_Parameter_Dir param_dir, const char *type, const char *name, const char *description);
void database_parameter_get_const_attribute_set(Eolian_Function_Parameter param_desc, Eina_Bool is_const);