jpeg pushed a commit to branch master.

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

commit d49c544e81c0d4da6d4c585b4033f9c5c6785bb4
Author: Jean-Philippe Andre <[email protected]>
Date:   Thu Nov 23 14:49:49 2017 +0900

    eolian: Add API's for part enumeration
    
    @feature
---
 src/Makefile_Eolian.am              |  2 ++
 src/lib/eolian/Eolian.h             | 42 ++++++++++++++++++++++++++++++++-
 src/lib/eolian/database_class_api.c |  7 ++++++
 src/lib/eolian/database_part_api.c  | 27 ++++++++++++++++++++++
 src/tests/eolian/data/parts.eo      |  7 ++++++
 src/tests/eolian/eolian_parsing.c   | 46 +++++++++++++++++++++++++++++++++++++
 6 files changed, 130 insertions(+), 1 deletion(-)

diff --git a/src/Makefile_Eolian.am b/src/Makefile_Eolian.am
index 8126337c5b..efad6a62d4 100644
--- a/src/Makefile_Eolian.am
+++ b/src/Makefile_Eolian.am
@@ -30,6 +30,7 @@ lib_eolian_libeolian_la_SOURCES = \
                                   lib/eolian/database_event.c \
                                   lib/eolian/database_event_api.c \
                                   lib/eolian/database_part.c \
+                                  lib/eolian/database_part_api.c \
                                   lib/eolian/database_expr.c \
                                   lib/eolian/database_expr_api.c \
                                   lib/eolian/database_var.c \
@@ -94,6 +95,7 @@ tests/eolian/data/object_impl.eo \
 tests/eolian/data/object_impl_add.eo \
 tests/eolian/data/override.eo \
 tests/eolian/data/owning.eo \
+tests/eolian/data/parts.eo \
 tests/eolian/data/scope.eo \
 tests/eolian/data/struct.eo \
 tests/eolian/data/typedef.eo \
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index b69f2c5dfa..0bd3646f31 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -1253,7 +1253,7 @@ EAPI Eina_Iterator *eolian_class_constructors_get(const 
Eolian_Class *klass);
  * @brief Get an iterator to the events defined in a class.
  *
  * @param[in] klass the class.
- * @return the iterator
+ * @return an iterator over const Eolian_Event* objects
  *
  * @ingroup Eolian
  */
@@ -1334,6 +1334,46 @@ EAPI Eina_Bool eolian_event_is_hot(const Eolian_Event 
*event);
 EAPI Eina_Bool eolian_event_is_restart(const Eolian_Event *event);
 
 /*
+ * @brief Get an iterator to the parts defined in a class.
+ *
+ * @param[in] klass the class.
+ * @return an iterator over const Eolian_Part* objects
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Iterator *eolian_class_parts_get(const Eolian_Class *klass);
+
+/*
+ * @brief Get the name of a part.
+ *
+ * @param[in] part the part handle
+ * @return the name or NULL
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Stringshare *eolian_part_name_get(const Eolian_Part *part);
+
+/*
+ * @brief Get the type of a part.
+ *
+ * @param[in] part the part handle
+ * @return the type or NULL
+ *
+ * @ingroup Eolian
+ */
+EAPI const Eolian_Class *eolian_part_class_get(const Eolian_Part *part);
+
+/*
+ * @brief Get the documentation of an part.
+ *
+ * @param[in] part the part handle
+ * @return the documentation or NULL
+ *
+ * @ingroup Eolian
+ */
+EAPI const Eolian_Documentation *eolian_part_documentation_get(const 
Eolian_Part *part);
+
+/*
  * @brief Returns the C name of an event
  *
  * @param[in] event the event handle
diff --git a/src/lib/eolian/database_class_api.c 
b/src/lib/eolian/database_class_api.c
index 963a874f03..10fb275cde 100644
--- a/src/lib/eolian/database_class_api.c
+++ b/src/lib/eolian/database_class_api.c
@@ -173,6 +173,13 @@ eolian_class_events_get(const Eolian_Class *cl)
    return (cl->events ? eina_list_iterator_new(cl->events) : NULL);
 }
 
+EAPI Eina_Iterator *
+eolian_class_parts_get(const Eolian_Class *cl)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cl, NULL);
+   return (cl->parts ? eina_list_iterator_new(cl->parts) : NULL);
+}
+
 EAPI Eina_Bool
 eolian_class_ctor_enable_get(const Eolian_Class *cl)
 {
diff --git a/src/lib/eolian/database_part_api.c 
b/src/lib/eolian/database_part_api.c
new file mode 100644
index 0000000000..a67b0d4391
--- /dev/null
+++ b/src/lib/eolian/database_part_api.c
@@ -0,0 +1,27 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <Eina.h>
+#include "eolian_database.h"
+
+EAPI Eina_Stringshare *
+eolian_part_name_get(const Eolian_Part *part)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
+   return part->name;
+}
+
+EAPI const Eolian_Class *
+eolian_part_class_get(const Eolian_Part *part)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
+   return part->klass;
+}
+
+EAPI const Eolian_Documentation *
+eolian_part_documentation_get(const Eolian_Part *part)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
+   return part->doc;
+}
diff --git a/src/tests/eolian/data/parts.eo b/src/tests/eolian/data/parts.eo
new file mode 100644
index 0000000000..286d1e432f
--- /dev/null
+++ b/src/tests/eolian/data/parts.eo
@@ -0,0 +1,7 @@
+class Parts (Override, Base) {
+   parts {
+      part1: Override; [[Part 1]]
+      part2: Base; [[Part 2]]
+      part3: Parts; [[Part 3]]
+   }
+}
diff --git a/src/tests/eolian/eolian_parsing.c 
b/src/tests/eolian/eolian_parsing.c
index 9297932451..ce18e4e137 100644
--- a/src/tests/eolian/eolian_parsing.c
+++ b/src/tests/eolian/eolian_parsing.c
@@ -1544,6 +1544,51 @@ START_TEST(eolian_function_as_arguments)
 }
 END_TEST
 
+START_TEST(eolian_parts)
+{
+   const Eolian_Unit *unit;
+   const Eolian_Class *cls;
+   Eina_Iterator *iter;
+   Eolian_Part *part;
+   int i = 0;
+
+   static const char *part_classes[] = {
+      "Override", "Base", "Parts"
+   };
+
+   eolian_init();
+
+   fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
+
+   fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/parts.eo")));
+
+   fail_if(!(cls = eolian_class_get_by_name(unit, "Parts")));
+
+   fail_if(!(iter = eolian_class_parts_get(cls)));
+
+   EINA_ITERATOR_FOREACH(iter, part)
+     {
+        const Eolian_Documentation *doc;
+        const Eolian_Class *klass;
+        char pattern[24];
+
+        sprintf(pattern, "part%d", i + 1);
+        ck_assert_str_eq(pattern, eolian_part_name_get(part));
+
+        sprintf(pattern, "Part %d", i + 1);
+        fail_if(!(doc = eolian_part_documentation_get(part)));
+        ck_assert_str_eq(pattern, eolian_documentation_summary_get(doc));
+
+        fail_if(!(klass = eolian_part_class_get(part)));
+        ck_assert_str_eq(part_classes[i], eolian_class_name_get(klass));
+        i++;
+     }
+   eina_iterator_free(iter);
+
+   eolian_shutdown();
+}
+END_TEST
+
 void eolian_parsing_test(TCase *tc)
 {
    tcase_add_test(tc, eolian_simple_parsing);
@@ -1567,4 +1612,5 @@ void eolian_parsing_test(TCase *tc)
    tcase_add_test(tc, eolian_docs);
    tcase_add_test(tc, eolian_function_types);
    tcase_add_test(tc, eolian_function_as_arguments);
+   tcase_add_test(tc, eolian_parts);
 }

-- 


Reply via email to