summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-04-23 23:28:31 +0800
committerruki <[email protected]>2024-04-23 23:28:31 +0800
commit02af5e5ee379711fed6327ae1d52c9ff792510cc (patch)
tree108890f80370eeb342974829c95119e6e4e83a53
parentd00c884b8d6b71f8f232cbb5cd0e7186ad966df9 (diff)
show module apis
-rw-r--r--xmake/core/sandbox/modules/import/core/sandbox/sandbox.lua9
-rw-r--r--xmake/core/sandbox/sandbox.lua71
-rw-r--r--xmake/plugins/show/lists/apis.lua68
3 files changed, 102 insertions, 46 deletions
diff --git a/xmake/core/sandbox/modules/import/core/sandbox/sandbox.lua b/xmake/core/sandbox/modules/import/core/sandbox/sandbox.lua
index c189f398e..688707e4c 100644
--- a/xmake/core/sandbox/modules/import/core/sandbox/sandbox.lua
+++ b/xmake/core/sandbox/modules/import/core/sandbox/sandbox.lua
@@ -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
diff --git a/xmake/core/sandbox/sandbox.lua b/xmake/core/sandbox/sandbox.lua
index 766e6061c..1e0817a4e 100644
--- a/xmake/core/sandbox/sandbox.lua
+++ b/xmake/core/sandbox/sandbox.lua
@@ -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()
@@ -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
@@ -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
diff --git a/xmake/plugins/show/lists/apis.lua b/xmake/plugins/show/lists/apis.lua
index cfd243c63..46f369464 100644
--- a/xmake/plugins/show/lists/apis.lua
+++ b/xmake/plugins/show/lists/apis.lua
@@ -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 = {}
@@ -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