eolian-cxx: Add parent/extensions information to klass_def
authorLauro Moura <lauromoura@expertisesolutions.com.br>
Fri, 14 Dec 2018 20:52:56 +0000 (18:52 -0200)
committerWonki Kim <wonki_.kim@samsung.com>
Tue, 18 Dec 2018 04:23:55 +0000 (13:23 +0900)
Summary: Following new Eolian api.

Test Plan: Run newly added test

Reviewers: vitor.sousa, felipealmeida

Reviewed By: vitor.sousa

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D7459

src/Makefile_Eolian_Cxx.am
src/lib/eolian_cxx/grammar/klass_def.hpp
src/tests/eolian_cxx/eolian_cxx_test_binding.cc
src/tests/eolian_cxx/generic.c
src/tests/eolian_cxx/generic.eo
src/tests/eolian_cxx/generic_interface.eo [new file with mode: 0644]
src/tests/eolian_cxx/meson.build

index be0cbaf..9b6c32e 100644 (file)
@@ -110,14 +110,14 @@ endif
 
 tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-name1_name2_type_generation.$(OBJEXT): tests/eolian_cxx/name1_name2_type_generation.eo.h tests/eolian_cxx/name1_name2_type_generation.eo.c
 tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-eolian_cxx_test_inheritance.$(OBJEXT): tests/eolian_cxx/simple.eo.hh tests/eolian_cxx/simple.eo.h
-tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-eolian_cxx_test_binding.$(OBJEXT): tests/eolian_cxx/generic.eo.hh tests/eolian_cxx/generic.eo.h tests/eolian_cxx/name1_name2_type_generation.eo.hh tests/eolian_cxx/name1_name2_type_generation.eo.h tests/eolian_cxx/name1_name2_type_generation.eo.c
+tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-eolian_cxx_test_binding.$(OBJEXT): tests/eolian_cxx/generic.eo.hh tests/eolian_cxx/generic.eo.h tests/eolian_cxx/generic.eo.c tests/eolian_cxx/generic_interface.eo.hh tests/eolian_cxx/generic_interface.eo.h tests/eolian_cxx/generic_interface.eo.c tests/eolian_cxx/name1_name2_type_generation.eo.hh tests/eolian_cxx/name1_name2_type_generation.eo.h tests/eolian_cxx/name1_name2_type_generation.eo.c
 tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-eolian_cxx_test_address_of.$(OBJEXT): tests/eolian_cxx/a.eo.hh tests/eolian_cxx/b.eo.hh tests/eolian_cxx/c.eo.hh tests/eolian_cxx/d.eo.hh tests/eolian_cxx/a.eo.h tests/eolian_cxx/b.eo.h tests/eolian_cxx/c.eo.h tests/eolian_cxx/d.eo.h
 tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-eolian_cxx_test_cyclic.$(OBJEXT): tests/eolian_cxx/cyclic1.eo.hh tests/eolian_cxx/cyclic2.eo.hh tests/eolian_cxx/cyclic1.eo.c tests/eolian_cxx/cyclic2.eo.c tests/eolian_cxx/cyclic1.eo.h tests/eolian_cxx/cyclic2.eo.h
 
 tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-eolian_cxx_test_wrapper.$(OBJEXT): tests/eolian_cxx/a.eo.h tests/eolian_cxx/a.eo.c tests/eolian_cxx/a.eo.hh
 
 tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-simple.$(OBJEXT): tests/eolian_cxx/simple.eo.c tests/eolian_cxx/simple.eo.h
-tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-generic.$(OBJEXT): tests/eolian_cxx/generic.eo.c tests/eolian_cxx/generic.eo.h
+tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-generic.$(OBJEXT): tests/eolian_cxx/generic.eo.c tests/eolian_cxx/generic.eo.h tests/eolian_cxx/generic_interface.eo.c tests/eolian_cxx/generic_interface.eo.h
 tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-a.$(OBJEXT): tests/eolian_cxx/a.eo.c tests/eolian_cxx/a.eo.h
 tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-b.$(OBJEXT): tests/eolian_cxx/b.eo.c tests/eolian_cxx/b.eo.h
 tests/eolian_cxx/$(TESTS_EOLIAN_CXX_OBJNAME)eolian_cxx_suite-c.$(OBJEXT): tests/eolian_cxx/c.eo.c tests/eolian_cxx/c.eo.h
@@ -138,6 +138,10 @@ tests/eolian_cxx/generic.eo.c \
 tests/eolian_cxx/generic.eo.h \
 tests/eolian_cxx/generic.eo.hh \
 tests/eolian_cxx/generic.eo.impl.hh \
+tests/eolian_cxx/generic_interface.eo.c \
+tests/eolian_cxx/generic_interface.eo.h \
+tests/eolian_cxx/generic_interface.eo.hh \
+tests/eolian_cxx/generic_interface.eo.impl.hh \
 tests/eolian_cxx/a.eo.hh tests/eolian_cxx/a.eo.impl.hh tests/eolian_cxx/a.eo.c tests/eolian_cxx/a.eo.h \
 tests/eolian_cxx/b.eo.hh tests/eolian_cxx/b.eo.impl.hh tests/eolian_cxx/b.eo.c tests/eolian_cxx/b.eo.h \
 tests/eolian_cxx/c.eo.hh tests/eolian_cxx/c.eo.impl.hh tests/eolian_cxx/c.eo.c tests/eolian_cxx/c.eo.h \
@@ -198,6 +202,7 @@ endif
 EXTRA_DIST2 += \
 tests/eolian_cxx/simple.eo \
 tests/eolian_cxx/generic.eo \
+tests/eolian_cxx/generic_interface.eo \
 tests/eolian_cxx/docs.eo \
 tests/eolian_cxx/a.eo \
 tests/eolian_cxx/b.eo \
index 08240b6..ce54f35 100644 (file)
@@ -987,6 +987,9 @@ struct klass_def
   class_type type;
   std::vector<event_def> events;
   std::set<klass_name, compare_klass_name_by_name> immediate_inherits;
+  eina::optional<klass_name> parent;
+  std::set<klass_name, compare_klass_name_by_name> extensions;
+
   std::set<part_def> parts;
   Eolian_Unit const* unit;
 
@@ -1108,12 +1111,17 @@ struct klass_def
          } catch(std::exception const&) {}
        }
      if(::eolian_class_parent_get(klass))
-       immediate_inherits.insert({::eolian_class_parent_get(klass), {}});
+       {
+          parent = eina::optional<klass_name>({::eolian_class_parent_get(klass), {}});
+          immediate_inherits.insert(*parent);
+       }
      for(efl::eina::iterator<Eolian_Class const> inherit_iterator ( ::eolian_class_extensions_get(klass))
            , inherit_last; inherit_iterator != inherit_last; ++inherit_iterator)
        {
          Eolian_Class const* inherit = &*inherit_iterator;
-         immediate_inherits.insert({inherit, {}});
+         klass_name extension(inherit, {});
+         immediate_inherits.insert(extension);
+         extensions.insert(extension);
        }
      std::function<void(Eolian_Class const*)> inherit_algo =
        [&] (Eolian_Class const* inherit_klass)
index 0983406..936687a 100644 (file)
@@ -292,6 +292,23 @@ EFL_START_TEST(eolian_cxx_test_properties)
 }
 EFL_END_TEST
 
+EFL_START_TEST(eolian_cxx_test_parent_extensions)
+{
+  efl::eolian::eolian_init eolian_init;
+  efl::eolian::eolian_state eolian_state;
+
+  klass_def cls = init_test_data("generic.eo", "Generic", eolian_state);
+
+  auto parent = cls.parent;
+  ck_assert(parent.is_engaged());
+  ck_assert_str_eq("Object", parent->eolian_name.c_str());
+
+  ck_assert_int_eq(1, cls.extensions.size());
+  auto extension = *cls.extensions.cbegin();
+  ck_assert_str_eq("Generic_Interface", extension.eolian_name.c_str());
+}
+EFL_END_TEST
+
 void
 eolian_cxx_test_binding(TCase* tc)
 {
@@ -303,4 +320,5 @@ eolian_cxx_test_binding(TCase* tc)
    tcase_add_test(tc, eolian_cxx_test_type_generation_optional);
    tcase_add_test(tc, eolian_cxx_test_type_callback);
    tcase_add_test(tc, eolian_cxx_test_properties);
+   tcase_add_test(tc, eolian_cxx_test_parent_extensions);
 }
index f558208..ee3a0c3 100644 (file)
@@ -9,6 +9,7 @@
 #define GENERIC_PROTECTED
 
 #include "generic.eo.h"
+#include "generic_interface.eo.h"
 
 #include <check.h>
 
@@ -138,3 +139,4 @@ static void _generic_beta_method1(Eo *obj EINA_UNUSED, Generic_Data* pd EINA_UNU
 {
 }
 #include "generic.eo.c"
+#include "generic_interface.eo.c"
index 6282cba..7f367a9 100644 (file)
@@ -5,7 +5,7 @@ struct Generic.Event
   field2: list<ptr(int)>;
 }
 
-class Generic extends Efl.Object
+class Generic extends Efl.Object implements Generic_Interface
 {
    data: Generic_Data;
    methods {
diff --git a/src/tests/eolian_cxx/generic_interface.eo b/src/tests/eolian_cxx/generic_interface.eo
new file mode 100644 (file)
index 0000000..9f11c1a
--- /dev/null
@@ -0,0 +1,3 @@
+interface Generic_Interface
+{
+}
index d93fe60..a3a0e57 100644 (file)
@@ -34,6 +34,7 @@ pub_eo_files = [
   'cyclic2.eo',
   'docs.eo',
   'generic.eo',
+  'generic_interface.eo',
   'name1_name2_type_generation.eo',
   'name_name.eo',
   'ns_name.eo',