Skip to content

Commit 9ab8675

Browse files
NullVoxPopuliclaude
andcommitted
rust: bump tree-sitter to 0.25 and adopt LanguageFn pattern
The Rust binding was pinning tree-sitter = "~0.20.10", which only supports parser ABI 13. The regenerated parser.c declares LANGUAGE_VERSION 15, so loading the grammar at runtime panicked with `LanguageError { version: 15 }` in the bindings test. Switch to the modern convention used by tree-sitter-typescript and other maintained parser crates: - `tree-sitter-language = "0.1"` as the runtime dep (provides LanguageFn) - `tree-sitter = "0.25"` as a dev-dep for the bindings test (supports ABI 15) - `extern fn tree_sitter_glimmer_javascript() -> *const ()` returns the opaque language pointer; wrap with `LanguageFn::from_raw` and expose as `pub const LANGUAGE` - doctest and unit test go through `parser.set_language(&LANGUAGE.into())` Crate name, version, description, repository, edition, and include list are left untouched so the published `tree-sitter-glimmer_javascript@0.0.1` identifier is unaffected. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 9291fd4 commit 9ab8675

2 files changed

Lines changed: 22 additions & 24 deletions

File tree

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ include = [
2020
path = "bindings/rust/lib.rs"
2121

2222
[dependencies]
23-
tree-sitter = "~0.20.10"
23+
tree-sitter-language = "0.1"
2424

2525
[build-dependencies]
2626
cc = "1.0"
27+
28+
[dev-dependencies]
29+
tree-sitter = "0.25"

bindings/rust/lib.rs

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,47 @@
1-
//! This crate provides glimmer_javascript language support for the [tree-sitter][] parsing library.
1+
//! This crate provides Glimmer-flavored JavaScript language support for the
2+
//! [tree-sitter][] parsing library.
23
//!
3-
//! Typically, you will use the [language][language func] function to add this language to a
4+
//! Typically, you will use the [LANGUAGE] constant to add this language to a
45
//! tree-sitter [Parser][], and then use the parser to parse some code:
56
//!
67
//! ```
7-
//! let code = "";
8-
//! let mut parser = tree_sitter::Parser::new();
9-
//! parser.set_language(tree_sitter_glimmer_javascript::language()).expect("Error loading glimmer_javascript grammar");
8+
//! use tree_sitter::Parser;
9+
//!
10+
//! let code = "const x = 1;";
11+
//! let mut parser = Parser::new();
12+
//! parser
13+
//! .set_language(&tree_sitter_glimmer_javascript::LANGUAGE.into())
14+
//! .expect("Error loading glimmer_javascript parser");
1015
//! let tree = parser.parse(code, None).unwrap();
16+
//! assert!(!tree.root_node().has_error());
1117
//! ```
1218
//!
13-
//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
14-
//! [language func]: fn.language.html
1519
//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html
1620
//! [tree-sitter]: https://tree-sitter.github.io/
1721
18-
use tree_sitter::Language;
22+
use tree_sitter_language::LanguageFn;
1923

2024
extern "C" {
21-
fn tree_sitter_glimmer_javascript() -> Language;
25+
fn tree_sitter_glimmer_javascript() -> *const ();
2226
}
2327

24-
/// Get the tree-sitter [Language][] for this grammar.
28+
/// The tree-sitter [`LanguageFn`] for Glimmer-flavored JavaScript.
2529
///
26-
/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
27-
pub fn language() -> Language {
28-
unsafe { tree_sitter_glimmer_javascript() }
29-
}
30+
/// [LanguageFn]: https://docs.rs/tree-sitter-language/*/tree_sitter_language/struct.LanguageFn.html
31+
pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_glimmer_javascript) };
3032

3133
/// The content of the [`node-types.json`][] file for this grammar.
3234
///
3335
/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
34-
pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json");
35-
36-
// Uncomment these to include any queries that this grammar contains
37-
38-
// pub const HIGHLIGHTS_QUERY: &'static str = include_str!("../../queries/highlights.scm");
39-
// pub const INJECTIONS_QUERY: &'static str = include_str!("../../queries/injections.scm");
40-
// pub const LOCALS_QUERY: &'static str = include_str!("../../queries/locals.scm");
41-
// pub const TAGS_QUERY: &'static str = include_str!("../../queries/tags.scm");
36+
pub const NODE_TYPES: &str = include_str!("../../src/node-types.json");
4237

4338
#[cfg(test)]
4439
mod tests {
4540
#[test]
4641
fn test_can_load_grammar() {
4742
let mut parser = tree_sitter::Parser::new();
4843
parser
49-
.set_language(super::language())
44+
.set_language(&super::LANGUAGE.into())
5045
.expect("Error loading glimmer_javascript language");
5146
}
5247
}

0 commit comments

Comments
 (0)