diff options
author | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2016-09-20 15:50:37 +0200 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2016-10-07 11:54:23 +0200 |
commit | ec1bb92a8fb3f39ace4210ad1a8738d2f771bb9a (patch) | |
tree | 304f617d1dc04c04e2c6e6696b895784fefb964e /src | |
parent | 45b867ae0579cd35d4585ab41c43513e6ecd21f3 (diff) | |
download | efl-ec1bb92a8fb3f39ace4210ad1a8738d2f771bb9a.tar.gz |
eolian gen2: feature complete header generator (eo and legacy)
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/eolian2/headers.c | 176 |
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); |