eolian_tools/utils/eolian_extras.lua

169 lines
4.0 KiB
Lua

local eolian = require("eolian")
local M = {}
-- check for pre-state eolian api
local legacy = not eolian.new
-- wrapper for legacy eolian api to mimic modern
local legacy_eos = {
directory_add = function(self, dir)
eolian.directory_scan(dir)
end,
system_directory_add = function(self)
eolian.system_directory_scan()
end,
all_eo_files_parse = function(self)
assert(eolian.all_eo_files_parse())
assert(eolian.database_validate())
end,
all_eot_files_parse = function(self)
assert(eolian.all_eot_files_parse())
assert(eolian.database_validate())
end,
classes_get = function(self)
return eolian.all_classes_get(nil)
end,
aliases_get = function(self)
return eolian.typedecl_all_aliases_get(nil)
end,
structs_get = function(self)
return eolian.typedecl_all_structs_get(nil)
end,
enums_get = function(self)
return eolian.typedecl_all_enums_get(nil)
end,
globals_get = function(self)
return eolian.variable_all_globals_get(nil)
end,
constants_get = function(self)
return eolian.variable_all_constants_get(nil)
end
}
M.new = function()
if legacy then
return legacy_eos
end
return eolian.new()
end
local f_is_beta = function(fn)
if legacy then
return false
end
return fn:is_beta()
end
M.get_c_functions = function(eos, only_legacy)
only_legacy = not not only_legacy
local ret = {}
for cl in eos:classes_get() do
local fntp = eolian.function_type
for fn in cl:functions_get(fntp.METHOD) do
if not only_legacy or not f_is_beta(fn) then
ret[#ret + 1] = fn:full_c_name_get(fntp.METHOD, only_legacy)
end
end
for fn in cl:functions_get(fntp.PROPERTY) do
if not only_legacy or not f_is_beta(fn) then
local tp = fn:type_get()
if tp == fntp.PROPERTY then
ret[#ret + 1] = fn:full_c_name_get(fntp.PROP_GET, only_legacy)
ret[#ret + 1] = fn:full_c_name_get(fntp.PROP_SET, only_legacy)
else
ret[#ret + 1] = fn:full_c_name_get(tp, only_legacy)
end
end
end
end
return ret
end
M.get_c_events = function(eos, only_legacy)
local ret = {}
if only_legacy then
return ret
end
for cl in eos:classes_get() do
for ev in cl:events_get() do
ret[#ret + 1] = ev:c_name_get()
end
end
return ret
end
local full_name_get = function(obj)
if legacy then
return obj:full_name_get()
end
return obj:name_get()
end
M.get_c_function_pointers = function(eos, only_legacy)
if legacy or only_legacy then
-- no function pointer support in pre-state api
return {}
end
local ret = {}
for tp in eos:aliases_get() do
if tp:type_get() == eolian.typedecl_type.FUNCTION_POINTER then
ret[#ret + 1] = full_name_get(tp):gsub("%.", "_")
end
end
return ret
end
M.get_c_aliases = function(eos)
local ret = {}
for tp in eos:aliases_get() do
if tp:type_get() ~= eolian.typedecl_type.FUNCTION_POINTER then
ret[#ret + 1] = full_name_get(tp):gsub("%.", "_")
end
end
return ret
end
M.get_c_structs = function(eos)
local ret = {}
for tp in eos:structs_get() do
ret[#ret + 1] = full_name_get(tp):gsub("%.", "_")
end
return ret
end
M.get_c_enums = function(eos)
local ret = {}
for tp in eos:enums_get() do
ret[#ret + 1] = full_name_get(tp):gsub("%.", "_")
end
return ret
end
M.get_c_globals = function(eos)
local ret = {}
for v in eos:globals_get() do
ret[#ret + 1] = full_name_get(v):gsub("%.", "_"):upper()
end
return ret
end
M.get_c_constants = function(eos)
local ret = {}
for v in eos:constants_get() do
ret[#ret + 1] = full_name_get(v):gsub("%.", "_"):upper()
end
return ret
end
return M