From a0d563172dc0818a62ebd836c363268c3c45bd35 Mon Sep 17 00:00:00 2001 From: simrat39 Date: Tue, 5 Oct 2021 22:46:53 -0700 Subject: [PATCH] refactor: Add a generic provider module In preperation for coc support --- lua/symbols-outline.lua | 22 ++++---------- lua/symbols-outline/providers/init.lua | 19 ++++++++++++ lua/symbols-outline/providers/markdown.lua | 15 ++++++++++ lua/symbols-outline/providers/nvim-lsp.lua | 35 ++++++++++++++++++++++ 4 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 lua/symbols-outline/providers/init.lua create mode 100644 lua/symbols-outline/providers/markdown.lua create mode 100644 lua/symbols-outline/providers/nvim-lsp.lua diff --git a/lua/symbols-outline.lua b/lua/symbols-outline.lua index b69858f..bc9cfa5 100644 --- a/lua/symbols-outline.lua +++ b/lua/symbols-outline.lua @@ -1,12 +1,12 @@ local vim = vim local parser = require('symbols-outline.parser') +local providers = require('symbols-outline.providers.init') local ui = require('symbols-outline.ui') local writer = require('symbols-outline.writer') local config = require('symbols-outline.config') local lsp_utils = require('symbols-outline.utils.lsp_utils') local utils = require('symbols-outline.utils.init') -local markdown = require('symbols-outline.markdown') local view = require('symbols-outline.view') local M = {} @@ -29,10 +29,6 @@ local function setup_buffer_autocmd() end -local function getParams() - return {textDocument = vim.lsp.util.make_text_document_params()} -end - ------------------------- -- STATE ------------------------- @@ -48,7 +44,7 @@ local function wipe_state() M.state = {outline_items = {}, flattened_outline_items = {}} end -local function __refresh () +local function __refresh() if M.state.outline_buf ~= nil then local function refresh_handler(response) if response == nil or type(response) ~= 'table' then @@ -70,11 +66,7 @@ local function __refresh () M.state.flattened_outline_items) end - if vim.api.nvim_buf_get_option(0, 'ft') == 'markdown' then - refresh_handler(markdown.handle_markdown()) - end - vim.lsp.buf_request_all(0, "textDocument/documentSymbol", getParams(), - refresh_handler) + providers.request_symbols(refresh_handler) end end @@ -195,16 +187,12 @@ end function M.open_outline() if M.state.outline_buf == nil then - if vim.api.nvim_buf_get_option(0, 'ft') == 'markdown' then - handler(markdown.handle_markdown()) - end - vim.lsp.buf_request_all(0, "textDocument/documentSymbol", getParams(), - handler) + providers.request_symbols(handler) end end function M.close_outline() - if M.state.outline_buf ~= nil then + if M.state.outline_buf then vim.api.nvim_win_close(M.state.outline_win, true) end end diff --git a/lua/symbols-outline/providers/init.lua b/lua/symbols-outline/providers/init.lua new file mode 100644 index 0000000..8a39b8f --- /dev/null +++ b/lua/symbols-outline/providers/init.lua @@ -0,0 +1,19 @@ +local M = {} + +local providers = { + 'symbols-outline/providers/nvim-lsp', + 'symbols-outline/providers/markdown' +} + +---@param on_symbols function +function M.request_symbols(on_symbols) + for _, value in ipairs(providers) do + local provider = require(value) + if provider.should_use_provider(0) then + provider.request_symbols(on_symbols) + break + end + end +end + +return M diff --git a/lua/symbols-outline/providers/markdown.lua b/lua/symbols-outline/providers/markdown.lua new file mode 100644 index 0000000..441c6c3 --- /dev/null +++ b/lua/symbols-outline/providers/markdown.lua @@ -0,0 +1,15 @@ +local md_parser = require('symbols-outline.markdown') + +local M = {} + +-- probably change this +function M.should_use_provider(bufnr) + return vim.api.nvim_buf_get_option(bufnr, 'ft') == 'markdown' +end + +---@param on_symbols function +function M.request_symbols(on_symbols) + on_symbols(md_parser.handle_markdown()) +end + +return M diff --git a/lua/symbols-outline/providers/nvim-lsp.lua b/lua/symbols-outline/providers/nvim-lsp.lua new file mode 100644 index 0000000..0ab7c00 --- /dev/null +++ b/lua/symbols-outline/providers/nvim-lsp.lua @@ -0,0 +1,35 @@ +local config = require('symbols-outline.config') + +local M = {} + +local function getParams() + return {textDocument = vim.lsp.util.make_text_document_params()} +end + +-- probably change this +function M.should_use_provider(bufnr) + local clients = vim.lsp.buf_get_clients(bufnr) + local ret = false + + for id, client in ipairs(clients) do + if config.is_client_blacklisted(id) then + goto continue + else + if client.server_capabilities.documentSymbolProvider then + ret = true + break + end + end + ::continue:: + end + + return ret +end + +---@param on_symbols function +function M.request_symbols(on_symbols) + vim.lsp.buf_request_all(0, "textDocument/documentSymbol", getParams(), + on_symbols) +end + +return M