-
Notifications
You must be signed in to change notification settings - Fork 0
/
jass.lua
114 lines (105 loc) · 3.13 KB
/
jass.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
-- 检查单个脚本文件,会使用工具内置的common.j和blizzard.j(1.24e)
root = arg[0] .. '\\..'
package.path = package.path .. ';' .. root .. '\\src\\?.lua'
.. ';' .. root .. '\\src\\?\\init.lua'
require 'filesystem'
require 'utility'
local root = fs.path(root)
local parser = require 'parser'
local showerror = require 'gui.showerror'
local function show_error(filename, info)
showerror(root / 'src' / 'gui', info.err, filename, info.line)
end
local function format_error(info)
return ([[%s:%d: %s]]):format(info.file, info.line, info.err)
end
local function command()
local res = {}
for i = 1, #arg do
local cmd = arg[i]
if cmd:sub(1, 1) == '-' then
local k, v
local pos = cmd:find('=', 1, true)
if pos then
k = cmd:sub(2, pos - 1)
v = cmd:sub(pos + 1)
else
k = cmd:sub(2)
v = true
end
res[k] = v
else
res[#res+1] = cmd
end
end
return res
end
local function parse(filename, option, gui)
local file = io.load(filename)
if not file then
print('不能打开文件:', filename:string())
option.Error = option.Error + 1
return false
end
local errors = parser.checker(file, filename:filename():string(), option)
if #errors > 0 then
for _, error in ipairs(errors) do
if error.level == 'warning' then
print(format_error(error))
option.Warning = option.Warning + 1
end
end
local hasError = false
for _, error in ipairs(errors) do
if error.level == 'error' then
print(format_error(error))
option.Error = option.Error + 1
if gui then
show_error(filename, error)
end
hasError = true
end
end
return not hasError
end
print('检查完成:', filename:string())
return true
end
local function main()
local cmd = command()
if not cmd[1] then
print('请输入脚本路径')
return
end
local option = {
Error = 0,
Warning = 0,
}
local suc, errors = xpcall(function()
local gui = not not cmd.gui
if cmd.ver then
option.Version = tonumber(cmd.ver)
if not parse(root / 'standard' / cmd.ver / 'common.j', option, gui) then
return
end
if not parse(root / 'standard' / cmd.ver / 'blizzard.j', option, gui) then
return
end
end
for _, c in ipairs(cmd) do
if not parse(fs.path(c), option, gui) then
return
end
end
end, debug.traceback)
if not suc then
print(errors)
return
end
if option.Error > 0 then
print('检查失败:', ('%d 个错误, %d 个警告'):format(option.Error, option.Warning))
else
print('检查成功:', ('%d 个错误, %d 个警告'):format(option.Error, option.Warning))
end
end
main()