Skip to content

Commit

Permalink
show module apis
Browse files Browse the repository at this point in the history
  • Loading branch information
waruqi committed Apr 23, 2024
1 parent d00c884 commit 02af5e5
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 46 deletions.
9 changes: 5 additions & 4 deletions xmake/core/sandbox/modules/import/core/sandbox/sandbox.lua
Original file line number Diff line number Diff line change
Expand Up @@ -127,16 +127,17 @@ end

-- get the filter of the current sandbox for the given script
function sandbox_core_sandbox.filter(script)

-- get the current sandbox instance
local instance = sandbox.instance(script)
if not instance then
raise("cannot get sandbox instance!")
end

-- get it
return instance:filter()
end

-- get all builtin modules
function sandbox_core_sandbox.builtin_modules()
return sandbox.builtin_modules()
end

-- return module
return sandbox_core_sandbox
71 changes: 30 additions & 41 deletions xmake/core/sandbox/sandbox.lua
Original file line number Diff line number Diff line change
Expand Up @@ -90,50 +90,10 @@ end

-- register api for builtin
function sandbox._api_register_builtin(self, name, func)

-- check
assert(self and self._PUBLIC and func)

-- register it
self._PUBLIC[name] = func
end

-- get builtin modules
function sandbox._builtin_modules()
local builtin_modules = sandbox._BUILTIN_MODULES
if builtin_modules == nil then
builtin_modules = {}
local builtin_module_files = os.match(path.join(os.programdir(), "core/sandbox/modules/*.lua"))
if builtin_module_files then
for _, builtin_module_file in ipairs(builtin_module_files) do

-- the module name
local module_name = path.basename(builtin_module_file)
assert(module_name)

-- load script
local script, errors = loadfile(builtin_module_file)
if script then

-- load module
local ok, results = utils.trycall(script)
if not ok then
os.raise(results)
end

-- save module
builtin_modules[module_name] = results
else
-- error
os.raise(errors)
end
end
end
sandbox._BUILTIN_MODULES = builtin_modules
end
return builtin_modules
end

-- new a sandbox instance
function sandbox._new()

Expand All @@ -145,7 +105,7 @@ function sandbox._new()

-- register the builtin modules
instance:_api_register_builtin("_g", {})
for module_name, module in pairs(sandbox._builtin_modules()) do
for module_name, module in pairs(sandbox.builtin_modules()) do
instance:_api_register_builtin(module_name, module)
end

Expand Down Expand Up @@ -350,5 +310,34 @@ function sandbox.instance(script)
return instance
end

-- get builtin modules
function sandbox.builtin_modules()
local builtin_modules = sandbox._BUILTIN_MODULES
if builtin_modules == nil then
builtin_modules = {}
local builtin_module_files = os.files(path.join(os.programdir(), "core/sandbox/modules/*.lua"))
if builtin_module_files then
for _, builtin_module_file in ipairs(builtin_module_files) do
local module_name = path.basename(builtin_module_file)
assert(module_name)

local script, errors = loadfile(builtin_module_file)
if script then
local ok, results = utils.trycall(script)
if not ok then
os.raise(results)
end
builtin_modules[module_name] = results
else
os.raise(errors)
end
end
end
sandbox._BUILTIN_MODULES = builtin_modules
end
return builtin_modules
end


-- return module
return sandbox
68 changes: 67 additions & 1 deletion xmake/plugins/show/lists/apis.lua
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,21 @@ import("core.project.target")
import("core.project.project")
import("core.project.option")
import("core.package.package")
import("core.sandbox.sandbox")
import("core.tool.toolchain")
import(".showlist")

function _is_callable(func)
if type(func) == "function" then
return true
elseif type(func) == "table" then
local meta = debug.getmetatable(func)
if meta and meta.__call then
return true
end
end
end

-- get project scope apis
function project_scope_apis()
local result = {}
Expand Down Expand Up @@ -186,9 +198,63 @@ function instance_apis()
return result
end

-- get builtin module apis
function builtin_module_apis()
local builtin_modules = table.clone(sandbox.builtin_modules())
builtin_modules.pairs = nil
builtin_modules.ipairs = nil
local result = {}
for name, value in pairs(builtin_modules) do
if type(value) == "table" then
for k, v in pairs(value) do
if not k:startswith("_") and type(v) == "function" then
table.insert(result, name .. "." .. k)
end
end
elseif type(value) == "function" then
table.insert(result, name)
end
end
table.insert(result, "ipairs")
table.insert(result, "pairs")
table.sort(result)
return result
end

-- get import module apis
function import_module_apis()
local result = {}
local modulefiles = os.files(path.join(os.programdir(), "modules/**.lua|private/**.lua|core/tools/**.lua|detect/tools/**.lua"))
if modulefiles then
for _, modulefile in ipairs(modulefiles) do
local modulename = path.relative(modulefile, path.join(os.programdir(), "modules"))
if path.filename(modulename) == "main.lua" then
modulename = path.directory(modulename)
end
modulename = modulename:gsub("/", "."):gsub("%.lua", "")
local instance = import(modulename, {try = true, anonymous = true})
if _is_callable(instance) then
table.insert(result, modulename)
elseif type(instance) == "table" then
for k, v in pairs(instance) do
print(k)
if not k:startswith("_") and type(v) == "function" then
table.insert(result, modulename .. "." .. k)
end
end
end
end
end
table.sort(result)
return result
end

-- get all apis
function apis()
return {scope = scope_apis(), instance = instance_apis()}
return {scope = scope_apis(),
instance = instance_apis(),
builtin_module = builtin_module_apis(),
import_module = import_module_apis()}
end

-- show all apis
Expand Down

0 comments on commit 02af5e5

Please sign in to comment.