mirror of
https://github.com/cimgui/cimgui.git
synced 2026-04-28 22:11:16 +01:00
cpp2ffi.lua: imgui-nodes-editor work 1
This commit is contained in:
@@ -473,7 +473,7 @@ local function parseItems(txt,linenumdict, itparent, dumpit)
|
|||||||
else
|
else
|
||||||
error"no linenumdict"
|
error"no linenumdict"
|
||||||
end
|
end
|
||||||
table.insert(itemarr,{re_name=re_name,item=item,locat=loca,prevcomments=comments})
|
table.insert(itemarr,{re_name=re_name,item=item,locat=loca,prevcomments=comments,parent=itparent})
|
||||||
items[re_name] = items[re_name] or {}
|
items[re_name] = items[re_name] or {}
|
||||||
table.insert(items[re_name],item)
|
table.insert(items[re_name],item)
|
||||||
end
|
end
|
||||||
@@ -1449,8 +1449,15 @@ local function ADDnonUDT(FP)
|
|||||||
def.ret = "const char*"
|
def.ret = "const char*"
|
||||||
def.nonUDT = "string"
|
def.nonUDT = "string"
|
||||||
elseif FP.opaque_structs[rets] then
|
elseif FP.opaque_structs[rets] then
|
||||||
assert(def.ret:match"%*","opaque struct without pointer")
|
if not def.ret:match"%*" then
|
||||||
def.ret = def.ret:gsub(rets.."%s*%*",rets.."_opq")
|
--assert(def.ret:match"%*","return opaque struct without pointer")
|
||||||
|
--M.prtable(def)
|
||||||
|
--error"return opaque struct without pointer"
|
||||||
|
def.nonUDT = "opaque"
|
||||||
|
def.ret = def.ret:gsub(rets,rets.."_opq")
|
||||||
|
else
|
||||||
|
def.ret = def.ret:gsub(rets.."%s*%*",rets.."_opq")
|
||||||
|
end
|
||||||
elseif def.stdret then -- not std::string
|
elseif def.stdret then -- not std::string
|
||||||
skip = true
|
skip = true
|
||||||
end
|
end
|
||||||
@@ -1492,13 +1499,18 @@ local function ADDnonUDT(FP)
|
|||||||
elseif FP.opaque_structs[typ2] then
|
elseif FP.opaque_structs[typ2] then
|
||||||
--assert(v.type:match"%*","opaque struct arg without pointer")
|
--assert(v.type:match"%*","opaque struct arg without pointer")
|
||||||
if not v.type:match"%*" then
|
if not v.type:match"%*" then
|
||||||
M.prtable(def)
|
--M.prtable(def)
|
||||||
error"opaque struct arg without pointer"
|
--error"opaque struct arg without pointer"
|
||||||
|
local newt = v.type:gsub(typ2,typ2.."_opq")
|
||||||
|
local callname = "*"..name
|
||||||
|
caar = caar .. callname .. ","
|
||||||
|
asp = asp .. newt.." "..name .. ","
|
||||||
|
else
|
||||||
|
local newt = v.type:gsub(typ2.."%s*%*",typ2.."_opq")
|
||||||
|
local callname = v.reftoptr and "*"..name or name
|
||||||
|
caar = caar .. callname .. ","
|
||||||
|
asp = asp .. newt.." "..name .. ","
|
||||||
end
|
end
|
||||||
local newt = v.type:gsub(typ2.."%s*%*",typ2.."_opq")
|
|
||||||
local callname = v.reftoptr and "*"..name or name
|
|
||||||
caar = caar .. callname .. ","
|
|
||||||
asp = asp .. newt.." "..name .. ","
|
|
||||||
else
|
else
|
||||||
local siz = v.type:match("(%[%d*%])") or ""
|
local siz = v.type:match("(%[%d*%])") or ""
|
||||||
local typ = v.type:gsub("(%[%d*%])","")
|
local typ = v.type:gsub("(%[%d*%])","")
|
||||||
@@ -1760,8 +1772,13 @@ function M.Parser()
|
|||||||
table.insert(cdefs,{line:gsub("^(%s*.-)%s*$", "%1"),loca})
|
table.insert(cdefs,{line:gsub("^(%s*.-)%s*$", "%1"),loca})
|
||||||
end
|
end
|
||||||
function par.getCname(stname,funcname, namespace)
|
function par.getCname(stname,funcname, namespace)
|
||||||
if #stname == 0 then return funcname end --top level
|
--if #stname == 0 then return funcname end --top level
|
||||||
local pre = stname.."_"
|
local pre = (namespace and namespace~="") and (namespace:gsub("::","_") .. "_") or ""
|
||||||
|
pre = pre .. (stname~="" and (stname .. "_") or "")
|
||||||
|
if pre:match":" then print(stname, funcname, namespace); error"debug" end
|
||||||
|
-- if stname== "" then
|
||||||
|
-- local pre = (stname == "") and (namespace and (namespace.."_") or "") or stname.."_"
|
||||||
|
-- local pre = stname.."_"
|
||||||
return pre..funcname
|
return pre..funcname
|
||||||
end
|
end
|
||||||
function par.getCname_overload(stname,funcname,signature, namespace)
|
function par.getCname_overload(stname,funcname,signature, namespace)
|
||||||
@@ -1881,11 +1898,44 @@ function M.Parser()
|
|||||||
end
|
end
|
||||||
return stname, derived
|
return stname, derived
|
||||||
end
|
end
|
||||||
|
local function get_parents_name(it)
|
||||||
|
local parnam = ""
|
||||||
|
while it.parent do
|
||||||
|
parnam = it.parent.name.."::"..parnam
|
||||||
|
it = it.parent
|
||||||
|
end
|
||||||
|
return parnam
|
||||||
|
end
|
||||||
|
local function get_parents_nameC(it)
|
||||||
|
local parnam = ""
|
||||||
|
while it.parent do
|
||||||
|
parnam = it.parent.name.."::"..parnam
|
||||||
|
it = it.parent
|
||||||
|
end
|
||||||
|
if parnam~="" then parnam = parnam:sub(1,-3) end
|
||||||
|
return parnam
|
||||||
|
end
|
||||||
--recursive item parsing
|
--recursive item parsing
|
||||||
function par:parseItemsR2(txt, itparent)
|
function par:parseItemsR2(txt, itparent)
|
||||||
local itsarr,its = parseItems(txt,self.linenumdict,itparent)
|
local itsarr,its = parseItems(txt,self.linenumdict,itparent)
|
||||||
|
--clean protect
|
||||||
|
if itparent and itparent.re_name == "class_re" then
|
||||||
|
local first_private
|
||||||
|
for j,child in ipairs(itsarr) do
|
||||||
|
if child.item:match("^\n*%s*private:") or child.item:match("^\n*%s*protected:") then
|
||||||
|
first_private = j
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if first_private then
|
||||||
|
for j=first_private,#itsarr do
|
||||||
|
--print("private discards",it.childs[j].re_name,it.childs[j].name)
|
||||||
|
itsarr[j] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
for i,it in ipairs(itsarr) do
|
for i,it in ipairs(itsarr) do
|
||||||
--clean class
|
--clean class and get name
|
||||||
if it.re_name == "class_re" then
|
if it.re_name == "class_re" then
|
||||||
it.name = it.item:match("class%s+(%S+)")
|
it.name = it.item:match("class%s+(%S+)")
|
||||||
print("cleaning class",it.name)
|
print("cleaning class",it.name)
|
||||||
@@ -1893,17 +1943,21 @@ function M.Parser()
|
|||||||
--it.item = it.item:gsub("private:","")
|
--it.item = it.item:gsub("private:","")
|
||||||
it.item = it.item:gsub("public:","")
|
it.item = it.item:gsub("public:","")
|
||||||
it.item = it.item:gsub("enum%s*class","enum")
|
it.item = it.item:gsub("enum%s*class","enum")
|
||||||
|
elseif it.re_name == "struct_re" then
|
||||||
|
it.name = it.item:match("struct%s+([^%s{]+)")
|
||||||
|
elseif it.re_name == "namespace_re" then
|
||||||
|
it.name = it.item:match("namespace%s+(%S+)")
|
||||||
end
|
end
|
||||||
|
|
||||||
if not isLeaf(it.re_name) then
|
if not isLeaf(it.re_name) then
|
||||||
local inner = strip_end(it.item:match("%b{}"):sub(2,-2))
|
local inner = strip_end(it.item:match("%b{}"):sub(2,-2))
|
||||||
--print(it.item)
|
--print("not isLeaf",it.re_name,it.name)
|
||||||
--print(inner)
|
--print(inner)
|
||||||
it.childs = par:parseItemsR2(inner, it)
|
it.childs = par:parseItemsR2(inner, it)
|
||||||
--if it.name == "TextEditor" then M.prtable(it.childs) end
|
--if it.name == "TextEditor" then M.prtable(it.childs) end
|
||||||
for j,child in ipairs(it.childs) do
|
-- for j,child in ipairs(it.childs) do
|
||||||
child.parent = it
|
-- child.parent = it
|
||||||
end
|
-- end
|
||||||
|
|
||||||
if it.re_name == "struct_re" then
|
if it.re_name == "struct_re" then
|
||||||
local typename = it.item:match("^%s*template%s*<%s*typename%s*(%S+)%s*>")
|
local typename = it.item:match("^%s*template%s*<%s*typename%s*(%S+)%s*>")
|
||||||
@@ -1920,37 +1974,57 @@ function M.Parser()
|
|||||||
self.typenames[stname] = typename or templa2
|
self.typenames[stname] = typename or templa2
|
||||||
end
|
end
|
||||||
elseif it.re_name == "namespace_re" then
|
elseif it.re_name == "namespace_re" then
|
||||||
it.name = it.item:match("namespace%s+(%S+)")
|
--it.name = it.item:match("namespace%s+(%S+)")
|
||||||
elseif it.re_name == "class_re" then
|
elseif it.re_name == "class_re" then
|
||||||
--it.name = it.item:match("class%s+(%S+)")
|
-- local first_private
|
||||||
local first_private
|
-- for j,child in ipairs(it.childs) do
|
||||||
for j,child in ipairs(it.childs) do
|
-- if child.item:match("^\n*%s*private:") or child.item:match("^\n*%s*protected:") then
|
||||||
if child.item:match("^\n*%s*private:") or child.item:match("^\n*%s*protected:") then
|
-- first_private = j
|
||||||
first_private = j
|
-- break
|
||||||
break
|
-- end
|
||||||
end
|
-- end
|
||||||
end
|
-- if first_private then
|
||||||
if first_private then
|
-- for j=first_private,#it.childs do
|
||||||
for j=first_private,#it.childs do
|
----print("private discards",it.childs[j].re_name,it.childs[j].name)
|
||||||
--print("private discards",it.childs[j].re_name,it.childs[j].name)
|
-- it.childs[j] = nil
|
||||||
it.childs[j] = nil
|
-- end
|
||||||
end
|
-- end
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--create opaque_struct
|
--create opaque_struct
|
||||||
if it.re_name == "struct_re" or it.re_name == "class_re" then
|
if it.re_name == "struct_re" or it.re_name == "class_re" then
|
||||||
local stname,derived = derived_check(it)
|
local stname,derived = derived_check(it)
|
||||||
|
if derived then
|
||||||
|
local derived2 = derived:gsub("%b<>","")
|
||||||
|
derived2 = derived2:gsub("%w+::","")
|
||||||
|
print("--derived check",stname, derived, derived2)
|
||||||
|
M.prtable(self.opaque_structs)
|
||||||
|
if self.opaque_structs[derived2] then
|
||||||
|
print("--make opaque opaque derived",it.name,derived,derived2)
|
||||||
|
it.opaque_struct = get_parents_name(it)..it.name
|
||||||
|
self.opaque_structs[it.name] = it.opaque_struct
|
||||||
|
end
|
||||||
|
end
|
||||||
if derived and derived:match"std::" then
|
if derived and derived:match"std::" then
|
||||||
print("--make opaque std::derived",it.name,derived)
|
print("--make opaque std::derived",it.name,derived)
|
||||||
it.opaque_struct = (itparent and itparent.name .."::" or "")..it.name
|
--it.opaque_struct = (itparent and itparent.name .."::" or "")..it.name
|
||||||
|
it.opaque_struct = get_parents_name(it)..it.name
|
||||||
|
self.opaque_structs[it.name] = it.opaque_struct
|
||||||
end
|
end
|
||||||
for j,child in ipairs(it.childs) do
|
for j,child in ipairs(it.childs) do
|
||||||
|
-- if child.re_name == "vardef_re" and child.item:match"using" then
|
||||||
|
-- print("=====using",child.item)
|
||||||
|
-- end
|
||||||
if child.re_name == "vardef_re" and child.item:match"std::" then
|
if child.re_name == "vardef_re" and child.item:match"std::" then
|
||||||
print("--make opaque",it.name,child.item)
|
print("--make opaque",it.name,child.item)
|
||||||
it.opaque_struct = (itparent and itparent.name .."::" or "")..it.name
|
--M.prtable(itparent)
|
||||||
|
--it.opaque_struct = (itparent and itparent.name .."::" or "")..it.name
|
||||||
|
it.opaque_struct = get_parents_name(it)..it.name
|
||||||
|
print("===parents1",get_parents_name(it),"===parents2",(itparent and itparent.name .."::" or ""))
|
||||||
|
print("===",it.opaque_struct)
|
||||||
--cant do that as function is recursive
|
--cant do that as function is recursive
|
||||||
--self.opaque_structs[it.name] = (itparent and itparent.name .."::" or "")..it.name
|
--self.opaque_structs[it.name] = get_parents_name(it)..it.name--(itparent and itparent.name .."::" or "")..it.name
|
||||||
|
self.opaque_structs[it.name] = it.opaque_struct
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -2172,6 +2246,15 @@ function M.Parser()
|
|||||||
predeclare = predeclare .. templatetypedef
|
predeclare = predeclare .. templatetypedef
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
--clean using
|
||||||
|
if it.re_name == "vardef_re" and it.item:match("using%s+([^=%s]+)%s*=%s*([^;]+);") then
|
||||||
|
print("===using",it.item)
|
||||||
|
local typedef, assign = it2:match("using%s+([^=%s]+)%s*=%s*([^;]+);")
|
||||||
|
print(typedef,assign)
|
||||||
|
assign = assign:gsub("%w+::","")
|
||||||
|
predeclare = predeclare .. "\ntypedef "..assign.." "..typedef..";"
|
||||||
|
it2 = "" --"\ntypedef "..assign.." "..typedef..";"
|
||||||
|
end
|
||||||
--clean mutable
|
--clean mutable
|
||||||
it2 = it2:gsub("mutable","")
|
it2 = it2:gsub("mutable","")
|
||||||
--clean namespaces but not std::
|
--clean namespaces but not std::
|
||||||
@@ -2244,38 +2327,31 @@ function M.Parser()
|
|||||||
end
|
end
|
||||||
return table.concat(outtab,""),stname,outtab,commtab, predeclare
|
return table.concat(outtab,""),stname,outtab,commtab, predeclare
|
||||||
end
|
end
|
||||||
local function get_parents_name(it)
|
|
||||||
local parnam = ""
|
|
||||||
while it.parent do
|
|
||||||
parnam = it.parent.name.."::"..parnam
|
|
||||||
it = it.parent
|
|
||||||
end
|
|
||||||
return parnam
|
|
||||||
end
|
|
||||||
local function get_parents_nameC(it)
|
|
||||||
local parnam = ""
|
|
||||||
while it.parent do
|
|
||||||
parnam = it.parent.name.."::"..parnam
|
|
||||||
it = it.parent
|
|
||||||
end
|
|
||||||
if parnam~="" then parnam = parnam:sub(1,-3) end
|
|
||||||
return parnam
|
|
||||||
end
|
|
||||||
function par:header_text_insert(tab,txt,it)
|
function par:header_text_insert(tab,txt,it)
|
||||||
--print("--header_text_insert",txt)--:sub(1,40))
|
--print("--header_text_insert",txt)--:sub(1,40))
|
||||||
table.insert(tab, txt)
|
table.insert(tab, txt)
|
||||||
end
|
end
|
||||||
local function function_parse(self,it)
|
local function function_parse(self,it)
|
||||||
|
--print"------------function_parse"
|
||||||
local stname = ""
|
local stname = ""
|
||||||
local namespace
|
local namespace
|
||||||
if it.parent then
|
if it.parent then
|
||||||
|
-- local parr = it.parent
|
||||||
|
-- it.parent = nil
|
||||||
|
-- print(parr.re_name,parr.name)
|
||||||
|
-- M.prtable(it)
|
||||||
|
-- it.parent = parr
|
||||||
if it.parent.re_name == "struct_re" or it.parent.re_name == "typedef_st_re" or it.parent.re_name == "class_re" then
|
if it.parent.re_name == "struct_re" or it.parent.re_name == "typedef_st_re" or it.parent.re_name == "class_re" then
|
||||||
stname = it.parent.name
|
stname = it.parent.name
|
||||||
namespace = get_parents_nameC(it)
|
namespace = get_parents_nameC(it)
|
||||||
elseif it.parent.re_name == "namespace_re" then
|
elseif it.parent.re_name == "namespace_re" then
|
||||||
namespace = get_parents_nameC(it) --it.parent.name
|
namespace = get_parents_nameC(it) --it.parent.name
|
||||||
|
--print("--function_parse namespace",namespace)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
--print("--namespace",namespace)
|
||||||
|
--if namespace == "ax::NodeEditor::Config" then error"debug" end
|
||||||
if it.item:match"^%s*template%s+<" then
|
if it.item:match"^%s*template%s+<" then
|
||||||
local ttype,fun = it.item:match"^%s*template%s+<%s*typename%s+([^>]+)%s*>%s*(.+)$"
|
local ttype,fun = it.item:match"^%s*template%s+<%s*typename%s+([^>]+)%s*>%s*(.+)$"
|
||||||
if self.ftemplate_list and self.ftemplate_list[ttype] then
|
if self.ftemplate_list and self.ftemplate_list[ttype] then
|
||||||
@@ -2292,7 +2368,8 @@ function M.Parser()
|
|||||||
end
|
end
|
||||||
function par:enum_for_header( it,outtab)
|
function par:enum_for_header( it,outtab)
|
||||||
--local enumname, enumbody = it.item:match"^%s*enum%s+([^%s;{}]+)[%s\n\r]*(%b{})"
|
--local enumname, enumbody = it.item:match"^%s*enum%s+([^%s;{}]+)[%s\n\r]*(%b{})"
|
||||||
local enumname = it.item:match"^%s*enum%s+([^%s;{}]+)"
|
local enumname = it.item:match"^%s*enum%s+([^%s;{}:]+)"
|
||||||
|
--if enumname and enumname:match":" then print("---enumname",enumname); error"debug" end
|
||||||
if enumname then
|
if enumname then
|
||||||
--if it's an enum with int type changed
|
--if it's an enum with int type changed
|
||||||
if self.structs_and_enums_table.enumtypes[enumname] then
|
if self.structs_and_enums_table.enumtypes[enumname] then
|
||||||
@@ -2318,12 +2395,14 @@ function M.Parser()
|
|||||||
self:header_text_insert(outtab, it2, it)
|
self:header_text_insert(outtab, it2, it)
|
||||||
end
|
end
|
||||||
if it.parent then
|
if it.parent then
|
||||||
if it.parent.re_name == "namespace_re" then
|
local namespace = get_parents_nameC(it)
|
||||||
local namespace = it.parent.item:match("namespace%s+(%S+)")
|
self.embeded_enums[enumname] = namespace.."::"..enumname
|
||||||
self.embeded_enums[enumname] = namespace.."::"..enumname
|
-- if it.parent.re_name == "namespace_re" then
|
||||||
else
|
-- local namespace = it.parent.item:match("namespace%s+(%S+)")
|
||||||
self.embeded_enums[enumname] = it.parent.name.."::"..enumname
|
-- self.embeded_enums[enumname] = namespace.."::"..enumname
|
||||||
end
|
-- else
|
||||||
|
--self.embeded_enums[enumname] = it.parent.name.."::"..enumname
|
||||||
|
-- end
|
||||||
end
|
end
|
||||||
else --unamed enum just repeat declaration
|
else --unamed enum just repeat declaration
|
||||||
local cl_item = clean_comments(it.item)
|
local cl_item = clean_comments(it.item)
|
||||||
@@ -2388,14 +2467,22 @@ function M.Parser()
|
|||||||
print("--skip extern vardef declaration:",it2)
|
print("--skip extern vardef declaration:",it2)
|
||||||
it2 = ""
|
it2 = ""
|
||||||
end
|
end
|
||||||
|
if it2:match("using") then
|
||||||
|
local typedef, assign = it2:match("using%s+([^=%s]+)%s*=%s*([^;]+);")
|
||||||
|
print("====using",string.format("%q %q",typedef, assign))
|
||||||
|
if assign and assign:match"%(%s*%*%s*%)" then --function typedef
|
||||||
|
it2 = "\ntypedef "..assign:gsub("%(%s*%*%s*%)","(*"..typedef..")")..";"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
--table.insert(outtabpre,it2)
|
--table.insert(outtabpre,it2)
|
||||||
--table.insert(outtab,it2)
|
--table.insert(outtab,it2)
|
||||||
self:header_text_insert(outtab, it2, it)
|
self:header_text_insert(outtab, it2, it)
|
||||||
-- add typedef after struct name
|
-- add typedef after struct name
|
||||||
if it.re_name == "vardef_re" and it.item:match"^%s*struct" then
|
if it.re_name == "vardef_re" and it.item:match"^%s*struct" then
|
||||||
--print("---------emmbed")
|
-- print("---------emmbed")
|
||||||
--M.prtable(it)
|
-- print(it.item, it.locat)
|
||||||
|
-- error"debug"
|
||||||
local stname = it.item:match("struct%s*(%S+)%s*;")
|
local stname = it.item:match("struct%s*(%S+)%s*;")
|
||||||
--table.insert(typedefs_table,"typedef struct "..stname.." "..stname..";\n")
|
--table.insert(typedefs_table,"typedef struct "..stname.." "..stname..";\n")
|
||||||
local tst = "\ntypedef struct "..stname.." "..stname..";"
|
local tst = "\ntypedef struct "..stname.." "..stname..";"
|
||||||
@@ -2416,48 +2503,7 @@ function M.Parser()
|
|||||||
--self:header_text_insert(outtab, predec .. cleanst, it)
|
--self:header_text_insert(outtab, predec .. cleanst, it)
|
||||||
self:enum_for_header(it,outtab)
|
self:enum_for_header(it,outtab)
|
||||||
end
|
end
|
||||||
--[[
|
|
||||||
--local enumname, enumbody = it.item:match"^%s*enum%s+([^%s;{}]+)[%s\n\r]*(%b{})"
|
|
||||||
local enumname = it.item:match"^%s*enum%s+([^%s;{}]+)"
|
|
||||||
if enumname then
|
|
||||||
--if it's an enum with int type changed
|
|
||||||
if self.structs_and_enums_table.enumtypes[enumname] then
|
|
||||||
local enumtype = self.structs_and_enums_table.enumtypes[enumname]
|
|
||||||
local enumbody = ""
|
|
||||||
local extraenums = ""
|
|
||||||
for i,v in ipairs(self.structs_and_enums_table.enums[enumname]) do
|
|
||||||
if type(v.calc_value)=="string" then
|
|
||||||
extraenums = extraenums .."\nstatic const "..enumtype.." "..v.name.." = "..v.calc_value..";"
|
|
||||||
else
|
|
||||||
enumbody = enumbody .. "\n" ..v.name .."="..v.value..","
|
|
||||||
end
|
|
||||||
end
|
|
||||||
enumbody = "{"..enumbody.."\n}"
|
|
||||||
--table.insert(outtab,"\ntypedef enum ".. enumbody..enumname..";"..extraenums)
|
|
||||||
local it2 = "\ntypedef enum ".. enumbody..enumname..";"..extraenums
|
|
||||||
self:header_text_insert(outtab, it2, it)
|
|
||||||
else
|
|
||||||
local enumbody = it.item:match"(%b{})"
|
|
||||||
enumbody = clean_comments(enumbody)
|
|
||||||
--table.insert(outtab,"\ntypedef enum ".. enumbody..enumname..";")
|
|
||||||
local it2 = "\ntypedef enum ".. enumbody..enumname..";"
|
|
||||||
self:header_text_insert(outtab, it2, it)
|
|
||||||
end
|
|
||||||
if it.parent then
|
|
||||||
if it.parent.re_name == "namespace_re" then
|
|
||||||
local namespace = it.parent.item:match("namespace%s+(%S+)")
|
|
||||||
self.embeded_enums[enumname] = namespace.."::"..enumname
|
|
||||||
else
|
|
||||||
self.embeded_enums[enumname] = it.parent.name.."::"..enumname
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else --unamed enum just repeat declaration
|
|
||||||
local cl_item = clean_comments(it.item)
|
|
||||||
--table.insert(outtab,cl_item)
|
|
||||||
self:header_text_insert(outtab, cl_item, it)
|
|
||||||
print("unnamed enum",cl_item)
|
|
||||||
end
|
|
||||||
--]]
|
|
||||||
elseif it.re_name == "struct_re" or it.re_name == "typedef_st_re" or it.re_name == "class_re" then
|
elseif it.re_name == "struct_re" or it.re_name == "typedef_st_re" or it.re_name == "class_re" then
|
||||||
if it.opaque_struct then
|
if it.opaque_struct then
|
||||||
self:header_text_insert(outtab, "\ntypedef struct "..it.name.."* "..it.name.."_opq;\n",it)
|
self:header_text_insert(outtab, "\ntypedef struct "..it.name.."* "..it.name.."_opq;\n",it)
|
||||||
@@ -2544,6 +2590,7 @@ function M.Parser()
|
|||||||
end
|
end
|
||||||
local functype_re = "^%s*[%w%s%*]+%(%*[%w_]+%)%([^%(%)]*%)"
|
local functype_re = "^%s*[%w%s%*]+%(%*[%w_]+%)%([^%(%)]*%)"
|
||||||
local functype_reex = "^(%s*[%w%s%*]+%(%*)([%w_]+)(%)%([^%(%)]*%))"
|
local functype_reex = "^(%s*[%w%s%*]+%(%*)([%w_]+)(%)%([^%(%)]*%))"
|
||||||
|
if line=="" then table.insert(outtab,{type="nil",name="nil"}) ;return end
|
||||||
line = clean_spaces(line)
|
line = clean_spaces(line)
|
||||||
if line:match(functype_re) then
|
if line:match(functype_re) then
|
||||||
local t1,name,t2 = line:match(functype_reex)
|
local t1,name,t2 = line:match(functype_reex)
|
||||||
@@ -2583,10 +2630,12 @@ function M.Parser()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local unnamed_enum_counter = 0
|
local unnamed_enum_counter = 0
|
||||||
local function enums_for_table(it, outtab, enumsordered)
|
local function enums_for_table(it, outtab, enumsordered)
|
||||||
--local enumname = it.item:match"^%s*enum%s+([^%s;{}]+)"
|
--local enumname = it.item:match"^%s*enum%s+([^%s;{}]+)"
|
||||||
local enumname = it.item:match"^[^;{}]-enum%s+([^%s;{}]+)"
|
--local enumname = it.item:match"^[^;{}]-enum%s+([^%s;{}]+)"
|
||||||
|
local enumname = it.item:match"^%s*enum%s+([^%s;{}:]+)"
|
||||||
if not enumname then
|
if not enumname then
|
||||||
unnamed_enum_counter = unnamed_enum_counter + 1
|
unnamed_enum_counter = unnamed_enum_counter + 1
|
||||||
enumname = "unnamed"..unnamed_enum_counter
|
enumname = "unnamed"..unnamed_enum_counter
|
||||||
@@ -2728,7 +2777,9 @@ function M.Parser()
|
|||||||
-- print(it.item)
|
-- print(it.item)
|
||||||
-- M.prtable(outtab.structs[structname])
|
-- M.prtable(outtab.structs[structname])
|
||||||
-- end
|
-- end
|
||||||
else
|
else --self.typenames[structname]
|
||||||
|
M.prtable("--self.typenames",structname,self.typenames[structname])
|
||||||
|
M.prtable("strtab 3, -1",strtab)
|
||||||
--templated struct
|
--templated struct
|
||||||
if structname then
|
if structname then
|
||||||
print("saving templated struct",structname)
|
print("saving templated struct",structname)
|
||||||
@@ -2738,7 +2789,7 @@ function M.Parser()
|
|||||||
self:parse_struct_line(strtab[j],self.templated_structs[structname],comstab[j])
|
self:parse_struct_line(strtab[j],self.templated_structs[structname],comstab[j])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--M.prtable(self.templated_structs[structname])
|
M.prtable("--template_structs",structname,self.templated_structs[structname])
|
||||||
else
|
else
|
||||||
print("skipped unnamed struct",structname)
|
print("skipped unnamed struct",structname)
|
||||||
end
|
end
|
||||||
@@ -2833,6 +2884,7 @@ function M.Parser()
|
|||||||
table.insert(strt,"----------------overloadings---------------------------")
|
table.insert(strt,"----------------overloadings---------------------------")
|
||||||
--require"anima.utils"
|
--require"anima.utils"
|
||||||
M.table_do_sorted(self.defsT, function(k,v)
|
M.table_do_sorted(self.defsT, function(k,v)
|
||||||
|
if k:match":" then error(k) end
|
||||||
get_types(v)
|
get_types(v)
|
||||||
if #v > 1 then
|
if #v > 1 then
|
||||||
numoverloaded = numoverloaded + #v
|
numoverloaded = numoverloaded + #v
|
||||||
@@ -3048,9 +3100,11 @@ function M.Parser()
|
|||||||
function par:cimgui_generation( cimgui_header)
|
function par:cimgui_generation( cimgui_header)
|
||||||
local name = self.modulename
|
local name = self.modulename
|
||||||
local hstrfile = read_data("./"..name.."_template.h")
|
local hstrfile = read_data("./"..name.."_template.h")
|
||||||
|
M.prtable("templates",self.templates)
|
||||||
|
M.prtable("typenames",self.typenames)
|
||||||
local outpre,outpost = self.structs_and_enums[1], self.structs_and_enums[2]
|
local outpre,outpost = self.structs_and_enums[1], self.structs_and_enums[2]
|
||||||
local tdt = self:generate_templates()
|
local tdt = self:generate_templates()
|
||||||
|
M.prtable("generate_templates",tdt)
|
||||||
local cstructsstr = outpre..tdt..outpost
|
local cstructsstr = outpre..tdt..outpost
|
||||||
|
|
||||||
hstrfile = hstrfile:gsub([[#include "imgui_structs%.h"]],cstructsstr)
|
hstrfile = hstrfile:gsub([[#include "imgui_structs%.h"]],cstructsstr)
|
||||||
@@ -3380,10 +3434,13 @@ local function ImGui_f_implementation(def)
|
|||||||
elseif def.nonUDT == "string" then
|
elseif def.nonUDT == "string" then
|
||||||
insert(outtab," static std::string str = "..ptret..namespace..def.funcname..def.call_args..";\n")
|
insert(outtab," static std::string str = "..ptret..namespace..def.funcname..def.call_args..";\n")
|
||||||
insert(outtab," return str.c_str();\n")
|
insert(outtab," return str.c_str();\n")
|
||||||
|
elseif def.nonUDT == "opaque" then
|
||||||
|
insert(outtab," static auto opq = "..ptret..namespace..def.funcname..def.call_args..";\n")
|
||||||
|
insert(outtab," return &opq;\n")
|
||||||
end
|
end
|
||||||
table.insert(outtab,"}\n")
|
table.insert(outtab,"}\n")
|
||||||
else --standard ImGui
|
else --standard ImGui
|
||||||
table.insert(outtab," return "..ptret..namespace..def.funcname..def.call_args..";\n")
|
table.insert(outtab," return "..ptret..(def.conv or "")..namespace..def.funcname..def.call_args..";\n")
|
||||||
table.insert(outtab,"}\n")
|
table.insert(outtab,"}\n")
|
||||||
end
|
end
|
||||||
--table.insert(outtab,"}\n")
|
--table.insert(outtab,"}\n")
|
||||||
@@ -3421,6 +3478,9 @@ local function struct_f_implementation(def)
|
|||||||
elseif def.nonUDT == "string" then
|
elseif def.nonUDT == "string" then
|
||||||
insert(outtab," static std::string str = "..ptret.."self->"..def.funcname..def.call_args..";\n")
|
insert(outtab," static std::string str = "..ptret.."self->"..def.funcname..def.call_args..";\n")
|
||||||
insert(outtab," return str.c_str();\n")
|
insert(outtab," return str.c_str();\n")
|
||||||
|
elseif def.nonUDT == "opaque" then
|
||||||
|
insert(outtab," static auto opq = "..ptret.."self->"..def.funcname..def.call_args..";\n")
|
||||||
|
insert(outtab," return &opq;\n")
|
||||||
end
|
end
|
||||||
else --standard struct
|
else --standard struct
|
||||||
table.insert(outtab," return "..ptret.."self->"..def.funcname..def.call_args..";\n")
|
table.insert(outtab," return "..ptret.."self->"..def.funcname..def.call_args..";\n")
|
||||||
@@ -3503,7 +3563,10 @@ local function func_header_generate_structs(FP)
|
|||||||
local outtab = {} --"\n/////func_header_generate_structs\n"}
|
local outtab = {} --"\n/////func_header_generate_structs\n"}
|
||||||
|
|
||||||
table_do_sorted(FP.embeded_structs,function(k,v)
|
table_do_sorted(FP.embeded_structs,function(k,v)
|
||||||
table.insert(outtab,"typedef "..v.." "..k..";\n")
|
if not FP.typenames[k] then
|
||||||
|
print("embeded",k,v)
|
||||||
|
table.insert(outtab,"typedef "..v.." "..k..";\n")
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
table_do_sorted(FP.embeded_enums,function(k,v) table.insert(outtab,"typedef "..v.." "..k..";\n") end)
|
table_do_sorted(FP.embeded_enums,function(k,v) table.insert(outtab,"typedef "..v.." "..k..";\n") end)
|
||||||
@@ -3517,9 +3580,12 @@ local function func_header_generate_structs(FP)
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
--M.prtable(FP.typenames)
|
||||||
table_do_sorted(FP.opaque_structs,function(k,v)
|
table_do_sorted(FP.opaque_structs,function(k,v)
|
||||||
table.insert(outtab,"typedef const "..v.."* "..k.."_opq;\n")
|
if not FP.typenames[k] then
|
||||||
|
table.insert(outtab,"typedef const "..v.."* "..k.."_opq;\n")
|
||||||
|
--table.insert(outtab,"typedef "..v.."* "..k.."_opq;\n")
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
--table.insert(outtab, "\n//////////end func header\n")
|
--table.insert(outtab, "\n//////////end func header\n")
|
||||||
return outtab
|
return outtab
|
||||||
|
|||||||
@@ -286,6 +286,7 @@ local function cimgui_generation(parser)
|
|||||||
|
|
||||||
|
|
||||||
local tdt = parser:generate_templates()
|
local tdt = parser:generate_templates()
|
||||||
|
cpp2ffi.prtable("generate_templates",tdt)
|
||||||
local cstructsstr = outpre..tdt..outpost
|
local cstructsstr = outpre..tdt..outpost
|
||||||
|
|
||||||
if gdefines.IMGUI_HAS_DOCK then
|
if gdefines.IMGUI_HAS_DOCK then
|
||||||
@@ -456,7 +457,11 @@ if ff then
|
|||||||
else
|
else
|
||||||
backends_folder = IMGUI_PATH .. "/backends/"
|
backends_folder = IMGUI_PATH .. "/backends/"
|
||||||
end
|
end
|
||||||
|
local function getCname(stname,funcname, namespace)
|
||||||
|
if #stname == 0 then return funcname end --top level
|
||||||
|
local pre = stname.."_"
|
||||||
|
return pre..funcname
|
||||||
|
end
|
||||||
local parser2
|
local parser2
|
||||||
|
|
||||||
if #implementations > 0 then
|
if #implementations > 0 then
|
||||||
@@ -488,9 +493,11 @@ if #implementations > 0 then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
parser2.cimgui_inherited = dofile([[./output/structs_and_enums.lua]])
|
parser2.cimgui_inherited = dofile([[./output/structs_and_enums.lua]])
|
||||||
|
parser2.getCname = getCname
|
||||||
local defines = parser2:take_lines(CPRE..extra_defines..extra_includes..source, {locati}, COMPILER)
|
local defines = parser2:take_lines(CPRE..extra_defines..extra_includes..source, {locati}, COMPILER)
|
||||||
|
|
||||||
local parser3 = cpp2ffi.Parser()
|
local parser3 = cpp2ffi.Parser()
|
||||||
|
parser3.getCname = getCname
|
||||||
parser3.cimgui_inherited = dofile([[./output/structs_and_enums.lua]])
|
parser3.cimgui_inherited = dofile([[./output/structs_and_enums.lua]])
|
||||||
parser3:take_lines(CPRE..extra_defines..extra_includes..source, {locati}, COMPILER)
|
parser3:take_lines(CPRE..extra_defines..extra_includes..source, {locati}, COMPILER)
|
||||||
parser3:do_parse()
|
parser3:do_parse()
|
||||||
|
|||||||
Reference in New Issue
Block a user