@@ -17,11 +17,109 @@ require 'vm'
1717
1818local export = {}
1919
20+ local colors
21+
22+ if not os.getenv (' NO_COLOR' ) then
23+ colors = {
24+ red = ' \27 [31m' ,
25+ green = ' \27 [32m' ,
26+ yellow = ' \27 [33m' ,
27+ blue = ' \27 [34m' ,
28+ magenta = ' \27 [35m' ,
29+ white = ' \27 [37m' ,
30+ grey = ' \27 [90m' ,
31+ reset = ' \27 [0m'
32+ }
33+ else
34+ colors = {
35+ red = ' ' ,
36+ green = ' ' ,
37+ yellow = ' ' ,
38+ blue = ' ' ,
39+ magenta = ' ' ,
40+ white = ' ' ,
41+ grey = ' ' ,
42+ reset = ' '
43+ }
44+ end
45+
46+ --- @type table<DiagnosticSeverity , string>
47+ local severity_colors = {
48+ Error = colors .red ,
49+ Warning = colors .yellow ,
50+ Information = colors .white ,
51+ Hint = colors .white ,
52+ }
53+
54+ local severity_str = {} --- @type table<integer,DiagnosticSeverity>
55+ for k , v in pairs (define .DiagnosticSeverity ) do
56+ severity_str [v ] = k
57+ end
58+
59+ local pwd
60+
61+ --- @param path string
62+ --- @return string
63+ local function relpath (path )
64+ if not pwd then
65+ pwd = furi .decode (furi .encode (fs .current_path ():string ()))
66+ end
67+ if pwd and path :sub (1 , # pwd ) == pwd then
68+ path = path :sub (# pwd + 2 )
69+ end
70+ return path
71+ end
72+
73+ local function report_pretty (uri , diags )
74+ local path = relpath (furi .decode (uri ))
75+
76+ local lines = {} --- @type string[]
77+ pcall (function ()
78+ for line in io.lines (path ) do
79+ table.insert (lines , line )
80+ end
81+ end )
82+
83+ for _ , d in ipairs (diags ) do
84+ local rstart = d .range .start
85+ local rend = d .range [' end' ]
86+ local severity = severity_str [d .severity ]
87+ print (
88+ (' %s%s:%s:%s%s [%s%s%s] %s %s(%s)%s' ):format (
89+ colors .blue ,
90+ path ,
91+ rstart .line + 1 , -- Use 1-based indexing
92+ rstart .character + 1 , -- Use 1-based indexing
93+ colors .reset ,
94+ severity_colors [severity ],
95+ severity ,
96+ colors .reset ,
97+ d .message ,
98+ colors .magenta ,
99+ d .code ,
100+ colors .reset
101+ )
102+ )
103+ if # lines > 0 then
104+ io.write (' ' , lines [rstart .line + 1 ], ' \n ' )
105+ io.write (' ' , colors .grey , (' ' ):rep (rstart .character ), ' ^' )
106+ if rstart .line == rend .line then
107+ io.write ((' ^' ):rep (rend .character - rstart .character - 1 ))
108+ end
109+ io.write (colors .reset , ' \n ' )
110+ end
111+ end
112+ end
113+
20114local function clear_line ()
21115 -- Write out empty space to ensure that the previous lien is cleared.
22116 io.write (' \x0D ' , (' ' ):rep (80 ), ' \x0D ' )
23117end
24118
119+ local function quiet ()
120+ return QUIET or CHECK_WORKER
121+ end
122+
25123--- @param i integer
26124--- @param max integer
27125--- @param results table<string , table[]>
@@ -127,9 +225,13 @@ function export.runCLI()
127225
128226 client :register (' textDocument/publishDiagnostics' , function (params )
129227 results [params .uri ] = params .diagnostics
228+ if not QUIET and (CHECK_FORMAT == nil or CHECK_FORMAT == ' pretty' ) then
229+ clear_line ()
230+ report_pretty (params .uri , params .diagnostics )
231+ end
130232 end )
131233
132- if not QUIET then
234+ if not quiet () then
133235 io.write (lang .script (' CLI_CHECK_INITING' ))
134236 end
135237
@@ -153,15 +255,15 @@ function export.runCLI()
153255 diag .doDiagnostic (uri , true )
154256 -- Print regularly but always print the last entry to ensure
155257 -- that logs written to files don't look incomplete.
156- if not QUIET and (os.clock () - lastClock > 0.2 or i == # uris ) then
258+ if not quiet () and (os.clock () - lastClock > 0.2 or i == # uris ) then
157259 lastClock = os.clock ()
158260 client :update ()
159261 report_progress (i , max , results )
160262 end
161263 end
162264 end
163- if not QUIET then
164- io.write ( ' \x0D ' )
265+ if not quiet () then
266+ clear_line ( )
165267 end
166268 end )
167269
@@ -173,16 +275,21 @@ function export.runCLI()
173275 end
174276 end
175277
176- local outpath = CHECK_OUT_PATH or LOGPATH .. ' /check.json '
278+ local outpath = nil
177279
178- -- Always write result, even if it's empty to make sure no one accidentally looks at an old output after a successful run.
179- util .saveFile (outpath , jsonb .beautify (results ))
280+ if CHECK_FORMAT == ' json' or CHECK_OUT_PATH then
281+ outpath = CHECK_OUT_PATH or LOGPATH .. ' /check.json'
282+ -- Always write result, even if it's empty to make sure no one accidentally looks at an old output after a successful run.
283+ util .saveFile (outpath , jsonb .beautify (results ))
284+ end
180285
181- if not QUIET then
286+ if not quiet () then
182287 if count == 0 then
183288 print (lang .script (' CLI_CHECK_SUCCESS' ))
289+ elseif outpath then
290+ print (lang .script (' CLI_CHECK_RESULTS_OUTPATH' , count , outpath ))
184291 else
185- print (lang .script (' CLI_CHECK_RESULTS ' , count , outpath ))
292+ print (lang .script (' CLI_CHECK_RESULTS_PRETTY ' , count ))
186293 end
187294 end
188295 return count == 0 and 0 or 1
0 commit comments