Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-loader/src/grammar.rs')
| -rw-r--r-- | helix-loader/src/grammar.rs | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/helix-loader/src/grammar.rs b/helix-loader/src/grammar.rs index 343cc9b9..362d3ba0 100644 --- a/helix-loader/src/grammar.rs +++ b/helix-loader/src/grammar.rs @@ -9,7 +9,7 @@ use std::{ sync::mpsc::channel, }; use tempfile::TempPath; -use tree_sitter::Language; +use tree_house::tree_sitter::Grammar; #[cfg(unix)] const DYLIB_EXTENSION: &str = "so"; @@ -61,28 +61,21 @@ const BUILD_TARGET: &str = env!("BUILD_TARGET"); const REMOTE_NAME: &str = "origin"; #[cfg(target_arch = "wasm32")] -pub fn get_language(name: &str) -> Result<Language> { +pub fn get_language(name: &str) -> Result<Option<Grammar>> { unimplemented!() } #[cfg(not(target_arch = "wasm32"))] -pub fn get_language(name: &str) -> Result<Language> { - use libloading::{Library, Symbol}; +pub fn get_language(name: &str) -> Result<Option<Grammar>> { let mut rel_library_path = PathBuf::new().join("grammars").join(name); rel_library_path.set_extension(DYLIB_EXTENSION); let library_path = crate::runtime_file(&rel_library_path); + if !library_path.exists() { + return Ok(None); + } - let library = unsafe { Library::new(&library_path) } - .with_context(|| format!("Error opening dynamic library {:?}", library_path))?; - let language_fn_name = format!("tree_sitter_{}", name.replace('-', "_")); - let language = unsafe { - let language_fn: Symbol<unsafe extern "C" fn() -> Language> = library - .get(language_fn_name.as_bytes()) - .with_context(|| format!("Failed to load symbol {}", language_fn_name))?; - language_fn() - }; - std::mem::forget(library); - Ok(language) + let grammar = unsafe { Grammar::new(name, &library_path) }?; + Ok(Some(grammar)) } fn ensure_git_is_available() -> Result<()> { |