mirror of
https://github.com/neovim/neovim.git
synced 2026-01-04 10:26:42 +10:00
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 ...`
This commit is contained in:
committed by
Christian Clason
parent
664de5ea97
commit
688b961d13
@@ -51,6 +51,13 @@ treesitter parser for buffers with filetype `svg` or `xslt`, use: >lua
|
||||
|
||||
vim.treesitter.language.register('xml', { 'svg', 'xslt' })
|
||||
<
|
||||
*treesitter-parsers-wasm*
|
||||
|
||||
If Nvim is built with `ENABLE_WASMTIME`, then wasm parsers can also be
|
||||
loaded: >lua
|
||||
|
||||
vim.treesitter.language.add('python', { path = "/path/to/python.wasm" })
|
||||
<
|
||||
|
||||
==============================================================================
|
||||
TREESITTER TREES *treesitter-tree*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user