From 95181f2d36c0c10805bb5deaf1d4e0c52c41afb0 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 19 Jan 2017 14:46:40 +0100 Subject: [PATCH] eolian: move base function doc API into implements This allows us to unify retrieval of docs for both regular and overridden funcs without having two separate APIs. It's currently missing validation and docgen is still not adjusted properly for it either, but at least there's this. Enables retrieval of docs for overridden funcs by default as well. --- src/bin/eolian/docs.c | 8 +++++--- src/bin/eolian/headers.c | 6 ++++-- src/bindings/luajit/eolian.lua | 14 ++++++------- src/lib/eolian/Eolian.h | 26 ++++++++++++------------ src/lib/eolian/database_function.c | 3 --- src/lib/eolian/database_function_api.c | 12 ----------- src/lib/eolian/database_implement_api.c | 13 ++++++++++++ src/lib/eolian/database_validate.c | 7 ++++--- src/lib/eolian/eo_parser.c | 10 ++++----- src/lib/eolian/eolian_database.h | 3 --- src/scripts/elua/apps/docgen/doctree.lua | 3 ++- src/tests/eolian/eolian_parsing.c | 10 +++++---- 12 files changed, 59 insertions(+), 56 deletions(-) diff --git a/src/bin/eolian/docs.c b/src/bin/eolian/docs.c index 0bfbe7fd0d..1e89b550f4 100644 --- a/src/bin/eolian/docs.c +++ b/src/bin/eolian/docs.c @@ -417,15 +417,17 @@ eo_gen_docs_func_gen(const Eolian_Function *fid, Eolian_Function_Type ftype, const char *group = eolian_class_full_name_get(eolian_function_class_get(fid)); + const Eolian_Implement *fimp = eolian_function_implement_get(fid); + if (ftype == EOLIAN_METHOD) { - doc = eolian_function_documentation_get(fid, EOLIAN_METHOD); + doc = eolian_implement_documentation_get(fimp, EOLIAN_METHOD); pdoc = NULL; } else { - doc = eolian_function_documentation_get(fid, EOLIAN_PROPERTY); - pdoc = eolian_function_documentation_get(fid, ftype); + doc = eolian_implement_documentation_get(fimp, EOLIAN_PROPERTY); + pdoc = eolian_implement_documentation_get(fimp, ftype); if (!doc && pdoc) doc = pdoc; if (pdoc == doc) pdoc = NULL; } diff --git a/src/bin/eolian/headers.c b/src/bin/eolian/headers.c index 564eb4f938..853b8672e8 100644 --- a/src/bin/eolian/headers.c +++ b/src/bin/eolian/headers.c @@ -42,9 +42,11 @@ _gen_func(const Eolian_Function *fid, Eolian_Function_Type ftype, if (!legacy && (fsc == EOLIAN_SCOPE_PROTECTED)) eina_strbuf_append_printf(buf, "#ifdef %s_PROTECTED\n", cnameu); - Eina_Bool hasdoc = !!eolian_function_documentation_get(fid, ftype); + const Eolian_Implement *fimp = eolian_function_implement_get(fid); + + Eina_Bool hasdoc = !!eolian_implement_documentation_get(fimp, ftype); if (!hasdoc && ((ftype == EOLIAN_PROP_GET) || (ftype == EOLIAN_PROP_SET))) - hasdoc = !!eolian_function_documentation_get(fid, EOLIAN_PROPERTY); + hasdoc = !!eolian_implement_documentation_get(fimp, EOLIAN_PROPERTY); if (hasdoc) { Eina_Strbuf *dbuf = eo_gen_docs_func_gen(fid, ftype, 0, legacy); diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua index d96b7e690a..0079928c00 100644 --- a/src/bindings/luajit/eolian.lua +++ b/src/bindings/luajit/eolian.lua @@ -249,7 +249,6 @@ ffi.cdef [[ const char *eolian_function_full_c_name_get(const Eolian_Function *function_id, Eolian_Function_Type ftype, Eina_Bool use_legacy); const Eolian_Function *eolian_class_function_get_by_name(const Eolian_Class *klass, const char *func_name, Eolian_Function_Type f_type); const char *eolian_function_legacy_get(const Eolian_Function *function_id, Eolian_Function_Type f_type); - const Eolian_Documentation *eolian_function_documentation_get(const Eolian_Function *function_id, Eolian_Function_Type f_type); const Eolian_Implement *eolian_function_implement_get(const Eolian_Function *function_id); Eina_Bool eolian_function_is_legacy_only(const Eolian_Function *function_id, Eolian_Function_Type ftype); Eina_Bool eolian_function_is_class(const Eolian_Function *function_id); @@ -273,6 +272,7 @@ ffi.cdef [[ const char *eolian_implement_full_name_get(const Eolian_Implement *impl); const Eolian_Class *eolian_implement_class_get(const Eolian_Implement *impl); const Eolian_Function *eolian_implement_function_get(const Eolian_Implement *impl, Eolian_Function_Type *func_type); + const Eolian_Documentation *eolian_implement_documentation_get(const Eolian_Implement *impl, Eolian_Function_Type f_type); Eina_Bool eolian_implement_is_auto(const Eolian_Implement *impl, Eolian_Function_Type ftype); Eina_Bool eolian_implement_is_empty(const Eolian_Implement *impl, Eolian_Function_Type ftype); Eina_Bool eolian_implement_is_pure_virtual(const Eolian_Implement *impl, Eolian_Function_Type ftype); @@ -775,12 +775,6 @@ M.Function = ffi.metatype("Eolian_Function", { return ffi.string(v) end, - documentation_get = function(self, ftype) - local v = eolian.eolian_function_documentation_get(self, ftype) - if v == nil then return nil end - return v - end, - implement_get = function(self) local v = eolian.eolian_function_implement_get(self) if v == nil then return nil end @@ -915,6 +909,12 @@ ffi.metatype("Eolian_Implement", { return v, tp[0] end, + documentation_get = function(self, ftype) + local v = eolian.eolian_implement_documentation_get(self, ftype) + if v == nil then return nil end + return v + end, + is_auto = function(self, ftype) return eolian.eolian_implement_is_auto(self, ftype) ~= 0 end, diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 97b28cf177..c7b632434b 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -747,19 +747,6 @@ EAPI const Eolian_Function *eolian_class_function_get_by_name(const Eolian_Class */ EAPI Eina_Stringshare *eolian_function_legacy_get(const Eolian_Function *function_id, Eolian_Function_Type f_type); -/* - * @brief Returns a documentation for a function. - * - * @param[in] function_id Id of the function - * @param[in] f_type The function type, for property get/set distinction. - * @return the documentation or NULL. - * - * Acceptable input types are METHOD, PROP_GET and PROP_SET. - * - * @ingroup Eolian - */ -EAPI const Eolian_Documentation *eolian_function_documentation_get(const Eolian_Function *function_id, Eolian_Function_Type f_type); - /* * @brief Returns the implement for a function. * @@ -1057,6 +1044,19 @@ EAPI const Eolian_Class *eolian_implement_class_get(const Eolian_Implement *impl */ EAPI const Eolian_Function *eolian_implement_function_get(const Eolian_Implement *impl, Eolian_Function_Type *func_type); +/* + * @brief Returns a documentation for an implement. + * + * @param[in] impl the handle of the implement + * @param[in] f_type The function type, for property get/set distinction. + * @return the documentation or NULL. + * + * Acceptable input types are METHOD, PROP_GET and PROP_SET. + * + * @ingroup Eolian + */ +EAPI const Eolian_Documentation *eolian_implement_documentation_get(const Eolian_Implement *impl, Eolian_Function_Type f_type); + /* * @brief Get whether an implement is tagged with @auto. * diff --git a/src/lib/eolian/database_function.c b/src/lib/eolian/database_function.c index 0ad9f2fdcf..8cf7171f1e 100644 --- a/src/lib/eolian/database_function.c +++ b/src/lib/eolian/database_function.c @@ -27,9 +27,6 @@ database_function_del(Eolian_Function *fid) database_expr_del(fid->set_ret_val); if (fid->get_legacy) eina_stringshare_del(fid->get_legacy); if (fid->set_legacy) eina_stringshare_del(fid->set_legacy); - database_doc_del(fid->common_doc); - database_doc_del(fid->get_doc); - database_doc_del(fid->set_doc); database_doc_del(fid->get_return_doc); database_doc_del(fid->set_return_doc); free(fid); diff --git a/src/lib/eolian/database_function_api.c b/src/lib/eolian/database_function_api.c index 1ad2a3ab91..d5e5f6136c 100644 --- a/src/lib/eolian/database_function_api.c +++ b/src/lib/eolian/database_function_api.c @@ -184,18 +184,6 @@ eolian_function_legacy_get(const Eolian_Function *fid, Eolian_Function_Type ftyp } } -EAPI const Eolian_Documentation * -eolian_function_documentation_get(const Eolian_Function *fid, Eolian_Function_Type ftype) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL); - switch (ftype) - { - case EOLIAN_PROP_GET: return fid->get_doc; break; - case EOLIAN_PROP_SET: return fid->set_doc; break; - default: return fid->common_doc; - } -} - EAPI const Eolian_Implement * eolian_function_implement_get(const Eolian_Function *fid) { diff --git a/src/lib/eolian/database_implement_api.c b/src/lib/eolian/database_implement_api.c index 34e724d249..2899b2093f 100644 --- a/src/lib/eolian/database_implement_api.c +++ b/src/lib/eolian/database_implement_api.c @@ -43,6 +43,19 @@ eolian_implement_function_get(const Eolian_Implement *impl, return impl->foo_id; } +EAPI const Eolian_Documentation * +eolian_implement_documentation_get(const Eolian_Implement *impl, + Eolian_Function_Type ftype) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(impl, NULL); + switch (ftype) + { + case EOLIAN_PROP_GET: return impl->get_doc; break; + case EOLIAN_PROP_SET: return impl->set_doc; break; + default: return impl->common_doc; + } +} + EAPI Eina_Bool eolian_implement_is_auto(const Eolian_Implement *impl, Eolian_Function_Type ftype) { diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c index 67cae4499c..e2ec9dc44c 100644 --- a/src/lib/eolian/database_validate.c +++ b/src/lib/eolian/database_validate.c @@ -227,11 +227,12 @@ _validate_function(const Eolian_Function *func) #undef EOLIAN_PARAMS_VALIDATE - if (!_validate_doc(func->common_doc)) + /* TODO: validate docs via impls to also validate overrides */ + if (!_validate_doc(func->impl->common_doc)) return EINA_FALSE; - if (!_validate_doc(func->get_doc)) + if (!_validate_doc(func->impl->get_doc)) return EINA_FALSE; - if (!_validate_doc(func->set_doc)) + if (!_validate_doc(func->impl->set_doc)) return EINA_FALSE; if (!_validate_doc(func->get_return_doc)) return EINA_FALSE; diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 0b59fa530d..e406611ec0 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -1208,7 +1208,7 @@ parse_accessor: line = ls->line_number; col = ls->column; check_next(ls, '{'); - if ((ls->t.token == TOK_DOC) && !prop->common_doc) + if ((ls->t.token == TOK_DOC) && !prop->impl->common_doc) { if (getenv("EOLIAN_PROPERTY_DOC_WARN")) { @@ -1220,11 +1220,11 @@ parse_accessor: } if (is_get) { - FILL_DOC(ls, prop, get_doc); + FILL_DOC(ls, prop->impl, get_doc); } else { - FILL_DOC(ls, prop, set_doc); + FILL_DOC(ls, prop->impl, set_doc); } for (;;) switch (ls->t.kw) { @@ -1369,7 +1369,7 @@ body: line = ls->line_number; col = ls->column; check_next(ls, '{'); - FILL_DOC(ls, prop, common_doc); + FILL_DOC(ls, prop->impl, common_doc); for (;;) switch (ls->t.kw) { case KW_get: @@ -1473,7 +1473,7 @@ body: line = ls->line_number; col = ls->column; check_next(ls, '{'); - FILL_DOC(ls, meth, common_doc); + FILL_DOC(ls, meth->impl, common_doc); for (;;) switch (ls->t.kw) { case KW_return: diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index bf0c257b40..9c54615f90 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -126,9 +126,6 @@ struct _Eolian_Function Eolian_Implement *impl; Eina_Stringshare *get_legacy; Eina_Stringshare *set_legacy; - Eolian_Documentation *common_doc; - Eolian_Documentation *get_doc; - Eolian_Documentation *set_doc; Eolian_Documentation *get_return_doc; Eolian_Documentation *set_return_doc; Eina_Bool obj_is_const :1; /* True if the object has to be const. Useful for a few methods. */ diff --git a/src/scripts/elua/apps/docgen/doctree.lua b/src/scripts/elua/apps/docgen/doctree.lua index b5d81ee579..7ef3e8bb87 100644 --- a/src/scripts/elua/apps/docgen/doctree.lua +++ b/src/scripts/elua/apps/docgen/doctree.lua @@ -305,7 +305,8 @@ M.Function = Node:clone { end, doc_get = function(self, ft) - return M.Doc(self.func:documentation_get(ft)) + -- TODO: handle overridden docs sanely + return M.Doc(self.func:implement_get():documentation_get(ft)) end, fallback_doc_get = function(self, ft) diff --git a/src/tests/eolian/eolian_parsing.c b/src/tests/eolian/eolian_parsing.c index 15b032ad49..f4dc6e2ef4 100644 --- a/src/tests/eolian/eolian_parsing.c +++ b/src/tests/eolian/eolian_parsing.c @@ -1300,7 +1300,8 @@ START_TEST(eolian_docs) "@Docs.prop.get @Docs.prop.set @Foo.field1 @Bar.foo @Docs")); fail_if(!(fid = eolian_class_function_get_by_name(class, "meth", EOLIAN_METHOD))); - fail_if(!(doc = eolian_function_documentation_get(fid, EOLIAN_METHOD))); + const Eolian_Implement *fimp = eolian_function_implement_get(fid); + fail_if(!(doc = eolian_implement_documentation_get(fimp, EOLIAN_METHOD))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Method documentation.")); fail_if(eolian_documentation_description_get(doc)); @@ -1331,17 +1332,18 @@ START_TEST(eolian_docs) fail_if(eolian_documentation_description_get(doc)); fail_if(!(fid = eolian_class_function_get_by_name(class, "prop", EOLIAN_PROPERTY))); - fail_if(!(doc = eolian_function_documentation_get(fid, EOLIAN_PROPERTY))); + fimp = eolian_function_implement_get(fid); + fail_if(!(doc = eolian_implement_documentation_get(fimp, EOLIAN_PROPERTY))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Property common documentation.")); fail_if(eolian_documentation_description_get(doc)); fail_if(strcmp(eolian_documentation_since_get(doc), "1.18")); - fail_if(!(doc = eolian_function_documentation_get(fid, EOLIAN_PROP_GET))); + fail_if(!(doc = eolian_implement_documentation_get(fimp, EOLIAN_PROP_GET))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Get documentation.")); fail_if(eolian_documentation_description_get(doc)); - fail_if(!(doc = eolian_function_documentation_get(fid, EOLIAN_PROP_SET))); + fail_if(!(doc = eolian_implement_documentation_get(fimp, EOLIAN_PROP_SET))); fail_if(strcmp(eolian_documentation_summary_get(doc), "Set documentation.")); fail_if(eolian_documentation_description_get(doc));