aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjdrouhard <john@drouhard.dev>2022-12-12 11:42:37 -0600
committerGitHub <noreply@github.com>2022-12-12 18:42:37 +0100
commit3869a2e0cf25323a8e5235840678b147ca908517 (patch)
treeaf9b075afa852407ea73465838fb667a3482db88
parentd40d34aaa5720b67da629b4ca74674dfd4b9221c (diff)
downloadrneovim-3869a2e0cf25323a8e5235840678b147ca908517.tar.gz
rneovim-3869a2e0cf25323a8e5235840678b147ca908517.tar.bz2
rneovim-3869a2e0cf25323a8e5235840678b147ca908517.zip
perf(lsp): update semantic tokens algorithm for parsing modifiers (#21383)
Instead of testing for every possible modifier type, only test bits up to the highest set in the token array. Saves many bit ops and comparisons when there are no modifiers or when the highest set bit is a lower bit than the highest possible in the legend on average. Can be further simplified when non-luaJIT gets the full bit module (see #21222)
-rw-r--r--runtime/lua/vim/lsp/semantic_tokens.lua26
-rw-r--r--test/functional/plugin/lsp/semantic_tokens_spec.lua23
2 files changed, 13 insertions, 36 deletions
diff --git a/runtime/lua/vim/lsp/semantic_tokens.lua b/runtime/lua/vim/lsp/semantic_tokens.lua
index 11e62ee793..f06d136801 100644
--- a/runtime/lua/vim/lsp/semantic_tokens.lua
+++ b/runtime/lua/vim/lsp/semantic_tokens.lua
@@ -55,22 +55,22 @@ end
---@private
---@return string[]
local function modifiers_from_number(x, modifiers_table)
- ---@private
- local function _get_bit(n, k)
- --TODO(jdrouhard): remove once `bit` module is available for non-LuaJIT
+ local modifiers = {}
+ local idx = 1
+ while x > 0 do
if _G.bit then
- return _G.bit.band(_G.bit.rshift(n, k), 1)
+ if _G.bit.band(x, 1) == 1 then
+ modifiers[#modifiers + 1] = modifiers_table[idx]
+ end
+ x = _G.bit.rshift(x, 1)
else
- return math.floor((n / math.pow(2, k)) % 2)
- end
- end
-
- local modifiers = {}
- for i = 0, #modifiers_table - 1 do
- local b = _get_bit(x, i)
- if b == 1 then
- modifiers[#modifiers + 1] = modifiers_table[i + 1]
+ --TODO(jdrouhard): remove this branch once `bit` module is available for non-LuaJIT (#21222)
+ if x % 2 == 1 then
+ modifiers[#modifiers + 1] = modifiers_table[idx]
+ end
+ x = math.floor(x / 2)
end
+ idx = idx + 1
end
return modifiers
diff --git a/test/functional/plugin/lsp/semantic_tokens_spec.lua b/test/functional/plugin/lsp/semantic_tokens_spec.lua
index 7a5494e9a5..e87e2a3334 100644
--- a/test/functional/plugin/lsp/semantic_tokens_spec.lua
+++ b/test/functional/plugin/lsp/semantic_tokens_spec.lua
@@ -459,29 +459,6 @@ describe('semantic token highlighting', function()
{1:~ }|
|
]] }
-
- exec_lua([[
- vim.lsp.semantic_tokens.start(bufnr, client_id)
- ]])
-
- screen:expect { grid = [[
- #include <iostream> |
- |
- int main() |
- { |
- int x; |
- #ifdef __cplusplus |
- std::cout << x << "\n"; |
- #else |
- printf("%d\n", x); |
- #endif |
- } |
- ^} |
- {1:~ }|
- {1:~ }|
- {1:~ }|
- |
- ]], unchanged = true }
end)
it('does not send delta requests if not supported by server', function()