Module:Module introspection: Difference between revisions

Ganaram inukshuk (talk | contribs)
m forgot to remove bugfixing additions
Ganaram inukshuk (talk | contribs)
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 module_name = module_name --or "MOS" -- Test arg; comment out when not testing
-- Get dependencies
local deps = p.list_dependencies(module_name)
-- Load module
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: Find all require statements with optional .function
-- Step 1: get the list of dependencies
local deps = deps or p.list_dependencies(module_name)
local results = {}
local results = {}
for var, dep, entry in content:gmatch(
"local%s+([%w_]+)%s*=%s*require%s*%(%s*['\"]Module:(.-)['\"]%s*%)%.?([%w_]*)"
) do
local used = {}


-- Step 2: Check how it's used
-- Step 2: for each dependency, find all variables referring to it
if entry ~= "" then
for _, dep in ipairs(deps) do
-- The module returned a single function: var() usage
results[dep] = results[dep] or {}
for _ in content:gmatch(var .. "%s*%(") do
 
used[entry] = true
-- Find all variable bindings to this dependency
end
for var, entry in content:gmatch(
else
"local%s+([%w_]+)%s*=%s*require%s*%(%s*['\"]Module:" .. dep .. "['\"]%s*%)%.?([%w_]*)"
-- The variable is a module table: var.func() usage
) do
for func in content:gmatch(var .. "%.(%w+)%s*%(") do
local used = {}
used[func] = true
 
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: Build result entry
-- Step 3: convert functions into sorted arrays
local funcList = {}
for dep, data in pairs(results) do
for f in pairs(used) do table.insert(funcList, f) end
local funcNames = {}
table.sort(funcList)
for f in pairs(data.functions or {}) do
 
table.insert(funcNames, f)
results[dep] = results[dep] or {}
end
table.insert(results[dep], {
table.sort(funcNames)
variable = var,
data.functions = funcNames
entry = (entry ~= "" and entry or nil),
functions = funcList
})
end
end


return results
return results
end
end


-- Helper function
-- Helper function