90 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local copilot = {}
 | |
| 
 | |
| local showDocument = function(err, result, ctx, _)
 | |
|   local fallback = vim.lsp.handlers['window/showDocument']
 | |
|   if not fallback or (result.external and vim.g.copilot_browser) then
 | |
|     return vim.fn['copilot#handlers#window_showDocument'](result)
 | |
|   else
 | |
|     return fallback(err, result, ctx, _)
 | |
|   end
 | |
| end
 | |
| 
 | |
| copilot.lsp_start_client = function(cmd, handler_names, opts, settings)
 | |
|   local handlers = {['window/showDocument'] = showDocument}
 | |
|   local id
 | |
|   for _, name in ipairs(handler_names) do
 | |
|     handlers[name] = function(err, result, ctx, _)
 | |
|       if result then
 | |
|         local retval = vim.call('copilot#client#LspHandle', id, { method = name, params = result })
 | |
|         if type(retval) == 'table' then
 | |
|           return retval.result, retval.error
 | |
|         elseif vim.lsp.handlers[name] then
 | |
|           return vim.lsp.handlers[name](err, result, ctx, _)
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
|   local workspace_folders = opts.workspaceFolders
 | |
|   if #workspace_folders == 0 then
 | |
|     workspace_folders = nil
 | |
|   end
 | |
|   id = vim.lsp.start_client({
 | |
|     cmd = cmd,
 | |
|     cmd_cwd = vim.call('copilot#job#Cwd'),
 | |
|     name = 'GitHub Copilot',
 | |
|     init_options = opts.initializationOptions,
 | |
|     workspace_folders = workspace_folders,
 | |
|     settings = settings,
 | |
|     handlers = handlers,
 | |
|     on_init = function(client, initialize_result)
 | |
|       vim.call('copilot#client#LspInit', client.id, initialize_result)
 | |
|       if vim.fn.has('nvim-0.8') == 0 then
 | |
|         client.notify('workspace/didChangeConfiguration', { settings = settings })
 | |
|       end
 | |
|     end,
 | |
|     on_exit = function(code, signal, client_id)
 | |
|       vim.schedule(function()
 | |
|         vim.call('copilot#client#LspExit', client_id, code, signal)
 | |
|       end)
 | |
|     end,
 | |
|   })
 | |
|   return id
 | |
| end
 | |
| 
 | |
| copilot.lsp_request = function(client_id, method, params, bufnr)
 | |
|   local client = vim.lsp.get_client_by_id(client_id)
 | |
|   if not client then
 | |
|     return
 | |
|   end
 | |
|   if bufnr == vim.NIL then
 | |
|     bufnr = nil
 | |
|   end
 | |
|   local _, id
 | |
|   _, id = client.request(method, params, function(err, result)
 | |
|     vim.call('copilot#client#LspResponse', client_id, { id = id, error = err, result = result })
 | |
|   end, bufnr)
 | |
|   return id
 | |
| end
 | |
| 
 | |
| copilot.rpc_request = function(client_id, method, params)
 | |
|   local client = vim.lsp.get_client_by_id(client_id)
 | |
|   if not client then
 | |
|     return
 | |
|   end
 | |
|   local _, id
 | |
|   _, id = client.rpc.request(method, params, function(err, result)
 | |
|     vim.call('copilot#client#LspResponse', client_id, { id = id, error = err, result = result })
 | |
|   end)
 | |
|   return id
 | |
| end
 | |
| 
 | |
| copilot.rpc_notify = function(client_id, method, params)
 | |
|   local client = vim.lsp.get_client_by_id(client_id)
 | |
|   if not client then
 | |
|     return
 | |
|   end
 | |
|   return client.rpc.notify(method, params)
 | |
| end
 | |
| 
 | |
| return copilot
 | 
