Module:Module introspection: Difference between revisions

Ganaram inukshuk (talk | contribs)
fix duplicates in functions used column
Tag: Reverted
Ganaram inukshuk (talk | contribs)
m bugfix worked too well, now it thinks it doesnt use arguments when it does
Tag: Reverted
Line 64: Line 64:
local deps = deps or p.list_dependencies(module_name)
local deps = deps or p.list_dependencies(module_name)
local results = {}
local results = {}
-- Helper: escape Lua pattern chars in dependency names
local function escape_pattern(s)
return (s:gsub("(%W)", "%%%1"))
end


-- Step 2: for each dependency, find all variables referring to it
-- Step 2: for each dependency, find all variables referring to it
for _, dep in ipairs(deps) do
for _, dep in ipairs(deps) do
results[dep] = results[dep] or {}
results[dep] = results[dep] or {functions = {}, variables = {}}


-- Find all variable bindings to this dependency
-- Pattern for require statements (case-insensitive)
local depPattern = escape_pattern(dep)
for var, entry in content:gmatch(
for var, entry in content:gmatch(
"local%s+([%w_]+)%s*=%s*require%s*%(%s*['\"]Module:" .. dep .. "['\"]%s*%)%.?([%w_]*)"
"local%s+([%w_]+)%s*=%s*require%s*%(%s*['\"]Module:" .. depPattern .. "['\"]%s*%)%.?([%w_]*)"
) do
) do
local used = {}
local used = {}


if entry ~= "" then
if entry ~= "" then
-- Case: module returns a function, e.g. var = require("Module:Dep").func
-- Case: module returns a single function (e.g. var = require("Module:Dep").func)
for _ in content:gmatch(var .. "%s*%(") do
for _ in content:gmatch(var .. "%s*%(") do
used[entry] = true
used[entry] = true
end
end
else
else
-- Case: module returns a table, e.g. var.func()
-- Case: module returns a table (e.g. var.func())
for func in content:gmatch(var .. "%.(%w+)%s*%(") do
for func in content:gmatch(var .. "%.(%w+)%s*%(") do
used[func] = true
used[func] = true
Line 88: Line 94:


-- Merge deduplicated results
-- Merge deduplicated results
local funcList = results[dep].functions or {}
for f in pairs(used) do
for f in pairs(used) do funcList[f] = true end
results[dep].functions[f] = true
results[dep].functions = funcList
end


-- Track variable bindings (may be multiple)
results[dep].variables = results[dep].variables or {}
table.insert(results[dep].variables, {
table.insert(results[dep].variables, {
variable = var,
variable = var,
Line 113: Line 117:
return results
return results
end
end


-- Helper function
-- Helper function