analyze.lua (1510B)
1 local loop = vim.loop 2 3 local M = {} 4 5 -- Dart analyze to quickfix list 6 function M.qf(make_entry) 7 local list = {} 8 9 local onread = function(err, data) 10 assert(not err, err) 11 if data then 12 local line = string.gsub(data, '\n', '') 13 local parsed = make_entry(line) 14 if parsed then table.insert(list, parsed) end 15 end 16 end 17 18 local stdout = loop.new_pipe(false) 19 local handle 20 print('Analyzing...') 21 handle = loop.spawn('dart', { args = { 'analyze' }, stdio = { nil, stdout, nil } }, vim.schedule_wrap(function() 22 stdout:read_stop() 23 stdout:close() 24 handle:close() 25 26 vim.fn.setqflist(list) 27 if #list > 0 then 28 vim.cmd.copen() 29 else 30 print('Analyzer finished.') 31 end 32 end)) 33 34 loop.read_start(stdout, onread) 35 end 36 37 function M.qf2103() 38 local dart2103 = function(line) 39 local level, msg, filename, lnum, lcol = string.match(line, '(%a+) %- (.*) at (%S+):(%d+):(%d+) .*') 40 if level and filename and lnum and lcol and msg then 41 return { type = string.sub(level, 1, 1):upper(), filename = filename, lnum = lnum, lcol = lcol, text = msg } 42 end 43 end 44 M.qf(dart2103) 45 end 46 47 function M.qf2131() 48 local dart2131 = function(line) 49 local level, filename, lnum, lcol, msg = string.match(line, '(%a+) %- (%S+):(%d+):(%d+) %- (.*)') 50 if level and filename and lnum and lcol and msg then 51 return { type = string.sub(level, 1, 1):upper(), filename = filename, lnum = lnum, lcol = lcol, text = msg } 52 end 53 end 54 M.qf(dart2131) 55 end 56 57 return M