summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2015-02-25 14:43:27 +0000
committerDaniel Kolesa <d.kolesa@samsung.com>2015-02-25 14:43:27 +0000
commit9593a720c1dbb0ea79ca5f0c418f7f109a4bc7fa (patch)
tree47a92ae7dac5ab5093863696470d6a2413e31821
parent7806e7902430f30548cb79f474bb3c421539ccab (diff)
downloadefl-9593a720c1dbb0ea79ca5f0c418f7f109a4bc7fa.tar.gz
elua: correct inheritance system in lualian generator
-rw-r--r--src/scripts/elua/modules/lualian.lua53
1 files changed, 25 insertions, 28 deletions
diff --git a/src/scripts/elua/modules/lualian.lua b/src/scripts/elua/modules/lualian.lua
index 5514852f25..7245291a06 100644
--- a/src/scripts/elua/modules/lualian.lua
+++ b/src/scripts/elua/modules/lualian.lua
@@ -433,9 +433,9 @@ local build_pn = function(fn, pn)
end
local Class = Node:clone {
- __ctor = function(self, klass, parent, mixins, ch, evs)
+ __ctor = function(self, klass, parents, mixins, ch, evs)
self.klass = klass
- self.parent = parent
+ self.parents = parents
self.interfaces = interfaces
self.mixins = mixins
self.children = ch
@@ -549,13 +549,22 @@ local File = Node:clone {
local ckls = self.children[1]
local kn = kls:full_name_get()
- local par = ckls.parent
dom:log(log.level.INFO, "Generating for file: " .. self.fname)
dom:log(log.level.INFO, " Class : " .. kn)
local knu = kn:gsub("%.", "_")
- local paru = par and ('"' .. par:gsub("%.", "_") .. '"') or "nil"
+
+ local pars = ckls.parents or {}
+ local mins = ckls.mixins or {}
+
+ -- serialize both
+ local pv = {}
+ local mv = {}
+ for i = 1, #pars do pv[i] = '"' .. pars[i]:gsub("%.", "_") .. '"' end
+ for i = 1, #mins do mv[i] = '"' .. mins[i]:gsub("%.", "_") .. '"' end
+ pars = (#pars > 0) and ("{" .. table.concat(pv, ", ") .. "}") or "nil"
+ mins = (#mins > 0) and ("{" .. table.concat(mv, ", ") .. "}") or "nil"
s:write(([[
-- EFL LuaJIT bindings: %s (class %s)
@@ -573,20 +582,12 @@ local __body
local init = function()
__class = __lib.%s()
- eo.class_register("%s", %s, __body, __class)
-]]):format(self.fname, kn, kls:c_get_function_name_get(), knu, paru))
-
- if ckls.mixins then for i, v in ipairs(ckls.mixins) do
- s:write((" eo.class_mixin(\"%s\", \"%s\")\n"):format(knu,
- v:gsub("%.", "_")))
- end end
-
- s:write([[
+ eo.class_register("%s", %s, %s, __body, __class)
end
cutil.init_module(init, function() end)
-]])
+]]):format(self.fname, kn, kls:c_get_function_name_get(), knu, pars, mins))
self:gen_children(s)
@@ -647,26 +648,22 @@ end
local gen_class = function(klass)
local inherits = klass:inherits_get():to_array()
- local parent
- local mixins = {}
local ct = eolian.class_type
- local n = 1
- if inherits[n] then
- local tp = eolian.class_get_by_name(inherits[n]):type_get()
- if tp == ct.REGULAR or tp == ct.ABSTRACT then
- parent = inherits[n]
- n = n + 1
- end
- end
- for i = n, #inherits do
+ -- figure out the correct lookup order
+ local parents = {}
+ local mixins = {} -- also includes ifaces, they're separated later
+ for i = 1, #inherits do
local v = inherits[i]
local tp = eolian.class_get_by_name(v):type_get()
- if tp == ct.UNKNOWN then
+ if tp == ct.REGULAR or tp == ct.ABSTRACT then
+ parents[#parents + 1] = v
+ elseif tp == ct.INTERFACE or tp == ct.MIXIN then
+ mixins[#mixins + 1] = v
+ else
error(klass:full_name_get() .. ": unknown inherit " .. v)
end
- mixins[#mixins + 1] = v
end
- return Class(klass, parent, mixins, gen_contents(klass))
+ return Class(klass, parents, mixins, gen_contents(klass))
end
M.include_dir = function(dir)