2014-06-30 11:32:52 -07:00
|
|
|
|
2014-05-02 15:55:51 -07:00
|
|
|
#include <vector>
|
|
|
|
#include <algorithm>
|
|
|
|
#include <cassert>
|
2014-06-30 11:32:52 -07:00
|
|
|
#include <cstddef>
|
2014-05-02 15:55:51 -07:00
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <Eina.hh>
|
|
|
|
#include <Eolian.h>
|
|
|
|
|
|
|
|
#include "eo_types.hh"
|
2014-06-30 11:32:52 -07:00
|
|
|
#include "eo_validate.hh"
|
|
|
|
|
2014-05-02 15:55:51 -07:00
|
|
|
#include "safe_strings.hh"
|
2014-06-30 11:32:52 -07:00
|
|
|
#include "convert_comments.hh"
|
|
|
|
#include "eolian_wrappers.hh"
|
|
|
|
|
|
|
|
namespace eolian_cxx {
|
|
|
|
|
|
|
|
extern efl::eina::log_domain domain;
|
2014-05-02 15:55:51 -07:00
|
|
|
|
|
|
|
static efl::eolian::parameters_container_type
|
2014-06-30 11:32:52 -07:00
|
|
|
convert_eolian_parameters(Eina_List const* parameters,
|
|
|
|
Eolian_Function_Type func_type)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
if (parameters == NULL) return {};
|
|
|
|
assert(func_type != EOLIAN_PROPERTY);
|
|
|
|
|
2014-05-02 15:55:51 -07:00
|
|
|
const Eina_List *it;
|
|
|
|
void *curr;
|
|
|
|
efl::eolian::parameters_container_type list;
|
2014-06-30 11:32:52 -07:00
|
|
|
EINA_LIST_FOREACH (parameters, it, curr)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
|
|
|
Eolian_Function_Parameter id =
|
|
|
|
(static_cast<Eolian_Function_Parameter>(curr));
|
2014-06-30 11:32:52 -07:00
|
|
|
list.push_back
|
|
|
|
({
|
|
|
|
parameter_type(id, func_type),
|
|
|
|
parameter_name(id)
|
|
|
|
});
|
2014-05-02 15:55:51 -07:00
|
|
|
}
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
2014-06-30 11:32:52 -07:00
|
|
|
static efl::eolian::parameters_container_type
|
2014-07-01 02:55:45 -07:00
|
|
|
convert_eolian_parameters(Eolian_Function const& func, getter_t func_type)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
return convert_eolian_parameters
|
2014-07-01 02:55:45 -07:00
|
|
|
(::eolian_parameters_list_get(func), func_type.value);
|
2014-06-30 11:32:52 -07:00
|
|
|
}
|
2014-05-02 15:55:51 -07:00
|
|
|
|
2014-06-30 11:32:52 -07:00
|
|
|
static efl::eolian::parameters_container_type
|
2014-07-01 02:55:45 -07:00
|
|
|
convert_eolian_parameters(Eina_List const* parameters, getter_t func_type)
|
2014-06-30 11:32:52 -07:00
|
|
|
{
|
|
|
|
return convert_eolian_parameters(parameters, func_type.value);
|
|
|
|
}
|
2014-05-02 15:55:51 -07:00
|
|
|
|
2014-06-30 11:32:52 -07:00
|
|
|
static efl::eolian::parameters_container_type
|
2014-07-01 02:55:45 -07:00
|
|
|
convert_eolian_parameters(Eina_List const* parameters, setter_t func_type)
|
2014-06-30 11:32:52 -07:00
|
|
|
{
|
|
|
|
return convert_eolian_parameters(parameters, func_type.value);
|
|
|
|
}
|
|
|
|
|
|
|
|
static efl::eolian::parameters_container_type
|
2014-07-01 02:55:45 -07:00
|
|
|
convert_eolian_parameters(Eolian_Function const& func)
|
2014-06-30 11:32:52 -07:00
|
|
|
{
|
2014-07-01 02:55:45 -07:00
|
|
|
assert(function_type(func) != EOLIAN_PROPERTY);
|
2014-06-30 11:32:52 -07:00
|
|
|
return convert_eolian_parameters
|
2014-07-01 02:55:45 -07:00
|
|
|
(::eolian_parameters_list_get(func), function_type(func));
|
2014-06-30 11:32:52 -07:00
|
|
|
}
|
2014-05-02 15:55:51 -07:00
|
|
|
|
2014-06-30 11:32:52 -07:00
|
|
|
static efl::eolian::functions_container_type
|
2014-07-09 08:33:07 -07:00
|
|
|
convert_eolian_property_to_functions(Eolian_Class const *& klass)
|
2014-06-30 11:32:52 -07:00
|
|
|
{
|
|
|
|
efl::eolian::functions_container_type container;
|
|
|
|
std::string cxx_classname = safe_lower(class_name(klass));
|
|
|
|
const Eina_List *properties =
|
|
|
|
eolian_class_functions_list_get(klass, EOLIAN_PROPERTY); // XXX
|
2014-05-02 15:55:51 -07:00
|
|
|
const Eina_List *it;
|
|
|
|
void *curr;
|
2014-06-30 11:32:52 -07:00
|
|
|
std::string prefix(class_prefix(klass));
|
2014-05-02 15:55:51 -07:00
|
|
|
EINA_LIST_FOREACH (properties, it, curr)
|
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
Eolian_Function prop_ = static_cast<Eolian_Function>(curr);
|
|
|
|
if (property_is_getter(prop_))
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
efl::eolian::parameters_container_type params
|
|
|
|
= convert_eolian_parameters(prop_, eolian_cxx::getter);
|
|
|
|
|
|
|
|
efl::eolian::eo_function get_;
|
|
|
|
get_.type = efl::eolian::eo_function::regular_;
|
|
|
|
get_.name = function_name(prop_) + "_get";
|
2014-07-01 02:55:45 -07:00
|
|
|
get_.impl = function_impl(prop_, prefix) + "_get";
|
2014-05-02 15:55:51 -07:00
|
|
|
|
2014-06-30 11:32:52 -07:00
|
|
|
efl::eolian::eolian_type_instance ret =
|
|
|
|
function_return_type(prop_, eolian_cxx::getter);
|
|
|
|
|
|
|
|
// if the getter has a single parameter and a void return
|
|
|
|
// it is transformed into a getter with no parameters
|
|
|
|
// that actually returns what would be the first argument.
|
|
|
|
if (params.size() == 1 && efl::eolian::type_is_void(ret))
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
get_.ret = params[0].type;
|
|
|
|
get_.params.clear();
|
2014-05-02 15:55:51 -07:00
|
|
|
}
|
|
|
|
else // otherwise just create the described getter
|
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
get_.ret = ret;
|
|
|
|
get_.params = params;
|
2014-05-02 15:55:51 -07:00
|
|
|
std::transform
|
2014-06-30 11:32:52 -07:00
|
|
|
(params.begin(), params.end(), get_.params.begin(),
|
2014-05-02 15:55:51 -07:00
|
|
|
[](efl::eolian::eo_parameter const& param)
|
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
efl::eolian::eolian_type getter_param_type =
|
|
|
|
type_to_native(param.type);
|
|
|
|
getter_param_type/*.native*/ += "*"; // XXX implement complex types
|
2014-05-02 15:55:51 -07:00
|
|
|
return efl::eolian::eo_parameter
|
2014-06-30 11:32:52 -07:00
|
|
|
{ { getter_param_type }, param.name };
|
2014-05-02 15:55:51 -07:00
|
|
|
});
|
|
|
|
}
|
2014-06-30 11:32:52 -07:00
|
|
|
efl::eolian::parameters_container_type keys =
|
|
|
|
convert_eolian_parameters(::eolian_property_keys_list_get(prop_),
|
|
|
|
eolian_cxx::getter);
|
|
|
|
if (!keys.empty())
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
keys.reserve(keys.size() + get_.params.size());
|
|
|
|
keys.insert(keys.end(), get_.params.begin(),
|
|
|
|
get_.params.end());
|
|
|
|
get_.params = keys;
|
2014-05-02 15:55:51 -07:00
|
|
|
}
|
2014-06-30 11:32:52 -07:00
|
|
|
get_.comment = convert_comments_function(prop_, eolian_cxx::getter);
|
|
|
|
container.push_back(get_);
|
2014-05-02 15:55:51 -07:00
|
|
|
}
|
2014-06-30 11:32:52 -07:00
|
|
|
if (property_is_setter(prop_))
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
const Eina_List *keys_ = eolian_property_keys_list_get(prop_);
|
|
|
|
const Eina_List *args_ = eolian_parameters_list_get(prop_);
|
2014-05-02 15:55:51 -07:00
|
|
|
Eina_List *params_ = eina_list_merge(eina_list_clone(keys_), eina_list_clone(args_));
|
2014-06-30 11:32:52 -07:00
|
|
|
efl::eolian::parameters_container_type params =
|
|
|
|
convert_eolian_parameters(params_, eolian_cxx::setter);
|
2014-05-02 15:55:51 -07:00
|
|
|
eina_list_free(params_);
|
2014-06-30 11:32:52 -07:00
|
|
|
efl::eolian::eo_function set_;
|
|
|
|
set_.type = efl::eolian::eo_function::regular_;
|
|
|
|
set_.name = function_name(prop_) + "_set";
|
2014-07-01 02:55:45 -07:00
|
|
|
set_.impl = function_impl(prop_, prefix) + "_set";
|
2014-06-30 11:32:52 -07:00
|
|
|
set_.params = params;
|
|
|
|
set_.ret = function_return_type(prop_, eolian_cxx::setter);
|
|
|
|
set_.comment = convert_comments_function(prop_, eolian_cxx::setter);
|
|
|
|
container.push_back(set_);
|
2014-05-02 15:55:51 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return container;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-07-09 08:33:07 -07:00
|
|
|
convert_eolian_inheritances(efl::eolian::eo_class& cls, Eolian_Class const *& klass)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
const Eina_List *inheritances =
|
|
|
|
::eolian_class_inherits_list_get(klass);
|
2014-05-02 15:55:51 -07:00
|
|
|
const Eina_List *it;
|
|
|
|
void *curr;
|
|
|
|
|
|
|
|
if (eina_list_count(inheritances) == 0
|
|
|
|
|| eina_list_data_get(inheritances) == NULL)
|
|
|
|
{
|
|
|
|
cls.parent = "efl::eo::base";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
const char *ptr = static_cast<const char*>
|
|
|
|
(eina_list_data_get(inheritances));
|
|
|
|
std::string parent = class_format_cxx(safe_lower(ptr));
|
|
|
|
|
2014-05-02 15:55:51 -07:00
|
|
|
// "eo_base" is the Eolian name for EO_BASE_CLASS.
|
2014-06-30 11:32:52 -07:00
|
|
|
cls.parent =
|
|
|
|
(parent == "eo_base" || parent == "eo::base" || parent == "")
|
|
|
|
? "efl::eo::base"
|
|
|
|
: parent;
|
2014-05-02 15:55:51 -07:00
|
|
|
}
|
|
|
|
inheritances = eina_list_next(inheritances);
|
|
|
|
EINA_LIST_FOREACH (inheritances, it, curr)
|
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
std::string extension = safe_lower(static_cast<const char*>(curr));
|
|
|
|
cls.extensions.push_back(class_format_cxx(extension));
|
2014-05-02 15:55:51 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-07-09 08:33:07 -07:00
|
|
|
convert_eolian_implements(efl::eolian::eo_class& cls, Eolian_Class const *& klass)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
|
|
|
const Eina_List *it;
|
2014-06-30 11:32:52 -07:00
|
|
|
std::string prefix(class_prefix(klass));
|
2014-05-02 15:55:51 -07:00
|
|
|
void *impl_desc_;
|
2014-06-30 11:32:52 -07:00
|
|
|
|
2014-05-22 07:24:50 -07:00
|
|
|
EINA_LIST_FOREACH(eolian_class_implements_list_get(klass), it, impl_desc_)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-07-09 08:45:41 -07:00
|
|
|
Eolian_Implement *impl_desc = static_cast<Eolian_Implement*>(impl_desc_);
|
2014-07-09 08:33:07 -07:00
|
|
|
Eolian_Class *impl_class;
|
2014-05-29 04:42:16 -07:00
|
|
|
Eolian_Function impl_func;
|
|
|
|
Eolian_Function_Type impl_type;
|
2014-05-02 15:55:51 -07:00
|
|
|
eolian_implement_information_get
|
2014-05-29 04:42:16 -07:00
|
|
|
(impl_desc, &impl_class, &impl_func, &impl_type);
|
|
|
|
if (impl_type == EOLIAN_CTOR)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
|
|
|
efl::eolian::eo_constructor constructor;
|
2014-06-30 11:32:52 -07:00
|
|
|
std::string parent = safe_lower(eolian_class_full_name_get(impl_class));
|
|
|
|
if (parent == "eo_base" || parent == "eo.base") parent = "eo";
|
|
|
|
constructor.name = parent + "_" + function_name(impl_func);
|
|
|
|
constructor.params = convert_eolian_parameters(impl_func);
|
|
|
|
constructor.comment = convert_comments_function(impl_func, eolian_cxx::ctor);
|
2014-05-02 15:55:51 -07:00
|
|
|
cls.constructors.push_back(constructor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-07-09 08:33:07 -07:00
|
|
|
convert_eolian_constructors(efl::eolian::eo_class& cls, Eolian_Class const *& klass)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
|
|
|
const Eina_List *it;
|
|
|
|
void *curr;
|
2014-06-30 11:32:52 -07:00
|
|
|
std::string prefix(class_prefix(klass));
|
2014-05-02 15:55:51 -07:00
|
|
|
const Eina_List *constructors =
|
2014-05-22 07:24:50 -07:00
|
|
|
eolian_class_functions_list_get(klass, EOLIAN_CTOR);
|
2014-05-02 15:55:51 -07:00
|
|
|
EINA_LIST_FOREACH (constructors, it, curr)
|
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
Eolian_Function eo_constructor = static_cast<Eolian_Function>(curr);
|
2014-05-02 15:55:51 -07:00
|
|
|
efl::eolian::eo_constructor constructor;
|
2014-07-01 02:55:45 -07:00
|
|
|
constructor.name = function_impl(eo_constructor, prefix);
|
2014-06-30 11:32:52 -07:00
|
|
|
constructor.params = convert_eolian_parameters(eo_constructor);
|
|
|
|
constructor.comment = convert_comments_function(eo_constructor, eolian_cxx::ctor);
|
2014-05-02 15:55:51 -07:00
|
|
|
cls.constructors.push_back(constructor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-07-09 08:33:07 -07:00
|
|
|
convert_eolian_functions(efl::eolian::eo_class& cls, Eolian_Class const *& klass)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
|
|
|
const Eina_List *it;
|
|
|
|
void *curr;
|
|
|
|
|
|
|
|
const Eina_List *eolian_functions =
|
2014-05-22 07:24:50 -07:00
|
|
|
eolian_class_functions_list_get(klass, EOLIAN_METHOD);
|
2014-05-02 15:55:51 -07:00
|
|
|
EINA_LIST_FOREACH (eolian_functions, it, curr)
|
|
|
|
{
|
2014-07-01 02:55:45 -07:00
|
|
|
efl::eolian::eo_function func_;
|
|
|
|
Eolian_Function eol_func = static_cast<Eolian_Function>(curr);
|
2014-05-02 15:55:51 -07:00
|
|
|
// XXX Eolian only provides regular methods so far
|
2014-07-01 02:55:45 -07:00
|
|
|
func_.type = efl::eolian::eo_function::regular_;
|
|
|
|
func_.name = function_name(eol_func);
|
|
|
|
func_.impl = function_impl(eol_func, class_prefix(klass));
|
|
|
|
func_.ret = function_return_type(eol_func);
|
|
|
|
func_.params = convert_eolian_parameters(eol_func);
|
|
|
|
func_.comment = convert_comments_function(eol_func, eolian_cxx::method);
|
|
|
|
cls.functions.push_back(func_);
|
2014-05-02 15:55:51 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-07-09 08:33:07 -07:00
|
|
|
convert_eolian_properties(efl::eolian::eo_class& cls, Eolian_Class const *& klass)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
efl::eolian::functions_container_type properties
|
|
|
|
= convert_eolian_property_to_functions(klass);
|
|
|
|
cls.functions.insert
|
|
|
|
(cls.functions.end(), properties.begin(), properties.end());
|
2014-05-02 15:55:51 -07:00
|
|
|
}
|
|
|
|
|
2014-06-30 11:32:52 -07:00
|
|
|
void
|
2014-07-09 08:33:07 -07:00
|
|
|
convert_eolian_events(efl::eolian::eo_class& cls, Eolian_Class const *& klass)
|
2014-06-30 11:32:52 -07:00
|
|
|
{
|
|
|
|
efl::eolian::events_container_type events = event_list(klass);
|
|
|
|
cls.events.reserve(cls.events.size() + events.size());
|
|
|
|
cls.events.insert(cls.events.end(), events.begin(), events.end());
|
|
|
|
}
|
2014-05-02 15:55:51 -07:00
|
|
|
|
|
|
|
efl::eolian::eo_class
|
2014-07-09 08:33:07 -07:00
|
|
|
convert_eolian_class_new(Eolian_Class const *& klass)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
efl::eolian::eo_class cls;
|
|
|
|
cls.type = class_type(klass);
|
|
|
|
cls.name = safe_lower(class_name(klass));
|
2014-07-01 02:55:45 -07:00
|
|
|
cls.name_space = class_namespace_full(klass);
|
2014-06-30 11:32:52 -07:00
|
|
|
cls.eo_name = class_eo_name(klass);
|
|
|
|
cls.comment = convert_comments_class(klass);
|
2014-05-02 15:55:51 -07:00
|
|
|
return cls;
|
|
|
|
}
|
|
|
|
|
|
|
|
efl::eolian::eo_class
|
2014-07-09 08:33:07 -07:00
|
|
|
convert_eolian_class(const Eolian_Class *klass)
|
2014-05-02 15:55:51 -07:00
|
|
|
{
|
2014-06-30 11:32:52 -07:00
|
|
|
assert(klass != NULL);
|
|
|
|
efl::eolian::eo_class cls(eolian_cxx::convert_eolian_class_new(klass));
|
|
|
|
eolian_cxx::convert_eolian_inheritances(cls, klass);
|
|
|
|
eolian_cxx::convert_eolian_implements(cls, klass);
|
|
|
|
eolian_cxx::convert_eolian_constructors(cls, klass);
|
|
|
|
eolian_cxx::convert_eolian_functions(cls, klass);
|
|
|
|
eolian_cxx::convert_eolian_properties(cls, klass);
|
|
|
|
eolian_cxx::convert_eolian_events(cls, klass);
|
|
|
|
efl::eolian::eo_class_validate(cls);
|
2014-05-02 15:55:51 -07:00
|
|
|
return cls;
|
|
|
|
}
|
2014-06-30 11:32:52 -07:00
|
|
|
|
|
|
|
} // namespace eolian_cxx {
|