eolian: Add API's for part enumeration

@feature
This commit is contained in:
Jean-Philippe Andre 2017-11-23 14:49:49 +09:00
parent f702826a90
commit d49c544e81
6 changed files with 130 additions and 1 deletions

View File

@ -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 \

View File

@ -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
*

View File

@ -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)
{

View File

@ -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;
}

View File

@ -0,0 +1,7 @@
class Parts (Override, Base) {
parts {
part1: Override; [[Part 1]]
part2: Base; [[Part 2]]
part3: Parts; [[Part 3]]
}
}

View File

@ -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);
}