local utils = require "luacheck.utils"
|
|
local stages = {}
|
|
-- Checking is organized into stages run one after another.
|
-- Each stage is in its own module and provides `run` function operating on a check state,
|
-- and optionally `warnings` table mapping issue codes to tables with fields `message_format`
|
-- containing format string for the issue or a function returning it given the issue,
|
-- and `fields` containing array of extra fields this warning can have.
|
|
stages.names = {
|
"parse",
|
"unwrap_parens",
|
"linearize",
|
"parse_inline_options",
|
"name_functions",
|
"resolve_locals",
|
"detect_bad_whitespace",
|
"detect_cyclomatic_complexity",
|
"detect_empty_blocks",
|
"detect_empty_statements",
|
"detect_globals",
|
"detect_reversed_fornum_loops",
|
"detect_unbalanced_assignments",
|
"detect_uninit_accesses",
|
"detect_unreachable_code",
|
"detect_unused_fields",
|
"detect_unused_locals"
|
}
|
|
stages.modules = {}
|
|
for _, name in ipairs(stages.names) do
|
table.insert(stages.modules, require("luacheck.stages." .. name))
|
end
|
|
stages.warnings = {}
|
|
local base_fields = {"code", "line", "column", "end_column"}
|
|
local function register_warnings(warnings)
|
for code, warning in pairs(warnings) do
|
assert(not stages.warnings[code])
|
assert(warning.message_format)
|
assert(warning.fields)
|
|
local full_fields = utils.concat_arrays({base_fields, warning.fields})
|
|
stages.warnings[code] = {
|
message_format = warning.message_format,
|
fields = full_fields,
|
fields_set = utils.array_to_set(full_fields)
|
}
|
end
|
end
|
|
-- Issues that do not originate from normal check stages (excluding global related ones).
|
register_warnings({
|
["011"] = {message_format = "{msg}", fields = {"msg", "prev_line", "prev_column", "prev_end_column"}},
|
["631"] = {message_format = "line is too long ({end_column} > {max_length})", fields = {}}
|
})
|
|
for _, stage_module in ipairs(stages.modules) do
|
if stage_module.warnings then
|
register_warnings(stage_module.warnings)
|
end
|
end
|
|
function stages.run(chstate)
|
for _, stage_module in ipairs(stages.modules) do
|
stage_module.run(chstate)
|
end
|
end
|
|
return stages
|