|
| 1 | +#!/usr/bin/env lua |
| 2 | +--- Check a FusionScript file for syntax and logical errors |
| 3 | +-- @script fusion-lint |
| 4 | +-- @usage fusion-lint [-h] [FILE] |
| 5 | +local argparse = require("argparse") |
| 6 | +local parser = require("fusion.core.parser") |
| 7 | +local unpack = require("fusion.util").unpack |
| 8 | + |
| 9 | +local argparser = argparse() { |
| 10 | + name = "fusion-lint"; |
| 11 | + description = "Check a FusionScript file for syntax and logical errors"; |
| 12 | + epilog = "For more info, see https://fusionscript.info"; |
| 13 | +} |
| 14 | +argparser:argument("file", "File(s) to lint"):args("+") |
| 15 | +local files = argparser:parse().file |
| 16 | + |
| 17 | +local function lint_file(file_name, file) |
| 18 | + local messages = {} |
| 19 | + local is_linted, result = pcall(parser.match, nil, file:read("*a")) |
| 20 | + if not is_linted then |
| 21 | + local message = result.msg[2] |
| 22 | + local pos = result.pos |
| 23 | + messages[#messages + 1] = |
| 24 | + ("%s:%d:%d: (E001) %s"):format(file_name, pos.y, pos.x, message) |
| 25 | + else -- luacheck: ignore |
| 26 | + -- pass |
| 27 | + end |
| 28 | + return messages |
| 29 | +end |
| 30 | + |
| 31 | +for index, file in ipairs(files) do |
| 32 | + files[index] = {file, assert(io.open(file))} -- TODO: support for dirs |
| 33 | +end |
| 34 | + |
| 35 | +for _, file in ipairs(files) do |
| 36 | + for _, line in ipairs(lint_file(unpack(file))) do |
| 37 | + print(line) |
| 38 | + end |
| 39 | +end |
0 commit comments