summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@osg.samsung.com>2016-09-20 15:50:37 +0200
committerDaniel Kolesa <d.kolesa@osg.samsung.com>2016-10-07 11:54:23 +0200
commitec1bb92a8fb3f39ace4210ad1a8738d2f771bb9a (patch)
tree304f617d1dc04c04e2c6e6696b895784fefb964e /src
parent45b867ae0579cd35d4585ab41c43513e6ecd21f3 (diff)
downloadefl-ec1bb92a8fb3f39ace4210ad1a8738d2f771bb9a.tar.gz
eolian gen2: feature complete header generator (eo and legacy)
Diffstat (limited to 'src')
-rw-r--r--src/bin/eolian2/headers.c176
1 files changed, 118 insertions, 58 deletions
diff --git a/src/bin/eolian2/headers.c b/src/bin/eolian2/headers.c
index 69dc94f3ae..f9313b4a94 100644
--- a/src/bin/eolian2/headers.c
+++ b/src/bin/eolian2/headers.c
@@ -29,7 +29,7 @@ _get_add_star(Eolian_Function_Type ftype, Eolian_Parameter_Dir pdir)
static void
_gen_func(const Eolian_Function *fid, Eolian_Function_Type ftype,
- Eina_Strbuf *buf, char *cnameu, Eina_Bool legacy)
+ Eina_Strbuf *buf, char *cname, char *cnameu, Eina_Bool legacy)
{
Eina_Stringshare *fcn = eolian_function_full_c_name_get(fid, ftype, legacy);
if (!fcn)
@@ -51,12 +51,14 @@ _gen_func(const Eolian_Function *fid, Eolian_Function_Type ftype,
Eolian_Object_Scope fsc = eolian_function_scope_get(fid, ftype);
+ /* this one will never be satisfied in legacy */
if (eolian_function_is_beta(fid))
eina_strbuf_append_printf(buf, "#ifdef %s_BETA\n", cnameu);
- if (fsc == EOLIAN_SCOPE_PROTECTED)
+ /* XXX: is this right? we expose potentially internal stuff into legacy */
+ if (!legacy && (fsc == EOLIAN_SCOPE_PROTECTED))
eina_strbuf_append_printf(buf, "#ifdef %s_PROTECTED\n", cnameu);
- eina_strbuf_append(buf, "EOAPI ");
+ eina_strbuf_append(buf, legacy ? "EAPI " : "EOAPI ");
if (rtp)
{
Eina_Stringshare *rtps = eolian_type_c_type_get(rtp);
@@ -71,13 +73,24 @@ _gen_func(const Eolian_Function *fid, Eolian_Function_Type ftype,
eina_strbuf_append(buf, fcn);
eina_stringshare_del(fcn);
+ Eina_Bool first = EINA_TRUE;
+ Eina_Strbuf *flagbuf = NULL;
+ int nidx = !legacy || !eolian_function_is_class(fid);
+
eina_strbuf_append_char(buf, '(');
- if ((ftype == EOLIAN_PROP_GET) || eolian_function_object_is_const(fid)
- || eolian_function_is_class(fid))
+ if (nidx)
{
- eina_strbuf_append(buf, "const ");
+ if ((ftype == EOLIAN_PROP_GET) || eolian_function_object_is_const(fid)
+ || eolian_function_is_class(fid))
+ {
+ eina_strbuf_append(buf, "const ");
+ }
+ if (legacy)
+ eina_strbuf_append_printf(buf, "%s *obj", cname);
+ else
+ eina_strbuf_append(buf, "Eo *obj");
+ first = EINA_FALSE;
}
- eina_strbuf_append(buf, "Eo *obj");
{
Eolian_Function_Parameter *pr = NULL;
@@ -87,8 +100,21 @@ _gen_func(const Eolian_Function *fid, Eolian_Function_Type ftype,
const Eolian_Type *prt = eolian_parameter_type_get(pr);
const char *prn = eolian_parameter_name_get(pr);
Eina_Stringshare *prtn = eolian_type_c_type_get(prt);
- eina_strbuf_append_printf(buf, ", %s %s", prtn, prn);
+ ++nidx;
+ if (!first)
+ eina_strbuf_append(buf, ", ");
+ eina_strbuf_append_printf(buf, "%s %s", prtn, prn);
eina_stringshare_del(prtn);
+ first = EINA_FALSE;
+ if (!eolian_parameter_is_nonull(pr))
+ continue;
+ if (!flagbuf)
+ {
+ flagbuf = eina_strbuf_new();
+ eina_strbuf_append_printf(flagbuf, " EINA_ARG_NONNULL(%d", nidx);
+ }
+ else
+ eina_strbuf_append_printf(flagbuf, ", %d", nidx);
}
eina_iterator_free(itr);
}
@@ -108,7 +134,9 @@ _gen_func(const Eolian_Function *fid, Eolian_Function_Type ftype,
const char *prn = eolian_parameter_name_get(pr);
Eina_Stringshare *prtn = eolian_type_c_type_get(prt);
- eina_strbuf_append(buf, ", ");
+ ++nidx;
+ if (!first)
+ eina_strbuf_append(buf, ", ");
eina_strbuf_append(buf, prtn);
if (!strchr(prtn, '*'))
eina_strbuf_append_char(buf, ' ');
@@ -116,16 +144,41 @@ _gen_func(const Eolian_Function *fid, Eolian_Function_Type ftype,
_get_add_star(ftype, eolian_parameter_direction_get(pr)));
eina_strbuf_append(buf, prn);
eina_stringshare_del(prtn);
+ first = EINA_FALSE;
+ if (!eolian_parameter_is_nonull(pr))
+ continue;
+ if (!flagbuf)
+ {
+ flagbuf = eina_strbuf_new();
+ eina_strbuf_append_printf(flagbuf, " EINA_ARG_NONNULL(%d", nidx);
+ }
+ else
+ eina_strbuf_append_printf(flagbuf, ", %d", nidx);
}
eina_iterator_free(itr);
}
- eina_strbuf_append(buf, ");\n");
+ if (flagbuf)
+ eina_strbuf_append_char(flagbuf, ')');
+
+ eina_strbuf_append(buf, ")");
+ if (eolian_function_return_is_warn_unused(fid, ftype))
+ {
+ if (!flagbuf)
+ flagbuf = eina_strbuf_new();
+ eina_strbuf_prepend(flagbuf, " EINA_WARN_UNUSED_RESULT");
+ }
+ if (flagbuf)
+ {
+ eina_strbuf_append(buf, eina_strbuf_string_get(flagbuf));
+ eina_strbuf_free(flagbuf);
+ }
+ eina_strbuf_append(buf, ";\n");
if (eolian_function_is_beta(fid))
eina_strbuf_append_printf(buf, "#endif\n");
- if (fsc == EOLIAN_SCOPE_PROTECTED)
+ if (!legacy && (fsc == EOLIAN_SCOPE_PROTECTED))
eina_strbuf_append_printf(buf, "#endif\n");
}
@@ -153,12 +206,15 @@ eo_gen_header_gen(const Eolian_Class *cl, Eina_Strbuf *buf, Eina_Bool legacy)
/* class definition */
- eina_strbuf_append_printf(buf, "#define %s_%s %s_%s_get()\n\n",
- cnameu, _cl_type_str_get(cl, EINA_TRUE),
- cnamel, _cl_type_str_get(cl, EINA_FALSE));
+ if (!legacy)
+ {
+ eina_strbuf_append_printf(buf, "#define %s_%s %s_%s_get()\n\n",
+ cnameu, _cl_type_str_get(cl, EINA_TRUE),
+ cnamel, _cl_type_str_get(cl, EINA_FALSE));
- eina_strbuf_append_printf(buf, "EWAPI const Efl_Class *%s_%s_get(void);\n\n",
- cnamel, _cl_type_str_get(cl, EINA_FALSE));
+ eina_strbuf_append_printf(buf, "EWAPI const Efl_Class *%s_%s_get(void);\n\n",
+ cnamel, _cl_type_str_get(cl, EINA_FALSE));
+ }
/* method section */
{
@@ -173,18 +229,21 @@ eo_gen_header_gen(const Eolian_Class *cl, Eina_Strbuf *buf, Eina_Bool legacy)
continue;
Eolian_Function_Type ftype = EOLIAN_UNRESOLVED;
const Eolian_Function *fid = eolian_implement_function_get(imp, &ftype);
+ /* beta can only exist for eo api */
+ if (legacy && eolian_function_is_beta(fid))
+ continue;
switch (ftype)
{
case EOLIAN_PROP_GET:
case EOLIAN_PROP_SET:
- _gen_func(fid, ftype, buf, cnameu, legacy);
+ _gen_func(fid, ftype, buf, cname, cnameu, legacy);
break;
case EOLIAN_PROPERTY:
- _gen_func(fid, EOLIAN_PROP_SET, buf, cnameu, legacy);
- _gen_func(fid, EOLIAN_PROP_GET, buf, cnameu, legacy);
+ _gen_func(fid, EOLIAN_PROP_SET, buf, cname, cnameu, legacy);
+ _gen_func(fid, EOLIAN_PROP_GET, buf, cname, cnameu, legacy);
break;
default:
- _gen_func(fid, EOLIAN_UNRESOLVED, buf, cnameu, legacy);
+ _gen_func(fid, EOLIAN_UNRESOLVED, buf, cname, cnameu, legacy);
}
}
eina_iterator_free(itr);
@@ -192,44 +251,45 @@ eo_gen_header_gen(const Eolian_Class *cl, Eina_Strbuf *buf, Eina_Bool legacy)
events:
/* event section */
- {
- Eina_Iterator *itr = eolian_class_events_get(cl);
- Eolian_Event *ev;
- EINA_ITERATOR_FOREACH(itr, ev)
- {
- Eina_Stringshare *evn = eolian_event_c_name_get(ev);
- Eolian_Object_Scope evs = eolian_event_scope_get(ev);
-
- if (evs == EOLIAN_SCOPE_PRIVATE)
- continue;
-
- if (eolian_event_is_beta(ev))
- {
- eina_strbuf_append_printf(buf, "\n#ifdef %s_BETA\n", cnameu);
- }
- if (evs == EOLIAN_SCOPE_PROTECTED)
- {
- if (!eolian_event_is_beta(ev))
- eina_strbuf_append_char(buf, '\n');
- eina_strbuf_append_printf(buf, "#ifdef %s_PROTECTED\n", cnameu);
- }
-
- if (!eolian_event_is_beta(ev) && evs == EOLIAN_SCOPE_PUBLIC)
- eina_strbuf_append_char(buf, '\n');
-
- eina_strbuf_append_printf(buf, "EOAPI extern const "
- "Efl_Event_Description _%s;\n", evn);
- eina_strbuf_append_printf(buf, "#define %s (&(_%s))\n", evn, evn);
-
- if (evs == EOLIAN_SCOPE_PROTECTED)
- eina_strbuf_append(buf, "#endif\n");
- if (eolian_event_is_beta(ev))
- eina_strbuf_append(buf, "#endif\n");
-
- eina_stringshare_del(evn);
- }
- eina_iterator_free(itr);
- }
+ if (!legacy)
+ {
+ Eina_Iterator *itr = eolian_class_events_get(cl);
+ Eolian_Event *ev;
+ EINA_ITERATOR_FOREACH(itr, ev)
+ {
+ Eina_Stringshare *evn = eolian_event_c_name_get(ev);
+ Eolian_Object_Scope evs = eolian_event_scope_get(ev);
+
+ if (evs == EOLIAN_SCOPE_PRIVATE)
+ continue;
+
+ if (eolian_event_is_beta(ev))
+ {
+ eina_strbuf_append_printf(buf, "\n#ifdef %s_BETA\n", cnameu);
+ }
+ if (evs == EOLIAN_SCOPE_PROTECTED)
+ {
+ if (!eolian_event_is_beta(ev))
+ eina_strbuf_append_char(buf, '\n');
+ eina_strbuf_append_printf(buf, "#ifdef %s_PROTECTED\n", cnameu);
+ }
+
+ if (!eolian_event_is_beta(ev) && evs == EOLIAN_SCOPE_PUBLIC)
+ eina_strbuf_append_char(buf, '\n');
+
+ eina_strbuf_append_printf(buf, "EOAPI extern const "
+ "Efl_Event_Description _%s;\n", evn);
+ eina_strbuf_append_printf(buf, "#define %s (&(_%s))\n", evn, evn);
+
+ if (evs == EOLIAN_SCOPE_PROTECTED)
+ eina_strbuf_append(buf, "#endif\n");
+ if (eolian_event_is_beta(ev))
+ eina_strbuf_append(buf, "#endif\n");
+
+ eina_stringshare_del(evn);
+ }
+ eina_iterator_free(itr);
+ }
end:
free(cname);