mirror of
https://github.com/cimgui/cimgui.git
synced 2025-08-10 20:08:31 +01:00
cpp2ffi: get enums in namespace (needed by ImGuizmo)
This commit is contained in:
@@ -1019,7 +1019,7 @@ function M.Parser()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--get structs in namespace
|
--get structs and enums in namespace
|
||||||
for i,it in ipairs(itemsarr) do
|
for i,it in ipairs(itemsarr) do
|
||||||
if it.re_name == "namespace_re" then
|
if it.re_name == "namespace_re" then
|
||||||
local nsp = it.item:match("%b{}"):sub(2,-2)
|
local nsp = it.item:match("%b{}"):sub(2,-2)
|
||||||
@@ -1029,6 +1029,9 @@ function M.Parser()
|
|||||||
if itnsp.re_name == "struct_re" or itnsp.re_name == "typedef_st_re" then
|
if itnsp.re_name == "struct_re" or itnsp.re_name == "typedef_st_re" then
|
||||||
--print("in mamespace",itnsp.item,namespace)
|
--print("in mamespace",itnsp.item,namespace)
|
||||||
table.insert(outtab,itnsp.item)
|
table.insert(outtab,itnsp.item)
|
||||||
|
elseif itnsp.re_name == "enum_re" then
|
||||||
|
local enumname, enumbody = itnsp.item:match"^%s*enum%s+([^%s;{}]+)[%s\n\r]*(%b{})"
|
||||||
|
table.insert(outtab,"\ntypedef enum ".. enumbody..enumname..";")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -1112,6 +1115,38 @@ function M.Parser()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function enums_for_table(it, outtab, enumsordered)
|
||||||
|
local enumname = it.item:match"^%s*enum%s+([^%s;{}]+)"
|
||||||
|
outtab.enums[enumname] = {}
|
||||||
|
table.insert(enumsordered,enumname)
|
||||||
|
--self.order[enumname] = i
|
||||||
|
local inner = strip_end(it.item:match("%b{}"):sub(2,-2))
|
||||||
|
local enumarr = str_split(inner,",")
|
||||||
|
for j,line in ipairs(enumarr) do
|
||||||
|
local name,value = line:match("%s*([%w_]+)%s*=%s*([^,]+)")
|
||||||
|
if value then
|
||||||
|
table.insert(outtab.enums[enumname],{name=name,value=value})
|
||||||
|
outtab.locations[enumname] = it.locat
|
||||||
|
else --increment by one
|
||||||
|
local name = line:match("%s*([^,]+)")
|
||||||
|
local enum_table = outtab.enums[enumname]
|
||||||
|
local prevvalue = enum_table[#enum_table] and enum_table[#enum_table].value
|
||||||
|
local value --= enum_table[#enum_table] and (enum_table[#enum_table].value + 1) or 0
|
||||||
|
if not prevvalue then
|
||||||
|
value = 0
|
||||||
|
elseif tonumber(prevvalue) then
|
||||||
|
value = prevvalue +1
|
||||||
|
else --should be string
|
||||||
|
value = prevvalue .. "+1"
|
||||||
|
end
|
||||||
|
if name then --avoid last , if present
|
||||||
|
table.insert(outtab.enums[enumname],{name=name,value=value})
|
||||||
|
outtab.locations[enumname] = it.locat
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
function par:gen_structs_and_enums_table()
|
function par:gen_structs_and_enums_table()
|
||||||
local outtab = {enums={},structs={},locations={}}
|
local outtab = {enums={},structs={},locations={}}
|
||||||
self.typedefs_table = {}
|
self.typedefs_table = {}
|
||||||
@@ -1150,35 +1185,7 @@ function M.Parser()
|
|||||||
local enumsordered = {}
|
local enumsordered = {}
|
||||||
for i,it in ipairs(itemsarr) do
|
for i,it in ipairs(itemsarr) do
|
||||||
if it.re_name == "enum_re" then
|
if it.re_name == "enum_re" then
|
||||||
local enumname = it.item:match"^%s*enum%s+([^%s;{}]+)"
|
enums_for_table(it, outtab, enumsordered)
|
||||||
outtab.enums[enumname] = {}
|
|
||||||
table.insert(enumsordered,enumname)
|
|
||||||
self.order[enumname] = i
|
|
||||||
local inner = strip_end(it.item:match("%b{}"):sub(2,-2))
|
|
||||||
local enumarr = str_split(inner,",")
|
|
||||||
for j,line in ipairs(enumarr) do
|
|
||||||
local name,value = line:match("%s*([%w_]+)%s*=%s*([^,]+)")
|
|
||||||
if value then
|
|
||||||
table.insert(outtab.enums[enumname],{name=name,value=value})
|
|
||||||
outtab.locations[enumname] = it.locat
|
|
||||||
else --increment by one
|
|
||||||
local name = line:match("%s*([^,]+)")
|
|
||||||
local enum_table = outtab.enums[enumname]
|
|
||||||
local prevvalue = enum_table[#enum_table] and enum_table[#enum_table].value
|
|
||||||
local value --= enum_table[#enum_table] and (enum_table[#enum_table].value + 1) or 0
|
|
||||||
if not prevvalue then
|
|
||||||
value = 0
|
|
||||||
elseif tonumber(prevvalue) then
|
|
||||||
value = prevvalue +1
|
|
||||||
else --should be string
|
|
||||||
value = prevvalue .. "+1"
|
|
||||||
end
|
|
||||||
if name then --avoid last , if present
|
|
||||||
table.insert(outtab.enums[enumname],{name=name,value=value})
|
|
||||||
outtab.locations[enumname] = it.locat
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
elseif it.re_name == "struct_re" then
|
elseif it.re_name == "struct_re" then
|
||||||
local cleanst,structname,strtab = self:clean_struct(it.item, it.locat)
|
local cleanst,structname,strtab = self:clean_struct(it.item, it.locat)
|
||||||
--if not void stname or templated
|
--if not void stname or templated
|
||||||
@@ -1194,7 +1201,7 @@ function M.Parser()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--get structs in namespace
|
--get structs and enums in namespace
|
||||||
for i,it in ipairs(itemsarr) do
|
for i,it in ipairs(itemsarr) do
|
||||||
if it.re_name == "namespace_re" then
|
if it.re_name == "namespace_re" then
|
||||||
local nsp = it.item:match("%b{}"):sub(2,-2)
|
local nsp = it.item:match("%b{}"):sub(2,-2)
|
||||||
@@ -1211,6 +1218,8 @@ function M.Parser()
|
|||||||
self:parse_struct_line(strtab[j],outtab.structs[structname])
|
self:parse_struct_line(strtab[j],outtab.structs[structname])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
elseif itnsp.re_name == "enum_re" then
|
||||||
|
enums_for_table(itnsp, outtab, enumsordered)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user