feat: Symbol filtering config structure

This commit introduces a basic framework for symbol filtering in
outline.nvim, where users can set per-filetype kinds to filter - include
or exclude for each filetype.

As a side effect the checking of symbol inclusion function has been
improved to O(1) time-complexity (previously O(n)). You can see this
from types/outline.lua and config.lua: a lookup table is used to check
if a kind is filtered, rather than looping through a list each time.
Former takes O(1) for lookup whereas the old implementation would be
O(n) for *each* node!

The old symbols.blacklist option *still works as expected*.

The schema for the new confit is detailed in #23 and types/outline.lua.
By the way, this commit also closes #23.

These should equivalent:
    symbols.blacklist = { 'Function', 'Method' }
    symbols.filter = { 'Function', 'Method', exclude=true }
    symbols.filter = {
      ['*'] = { 'Function', 'Method', exclude=true }
    }

And these should be equivalent:
    symbols.blacklist = {}
    symbols.filter = false
    symbols.filter = nil
    symbols.filter = { ['*'] = false }
    symbols.filter = { ['*'] = { exclude = true } }
    symbols.filter = { exclude = true }

The last two of which could be considered unidiomatic.

When multiple filetypes are specified, filetype specific filters
are NOT merged with the default ('*') filter, they are independent. If a
filetype is used, the default filter is not considered. The default
filter is only considered if a filetype filter for the given buffer is
not provided.

LIMITATIONS:
This is carried over from the implementation from symbols-outline:
filters can only be applied to parents at the moment. I.e.: If some node
has a kind that is excluded, all its children will NOT be considered.

Filters are only applied to children if its parent was not excluded
during filtering.

Also extracted all types into types module, and updated conversion
script to use the new symbols.filter opt.

NOTE:
On outline open it appears that parsing functions are called twice?
I should definitely add tests soon.
This commit is contained in:
hedy
2023-11-16 21:21:55 +08:00
parent 5278eb5b2b
commit 24680f13f7
7 changed files with 244 additions and 80 deletions

View File

@@ -33,14 +33,15 @@ local your_new_opts = --[[put the cursor on this line]] {
---------------------------------------------------------------------
----- BEGIN SCRIPT --------------------------------------------------
---------------------------------------------------------------------
local newopts = {}
local newopts = { symbols = {} }
if opts.symbols or opts.symbol_blacklist then
newopts.symbols = {
icons = opts.symbols,
blacklist = opts.symbol_blacklist,
}
if opts.symbols then
newopts.symbols.icons = opts.symbols
opts.symbols = nil
end
if opts.symbol_blacklist then
newopts.symbols.filter = opts.symbol_blacklist
newopts.symbols.filter.exclude = true
opts.symbol_blacklist = nil
end
@@ -109,7 +110,7 @@ if opts and next(opts) ~= nil then
end
end
for _, v in ipairs({'outline_items', 'outline_window', 'preview_window'}) do
for _, v in ipairs({'outline_items', 'outline_window', 'preview_window', 'symbols'}) do
if newopts[v] and next(newopts[v]) == nil then
newopts[v] = nil
end