Lua Lint |
|
来源: http://place.org/~nop/lualint-0.0.tar.gz (本地: Files: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()",您应该需要 "myext",而不是依赖其他依赖项来加载它。LUA_PATH 会像往常一样被用于查找需求。
一些(并非严格意义上的 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 的解析器,它应该在这方面做得更好,并允许检测一些其他常见情况。
JayCarlson ([email protected])
这一切都是 Ben Jackson ([email protected]) 的错,他在 MOO 中做了一些类似的技巧。