diff options
author | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2016-04-07 14:36:19 +0100 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2016-05-12 11:59:08 +0100 |
commit | 3f506ac167a22be768d7c27af5e8e8d2744e9dc0 (patch) | |
tree | 1adaa8dc0f15b51e9f36f826d2968d3149a61c22 | |
parent | 6ac7e3ee80d0b0f5bb4551497a9c8d589c4cc551 (diff) | |
download | efl-3f506ac167a22be768d7c27af5e8e8d2744e9dc0.tar.gz |
docgen: generation of C method/property signatures
-rw-r--r-- | gendoc.lua | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/gendoc.lua b/gendoc.lua index c4b9a8e7ae..a18f474cd0 100644 --- a/gendoc.lua +++ b/gendoc.lua @@ -272,6 +272,86 @@ local gen_func_link = function(base, f) return base .. ":" .. ft .. ":" .. f:name_get():lower() end +local gen_func_sig = function(f, ftype) + ftype = ftype or eolian.function_type.METHOD +end + +local gen_cparam = function(par, out) + local part = par:type_get() + local tstr + out = out or (par:direction_get() == eolian.parameter_dir.OUT) + if part:type_get() == eolian.type_type.POINTER then + tstr = part:c_type_get() + if out then + tstr = tstr .. "*" + end + elseif out then + tstr = part:c_type_get() .. " *" + else + tstr = part:c_type_get() .. " " + end + return tstr .. par:name_get() +end + +local gen_func_csig = function(f, ftype) + ftype = ftype or eolian.function_type.METHOD + assert(ftype ~= eolian.function_type.PROPERTY) + + local cn = f:full_c_name_get(ftype) + local rtype = f:return_type_get(ftype) + + if f:type_get() == eolian.function_type.METHOD then + local pars = f:parameters_get():to_array() + local cnrt = rtype and rtype:c_type_named_get(cn) or ("void " .. cn) + for i = 1, #pars do + pars[i] = gen_cparam(pars[i]) + end + if #pars == 0 then + pars = { "void" } + end + return cnrt .. "(" .. table.concat(pars, ", ") .. ");" + end + + local keys = f:property_keys_get(ftype):to_array() + local vals = f:property_values_get(ftype):to_array() + + if ftype == eolian.function_type.PROP_SET then + local cnrt = rtype and rtype:c_type_named_get(cn) or ("void " .. cn) + local pars = {} + for i, par in ipairs(keys) do + pars[#pars + 1] = gen_cparam(par) + end + for i, par in ipairs(vals) do + pars[#pars + 1] = gen_cparam(par) + end + return cnrt .. "(" .. table.concat(pars, ", ") .. ");" + end + + -- getters + local cnrt + if not rtype then + if #vals == 1 then + cnrt = vals[1]:type_get():c_type_named_get(cn) + table.remove(vals, 1) + else + cnrt = "void " .. cn + end + else + cnrt = rtype:c_type_named_get(cn) + end + local pars = {} + for i, par in ipairs(keys) do + pars[#pars + 1] = gen_cparam(par) + end + for i, par in ipairs(vals) do + pars[#pars + 1] = gen_cparam(par, true) + end + if #pars == 0 then + pars = { "void" } + end + return cnrt .. "(" .. table.concat(pars, ", ") .. ");" +end + -- builders local classt_to_str = { @@ -466,6 +546,9 @@ build_method = function(fn, cl) f:write_h(fn:name_get(), 2) + f:write_h("C signature", 3) + f:write_raw("<code c>\n", gen_func_csig(fn), "\n</code>\n") + f:write_h("Description", 3) write_full_doc(f, fn:documentation_get(eolian.function_type.METHOD)) @@ -488,6 +571,16 @@ build_property = function(fn, cl) f:write_h(fn:name_get(), 2) + f:write_h("C signature", 3) + f:write_raw("<code c>\n") + if isget then + f:write_raw(gen_func_csig(fn, fts.PROP_GET), "\n") + end + if isset then + f:write_raw(gen_func_csig(fn, fts.PROP_SET), "\n") + end + f:write_raw("</code>\n") + if isget and isset then f:write_h("Description", 3) if doc or (not gdoc and not sdoc) then |