I was more playing with the thought of concatenating all files into a single string and passing that to the analyzer - that should, theoretically, allow it to do a better job with those functions. I might give it a try later on, for now I'm content with what ZBS does and will recommend it to anyone doing plugin development for MCS, especially when on Linux / MacOS. For Windows, Decoda is still my favorite IDE because it allows me to see stack traces in both the Lua code as well as C++ code.
Hmm, I just couldn't keep off of it. I've tried the following snippet and it seems to do what I want, now only it needs converting from the big blob linenumbers back to original files' names and line numbers
Of course I'm just messing around, the code will need proper massaging if we want it production-grade.
Hmm, I just couldn't keep off of it. I've tried the following snippet and it seems to do what I want, now only it needs converting from the big blob linenumbers back to original files' names and line numbers
-- packages/analyzeall.lua: local G = ... local id = G.ID("analyzeall.analyzeall") local menuid local function analyzeProject() local frame = ide:GetMainFrame() local menubar = ide:GetMenuBar() if menubar:IsChecked(ID_CLEAROUTPUT) then ClearOutput() end DisplayOutputLn("Analyzing the project code.") frame:Update() local projectPath = ide:GetProject() local src = {} local files = {} if projectPath then for _, filePath in ipairs(FileSysGetRecursive(projectPath, true, "*.lua")) do files[#files + 1] = filePath end table.sort(files) for _, fileName in ipairs(files) do src[#src + 1] = FileRead(fileName) end local warn, err, line = AnalyzeString(table.concat(src, "\n")) if err then DisplayOutputNoMarker("Error: " .. err .. "\n") elseif (#warn > 0) then DisplayOutputNoMarker(table.concat(warn, "\n") .. "\n") end frame:Update() -- refresh the output with new results end end return { name = "Analyze all files as a single blob", description = "Analyzes all files in a project.", author = "Paul Kulchenko", version = 0.1, onRegister = function(self) local menu = ide:GetMenuBar():GetMenu(ide:GetMenuBar():FindMenu(TR("&Project"))) local _, analyzepos = ide:FindMenuItem(menu, ID_ANALYZE) if analyzepos then menu:Insert(analyzepos+1, id, TR("Analyze All")..KSC(id), TR("Analyze the project source code")) end ide:GetMainFrame():Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, analyzeProject) end, onUnRegister = function(self) local menu = ide:GetMenuBar():GetMenu(ide:GetMenuBar():FindMenu(TR("&Project"))) ide:GetMainFrame():Disconnect(id, wx.wxID_ANY, wx.wxEVT_COMMAND_MENU_SELECTED) if menuid then menu:Destroy(menuid) end end, } -- Add this to src/editor/inspect.lua: function AnalyzeString(src) local warn, err, line, pos = M.warnings_from_string(src, "src") if err then err = err:gsub("line %d+, char %d+", "syntax error") end return warn, err, line, pos end
Of course I'm just messing around, the code will need proper massaging if we want it production-grade.