summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authoroberblastmeister <61095988+oberblastmeister@users.noreply.github.com>2021-04-13 14:39:14 -0400
committerGitHub <noreply@github.com>2021-04-13 14:39:14 -0400
commit253d3aaa6b43eac6b11341b325e34d37dc459af3 (patch)
treef2e4c02ffcc6a6f6019d7fb1f605f08d31544a4d /lua
parent5bd6f5ca9828ea02f2c54d616ad65c72a5cdd7fb (diff)
added a new DynamicFinder (which can be used with rust_analyzer) (#705)
* started tree finder * made tree more ergonmic * deleted unneeded comments * added stack root and node * added preprocessing * using staticfinder instead of separate finder, custom entry maker * added selections and remember * removed unused stuff * fixed warnings * fixed remember and selections pop * started branch * added go function * changed up test * removed root parameter from go function * changed back to not do_close * removed node and leaf classes * removed stack class instead for table.insert and table.remove * fixed warning * started branch * added better preprocessor and tree class * started some tests * finished making tests pass * cleaned up * fixed make entry and updated example * started * added some stuff * deleted uneeded stuff * added cancelable * changed workspace requester * use better cancellation mechanism * removed accidental stuff * removed useless print * delete more useless stuff * rename to dynamic * added request cancellation * CHECK IF NIL * removed unused * added trash global variable
Diffstat (limited to 'lua')
-rw-r--r--lua/telescope/builtin/init.lua2
-rw-r--r--lua/telescope/builtin/lsp.lua33
-rw-r--r--lua/telescope/finders.lua36
3 files changed, 70 insertions, 1 deletions
diff --git a/lua/telescope/builtin/init.lua b/lua/telescope/builtin/init.lua
index 2b3c1ca..b9cc99f 100644
--- a/lua/telescope/builtin/init.lua
+++ b/lua/telescope/builtin/init.lua
@@ -40,6 +40,7 @@ builtin.git_branches = require('telescope.builtin.git').branches
builtin.git_status = require('telescope.builtin.git').status
builtin.builtin = require('telescope.builtin.internal').builtin
+
builtin.planets = require('telescope.builtin.internal').planets
builtin.symbols = require('telescope.builtin.internal').symbols
builtin.commands = require('telescope.builtin.internal').commands
@@ -70,5 +71,6 @@ builtin.lsp_document_diagnostics = require('telescope.builtin.lsp').diagnostics
builtin.lsp_workspace_diagnostics = require('telescope.builtin.lsp').workspace_diagnostics
builtin.lsp_range_code_actions = require('telescope.builtin.lsp').range_code_actions
builtin.lsp_workspace_symbols = require('telescope.builtin.lsp').workspace_symbols
+builtin.lsp_dynamic_workspace_symbols = require('telescope.builtin.lsp').dynamic_workspace_symbols
return builtin
diff --git a/lua/telescope/builtin/lsp.lua b/lua/telescope/builtin/lsp.lua
index 741eb36..b2ab981 100644
--- a/lua/telescope/builtin/lsp.lua
+++ b/lua/telescope/builtin/lsp.lua
@@ -4,6 +4,9 @@ local finders = require('telescope.finders')
local make_entry = require('telescope.make_entry')
local pickers = require('telescope.pickers')
local utils = require('telescope.utils')
+local a = require('plenary.async_lib')
+local async, await = a.async, a.await
+local channel = a.util.channel
local conf = require('telescope.config').values
@@ -218,6 +221,36 @@ lsp.workspace_symbols = function(opts)
}):find()
end
+local function get_workspace_symbols_requester(bufnr)
+ local cancel = function() end
+
+ return async(function(prompt)
+ local tx, rx = channel.oneshot()
+ cancel()
+ _, cancel = vim.lsp.buf_request(bufnr, "workspace/symbol", {query = prompt}, tx)
+
+ local err, _, results_lsp = await(rx())
+ assert(not err, err)
+
+ local locations = vim.lsp.util.symbols_to_items(results_lsp or {}, bufnr) or {}
+ return locations
+ end)
+end
+
+lsp.dynamic_workspace_symbols = function(opts)
+ local curr_bufnr = vim.api.nvim_get_current_buf()
+
+ pickers.new(opts, {
+ prompt_title = 'LSP Dynamic Workspace Symbols',
+ finder = finders.new_dynamic {
+ entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts),
+ fn = get_workspace_symbols_requester(curr_bufnr),
+ },
+ previewer = conf.qflist_previewer(opts),
+ sorter = conf.generic_sorter()
+ }):find()
+end
+
lsp.diagnostics = function(opts)
local locations = utils.diagnostics_to_tbl(opts)
diff --git a/lua/telescope/finders.lua b/lua/telescope/finders.lua
index d2acd05..62c05a1 100644
--- a/lua/telescope/finders.lua
+++ b/lua/telescope/finders.lua
@@ -2,6 +2,8 @@ local Job = require('plenary.job')
local make_entry = require('telescope.make_entry')
local log = require('telescope.log')
+local a = require('plenary.async_lib')
+local await = a.await
local async_static_finder = require('telescope.finders.async_static_finder')
local async_oneshot_finder = require('telescope.finders.async_oneshot_finder')
@@ -20,7 +22,6 @@ local _callable_obj = function()
return obj
end
-
--[[ =============================================================
JobFinder
@@ -108,6 +109,35 @@ function JobFinder:_find(prompt, process_result, process_complete)
self.job:start()
end
+local DynamicFinder = _callable_obj()
+
+function DynamicFinder:new(opts)
+ opts = opts or {}
+
+ assert(not opts.results, "`results` should be used with finder.new_table")
+ assert(not opts.static, "`static` should be used with finder.new_oneshot_job")
+
+ local obj = setmetatable({
+ curr_buf = opts.curr_buf,
+ fn = opts.fn,
+ entry_maker = opts.entry_maker or make_entry.from_string,
+ }, self)
+
+ return obj
+end
+
+function DynamicFinder:_find(prompt, process_result, process_complete)
+ a.scope(function()
+ local results = await(self.fn(prompt))
+
+ for _, result in ipairs(results) do
+ if process_result(self.entry_maker(result)) then return end
+ end
+
+ process_complete()
+ end)
+end
+
--- Return a new Finder
--
-- Use at your own risk.
@@ -185,4 +215,8 @@ finders.new_table = function(t)
return async_static_finder(t)
end
+finders.new_dynamic = function(t)
+ return DynamicFinder:new(t)
+end
+
return finders