docgen: initial support for generic method signatures

This commit is contained in:
Daniel Kolesa 2016-04-18 21:08:17 +01:00
parent e8e89db97f
commit 16b8d21692
1 changed files with 101 additions and 1 deletions

View File

@ -732,6 +732,20 @@ local Buffer = Writer:clone {
-- eolian to various doc elements conversions
local get_type_str
get_type_str = function(tp)
local tps = eolian.type_type
local tpt = tp:type_get()
if tpt == tps.VOID then
return "void"
end
if tpt == tps.REGULAR then
return tp:full_name_get()
end
-- TODO
return tp:full_name_get()
end
local gen_doc_refd = function(str)
if not str then
return nil
@ -890,6 +904,85 @@ local gen_func_csig = function(f, ftype)
return cnrt .. "(" .. table.concat(pars, ", ") .. ");"
end
local get_func_namesig = function(fn, cl, buf)
if fn:type_get() ~= eolian.function_type.METHOD then
buf[#buf + 1] = "@property "
end
buf[#buf + 1] = cl:full_name_get()
buf[#buf + 1] = "."
buf[#buf + 1] = fn:name_get()
buf[#buf + 1] = " "
if fn:scope_get() == eolian.object_scope.PROTECTED then
buf[#buf + 1] = "@protected "
end
if fn:is_class() then
buf[#buf + 1] = "@class "
end
if fn:is_const() then
buf[#buf + 1] = "@const "
end
if fn:is_c_only() then
buf[#buf + 1] = "@c_only "
end
end
local gen_func_param = function(fp, buf)
-- TODO: default value
buf[#buf + 1] = " "
local dirs = {
[eolian.parameter_dir.IN] = "@in ",
[eolian.parameter_dir.OUT] = "@out ",
[eolian.parameter_dir.INOUT] = "@inout ",
}
buf[#buf + 1] = dirs[fp:direction_get()]
buf[#buf + 1] = fp:name_get()
buf[#buf + 1] = ": "
buf[#buf + 1] = get_type_str(fp:type_get())
if fp:is_nonull() then
buf[#buf + 1] = " @nonull"
end
if fp:is_nullable() then
buf[#buf + 1] = " @nullable"
end
if fp:is_optional() then
buf[#buf + 1] = " @optional"
end
buf[#buf + 1] = ";\n"
end
local get_method_sig = function(fn, cl)
local buf = {}
get_func_namesig(fn, cl, buf)
if fn:is_virtual_pure(eolian.function_type.METHOD) then
buf[#buf + 1] = "@virtual_pure "
end
buf[#buf + 1] = "{"
local params = fn:parameters_get():to_array()
local rtp = fn:return_type_get(eolian.function_type.METHOD)
if #params == 0 and not rtp then
buf[#buf + 1] = "}"
return table.concat(buf)
end
buf[#buf + 1] = "\n"
if #params > 0 then
buf[#buf + 1] = " params {\n"
for i, fp in ipairs(params) do
gen_func_param(fp, buf)
end
buf[#buf + 1] = " }"
end
buf[#buf + 1] = "}"
return table.concat(buf)
end
local get_property_sig = function(fn, cl)
local buf = {}
get_func_namesig(fn, cl, buf)
buf[#buf + 1] = "{"
buf[#buf + 1] = "}"
return table.concat(buf)
end
-- builders
local build_method, build_property
@ -1134,6 +1227,10 @@ build_method = function(fn, cl)
f:write_h(cl:full_name_get() .. "." .. fn:name_get(), 2)
f:write_h("Signature", 3)
f:write_code(get_method_sig(fn, cl))
f:write_nl()
f:write_h("C signature", 3)
f:write_code(gen_func_csig(fn), "c")
f:write_nl()
@ -1164,6 +1261,10 @@ build_property = function(fn, cl)
f:write_h(cl:full_name_get() .. "." .. fn:name_get(), 2)
f:write_h("Signature", 3)
f:write_code(get_method_sig(fn, cl))
f:write_nl()
f:write_h("C signature", 3)
local codes = {}
if isget then
@ -1218,7 +1319,6 @@ getopt.parse {
{ "h", "help", nil, help = "Show this message.", metavar = "CATEGORY",
callback = getopt.help_cb(io.stdout)
},
-- TODO: implement verbose mode
{ "v", "verbose", false, help = "Be verbose." },
{ category = "Generator" },