Module:Module introspection: Difference between revisions
m forgot to remove bugfixing additions |
fix duplicates in functions used column Tag: Reverted |
||
| Line 58: | Line 58: | ||
-- them itself by calling list_dependencies | -- them itself by calling list_dependencies | ||
function p.list_dependency_functions(module_name, deps) | function p.list_dependency_functions(module_name, deps) | ||
local title = mw.title.new('Module:' .. module_name) | local title = mw.title.new('Module:' .. module_name) | ||
local content = title:getContent() | local content = p.strip_comments(title:getContent() or "") | ||
-- Step 1: | -- Step 1: get the list of dependencies | ||
local deps = deps or p.list_dependencies(module_name) | |||
local results = {} | local results = {} | ||
-- Step 2: for each dependency, find all variables referring to it | |||
for _, dep in ipairs(deps) do | |||
results[dep] = results[dep] or {} | |||
-- Find all variable bindings to this dependency | |||
for var, entry in content:gmatch( | |||
"local%s+([%w_]+)%s*=%s*require%s*%(%s*['\"]Module:" .. dep .. "['\"]%s*%)%.?([%w_]*)" | |||
) do | |||
local used = {} | |||
if entry ~= "" then | |||
-- Case: module returns a function, e.g. var = require("Module:Dep").func | |||
for _ in content:gmatch(var .. "%s*%(") do | |||
used[entry] = true | |||
end | |||
else | |||
-- Case: module returns a table, e.g. var.func() | |||
for func in content:gmatch(var .. "%.(%w+)%s*%(") do | |||
used[func] = true | |||
end | |||
end | end | ||
-- Merge deduplicated results | |||
local funcList = results[dep].functions or {} | |||
for f in pairs(used) do funcList[f] = true end | |||
results[dep].functions = funcList | |||
-- Track variable bindings (may be multiple) | |||
results[dep].variables = results[dep].variables or {} | |||
table.insert(results[dep].variables, { | |||
variable = var, | |||
entry = (entry ~= "" and entry or nil) | |||
}) | |||
end | end | ||
end | |||
-- Step 3: convert functions into sorted arrays | |||
local | for dep, data in pairs(results) do | ||
for f in pairs( | local funcNames = {} | ||
table.sort( | for f in pairs(data.functions or {}) do | ||
table.insert(funcNames, f) | |||
end | |||
table.sort(funcNames) | |||
data.functions = funcNames | |||
end | end | ||
return results | return results | ||
end | end | ||
-- Helper function | -- Helper function | ||