Update BUILD
[lqt/mk.git] / generator / properties.lua
blob01b74b9dc7bb671689065812af4f8170f5320b1f
1 module('properties', package.seeall)
3 local function get_variables(class)
4 local vars = {}
5 local function traverse(c)
6 for i, var in ipairs(c) do
7 if var.label == "Variable" and var.xarg.access == "public" then
8 table.insert(vars, var)
9 end
10 end
11 for b in string.gmatch(c.xarg.bases or '', '([^;]+);') do
12 local base = fullnames[b]
13 if base then traverse(base) end
14 end
15 end
16 traverse(class)
17 return vars
18 end
20 function fill_properties(classes)
21 for c in pairs(classes) do
22 local props = {}
23 local vars = get_variables(c)
24 for i, var in ipairs(vars) do
25 local targetType = typesystem[var.xarg.type_name]
26 if targetType then
27 local sget = typesystem[c.xarg.fullname..'*'].get(1)
28 local getter =
29 ' ' .. c.xarg.fullname .. '* self = ' .. sget .. ';\n' ..
30 ' lqtL_selfcheck(L, self, "'..c.xarg.fullname..'");\n' ..
31 ' ' .. targetType.push('self->'..var.xarg.name) .. ';\n' ..
32 ' return 1;\n'
34 local setter
35 if not var.xarg.type_constant then
36 setter =
37 ' ' .. c.xarg.fullname .. '* self = ' .. sget .. ';\n' ..
38 ' lqtL_selfcheck(L, self, "'..c.xarg.fullname..'");\n' ..
39 ' self->' .. var.xarg.name .. ' = ' .. targetType.get(3) .. ';\n' ..
40 ' return 0;\n'
41 end
43 table.insert(props, { class=c.xarg.cname, name = var.xarg.name, type = var.xarg.type_name,
44 getter = getter, setter = setter })
45 end
46 end
47 if next(props) then
48 local properties = ''
49 local getters, setters = {}, {}
50 for i, p in ipairs(props) do
51 properties = properties .. 'static int '..p.class..'_get_'..p.name..'(lua_State *L) {\n'..p.getter..'}\n'
52 table.insert(getters, p)
53 if p.setter then
54 properties = properties .. 'static int '..p.class..'_set_'..p.name..'(lua_State *L) {\n'..p.setter..'}\n'
55 table.insert(setters, p)
56 end
57 end
58 -- there can be less setters than getters, due to 'const'
59 for i,g in ipairs(getters) do
60 getters[i] = ' {"'..g.name..'", '..g.class..'_get_'..g.name..'},'
61 end
62 for i,s in ipairs(setters) do
63 setters[i] = ' {"'..s.name..'", '..s.class..'_set_'..s.name..'},'
64 end
65 c.properties = properties..'\n'..
66 'static luaL_Reg lqt_getters'..c.xarg.id..'[] = {\n'..table.concat(getters, '\n')..' {NULL, NULL}\n};\n\n' ..
67 'static luaL_Reg lqt_setters'..c.xarg.id..'[] = {\n'..table.concat(setters, '\n')..' {NULL, NULL}\n};\n\n'
68 end
69 end
70 end