elua: better namespace handling in lualian generator (support more than 1 level of...
authorDaniel Kolesa <d.kolesa@samsung.com>
Thu, 5 Jun 2014 13:17:30 +0000 (14:17 +0100)
committerDaniel Kolesa <d.kolesa@samsung.com>
Tue, 10 Jun 2014 14:48:53 +0000 (15:48 +0100)
src/bin/elua/core/util.lua
src/bin/elua/modules/lualian.lua

index 67ec075..f0e21c6 100644 (file)
@@ -379,4 +379,17 @@ table.uniq = function(tbl)
     return ret
 end
 
+M.get_namespace = function(M, nspaces)
+    local last_m = M
+    for i, v in ipairs(nspaces) do
+        local nsp = M[v]
+        if not nsp then
+            nsp = {}
+            last_m[v] = nsp
+        end
+        last_m = nsp
+    end
+    return last_m
+end
+
 return M
\ No newline at end of file
index 87748f1..6152be4 100644 (file)
@@ -438,19 +438,21 @@ local Mixin = Node:clone {
         s:write("]]\n\n")
 
         local nspaces = self.klass:namespaces_list_get()
-        local ename
-        if #nspaces > 0 then
-            table.remove(nspaces, 1)
-            nspaces[#nspaces + 1] = self.klass:name_get()
-            ename = table.concat(nspaces, "_")
+        if #nspaces > 1 then
+            local lnspaces = {}
+            for i = 2, #nspaces do
+                lnspaces[i] = '"' .. nspaces[i]:lower() .. '"'
+            end
+            s:write("local __M = util.get_namespace(M, { ",
+                table.concat(lnspaces, ", "), " })\n")
         else
-            ename = self.klass:name_get()
+            s:write("local __M = M\n")
         end
 
         s:write(([[
 local __class = __lib.%s_class_get()
-M.%s = eo.class_register("%s", {
-]]):format(self.prefix, ename, self.klass:full_name_get()))
+__M.%s = eo.class_register("%s", {
+]]):format(self.prefix, self.klass:name_get(), self.klass:full_name_get()))
 
         self:gen_children(s)
 
@@ -499,20 +501,23 @@ local Class = Node:clone {
         s:write("]]\n\n")
 
         local nspaces = self.klass:namespaces_list_get()
-        local ename
-        if #nspaces > 0 then
-            table.remove(nspaces, 1)
-            nspaces[#nspaces + 1] = self.klass:name_get()
-            ename = table.concat(nspaces, "_")
+        if #nspaces > 1 then
+            local lnspaces = {}
+            for i = 2, #nspaces do
+                lnspaces[i] = '"' .. nspaces[i]:lower() .. '"'
+            end
+            s:write("local __M = util.get_namespace(M, { ",
+                table.concat(lnspaces, ", "), " })\n")
         else
-            ename = self.klass:name_get()
+            s:write("local __M = M\n")
         end
 
         s:write(([[
 local __class = __lib.%s_class_get()
 local Parent  = eo.class_get("%s")
-M.%s = eo.class_register("%s", Parent:clone {
-]]):format(self.prefix, self.parent, ename, self.klass:full_name_get()))
+__M.%s = eo.class_register("%s", Parent:clone {
+]]):format(self.prefix, self.parent, self.klass:name_get(),
+        self.klass:full_name_get()))
 
         self:gen_children(s)