Skip to content

Commit

Permalink
feat: race symbol backends on first fetch (#177)
Browse files Browse the repository at this point in the history
  • Loading branch information
stevearc committed Oct 29, 2022
1 parent 9877a5c commit 45de4de
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 13 deletions.
35 changes: 28 additions & 7 deletions lua/aerial/backends/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,11 @@ end
---@param bufnr? integer
---@param backend? aerial.Backend
---@param name? string
---@param existing_backend_name? string
local function attach(bufnr, backend, name, existing_backend_name)
local function attach(bufnr, backend, name)
if not bufnr or bufnr == 0 then
bufnr = vim.api.nvim_get_current_buf()
end
local existing_backend_name = M.get_attached_backend(bufnr)
if not backend or not name or name == existing_backend_name then
return
end
Expand All @@ -96,7 +99,6 @@ local function attach(bufnr, backend, name, existing_backend_name)
end
set_backend(bufnr, name)
backend.attach(bufnr)
backend.fetch_symbols(bufnr)
if existing_backend_name then
M.get_backend_by_name(existing_backend_name).detach(bufnr)
else
Expand All @@ -107,7 +109,21 @@ local function attach(bufnr, backend, name, existing_backend_name)
local util = require("aerial.util")
local aer_bufnr = util.get_aerial_buffer(bufnr)
loading.set_loading(aer_bufnr, not data.has_received_data(bufnr))

-- On first attach, fetch symbols from ALL possible backends so that they will race and the
-- fastest provider will display symbols (instead of just waiting for the prioritized backend
-- to come back with symbols)
local candidates = config.backends(bufnr)
for _, candidate_name in ipairs(candidates) do
if name ~= candidate_name and M.is_supported(bufnr, candidate_name) then
local other_backend = M.get_backend_by_name(candidate_name)
if other_backend then
other_backend.fetch_symbols(bufnr)
end
end
end
end
backend.fetch_symbols(bufnr)
if not existing_backend_name and config.on_attach then
config.on_attach(bufnr)
end
Expand All @@ -123,14 +139,15 @@ M.get = function(bufnr)
end
local backend, name = get_best_backend(bufnr)
if backend and name then
attach(bufnr, backend, name, existing_backend_name)
attach(bufnr, backend, name)
end
return backend, name
end

---@param backend_name string
---@param bufnr? integer
---@param items aerial.Symbol[]
M.set_symbols = function(bufnr, items)
M.set_symbols = function(backend_name, bufnr, items)
if not bufnr or bufnr == 0 then
bufnr = vim.api.nvim_get_current_buf()
end
Expand All @@ -145,6 +162,11 @@ M.set_symbols = function(bufnr, items)
local window = require("aerial.window")

local had_symbols = data.has_symbols(bufnr)
-- Ignore symbols from non-attached backend IFF we already have symbols
if had_symbols and not M.is_backend_attached(bufnr, backend_name) then
return
end

data.set_symbols(bufnr, items)
loading.set_loading(util.get_aerial_buffer(bufnr), false)

Expand Down Expand Up @@ -192,9 +214,8 @@ end
---@param refresh? boolean
M.attach = function(bufnr, refresh)
if refresh then
local existing_backend_name = M.get_attached_backend(bufnr)
local backend, name = get_best_backend()
attach(bufnr, backend, name, existing_backend_name)
attach(bufnr, backend, name)
else
M.get(bufnr)
end
Expand Down
2 changes: 1 addition & 1 deletion lua/aerial/backends/lsp/callbacks.lua
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ local function process_symbols(symbols, bufnr)
end

M.handle_symbols = function(result, bufnr)
backends.set_symbols(bufnr, process_symbols(result, bufnr))
backends.set_symbols("lsp", bufnr, process_symbols(result, bufnr))
end

local function get_error_count(bufnr, client_id)
Expand Down
2 changes: 1 addition & 1 deletion lua/aerial/backends/man.lua
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ M.fetch_symbols_sync = function(bufnr)
prev_line = line
end
finalize_header()
backends.set_symbols(bufnr, items)
backends.set_symbols("man", bufnr, items)
end

M.fetch_symbols = M.fetch_symbols_sync
Expand Down
2 changes: 1 addition & 1 deletion lua/aerial/backends/markdown.lua
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ M.fetch_symbols_sync = function(bufnr)
end
-- This sets the proper end_lnum and end_col
extensions.markdown.postprocess_symbols(bufnr, items)
backends.set_symbols(bufnr, items)
backends.set_symbols("markdown", bufnr, items)
end

M.fetch_symbols = M.fetch_symbols_sync
Expand Down
6 changes: 3 additions & 3 deletions lua/aerial/backends/treesitter/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ M.fetch_symbols_sync = function(bufnr)
local parser = parsers.get_parser(bufnr)
local items = {}
if not parser then
backends.set_symbols(bufnr, items)
backends.set_symbols("treesitter", bufnr, items)
return
end
local lang = parser:lang()
local syntax_tree = parser:parse()[1]
if not query.has_query_files(lang, "aerial") or not syntax_tree then
backends.set_symbols(bufnr, items)
backends.set_symbols("treesitter", bufnr, items)
return
end
-- This will track a loose hierarchy of recent node+items.
Expand Down Expand Up @@ -115,7 +115,7 @@ M.fetch_symbols_sync = function(bufnr)
::continue::
end
ext.postprocess_symbols(bufnr, items)
backends.set_symbols(bufnr, items)
backends.set_symbols("treesitter", bufnr, items)
end

M.fetch_symbols = M.fetch_symbols_sync
Expand Down

0 comments on commit 45de4de

Please sign in to comment.