elua: correct inheritance system in lualian generator

This commit is contained in:
Daniel Kolesa 2015-02-25 14:43:27 +00:00
parent 7806e79024
commit 9593a720c1
1 changed files with 25 additions and 28 deletions

View File

@ -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)