aboutsummaryrefslogtreecommitdiff
path: root/.config/nvim/lsp/denols.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/lsp/denols.lua')
-rw-r--r--.config/nvim/lsp/denols.lua111
1 files changed, 111 insertions, 0 deletions
diff --git a/.config/nvim/lsp/denols.lua b/.config/nvim/lsp/denols.lua
new file mode 100644
index 0000000..8c051fb
--- /dev/null
+++ b/.config/nvim/lsp/denols.lua
@@ -0,0 +1,111 @@
+---@brief
+---
+--- https://github.com/denoland/deno
+---
+--- Deno's built-in language server
+---
+--- To appropriately highlight codefences returned from denols, you will need to augment vim.g.markdown_fenced languages
+--- in your init.lua. Example:
+---
+--- ```lua
+--- vim.g.markdown_fenced_languages = {
+--- "ts=typescript"
+--- }
+--- ```
+
+local lsp = vim.lsp
+
+local function virtual_text_document_handler(uri, res, client)
+ if not res then
+ return nil
+ end
+
+ local lines = vim.split(res.result, '\n')
+ local bufnr = vim.uri_to_bufnr(uri)
+
+ local current_buf = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)
+ if #current_buf ~= 0 then
+ return nil
+ end
+
+ vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
+ vim.api.nvim_set_option_value('readonly', true, { buf = bufnr })
+ vim.api.nvim_set_option_value('modified', false, { buf = bufnr })
+ vim.api.nvim_set_option_value('modifiable', false, { buf = bufnr })
+ lsp.buf_attach_client(bufnr, client.id)
+end
+
+local function virtual_text_document(uri, client)
+ local params = {
+ textDocument = {
+ uri = uri,
+ },
+ }
+ local result = client:request_sync('deno/virtualTextDocument', params)
+ virtual_text_document_handler(uri, result, client)
+end
+
+local function denols_handler(err, result, ctx, config)
+ if not result or vim.tbl_isempty(result) then
+ return nil
+ end
+
+ local client = vim.lsp.get_client_by_id(ctx.client_id)
+ for _, res in pairs(result) do
+ local uri = res.uri or res.targetUri
+ if uri:match '^deno:' then
+ virtual_text_document(uri, client)
+ res['uri'] = uri
+ res['targetUri'] = uri
+ end
+ end
+
+ lsp.handlers[ctx.method](err, result, ctx, config)
+end
+
+---@type vim.lsp.Config
+return {
+ cmd = { 'deno', 'lsp' },
+ cmd_env = { NO_COLOR = true },
+ filetypes = {
+ 'javascript',
+ 'javascriptreact',
+ 'javascript.jsx',
+ 'typescript',
+ 'typescriptreact',
+ 'typescript.tsx',
+ },
+ root_markers = { 'deno.json', 'deno.jsonc', '.git' },
+ settings = {
+ deno = {
+ enable = true,
+ suggest = {
+ imports = {
+ hosts = {
+ ['https://deno.land'] = true,
+ },
+ },
+ },
+ },
+ },
+ handlers = {
+ ['textDocument/definition'] = denols_handler,
+ ['textDocument/typeDefinition'] = denols_handler,
+ ['textDocument/references'] = denols_handler,
+ },
+ on_attach = function(client, bufnr)
+ vim.api.nvim_buf_create_user_command(bufnr, 'LspDenolsCache', function()
+ client:exec_cmd({
+ command = 'deno.cache',
+ arguments = { {}, vim.uri_from_bufnr(bufnr) },
+ }, { bufnr = bufnr }, function(err, _, ctx)
+ if err then
+ local uri = ctx.params.arguments[2]
+ vim.notify('cache command failed for' .. vim.uri_to_fname(uri), vim.log.levels.ERROR)
+ end
+ end)
+ end, {
+ desc = 'Cache a module and all of its dependencies.',
+ })
+ end,
+}