q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=95181f2d36c0c10805bb5deaf1d4e0c52c41afb0

commit 95181f2d36c0c10805bb5deaf1d4e0c52c41afb0
Author: Daniel Kolesa <[email protected]>
Date:   Thu Jan 19 14:46:40 2017 +0100

    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 0bfbe7f..1e89b55 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 564eb4f..853b867 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 d96b7e6..0079928 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 97b28cf..c7b6324 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -748,19 +748,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.
  *
  * @param[in] function_id Id of the function
@@ -1058,6 +1045,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.
  *
  * @param[in] impl the handle of the implement
diff --git a/src/lib/eolian/database_function.c 
b/src/lib/eolian/database_function.c
index 0ad9f2f..8cf7171 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 1ad2a3a..d5e5f61 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 34e724d..2899b20 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 67cae44..e2ec9dc 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 0b59fa5..e406611 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 bf0c257..9c54615 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 b5d81ee..7ef3e8b 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 15b032a..f4dc6e2 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));

-- 


Reply via email to