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() ? ", " : "")

-- 


Reply via email to