Skip to content

Commit b2f3e44

Browse files
committed
feat: locateFile for nodejs
1 parent 570be1b commit b2f3e44

File tree

1 file changed

+15
-21
lines changed
  • crates/web-tree-sitter-sg/src

1 file changed

+15
-21
lines changed

crates/web-tree-sitter-sg/src/lib.rs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use core::cell::RefCell;
66
use js_sys::{Array, Error, Function, JsString, Object, Promise, Reflect, Uint8Array};
7-
use wasm_bindgen::{prelude::*, JsCast};
7+
use wasm_bindgen::{JsCast, prelude::*};
88
use wasm_bindgen_futures::JsFuture;
99

1010
trait JsValueExt {
@@ -41,27 +41,27 @@ thread_local! {
4141
pub struct TreeSitter;
4242

4343
impl TreeSitter {
44-
pub async fn init() -> Result<(), JsError> {
44+
pub async fn init(locate_file: Option<Function>) -> Result<(), JsError> {
4545
#![allow(non_snake_case)]
4646

4747
// Exit early if `web-tree-sitter` is already initialized
4848
if TREE_SITTER_INITIALIZED.with(|cell| *cell.borrow()) {
4949
return Ok(());
5050
}
5151

52-
JsFuture::from(Parser::init()).await.lift_error()?;
52+
if let Some(locate_file) = locate_file {
53+
let options = Object::new();
54+
Reflect::set(&options, &"locateFile".into(), &locate_file.into()).unwrap();
55+
JsFuture::from(Parser::init(Some(&options))).await.lift_error()?;
56+
} else {
57+
JsFuture::from(Parser::init(None)).await.lift_error()?;
58+
}
5359

5460
// Set `web-tree-sitter` to initialized
5561
TREE_SITTER_INITIALIZED.with(|cell| cell.replace(true));
5662

5763
Ok(())
5864
}
59-
60-
fn init_guard() {
61-
if !TREE_SITTER_INITIALIZED.with(|cell| *cell.borrow()) {
62-
wasm_bindgen::throw_str("TreeSitter::init must be called to initialize the library");
63-
}
64-
}
6565
}
6666

6767
#[wasm_bindgen]
@@ -154,7 +154,7 @@ extern {
154154
fn delete(this: &LoggerParams, val: &JsString);
155155
}
156156

157-
#[wasm_bindgen(module="web-tree-sitter")]
157+
#[wasm_bindgen(module = "web-tree-sitter")]
158158
extern {
159159
#[derive(Clone, Debug, PartialEq)]
160160
pub type Language;
@@ -204,15 +204,13 @@ extern {
204204

205205
impl Language {
206206
pub async fn load_bytes(bytes: &Uint8Array) -> Result<Language, LanguageError> {
207-
TreeSitter::init_guard();
208207
JsFuture::from(Language::__load_bytes(bytes))
209208
.await
210209
.map(JsCast::unchecked_into)
211210
.map_err(JsCast::unchecked_into)
212211
}
213212

214213
pub async fn load_path(path: &str) -> Result<Language, LanguageError> {
215-
TreeSitter::init_guard();
216214
JsFuture::from(Language::__load_path(path))
217215
.await
218216
.map(JsCast::unchecked_into)
@@ -292,8 +290,7 @@ impl Default for Point {
292290
}
293291
}
294292

295-
impl Eq for Point {
296-
}
293+
impl Eq for Point {}
297294

298295
impl std::hash::Hash for Point {
299296
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
@@ -538,8 +535,7 @@ impl Default for Range {
538535
}
539536
}
540537

541-
impl Eq for Range {
542-
}
538+
impl Eq for Range {}
543539

544540
impl std::hash::Hash for Range {
545541
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
@@ -743,8 +739,7 @@ impl PartialEq<SyntaxNode> for SyntaxNode {
743739
}
744740
}
745741

746-
impl Eq for SyntaxNode {
747-
}
742+
impl Eq for SyntaxNode {}
748743

749744
impl std::hash::Hash for SyntaxNode {
750745
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
@@ -850,14 +845,14 @@ extern {
850845
pub fn reset(this: &TreeCursor, node: &SyntaxNode);
851846
}
852847

853-
#[wasm_bindgen(module="web-tree-sitter")]
848+
#[wasm_bindgen(module = "web-tree-sitter")]
854849
extern {
855850
#[derive(Clone, Debug)]
856851
pub type Parser;
857852

858853
// Static Methods
859854
#[wasm_bindgen(static_method_of = Parser)]
860-
pub fn init() -> Promise;
855+
pub fn init(options: Option<&Object>) -> Promise;
861856

862857
// Constructor
863858

@@ -905,7 +900,6 @@ extern {
905900

906901
impl Parser {
907902
pub fn new() -> Result<Parser, ParserError> {
908-
TreeSitter::init_guard();
909903
let result = Parser::__new()?;
910904
Ok(result)
911905
}

0 commit comments

Comments
 (0)