q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=ce63b16f400ae041d66a79f7d6d8c09838a7af12
commit ce63b16f400ae041d66a79f7d6d8c09838a7af12 Author: Savio Sena <savio.s...@acm.org> Date: Tue Jul 1 10:55:45 2014 +0100 eolian-cxx: Make proper handling of namespaces. Summary: The generation of class prefixes was not taking into account the full classname -- the namespace was not being prepended to it. Fixed that and also re-organized the code a bit, removed some Wshadow warnings also. This commit fixes 'make examples' and 'make check'. Reviewers: tasn, cedric, q66 CC: felipealmeida, smohanty, cedric Differential Revision: https://phab.enlightenment.org/D1100 --- src/bin/eolian_cxx/convert.cc | 53 ++++++++------------- src/bin/eolian_cxx/eolian_wrappers.hh | 55 +++++++++++++--------- src/bin/eolian_cxx/safe_strings.hh | 19 ++++++++ src/examples/evas/evas_cxx_rectangle.cc | 6 +-- src/lib/eolian_cxx/eo_validate.hh | 2 - .../grammar/inheritance_base_generator.hh | 24 ++++++++-- 6 files changed, 95 insertions(+), 64 deletions(-) diff --git a/src/bin/eolian_cxx/convert.cc b/src/bin/eolian_cxx/convert.cc index 0b7b836..e50dd46 100644 --- a/src/bin/eolian_cxx/convert.cc +++ b/src/bin/eolian_cxx/convert.cc @@ -22,15 +22,6 @@ namespace eolian_cxx { extern efl::eina::log_domain domain; -static std::string -_dedup_func_name(Eolian_Function func, const std::string &classn) -{ - const char *s = eolian_function_full_c_name_get(func, classn.c_str()); - std::string ret(s); - eina_stringshare_del(s); - return ret; -} - static efl::eolian::parameters_container_type convert_eolian_parameters(Eina_List const* parameters, Eolian_Function_Type func_type) @@ -55,33 +46,30 @@ convert_eolian_parameters(Eina_List const* parameters, } static efl::eolian::parameters_container_type -convert_eolian_parameters(Eolian_Function const& function, - getter_t func_type) +convert_eolian_parameters(Eolian_Function const& func, getter_t func_type) { return convert_eolian_parameters - (::eolian_parameters_list_get(function), func_type.value); + (::eolian_parameters_list_get(func), func_type.value); } static efl::eolian::parameters_container_type -convert_eolian_parameters(Eina_List const* parameters, - getter_t func_type) +convert_eolian_parameters(Eina_List const* parameters, getter_t func_type) { return convert_eolian_parameters(parameters, func_type.value); } static efl::eolian::parameters_container_type -convert_eolian_parameters(Eina_List const* parameters, - setter_t func_type) +convert_eolian_parameters(Eina_List const* parameters, setter_t func_type) { return convert_eolian_parameters(parameters, func_type.value); } static efl::eolian::parameters_container_type -convert_eolian_parameters(Eolian_Function const& function) +convert_eolian_parameters(Eolian_Function const& func) { - assert(function_type(function) != EOLIAN_PROPERTY); + assert(function_type(func) != EOLIAN_PROPERTY); return convert_eolian_parameters - (::eolian_parameters_list_get(function), function_type(function)); + (::eolian_parameters_list_get(func), function_type(func)); } static efl::eolian::functions_container_type @@ -105,7 +93,7 @@ convert_eolian_property_to_functions(Eolian_Class const& klass) efl::eolian::eo_function get_; get_.type = efl::eolian::eo_function::regular_; get_.name = function_name(prop_) + "_get"; - get_.impl = _dedup_func_name(prop_, prefix) + "_get"; + get_.impl = function_impl(prop_, prefix) + "_get"; efl::eolian::eolian_type_instance ret = function_return_type(prop_, eolian_cxx::getter); @@ -157,7 +145,7 @@ convert_eolian_property_to_functions(Eolian_Class const& klass) efl::eolian::eo_function set_; set_.type = efl::eolian::eo_function::regular_; set_.name = function_name(prop_) + "_set"; - set_.impl = _dedup_func_name(prop_, prefix) + "_set"; + set_.impl = function_impl(prop_, prefix) + "_set"; set_.params = params; set_.ret = function_return_type(prop_, eolian_cxx::setter); set_.comment = convert_comments_function(prop_, eolian_cxx::setter); @@ -241,7 +229,7 @@ convert_eolian_constructors(efl::eolian::eo_class& cls, Eolian_Class const& klas { Eolian_Function eo_constructor = static_cast<Eolian_Function>(curr); efl::eolian::eo_constructor constructor; - constructor.name = _dedup_func_name(eo_constructor, prefix); + constructor.name = function_impl(eo_constructor, prefix); constructor.params = convert_eolian_parameters(eo_constructor); constructor.comment = convert_comments_function(eo_constructor, eolian_cxx::ctor); cls.constructors.push_back(constructor); @@ -258,17 +246,16 @@ convert_eolian_functions(efl::eolian::eo_class& cls, Eolian_Class const& klass) eolian_class_functions_list_get(klass, EOLIAN_METHOD); EINA_LIST_FOREACH (eolian_functions, it, curr) { - efl::eolian::eo_function function; - Eolian_Function eolian_function = static_cast<Eolian_Function>(curr); - std::string prefix(class_prefix(klass)); + efl::eolian::eo_function func_; + Eolian_Function eol_func = static_cast<Eolian_Function>(curr); // XXX Eolian only provides regular methods so far - function.type = efl::eolian::eo_function::regular_; - function.name = function_name(eolian_function); - function.impl = _dedup_func_name(eolian_function, prefix); - function.ret = function_return_type(eolian_function); - function.params = convert_eolian_parameters(eolian_function); - function.comment = convert_comments_function(eolian_function, eolian_cxx::method); - cls.functions.push_back(function); + 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_); } } @@ -295,7 +282,7 @@ convert_eolian_class_new(Eolian_Class const& klass) efl::eolian::eo_class cls; cls.type = class_type(klass); cls.name = safe_lower(class_name(klass)); - cls.name_space = safe_lower(class_namespace_full(klass)); + cls.name_space = class_namespace_full(klass); cls.eo_name = class_eo_name(klass); cls.comment = convert_comments_class(klass); return cls; diff --git a/src/bin/eolian_cxx/eolian_wrappers.hh b/src/bin/eolian_cxx/eolian_wrappers.hh index 2472e4a..e357c25 100644 --- a/src/bin/eolian_cxx/eolian_wrappers.hh +++ b/src/bin/eolian_cxx/eolian_wrappers.hh @@ -109,7 +109,7 @@ class_prefix(Eolian_Class const& klass) { std::string prefix = safe_lower(::eolian_class_eo_prefix_get(klass)); if (prefix.empty()) - prefix = safe_lower(class_name(klass)); + prefix = safe_lower(find_replace(class_full_name(klass), ".", "_")); assert(!prefix.empty()); return prefix; } @@ -148,7 +148,7 @@ class_namespace_full(Eolian_Class const& klass) } if (s.size() >= 2) s = s.substr(0, s.size()-2); - return s; + return safe_lower(s); } inline efl::eina::range_ptr_list<const Eolian_Class> @@ -158,46 +158,55 @@ class_list_all() } inline std::string -function_name(Eolian_Function const& function) +function_name(Eolian_Function const& func) +{ + return safe_str(::eolian_function_name_get(func)); +} + +inline std::string +function_impl(Eolian_Function const& func, std::string const& prefix) { - return safe_str(::eolian_function_name_get(function)); + const char *s = ::eolian_function_full_c_name_get(func, prefix.c_str()); + std::string ret(s); + ::eina_stringshare_del(s); + return ret; } inline Eolian_Function_Type -function_type(Eolian_Function const& function) +function_type(Eolian_Function const& func) { - return ::eolian_function_type_get(function); + return ::eolian_function_type_get(func); } inline efl::eolian::eolian_type_instance -function_return_type(Eolian_Function const& function, Eolian_Function_Type func_type = method_t::value) +function_return_type(Eolian_Function const& func, Eolian_Function_Type func_type = method_t::value) { return type_lookup - (::eolian_function_return_type_get(function, func_type)); + (::eolian_function_return_type_get(func, func_type)); } inline efl::eolian::eolian_type_instance -function_return_type(Eolian_Function const& function, setter_t func_type) +function_return_type(Eolian_Function const& func, setter_t func_type) { - return function_return_type(function, func_type.value); + return function_return_type(func, func_type.value); } inline efl::eolian::eolian_type_instance -function_return_type(Eolian_Function const& function, getter_t func_type) +function_return_type(Eolian_Function const& func, getter_t func_type) { - return function_return_type(function, func_type.value); + return function_return_type(func, func_type.value); } inline efl::eolian::eolian_type_instance -function_return_type(Eolian_Function const& function, method_t func_type) +function_return_type(Eolian_Function const& func, method_t func_type) { - return function_return_type(function, func_type.value); + return function_return_type(func, func_type.value); } inline efl::eolian::eolian_type_instance -function_return_type(Eolian_Function const& function, ctor_t func_type) +function_return_type(Eolian_Function const& func, ctor_t func_type) { - return function_return_type(function, func_type.value); + return function_return_type(func, func_type.value); } inline bool @@ -207,9 +216,9 @@ property_is_getter(Eolian_Function_Type func_type) } inline bool -property_is_getter(Eolian_Function const& function) +property_is_getter(Eolian_Function const& func) { - return property_is_getter(function_type(function)); + return property_is_getter(function_type(func)); } inline bool @@ -219,9 +228,9 @@ property_is_setter(Eolian_Function_Type func_type) } inline bool -property_is_setter(Eolian_Function const& function) +property_is_setter(Eolian_Function const& func) { - return property_is_setter(function_type(function)); + return property_is_setter(function_type(func)); } inline std::string @@ -264,11 +273,11 @@ parameter_is_const(Eolian_Function_Parameter const& parameter, inline bool parameter_is_const(Eolian_Function_Parameter const& parameter, - Eolian_Function const& function) + Eolian_Function const& func) { - assert(function_type(function) != EOLIAN_PROPERTY); + assert(function_type(func) != EOLIAN_PROPERTY); return ::eolian_parameter_const_attribute_get - (parameter, property_is_getter(function)); + (parameter, property_is_getter(func)); } inline efl::eolian::eolian_type_instance diff --git a/src/bin/eolian_cxx/safe_strings.hh b/src/bin/eolian_cxx/safe_strings.hh index b45a4ff..d9a9069 100644 --- a/src/bin/eolian_cxx/safe_strings.hh +++ b/src/bin/eolian_cxx/safe_strings.hh @@ -94,6 +94,8 @@ normalize_spaces(std::string const& s) return r; } +/// @brief Return the basename of a path. +/// inline std::string path_base(std::string path) { @@ -102,5 +104,22 @@ path_base(std::string path) return std::string(slash.base(), path.end()); } +/// @brief Find-and-replace patterns in a string. +/// +inline std::string +find_replace(std::string const& s_, + std::string const& old, + std::string const& new_) +{ + std::string s = s_; + std::string::size_type found = s.find(old); + std::string::size_type len = new_.length(); + while (found != std::string::npos) + { + s.replace(found, len, new_); + found = s.find(old); + } + return s; +} #endif // EOLIAN_CXX_BIN_SAFE_STRINGS_HH diff --git a/src/examples/evas/evas_cxx_rectangle.cc b/src/examples/evas/evas_cxx_rectangle.cc index 3b01071..d307200 100644 --- a/src/examples/evas/evas_cxx_rectangle.cc +++ b/src/examples/evas/evas_cxx_rectangle.cc @@ -12,7 +12,7 @@ #include <Eina.hh> #include <Eo.hh> -#include "canvas/evas.eo.hh" +#include "canvas/evas_canvas.eo.hh" #include "canvas/evas_image.eo.hh" #include "canvas/evas_rectangle.eo.hh" @@ -39,8 +39,8 @@ int main() ecore_evas_show(ee); { - ::evas canvas(::eo_ref(::ecore_evas_get(ee))); - ::evas_rectangle rect(efl::eo::parent = canvas); + evas::canvas canvas(::eo_ref(::ecore_evas_get(ee))); + evas::rectangle rect(efl::eo::parent = canvas); rect.color_set(255, 0, 0, 255); rect.position_set(10, 10); rect.size_set(100, 100); diff --git a/src/lib/eolian_cxx/eo_validate.hh b/src/lib/eolian_cxx/eo_validate.hh index 0095cd5..801c0e0 100644 --- a/src/lib/eolian_cxx/eo_validate.hh +++ b/src/lib/eolian_cxx/eo_validate.hh @@ -2,8 +2,6 @@ #ifndef EOLIAN_CXX_EO_CLASS_VALIDATE_HH #define EOLIAN_CXX_EO_CLASS_VALIDATE_HH -#include <iostream> // XXX - #include <algorithm> #include <string> #include <cassert> diff --git a/src/lib/eolian_cxx/grammar/inheritance_base_generator.hh b/src/lib/eolian_cxx/grammar/inheritance_base_generator.hh index 8cc2538..fe89e6d 100644 --- a/src/lib/eolian_cxx/grammar/inheritance_base_generator.hh +++ b/src/lib/eolian_cxx/grammar/inheritance_base_generator.hh @@ -9,11 +9,24 @@ #include "eo_types.hh" #include "tab.hh" #include "parameters_generator.hh" - #include "eo_class_functions_generator.hh" namespace efl { namespace eolian { namespace grammar { +inline std::string +_ns_as_prefix(eo_class const& cls) +{ + // XXX Use eolian_cxx::find_replace() instead. + std::string s = cls.name_space; + std::string::size_type found = s.find("::"); + while (found != std::string::npos) + { + s.replace(found, 1, "_"); + found = s.find("::"); + } + return s; +} + struct inheritance_operation { eo_class const& _cls; @@ -30,6 +43,7 @@ operator<<(std::ostream& out, inheritance_operation const& x) eo_function const& func = x._cls.functions[x._idx]; out << tab(1) << "ops[" << x._idx << "].func = reinterpret_cast<void*>(& ::" + << _ns_as_prefix(x._cls) << "_" << x._cls.name << "_" << func.name << "_wrapper<T>);" << endl << tab(1) << "ops[" << x._idx << "].api_func = reinterpret_cast<void*>(& ::" << func.impl << ");" << endl @@ -82,7 +96,9 @@ inline std::ostream& operator<<(std::ostream& out, inheritance_wrapper const& x) { out << "template <typename T>" << endl - << x._func.ret << " " << x._cls.name << "_" << x._func.name + << x._func.ret << " " + << _ns_as_prefix(x._cls) << "_" + << x._cls.name << "_" << x._func.name << "_wrapper(Eo* objid EINA_UNUSED, " << "efl::eo::detail::Inherit_Private_Data* self" << (x._func.params.size() ? ", " : "") @@ -114,7 +130,9 @@ operator<<(std::ostream& out, inheritance_wrappers const& x) { eo_function const& func = *it; out << "template <typename T>" << endl - << func.ret << " " << x._cls.name << "_" << func.name + << func.ret << " " + << _ns_as_prefix(x._cls) << "_" + << x._cls.name << "_" << func.name << "_wrapper(Eo* objid EINA_UNUSED, " << "efl::eo::detail::Inherit_Private_Data* self" << (func.params.size() ? ", " : "") --