diff options
| author | ruki <[email protected]> | 2024-04-23 23:28:31 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2024-04-23 23:28:31 +0800 |
| commit | 02af5e5ee379711fed6327ae1d52c9ff792510cc (patch) | |
| tree | 108890f80370eeb342974829c95119e6e4e83a53 | |
| parent | d00c884b8d6b71f8f232cbb5cd0e7186ad966df9 (diff) | |
show module apis
| -rw-r--r-- | xmake/core/sandbox/modules/import/core/sandbox/sandbox.lua | 9 | ||||
| -rw-r--r-- | xmake/core/sandbox/sandbox.lua | 71 | ||||
| -rw-r--r-- | xmake/plugins/show/lists/apis.lua | 68 |
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 |
