From d49c544e81c0d4da6d4c585b4033f9c5c6785bb4 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Thu, 23 Nov 2017 14:49:49 +0900 Subject: [PATCH] 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(-) create mode 100644 src/lib/eolian/database_part_api.c create mode 100644 src/tests/eolian/data/parts.eo 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 */ @@ -1333,6 +1333,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 * 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 +#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); }