Module:Module introspection: Difference between revisions

Ganaram inukshuk (talk | contribs)
m bugfix worked too well, now it thinks it doesnt use arguments when it does
Tag: Reverted
Ganaram inukshuk (talk | contribs)
rollback for now
Tag: Manual revert
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 = p.strip_comments(title:getContent() or "")
local content = title:getContent()


-- Step 1: get the list of dependencies
-- Step 1: Find all require statements with optional .function
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 = {}


-- Helper: escape Lua pattern chars in dependency names
-- Step 2: Check how it's used
local function escape_pattern(s)
if entry ~= "" then
return (s:gsub("(%W)", "%%%1"))
-- The module returned a single function: var() usage
end
for _ in content:gmatch(var .. "%s*%(") do
 
used[entry] = true
-- Step 2: for each dependency, find all variables referring to it
for _, dep in ipairs(deps) do
results[dep] = results[dep] or {functions = {}, variables = {}}
 
-- Pattern for require statements (case-insensitive)
local depPattern = escape_pattern(dep)
for var, entry in content:gmatch(
"local%s+([%w_]+)%s*=%s*require%s*%(%s*['\"]Module:" .. depPattern .. "['\"]%s*%)%.?([%w_]*)"
) do
local used = {}
 
if entry ~= "" then
-- Case: module returns a single 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
 
else
-- Merge deduplicated results
-- The variable is a module table: var.func() usage
for f in pairs(used) do
for func in content:gmatch(var .. "%.(%w+)%s*%(") do
results[dep].functions[f] = true
used[func] = true
end
end
end


table.insert(results[dep].variables, {
-- Step 3: Build result entry
variable = var,
local funcList = {}
entry = (entry ~= "" and entry or nil)
for f in pairs(used) do table.insert(funcList, f) end
})
table.sort(funcList)
end
end


-- Step 3: convert functions into sorted arrays
results[dep] = results[dep] or {}
for dep, data in pairs(results) do
table.insert(results[dep], {
local funcNames = {}
variable = var,
for f in pairs(data.functions or {}) do
entry = (entry ~= "" and entry or nil),
table.insert(funcNames, f)
functions = funcList
end
})
table.sort(funcNames)
data.functions = funcNames
end
end