elua: generate a default constructor if none provided
authorDaniel Kolesa <quaker66@gmail.com>
Tue, 22 Apr 2014 15:02:01 +0000 (16:02 +0100)
committerDaniel Kolesa <d.kolesa@samsung.com>
Tue, 10 Jun 2014 14:48:48 +0000 (15:48 +0100)
src/bin/elua/modules/lualian.lua

index 0d9f070..72bfe7a 100644 (file)
@@ -383,6 +383,7 @@ local Constructor = Method:clone {
         if not defctor then
             s:write("        self = self:clone()\n")
         end
+        self.parent_node:gen_ctor(s)
         for i, v in ipairs(proto.allocs) do
             s:write("        local ", v[2], " = ffi.new(\"", v[1], "[1]\")\n")
         end
@@ -400,6 +401,21 @@ local Constructor = Method:clone {
     end
 }
 
+local Default_Constructor = Node:clone {
+    generate = function(self, s, last)
+        s:write( "    __ctor = function(self, parent)\n")
+        self.parent_node:gen_ctor(s)
+        s:write("        self:__ctor_common(butts, parent)\n")
+        s:write("    end", last and "" or ",", last and "\n" or "\n\n")
+    end,
+
+    gen_ffi = function(self, s)
+    end,
+
+    gen_ctor = function(self)
+    end
+}
+
 local Mixin = Node:clone {
     __ctor = function(self, cname, ch, evs)
         self.cname    = cname
@@ -435,6 +451,13 @@ local Mixin = Node:clone {
                 v:gen_ffi(s)
             end
         end
+    end,
+
+    gen_ctor = function(self, s)
+        for i, v in ipairs(self.children) do
+            v.parent_node = self
+            v:gen_ctor(s)
+        end
     end
 }
 
@@ -472,7 +495,8 @@ M.%s = Parent:clone {
         end
     end,
 
-    gen_ffi = Mixin.gen_ffi
+    gen_ffi = Mixin.gen_ffi,
+    gen_ctor = Mixin.gen_ctor
 }
 
 local File = Node:clone {
@@ -550,6 +574,9 @@ local gen_contents = function(classn)
     for i, v in ipairs(ctors) do
         cnt[#cnt + 1] = Constructor(v)
     end
+    if #ctors == 0 then
+        cnt[#cnt + 1] = Default_Constructor()
+    end
     -- events
     local evs = {}
     local events = eolian.class_events_list_get(classn)