Lua Lint |
|
源代码: http://place.org/~nop/lualint-0.0.tar.gz (本地: 文件:wiki_insecure/users/nop/lualint) (github: https://github.com/philips/lualint)
用法: lualint [-r|-s] filename.lua [ [-r|-s] [filename.lua] ...]
lualint 使用 luac 的字节码列表。它报告所有对未声明全局变量的访问,从而捕获变量名中的许多拼写错误。例如
local really_aborting local function abort() os.exit(1) end if not os.getenv("HOME") then realy_aborting = true abortt() end
报告
/tmp/example.lua:4: *** global SET of realy_aborting /tmp/example.lua:5: global get of abortt
它主要设计用于 LTN7 风格的模块,其中每个源文件只导出一个全局符号。(包含在文件 "foobar.lua" 中的模块应该只导出符号 "foobar"。)
对于非 LTN7 风格的源文件,提供了一个 "宽松" 模式。它只检测从未设置过的全局变量的读取。开关 "-r" 将 lualint 置于宽松模式,用于后续文件;"-s" 则切换回严格模式。
跟踪了必需的包,但不是递归地跟踪。如果你调用 "myext.process()",你应该 require "myext",而不是依赖其他依赖项来加载它。LUA_PATH 照常用于查找 require。
一些 (不严格是 LTN7) 模块可能希望将其他变量导出到全局环境中。要做到这一点,请使用 declare 函数
declare "xpairs" function xpairs(node) [...]
类似地,要抑制关于读取你已知可能不可用的全局变量的警告
lint_ignore "lua_fltk_version" if lua_fltk_version then print("fltk loaded") end
定义这些变量的一种方法是在一个名为 "declare.lua" 的模块中
function declare(s) end declare "lint_ignore" function lint_ignore(s) end
(设置 declare 是可以的,因为它在 "declare" 模块中。) 这些函数不必做任何事情,甚至实际上不存在!它们可以存在于死代码中
if false then declare "xpairs" end
这是因为 lualint 只执行对字节码的相当初级和粗略的扫描。也许声明应该只允许在主块中。
错误不会按任何特定顺序出现。
应该切换到 RiciLake 的解析器,它应该能更好地完成这项工作,并允许检测一些其他常见情况。
Jay Carlson (nop@nop.com)
这都是 Ben Jackson (ben@ben.com) 的错,他在 MOO 中做了一些类似的事情。