eolian: implement new syntax for inheritance
authorDaniel Kolesa <d.kolesa@samsung.com>
Thu, 22 Nov 2018 16:17:29 +0000 (17:17 +0100)
committerHermet Park <hermetpark@gmail.com>
Wed, 5 Dec 2018 05:37:06 +0000 (14:37 +0900)
This new syntax separates the parent class from extensions, in
a familiar way to similar to e.g. Java. Since changing everything
at once is a lot of effort, implement it alongside for the time
being.

32 files changed:
src/lib/ecore/efl_loop.eo
src/lib/eo/efl_class.eo
src/lib/eo/efl_interface.eo
src/lib/eo/efl_object.eo
src/lib/eo/efl_object_override.eo
src/lib/eolian/eo_lexer.h
src/lib/eolian/eo_parser.c
src/tests/efl_js/benchmark_object.eo
src/tests/efl_mono/test_child.eo
src/tests/efl_mono/test_numberwrapper.eo
src/tests/efl_mono/test_testing.eo
src/tests/eina_cxx/simple.eo
src/tests/elementary/focus_test.eo
src/tests/elementary/focus_test_sub_main.eo
src/tests/eolian/data/ctor_dtor.eo
src/tests/eolian/data/nmsp1_class1.eo
src/tests/eolian/data/object_impl.eo
src/tests/eolian/data/object_impl_add.eo
src/tests/eolian/data/override.eo
src/tests/eolian/data/parts.eo
src/tests/eolian/generated_future.eo
src/tests/eolian_cxx/a.eo
src/tests/eolian_cxx/b.eo
src/tests/eolian_cxx/c.eo
src/tests/eolian_cxx/callback.eo
src/tests/eolian_cxx/complex.eo
src/tests/eolian_cxx/d.eo
src/tests/eolian_cxx/generic.eo
src/tests/eolian_cxx/name1_name2_type_generation.eo
src/tests/eolian_cxx/simple.eo
src/tests/eolian_js/constructor_method_class.eo
src/tests/eolian_js/test_object.eo

index d3d7fc8..8dcfc3e 100644 (file)
@@ -4,7 +4,7 @@ struct Efl.Loop_Arguments {
    initialization: bool; [[Set to $true when the program should initialize its internal state. This happen once per process instance.]]
 }
 
-class Efl.Loop (Efl.Task)
+class Efl.Loop extends Efl.Task
 {
    [[The Efl Main Loop
 
index b40674d..b665ec2 100644 (file)
@@ -1,4 +1,4 @@
-abstract Efl.Class ()
+abstract Efl.Class
 {
     [[Abstract Efl class]]
     data: null;
index acf3097..f2d6b27 100644 (file)
@@ -1,4 +1,4 @@
-interface Efl.Interface ()
+interface Efl.Interface
 {
    [[An interface for other interfaces to inherit from.
     This is useful when you want to create interfaces and mixins that expose
index a0d500b..7507e01 100644 (file)
@@ -8,7 +8,7 @@ struct Efl.Event_Description {
     restart: bool; [[$true if when the event is triggered again from a callback it'll start from where it was]]
 }
 
-abstract Efl.Object ()
+abstract Efl.Object
 {
    [[Abstract Efl object class]]
    eo_prefix: efl;
index 01bf083..65f46da 100644 (file)
@@ -1,4 +1,4 @@
-abstract Efl.Object_Override ()
+abstract Efl.Object_Override
 {
    [[A special class to pass to #eo_super() when using #eo_override()
 
index fc70a0c..d805357 100644 (file)
@@ -25,14 +25,15 @@ enum Tokens
 #define KEYWORDS KW(class), KW(const), KW(enum), KW(return), KW(struct), \
     \
     KW(abstract), KW(constructor), KW(constructors), KW(data), \
-    KW(destructor), KW(eo), KW(eo_prefix), KW(event_prefix), KW(events), KW(free), \
-    KW(get), KW(implements), KW(import), KW(interface), KW(keys), KW(legacy), \
-    KW(legacy_prefix), KW(methods), KW(mixin), KW(params), KW(parse), KW(parts), \
-    KW(ptr), KW(set), KW(type), KW(values), KW(var), KWAT(auto), KWAT(beta), \
-    KWAT(class), KWAT(const), KWAT(cref), KWAT(empty), KWAT(extern), \
-    KWAT(free), KWAT(hot), KWAT(in), KWAT(inout), KWAT(nonull), KWAT(nullable), \
-    KWAT(optional), KWAT(out), KWAT(owned), KWAT(private), KWAT(property), \
-    KWAT(protected), KWAT(restart), KWAT(pure_virtual), \
+    KW(destructor), KW(eo), KW(eo_prefix), KW(event_prefix), KW(events), \
+    KW(extends), KW(free), KW(get), KW(implements), KW(import), KW(interface), \
+    KW(keys), KW(legacy), KW(legacy_prefix), KW(methods), KW(mixin), KW(params), \
+    KW(parse), KW(parts), KW(ptr), KW(set), KW(type), KW(values), KW(var), \
+    \
+    KWAT(auto), KWAT(beta), KWAT(class), KWAT(const), KWAT(cref), KWAT(empty), \
+    KWAT(extern), KWAT(free), KWAT(hot), KWAT(in), KWAT(inout), KWAT(nonull), \
+    KWAT(nullable), KWAT(optional), KWAT(out), KWAT(owned), KWAT(private), \
+    KWAT(property), KWAT(protected), KWAT(restart), KWAT(pure_virtual), \
     KWAT(warn_unused), \
     \
     KW(byte), KW(ubyte), KW(char), KW(short), KW(ushort), KW(int), KW(uint), \
index 858e268..37bed0a 100644 (file)
@@ -2043,23 +2043,49 @@ parse_class(Eo_Lexer *ls, Eolian_Class_Type type)
      }
    eo_lexer_context_pop(ls);
    eo_lexer_dtor_pop(ls);
+
+   Eina_Bool is_reg = (type == EOLIAN_CLASS_REGULAR) || (type == EOLIAN_CLASS_ABSTRACT);
    if (ls->t.token != '{')
      {
         line = ls->line_number;
         col = ls->column;
-        check_next(ls, '(');
-        if (ls->t.token != ')')
+        Eina_Strbuf *ibuf = eina_strbuf_new();
+        eo_lexer_dtor_push(ls, EINA_FREE_CB(eina_strbuf_free), ibuf);
+        /* new inherits syntax, keep alongside old for now */
+        if (ls->t.kw == KW_extends || (is_reg && (ls->t.kw == KW_implements)))
+          {
+             Eina_Bool ext = (ls->t.kw == KW_extends);
+             eo_lexer_get(ls);
+             if (is_reg && ext)
+               {
+                  /* regular class can have a parent, but just one */
+                  _inherit_dep(ls, ibuf, EINA_TRUE);
+                  /* if not followed by implements, we're done */
+                  if (ls->t.kw != KW_implements)
+                    {
+                       eo_lexer_dtor_pop(ls);
+                       goto inherit_done;
+                    }
+                  eo_lexer_get(ls);
+               }
+             do
+               _inherit_dep(ls, ibuf, EINA_FALSE);
+             while (test_next(ls, ','));
+          }
+        else
           {
-              Eina_Strbuf *ibuf = eina_strbuf_new();
-              eo_lexer_dtor_push(ls, EINA_FREE_CB(eina_strbuf_free), ibuf);
-              _inherit_dep(ls, ibuf,
-                (type == EOLIAN_CLASS_REGULAR) || (type == EOLIAN_CLASS_ABSTRACT));
-              while (test_next(ls, ','))
-                _inherit_dep(ls, ibuf, EINA_FALSE);
-              eo_lexer_dtor_pop(ls);
+             check_next(ls, '(');
+             if (ls->t.token != ')')
+               {
+                   _inherit_dep(ls, ibuf, is_reg);
+                   while (test_next(ls, ','))
+                     _inherit_dep(ls, ibuf, EINA_FALSE);
+               }
+             check_match(ls, ')', '(', line, col);
           }
-        check_match(ls, ')', '(', line, col);
+        eo_lexer_dtor_pop(ls);
      }
+inherit_done:
    line = ls->line_number;
    col = ls->column;
    check_next(ls, '{');
index 4441ac2..65b6566 100644 (file)
@@ -1,4 +1,4 @@
-class Benchmark_Object (Efl.Object)
+class Benchmark_Object extends Efl.Object
 {
    data: null;
    methods {
index d12ba6d..0d37c19 100644 (file)
@@ -1,6 +1,6 @@
 import eina_types;
 
-class Test.Child (Test.Testing) {
+class Test.Child extends Test.Testing {
 
    implements {
       class.constructor;
index 3402fbd..6f749f9 100644 (file)
@@ -1,4 +1,4 @@
-class Test.Numberwrapper (Efl.Object) {
+class Test.Numberwrapper extends Efl.Object {
    methods {
       @property number {
          get {
index 26692ea..c46963e 100644 (file)
@@ -91,7 +91,7 @@ function Test.FormatCb {
    }
 };
 
-class Test.Testing (Efl.Object, Efl.Part) {
+class Test.Testing extends Efl.Object implements Efl.Part {
 
    parts {
       part1: Test.Testing; [[ Part number one. ]]
index 1a76d23..8750b70 100644 (file)
@@ -1,4 +1,4 @@
-class Simple (Efl.Object)
+class Simple extends Efl.Object
 {
    data: null;
    implements {
index 8be44ed..1293b65 100644 (file)
@@ -1,4 +1,7 @@
-class Focus.Test(Efl.Object, Efl.Ui.Focus.Object, Efl.Gfx.Entity) {
+class Focus.Test
+    extends Efl.Object
+    implements Efl.Ui.Focus.Object, Efl.Gfx.Entity
+{
     methods {
         test_size {
             params {
index ebf8358..d259d38 100644 (file)
@@ -1,4 +1,7 @@
-class Focus.Test.Sub.Main(Efl.Object, Efl.Ui.Focus.Object, Efl.Ui.Focus.Manager_Sub) {
+class Focus.Test.Sub.Main
+    extends Efl.Object
+    implements Efl.Ui.Focus.Object, Efl.Ui.Focus.Manager_Sub
+{
     implements {
         Efl.Ui.Focus.Object.focus_manager { get; }
         Efl.Ui.Focus.Object.focus_parent { get; }
index 98452b1..256dcc0 100644 (file)
@@ -1,4 +1,4 @@
-class Ctor_Dtor (Base) {
+class Ctor_Dtor extends Base {
    methods {
       custom_constructor_1 {
          params {
index 42d6c04..a494e5e 100644 (file)
@@ -1,4 +1,4 @@
-class nmsp1.class1 (nmsp1.nmsp11.class2, nmsp2.class1, no_nmsp)
+class nmsp1.class1 extends nmsp1.nmsp11.class2 implements nmsp2.class1, no_nmsp
 {
    implements {
       nmsp1.nmsp11.class2.a { set; }
index 7019225..e646a70 100644 (file)
@@ -1,4 +1,4 @@
-class Object_Impl (Base) {
+class Object_Impl extends Base {
    methods {
       @property a {
          set {
index 4059110..e9e97c0 100644 (file)
@@ -1,4 +1,4 @@
-class Object_Impl_Add (Base) {
+class Object_Impl_Add extends Base {
    data: Object_Impl_Data;
 
    methods {
index 16ed529..440dc21 100644 (file)
@@ -1,4 +1,4 @@
-class Override (Base) {
+class Override extends Base {
    methods {
       @property a {
          set @pure_virtual {
index 286d1e4..773282d 100644 (file)
@@ -1,4 +1,4 @@
-class Parts (Override, Base) {
+class Parts extends Override implements Base {
    parts {
       part1: Override; [[Part 1]]
       part2: Base; [[Part 2]]
index 96ccc3a..4cf5518 100644 (file)
@@ -1,4 +1,4 @@
-class Generated_Future (Efl.Object)
+class Generated_Future extends Efl.Object
 {
    methods {
    }
index de330a4..cc94262 100644 (file)
@@ -1,4 +1,4 @@
-class A (Efl.Object)
+class A extends Efl.Object
 {
    data: A_Data;
    implements {
index 291865a..c293edc 100644 (file)
@@ -1,4 +1,4 @@
-class B (A)
+class B extends A
 {
    data: B_Data;
    implements {
index c784e0f..47c96cc 100644 (file)
@@ -1,4 +1,4 @@
-class C (A)
+class C extends A
 {
    data: C_Data;
    implements {
index b72e932..3f4cd9e 100644 (file)
@@ -4,7 +4,7 @@ struct Callback_Event
   field2: list<int*>;
 }
 
-class Callback (Efl.Object)
+class Callback extends Efl.Object
 {
    data: Callback_Data;
    events {
index e4400dd..13ed1ca 100644 (file)
@@ -1,4 +1,4 @@
-class Complex (Efl.Object)
+class Complex extends Efl.Object
 {
    data: Complex_Data;
    methods {
index 1a5d2b3..a3bf2a5 100644 (file)
@@ -1,4 +1,4 @@
-class D (B, C)
+class D extends B implements C
 {
    data: D_Data;
    implements {
index d21473c..6282cba 100644 (file)
@@ -5,7 +5,7 @@ struct Generic.Event
   field2: list<ptr(int)>;
 }
 
-class Generic (Efl.Object)
+class Generic extends Efl.Object
 {
    data: Generic_Data;
    methods {
index 8e745be..683cf9f 100644 (file)
@@ -1,4 +1,4 @@
-class Name1.Name2.Type_Generation (Efl.Object)
+class Name1.Name2.Type_Generation extends Efl.Object
 {
    data: Type_Generation_Data;
    methods {
index 003a3e6..f6f340f 100644 (file)
@@ -1,4 +1,4 @@
-class Simple (Efl.Object)
+class Simple extends Efl.Object
 {
    data: null;
    methods {
index ed77e85..206f2df 100644 (file)
@@ -1,4 +1,4 @@
-class Constructor_Method_Class (Efl.Object)
+class Constructor_Method_Class extends Efl.Object
 {
    data: Constructor_Method_Class_Data;
    methods {
index ea81366..d1aed0a 100644 (file)
@@ -10,7 +10,7 @@ struct Test.Struct_Ex {
     value_enum: Test.Enum_Ex;
 }
 
-class Test.Object (Efl.Object) {
+class Test.Object extends Efl.Object {
    methods {
        method_integral_in_a_check {
            [[ tests integral in ]]