gen_children = function(self, s)
local len = #self.children
- local evs = self.events
+
+ local evs = self.events
local evslen
if evs then evslen = #evs end
local hasevs = evs and evslen > 0
+
+ local hasprops = false
+ local nprops = 0
+ local props = {}
+
for i, v in ipairs(self.children) do
v.parent_node = self
- v:generate(s, (not hasevs) and (i == len))
+ if v.generate_prop then
+ if v:generate_prop(props) then
+ nprops = nprops + 1
+ end
+ hasprops = true
+ end
+ v:generate(s, (not hasevs) and (not hasprops) and (i == len))
end
+
if hasevs then
s:write(" __events = {\n")
for i, v in ipairs(evs) do
v.parent_node = self
v:generate(s, i == evslen)
end
+ s:write(" }", hasprops and "," or "", "\n")
+ end
+
+ if hasprops then
+ if hasevs then
+ s:write("\n")
+ end
+ s:write(" __properties = {\n")
+ local pi = 0
+ for k, v in pairs(props) do
+ pi = pi + 1
+ s:write(" [\"", k, "\"] = { ", table.concat(v, ", "),
+ " }", pi ~= nprops and "," or "", "\n")
+ end
s:write(" }\n")
end
end
local proto = {
name = prop:name_get(),
- suffix = (self.isget and "_get" or "_set")
+ suffix = (self.isget and "_get" or "_set"),
+ nkeys = #keys,
+ nvals = #vals
}
proto.ret_type = rett and rett:c_type_get() or "void"
local args, cargs, vargs = { "self" }, {}, {}
self.cached_proto = proto
return proto
+ end,
+
+ generate_prop = function(self, props)
+ local proto = self:gen_proto()
+ local prop = props[proto.name]
+ if prop then
+ if self.isget then
+ prop[3] = "true"
+ else
+ prop[4] = "true"
+ end
+ return false
+ else
+ props[proto.name] = { proto.nkeys, math.max(proto.nvals, 1),
+ tostring(self.isget), tostring(not self.isget) }
+ return true
+ end
end
}