felipealmeida pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0fcee227aa9269b3767d6f6046d4b18389c0533d

commit 0fcee227aa9269b3767d6f6046d4b18389c0533d
Author: Felipe Magno de Almeida <fel...@expertisesolutions.com.br>
Date:   Sun Jun 18 11:30:00 2017 -0300

    eolian-cxx: Fix C++ generation errors with handle opaque types
---
 src/bindings/cxx/eo_cxx/eo_cxx_interop.hh | 12 +++++++++++-
 src/lib/efl/Efl.h                         |  3 +++
 src/lib/efl/interfaces/efl_text_types.eot |  4 ++--
 src/lib/eolian_cxx/grammar/klass_def.hpp  | 14 +++++++++++++-
 src/lib/eolian_cxx/grammar/type_impl.hpp  |  4 ++--
 5 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/bindings/cxx/eo_cxx/eo_cxx_interop.hh 
b/src/bindings/cxx/eo_cxx/eo_cxx_interop.hh
index 7a2f8fb765..f8444ddc64 100644
--- a/src/bindings/cxx/eo_cxx/eo_cxx_interop.hh
+++ b/src/bindings/cxx/eo_cxx/eo_cxx_interop.hh
@@ -85,6 +85,11 @@ struct tag
 };
   
 template <typename T>
+void assign_out_impl(T*& lhs, T* rhs, tag<T*, T*>)
+{
+  lhs = rhs;
+}
+template <typename T>
 void assign_out_impl(T& lhs, T*& rhs, tag<T&, T*>, typename 
std::enable_if<!std::is_const<T>::value>::type* = 0)
 {
   lhs = *rhs;
@@ -535,8 +540,13 @@ Eina_Array** convert_to_c_impl(efl::eina::range_array<T>& 
/*c*/, tag<Eina_Array
 {
   std::abort();
 }
+template <typename T>
+T* convert_to_c_impl(T const* p, tag<T*, T const*>) // needed for property_get
+{
+  return const_cast<T*>(p);
 }
-    
+}
+
 template <typename T, typename U, bool Own, typename V>
 T convert_to_c(V&& object)
 {
diff --git a/src/lib/efl/Efl.h b/src/lib/efl/Efl.h
index 4e7fbd6810..66e9a978bc 100644
--- a/src/lib/efl/Efl.h
+++ b/src/lib/efl/Efl.h
@@ -52,6 +52,9 @@ extern "C" {
  */
 typedef struct tm Efl_Time;
 
+typedef struct _Efl_Text_Cursor_Cursor_Data Efl_Text_Cursor_Cursor_Data;
+typedef struct _Efl_Canvas_Text_Annotation Efl_Canvas_Text_Annotation;
+
 #ifdef EFL_BETA_API_SUPPORT
 
 #include "interfaces/efl_types.eot.h"
diff --git a/src/lib/efl/interfaces/efl_text_types.eot 
b/src/lib/efl/interfaces/efl_text_types.eot
index 08bdb3a8f9..3fe14a2021 100644
--- a/src/lib/efl/interfaces/efl_text_types.eot
+++ b/src/lib/efl/interfaces/efl_text_types.eot
@@ -20,9 +20,9 @@ enum Efl.Text.Cursor.Cursor_Get_Type {
    user_extra       [[User extra cursor state]]
 }
 
-struct Efl.Canvas.Text.Annotation; [[EFL text annotations data structure]]
+type @extern Efl.Canvas.Text.Annotation: __undefined_type; [[EFL text 
annotations data structure]]
 
-struct Efl.Text.Cursor.Cursor_Data; [[Text cursor data structure]]
+type @extern Efl.Text.Cursor.Cursor_Data: __undefined_type; [[Text cursor data 
structure]]
 
 enum Efl.Text.Cursor.Cursor_Type
 {
diff --git a/src/lib/eolian_cxx/grammar/klass_def.hpp 
b/src/lib/eolian_cxx/grammar/klass_def.hpp
index 9629c70715..583744b503 100644
--- a/src/lib/eolian_cxx/grammar/klass_def.hpp
+++ b/src/lib/eolian_cxx/grammar/klass_def.hpp
@@ -174,6 +174,7 @@ struct regular_type_def
    std::string base_type;
    qualifier_def base_qualifier;
    std::vector<std::string> namespaces;
+   bool is_undefined = false;
 };
 
 inline bool operator==(regular_type_def const& rhs, regular_type_def const& 
lhs)
@@ -253,13 +254,24 @@ inline void type_def::set(Eolian_Type const* eolian_type, 
Eolian_Unit const* uni
        break;
      case EOLIAN_TYPE_REGULAR:
        {
+         bool is_undefined = false;
+         Eolian_Typedecl const* decl = eolian_type_typedecl_get(eolian_type);
+         if(decl && eolian_typedecl_type_get(decl) == EOLIAN_TYPEDECL_ALIAS)
+           {
+             Eolian_Type const* aliased = eolian_typedecl_base_type_get(decl);
+             if(aliased && eolian_type_type_get(aliased) == 
EOLIAN_TYPE_UNDEFINED)
+               {
+                 is_undefined = true;
+               }
+           }
+         
          if(c_type == "va_list *")
            throw std::runtime_error("");
          std::vector<std::string> namespaces;
          for(efl::eina::iterator<const char> namespace_iterator( 
::eolian_type_namespaces_get(eolian_type))
                , namespace_last; namespace_iterator != namespace_last; 
++namespace_iterator)
            namespaces.push_back(&*namespace_iterator);
-         original_type = {regular_type_def{ 
::eolian_type_name_get(eolian_type), {qualifiers(eolian_type), {}}, 
namespaces}};
+         original_type = {regular_type_def{ 
::eolian_type_name_get(eolian_type), {qualifiers(eolian_type), {}}, namespaces, 
is_undefined}};
        }
        break;
      case EOLIAN_TYPE_CLASS:
diff --git a/src/lib/eolian_cxx/grammar/type_impl.hpp 
b/src/lib/eolian_cxx/grammar/type_impl.hpp
index a6bd0a9158..38d0bb3bb5 100644
--- a/src/lib/eolian_cxx/grammar/type_impl.hpp
+++ b/src/lib/eolian_cxx/grammar/type_impl.hpp
@@ -132,7 +132,7 @@ struct visitor_generate
              (
               lit("void") << (regular.base_qualifier & 
qualifier_info::is_const ? " const" : "")
               << "*"
-              << (is_out ? "&" : "")
+              << (is_out ? "*" : "")
              )
              .generate(sink, attributes::unused, *context);
         }
@@ -220,7 +220,7 @@ struct visitor_generate
                   || (regular.base_qualifier & qualifier_info::is_ref
                       && !is_return && !is_out)
                   ? " const" : "")
-              << (regular.base_qualifier & qualifier_info::is_ref? "&" : "")
+              << (regular.base_qualifier & qualifier_info::is_ref ? 
(regular.is_undefined ? "*" : "&") : "")
              )
              .generate(sink, std::make_tuple(regular.namespaces, 
regular.base_type), *context))
             return true;

-- 


Reply via email to