diff options
author | Lewis Russell <lewis6991@gmail.com> | 2024-04-19 16:04:57 +0100 |
---|---|---|
committer | Christian Clason <c.clason@uni-graz.at> | 2024-08-26 16:44:03 +0200 |
commit | 688b961d13bd54a14836f08c3ded3121d3fb15a0 (patch) | |
tree | b201413b8616abc42283545b146fb1492d56b861 /runtime/lua/vim/treesitter | |
parent | 664de5ea971440f24e3e7e3618786d01fbca6025 (diff) | |
download | rneovim-688b961d13bd54a14836f08c3ded3121d3fb15a0.tar.gz rneovim-688b961d13bd54a14836f08c3ded3121d3fb15a0.tar.bz2 rneovim-688b961d13bd54a14836f08c3ded3121d3fb15a0.zip |
feat(treesitter): add support for wasm parsers
Problem: Installing treesitter parser is hard (harder than
climbing to heaven).
Solution: Add optional support for wasm parsers with `wasmtime`.
Notes:
* Needs to be enabled by setting `ENABLE_WASMTIME` for tree-sitter and
Neovim. Build with
`make CMAKE_EXTRA_FLAGS=-DENABLE_WASMTIME=ON
DEPS_CMAKE_FLAGS=-DENABLE_WASMTIME=ON`
* Adds optional Rust (obviously) and C11 dependencies.
* Wasmtime comes with a lot of features that can negatively affect
Neovim performance due to library and symbol table size. Make sure to
build with minimal features and full LTO.
* To reduce re-compilation times, install `sccache` and build with
`RUSTC_WRAPPER=<path/to/sccache> make ...`
Diffstat (limited to 'runtime/lua/vim/treesitter')
-rw-r--r-- | runtime/lua/vim/treesitter/_meta.lua | 6 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/health.lua | 3 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/language.lua | 9 |
3 files changed, 16 insertions, 2 deletions
diff --git a/runtime/lua/vim/treesitter/_meta.lua b/runtime/lua/vim/treesitter/_meta.lua index 2aedf5754e..39d1f1f5f8 100644 --- a/runtime/lua/vim/treesitter/_meta.lua +++ b/runtime/lua/vim/treesitter/_meta.lua @@ -72,7 +72,11 @@ vim._ts_get_language_version = function() end --- @param path string --- @param lang string --- @param symbol_name? string -vim._ts_add_language = function(path, lang, symbol_name) end +vim._ts_add_language_from_object = function(path, lang, symbol_name) end + +--- @param path string +--- @param lang string +vim._ts_add_language_from_wasm = function(path, lang) end ---@return integer vim._ts_get_minimum_language_version = function() end diff --git a/runtime/lua/vim/treesitter/health.lua b/runtime/lua/vim/treesitter/health.lua index ed3616ef46..637f9ea543 100644 --- a/runtime/lua/vim/treesitter/health.lua +++ b/runtime/lua/vim/treesitter/health.lua @@ -28,6 +28,9 @@ function M.check() ) end end + + local can_wasm = vim._ts_add_language_from_wasm ~= nil + health.info(string.format('Can load WASM parsers: %s', tostring(can_wasm))) end return M diff --git a/runtime/lua/vim/treesitter/language.lua b/runtime/lua/vim/treesitter/language.lua index d0a74daa6c..e31ce6cb59 100644 --- a/runtime/lua/vim/treesitter/language.lua +++ b/runtime/lua/vim/treesitter/language.lua @@ -109,7 +109,14 @@ function M.add(lang, opts) path = paths[1] end - vim._ts_add_language(path, lang, symbol_name) + if vim.endswith(path, '.wasm') then + if not vim._ts_add_language_from_wasm then + error(string.format("Unable to load wasm parser '%s': not built with ENABLE_WASMTIME ", path)) + end + vim._ts_add_language_from_wasm(path, lang) + else + vim._ts_add_language_from_object(path, lang, symbol_name) + end M.register(lang, filetype) end |