mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	 198a952c13
			
		
	
	198a952c13
	
	
	
		
			
			This automatically downloads and uses the correct luals binary for the currently used system. `make luals` will run luals on all lua files in `runtime`. We download lua-language-server manually instead of relying on contributors downloading it on their own (like with stylua) as lua-language-server is updated frequently which may cause unnecessary friction. Therefore, we download a pinned version of luals which we then can manually bump when needed. This can be re-evaluated if luals becomes more stable in the future. Currently this is not run when using `make lint` since cmake style "file caching" doesn't seem possible at the moment. This is because checking a single file doesn't seem to work. Work on https://github.com/neovim/neovim/issues/24563.
		
			
				
	
	
		
			117 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -------------------------------------------------------------------------------
 | |
| -- (Not needed for LuaJIT or Lua 5.2+)
 | |
| --
 | |
| -- Coroutine safe xpcall and pcall versions
 | |
| --
 | |
| -- https://keplerproject.github.io/coxpcall/
 | |
| --
 | |
| -- Encapsulates the protected calls with a coroutine based loop, so errors can
 | |
| -- be dealed without the usual Lua 5.x pcall/xpcall issues with coroutines
 | |
| -- yielding inside the call to pcall or xpcall.
 | |
| --
 | |
| -- Authors: Roberto Ierusalimschy and Andre Carregal
 | |
| -- Contributors: Thomas Harning Jr., Ignacio Burgueño, Fabio Mascarenhas
 | |
| --
 | |
| -- Copyright 2005 - Kepler Project
 | |
| --
 | |
| -- $Id: coxpcall.lua,v 1.13 2008/05/19 19:20:02 mascarenhas Exp $
 | |
| -------------------------------------------------------------------------------
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| -- Checks if (x)pcall function is coroutine safe
 | |
| -------------------------------------------------------------------------------
 | |
| local function isCoroutineSafe(func)
 | |
|     local co = coroutine.create(function()
 | |
|         return func(coroutine.yield, function() end)
 | |
|     end)
 | |
| 
 | |
|     coroutine.resume(co)
 | |
|     return coroutine.resume(co)
 | |
| end
 | |
| 
 | |
| -- No need to do anything if pcall and xpcall are already safe.
 | |
| if isCoroutineSafe(pcall) and isCoroutineSafe(xpcall) then
 | |
|     _G.copcall = pcall
 | |
|     _G.coxpcall = xpcall
 | |
|     return { pcall = pcall, xpcall = xpcall, running = coroutine.running }
 | |
| end
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| -- Implements xpcall with coroutines
 | |
| -------------------------------------------------------------------------------
 | |
| ---@diagnostic disable-next-line
 | |
| local performResume
 | |
| local oldpcall, oldxpcall = pcall, xpcall
 | |
| local pack = table.pack or function(...) return {n = select("#", ...), ...} end
 | |
| local unpack = table.unpack or unpack
 | |
| local running = coroutine.running
 | |
| --- @type table<thread,thread>
 | |
| local coromap = setmetatable({}, { __mode = "k" })
 | |
| 
 | |
| local function handleReturnValue(err, co, status, ...)
 | |
|     if not status then
 | |
|         return false, err(debug.traceback(co, (...)), ...)
 | |
|     end
 | |
|     if coroutine.status(co) == 'suspended' then
 | |
|         return performResume(err, co, coroutine.yield(...))
 | |
|     else
 | |
|         return true, ...
 | |
|     end
 | |
| end
 | |
| 
 | |
| function performResume(err, co, ...)
 | |
|     return handleReturnValue(err, co, coroutine.resume(co, ...))
 | |
| end
 | |
| 
 | |
| --- @diagnostic disable-next-line: unused-vararg
 | |
| local function id(trace, ...)
 | |
|     return trace
 | |
| end
 | |
| 
 | |
| function _G.coxpcall(f, err, ...)
 | |
|     local current = running()
 | |
|     if not current then
 | |
|         if err == id then
 | |
|             return oldpcall(f, ...)
 | |
|         else
 | |
|             if select("#", ...) > 0 then
 | |
|                 local oldf, params = f, pack(...)
 | |
|                 f = function() return oldf(unpack(params, 1, params.n)) end
 | |
|             end
 | |
|             return oldxpcall(f, err)
 | |
|         end
 | |
|     else
 | |
|         local res, co = oldpcall(coroutine.create, f)
 | |
|         if not res then
 | |
|             local newf = function(...) return f(...) end
 | |
|             co = coroutine.create(newf)
 | |
|         end
 | |
|         coromap[co] = current
 | |
|         return performResume(err, co, ...)
 | |
|     end
 | |
| end
 | |
| 
 | |
| --- @param coro? thread
 | |
| local function corunning(coro)
 | |
|   if coro ~= nil then
 | |
|     assert(type(coro)=="thread", "Bad argument; expected thread, got: "..type(coro))
 | |
|   else
 | |
|     coro = running()
 | |
|   end
 | |
|   while coromap[coro] do
 | |
|     coro = coromap[coro]
 | |
|   end
 | |
|   if coro == "mainthread" then return nil end
 | |
|   return coro
 | |
| end
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| -- Implements pcall with coroutines
 | |
| -------------------------------------------------------------------------------
 | |
| 
 | |
| function _G.copcall(f, ...)
 | |
|     return coxpcall(f, id, ...)
 | |
| end
 | |
| 
 | |
| return { pcall = copcall, xpcall = coxpcall, running = corunning }
 |