diff --git a/Cargo.lock b/Cargo.lock index a71e64ec..a3650da3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -141,7 +141,7 @@ dependencies = [ "smallvec", "tempfile", "tokio", - "tree-sitter-facade-sg", + "tree-sitter", ] [[package]] @@ -166,7 +166,7 @@ dependencies = [ "bit-set", "regex", "thiserror", - "tree-sitter-facade-sg", + "tree-sitter", "tree-sitter-typescript", ] @@ -190,13 +190,13 @@ dependencies = [ "ast-grep-core", "ignore", "serde", + "tree-sitter", "tree-sitter-bash", "tree-sitter-c", "tree-sitter-c-sharp", "tree-sitter-cpp", "tree-sitter-css", "tree-sitter-elixir", - "tree-sitter-facade-sg", "tree-sitter-go", "tree-sitter-haskell", "tree-sitter-html", @@ -242,7 +242,7 @@ dependencies = [ "napi-build", "napi-derive", "serde_json", - "tree-sitter-facade-sg", + "tree-sitter", ] [[package]] @@ -996,7 +996,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a793df0d7afeac54f95b471d3af7f0d4fb975699f972341a4b76988d49cdf0c" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -1880,9 +1880,9 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.25.3" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ac5ea5e7f2f1700842ec071401010b9c59bf735295f6e9fa079c3dc035b167" +checksum = "69aff09fea9a41fb061ae6b206cb87cac1b8db07df31be3ba271fbc26760f213" dependencies = [ "cc", "regex", @@ -1952,20 +1952,6 @@ dependencies = [ "tree-sitter-language", ] -[[package]] -name = "tree-sitter-facade-sg" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b456912926c4079fb0e6d26e4282a588f93857fbb4d79e29c5eb1244b7100d55" -dependencies = [ - "js-sys", - "tree-sitter", - "tree-sitter-language", - "wasm-bindgen", - "web-sys", - "web-tree-sitter-sg", -] - [[package]] name = "tree-sitter-go" version = "0.23.4" @@ -2234,19 +2220,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.100" @@ -2289,17 +2262,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-tree-sitter-sg" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c769bd29dd6612783fffb7090d29ed8b390672fb9e968b9e76bbc07bf78600c" -dependencies = [ - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", -] - [[package]] name = "winapi" version = "0.3.9" @@ -2322,7 +2284,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1e9fa5bd..ca3a39ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ ignore = { version = "0.4.22" } regex = { version = "1.10.4" } serde = { version = "1.0.200", features = ["derive"] } serde_yaml = "0.9.33" -tree-sitter = { version = "0.25.3", package = "tree-sitter-facade-sg" } +tree-sitter = { version = "0.25.4" } thiserror = "2.0.0" schemars = "0.8.17" -anyhow = "1.0.82" +anyhow = "1.0.82" \ No newline at end of file diff --git a/crates/cli/src/lang/injection.rs b/crates/cli/src/lang/injection.rs index 3eecb203..3fb9a34b 100644 --- a/crates/cli/src/lang/injection.rs +++ b/crates/cli/src/lang/injection.rs @@ -175,7 +175,12 @@ fn node_to_range(node: &Node) -> TSRange { let end = node.end_pos(); let ep = end.byte_point(); let ep = tree_sitter::Point::new(ep.0, ep.1); - TSRange::new(r.start as u32, r.end as u32, &sp, &ep) + TSRange { + start_byte: r.start, + end_byte: r.end, + start_point: sp, + end_point: ep, + } } #[cfg(test)] diff --git a/crates/cli/src/utils/debug_query.rs b/crates/cli/src/utils/debug_query.rs index 5a986a2b..a4028ffc 100644 --- a/crates/cli/src/utils/debug_query.rs +++ b/crates/cli/src/utils/debug_query.rs @@ -84,7 +84,7 @@ fn dump_pattern( } => { if *is_named { let kind = lang.node_kind_for_id(*kind_id).unwrap(); - let kind = style.kind_style.paint(format!("{kind}")); + let kind = style.kind_style.paint(kind); writeln!(ret, "{kind} {text}")?; } else { writeln!(ret, "{text}")?; @@ -190,8 +190,8 @@ impl From for Pos { #[inline] fn from(pt: ts::Point) -> Self { Pos { - row: pt.row() as usize, - column: pt.column() as usize, + row: pt.row, + column: pt.column, } } } diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index a36aa277..8eef5c07 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -56,7 +56,9 @@ mod test { TSLanguage::from(tree_sitter_typescript::LANGUAGE_TSX).id_for_node_kind(kind, true) } fn field_to_id(&self, field: &str) -> Option { - TSLanguage::from(tree_sitter_typescript::LANGUAGE_TSX).field_id_for_name(field) + TSLanguage::from(tree_sitter_typescript::LANGUAGE_TSX) + .field_id_for_name(field) + .map(|f| f.get()) } fn from_path>(_path: P) -> Option { Some(TypeScript::Tsx) diff --git a/crates/core/src/language.rs b/crates/core/src/language.rs index 4a87df31..3f5f114a 100644 --- a/crates/core/src/language.rs +++ b/crates/core/src/language.rs @@ -62,7 +62,10 @@ mod test { ts_lang.id_for_node_kind(kind, /* named */ true) } fn field_to_id(&self, field: &str) -> Option { - self.get_ts_language().field_id_for_name(field) + self + .get_ts_language() + .field_id_for_name(field) + .map(|f| f.get()) } fn build_pattern(&self, builder: &PatternBuilder) -> Result { builder.build(|src| StrDoc::try_new(src, self.clone())) diff --git a/crates/core/src/node.rs b/crates/core/src/node.rs index 79d98801..a53e59ff 100644 --- a/crates/core/src/node.rs +++ b/crates/core/src/node.rs @@ -38,8 +38,8 @@ impl Position { let source = node.get_doc().get_source(); source.get_char_column(self.byte_column, self.byte_offset) } - pub fn byte_point(&self) -> (u32, u32) { - (self.line as u32, self.byte_column as u32) + pub fn byte_point(&self) -> (usize, usize) { + (self.line, self.byte_column) } } diff --git a/crates/core/src/tree_sitter/mod.rs b/crates/core/src/tree_sitter/mod.rs index af98d2c1..e06e7c1a 100644 --- a/crates/core/src/tree_sitter/mod.rs +++ b/crates/core/src/tree_sitter/mod.rs @@ -7,17 +7,16 @@ use crate::{node::KindId, Language, Position}; use crate::{AstGrep, Matcher}; use std::borrow::Cow; use std::collections::HashMap; +use std::num::NonZero; use thiserror::Error; pub use traversal::{TsPre, Visitor}; pub use tree_sitter::Language as TSLanguage; -use tree_sitter::{InputEdit, LanguageError, Node, Parser, ParserError, Point, Tree}; +use tree_sitter::{InputEdit, LanguageError, Node, Parser, Point, Tree}; pub use tree_sitter::{Point as TSPoint, Range as TSRange}; /// Represents tree-sitter related error #[derive(Debug, Error)] pub enum TSParseError { - #[error("web-tree-sitter parser is not available")] - Parse(#[from] ParserError), #[error("incompatible `Language` is assigned to a `Parser`.")] Language(#[from] LanguageError), /// A general error when tree sitter fails to parse in time. It can be caused by @@ -31,12 +30,12 @@ pub enum TSParseError { #[inline] fn parse_lang( - parse_fn: impl Fn(&mut Parser) -> Result, ParserError>, + parse_fn: impl Fn(&mut Parser) -> Option, ts_lang: TSLanguage, ) -> Result { - let mut parser = Parser::new()?; + let mut parser = Parser::new(); parser.set_language(&ts_lang)?; - if let Some(tree) = parse_fn(&mut parser)? { + if let Some(tree) = parse_fn(&mut parser) { Ok(tree) } else { Err(TSParseError::TreeUnavailable) @@ -87,9 +86,11 @@ impl Doc for StrDoc { self.tree.root_node() } fn get_node_text<'a>(&'a self, node: &Self::Node<'a>) -> Cow<'a, str> { - node - .utf8_text(self.src.as_bytes()) - .expect("invalid source text encoding") + Cow::Borrowed( + node + .utf8_text(self.src.as_bytes()) + .expect("invalid source text encoding"), + ) } } @@ -129,7 +130,7 @@ impl<'r> SgNode<'r> for Node<'r> { if inner.id() == self_id { return None; } - ancestor = inner.child_with_descendant(self.clone()); + ancestor = inner.child_with_descendant(*self); Some(inner) }) // We must iterate up the tree to preserve backwards compatibility @@ -142,14 +143,14 @@ impl<'r> SgNode<'r> for Node<'r> { } fn child(&self, nth: usize) -> Option { // TODO remove cast after migrating to tree-sitter - Node::child(self, nth as u32) + Node::child(self, nth) } fn children(&self) -> impl ExactSizeIterator { let mut cursor = self.walk(); cursor.goto_first_child(); NodeWalker { cursor, - count: self.child_count() as usize, + count: self.child_count(), } } fn child_by_field_id(&self, field_id: u16) -> Option { @@ -163,7 +164,7 @@ impl<'r> SgNode<'r> for Node<'r> { } fn next_all(&self) -> impl Iterator { // if root is none, use self as fallback to return a type-stable Iterator - let node = self.parent().unwrap_or_else(|| self.clone()); + let node = self.parent().unwrap_or(*self); let mut cursor = node.walk(); cursor.goto_first_child_for_byte(self.start_byte()); std::iter::from_fn(move || { @@ -176,7 +177,7 @@ impl<'r> SgNode<'r> for Node<'r> { } fn prev_all(&self) -> impl Iterator { // if root is none, use self as fallback to return a type-stable Iterator - let node = self.parent().unwrap_or_else(|| self.clone()); + let node = self.parent().unwrap_or(*self); let mut cursor = node.walk(); cursor.goto_first_child_for_byte(self.start_byte()); std::iter::from_fn(move || { @@ -199,7 +200,7 @@ impl<'r> SgNode<'r> for Node<'r> { self.child_count() == 0 } fn kind(&self) -> Cow { - Node::kind(self) + Cow::Borrowed(Node::kind(self)) } fn kind_id(&self) -> KindId { Node::kind_id(self) @@ -208,17 +209,17 @@ impl<'r> SgNode<'r> for Node<'r> { self.id() } fn range(&self) -> std::ops::Range { - (self.start_byte() as usize)..(self.end_byte() as usize) + self.start_byte()..self.end_byte() } fn start_pos(&self) -> Position { let pos = self.start_position(); - let byte = self.start_byte() as usize; - Position::new(pos.row() as usize, pos.column() as usize, byte) + let byte = self.start_byte(); + Position::new(pos.row, pos.column, byte) } fn end_pos(&self) -> Position { let pos = self.end_position(); - let byte = self.end_byte() as usize; - Position::new(pos.row() as usize, pos.column() as usize, byte) + let byte = self.end_byte(); + Position::new(pos.row, pos.column, byte) } // missing node is a tree-sitter specific concept fn is_missing(&self) -> bool { @@ -232,6 +233,7 @@ impl<'r> SgNode<'r> for Node<'r> { self.child_by_field_name(name) } fn field_children(&self, field_id: Option) -> impl Iterator { + let field_id = field_id.and_then(NonZero::new); let mut cursor = self.walk(); cursor.goto_first_child(); // if field_id is not found, iteration is done @@ -329,14 +331,14 @@ impl ContentExt for String { let old_end_position = position_for_offset(input, old_end_byte); input.splice(start_byte..old_end_byte, edit.inserted_text.clone()); let new_end_position = position_for_offset(input, new_end_byte); - InputEdit::new( - start_byte as u32, - old_end_byte as u32, - new_end_byte as u32, - &start_position, - &old_end_position, - &new_end_position, - ) + InputEdit { + start_byte, + old_end_byte, + new_end_byte, + start_position, + old_end_position, + new_end_position, + } } } @@ -360,15 +362,15 @@ impl Root> { .filter_map(|(lang, ranges)| { let lang = get_lang(&lang)?; let source = self.doc.get_source(); - let mut parser = tree_sitter::Parser::new().ok()?; + let mut parser = Parser::new(); parser.set_included_ranges(&ranges).ok()?; parser.set_language(&lang.get_ts_language()).ok()?; - let tree = parser.parse(source, None).ok()?; - tree.map(|t| Self { + let tree = parser.parse(source, None)?; + Some(Self { doc: StrDoc { src: self.doc.src.clone(), lang, - tree: t, + tree, }, }) }) @@ -394,8 +396,8 @@ impl<'r, L: LanguageExt> crate::Node<'r, StrDoc> { pub fn display_context(&self, before: usize, after: usize) -> DisplayContext<'r> { let source = self.root.doc.get_source().as_str(); let bytes = source.as_bytes(); - let start = self.inner.start_byte() as usize; - let end = self.inner.end_byte() as usize; + let start = self.inner.start_byte(); + let end = self.inner.end_byte(); let (mut leading, mut trailing) = (start, end); let mut lines_before = before + 1; while leading > 0 { @@ -463,8 +465,8 @@ mod test { let tree = parse("var a = 1234")?; let root_node = tree.root_node(); assert_eq!(root_node.kind(), "program"); - assert_eq!(root_node.start_position().column(), 0); - assert_eq!(root_node.end_position().column(), 12); + assert_eq!(root_node.start_position().column, 0); + assert_eq!(root_node.end_position().column, 12); assert_eq!( root_node.to_sexp(), "(program (variable_declaration (variable_declarator name: (identifier) value: (number))))" diff --git a/crates/core/src/tree_sitter/traversal.rs b/crates/core/src/tree_sitter/traversal.rs index 8f1322e8..55576345 100644 --- a/crates/core/src/tree_sitter/traversal.rs +++ b/crates/core/src/tree_sitter/traversal.rs @@ -387,7 +387,7 @@ pub struct Level<'tree, L: LanguageExt> { impl<'tree, L: LanguageExt> Level<'tree, L> { pub fn new(node: &Node<'tree, StrDoc>) -> Self { let mut deque = VecDeque::new(); - deque.push_back(node.inner.clone()); + deque.push_back(node.inner); let cursor = node.inner.walk(); Self { deque, diff --git a/crates/dynamic/Cargo.toml b/crates/dynamic/Cargo.toml index d245a521..f108be27 100644 --- a/crates/dynamic/Cargo.toml +++ b/crates/dynamic/Cargo.toml @@ -17,7 +17,7 @@ ignore.workspace = true libloading = "0.8.3" serde.workspace = true thiserror.workspace = true -tree-sitter-native = { version = "0.25.3", package = "tree-sitter" } +tree-sitter.workspace = true [dev-dependencies] serde_yaml.workspace = true \ No newline at end of file diff --git a/crates/dynamic/src/lib.rs b/crates/dynamic/src/lib.rs index dc5f8f42..26f21ac0 100644 --- a/crates/dynamic/src/lib.rs +++ b/crates/dynamic/src/lib.rs @@ -6,7 +6,7 @@ use ignore::types::{Types, TypesBuilder}; use libloading::{Error as LibError, Library, Symbol}; use serde::{Deserialize, Serialize}; use thiserror::Error; -use tree_sitter_native::{Language as NativeTS, LANGUAGE_VERSION, MIN_COMPATIBLE_LANGUAGE_VERSION}; +use tree_sitter::{Language as NativeTS, LANGUAGE_VERSION, MIN_COMPATIBLE_LANGUAGE_VERSION}; use std::borrow::Cow; use std::fs::canonicalize; @@ -133,7 +133,7 @@ unsafe fn load_ts_language( } else { // ATTENTION: dragon ahead // must hold valid reference to NativeTS - Ok((lib, lang.into())) + Ok((lib, lang)) } } @@ -239,7 +239,7 @@ impl Language for DynamicLang { } fn field_to_id(&self, field: &str) -> Option { let inner = self.inner(); - inner.lang.field_id_for_name(field) + inner.lang.field_id_for_name(field).map(|f| f.get()) } fn from_path>(path: P) -> Option { @@ -297,7 +297,7 @@ mod test { self.0.id_for_node_kind(kind, /* named */ true) } fn field_to_id(&self, field: &str) -> Option { - self.0.field_id_for_name(field) + self.0.field_id_for_name(field).map(|f| f.get()) } fn build_pattern(&self, builder: &PatternBuilder) -> Result { builder.build(|src| StrDoc::try_new(src, self.clone())) diff --git a/crates/language/src/html.rs b/crates/language/src/html.rs index 46ac23ce..c910223c 100644 --- a/crates/language/src/html.rs +++ b/crates/language/src/html.rs @@ -20,7 +20,9 @@ impl Language for Html { crate::parsers::language_html().id_for_node_kind(kind, true) } fn field_to_id(&self, field: &str) -> Option { - crate::parsers::language_html().field_id_for_name(field) + crate::parsers::language_html() + .field_id_for_name(field) + .map(|f| f.get()) } fn build_pattern(&self, builder: &PatternBuilder) -> Result { builder.build(|src| StrDoc::try_new(src, *self)) @@ -88,7 +90,12 @@ fn node_to_range(node: &Node) -> TSRange { let end = node.end_pos(); let ep = end.byte_point(); let ep = tree_sitter::Point::new(ep.0, ep.1); - TSRange::new(r.start as u32, r.end as u32, &sp, &ep) + TSRange { + start_byte: r.start, + end_byte: r.end, + start_point: sp, + end_point: ep, + } } #[cfg(test)] diff --git a/crates/language/src/lib.rs b/crates/language/src/lib.rs index f12db0fa..6f18f04c 100644 --- a/crates/language/src/lib.rs +++ b/crates/language/src/lib.rs @@ -59,7 +59,10 @@ macro_rules! impl_lang { .id_for_node_kind(kind, /*named*/ true) } fn field_to_id(&self, field: &str) -> Option { - self.get_ts_language().field_id_for_name(field) + self + .get_ts_language() + .field_id_for_name(field) + .map(|f| f.get()) } fn build_pattern(&self, builder: &PatternBuilder) -> Result { builder.build(|src| StrDoc::try_new(src, self.clone())) @@ -107,7 +110,10 @@ macro_rules! impl_lang_expando { .id_for_node_kind(kind, /*named*/ true) } fn field_to_id(&self, field: &str) -> Option { - self.get_ts_language().field_id_for_name(field) + self + .get_ts_language() + .field_id_for_name(field) + .map(|f| f.get()) } fn expando_char(&self) -> char { $char diff --git a/crates/napi/src/doc.rs b/crates/napi/src/doc.rs index 856e2a24..6e0ea405 100644 --- a/crates/napi/src/doc.rs +++ b/crates/napi/src/doc.rs @@ -86,14 +86,14 @@ impl ContentExt for Wrapper { let old_end_position = pos_for_byte_offset(input, old_end_byte); input.splice(start_byte / 2..old_end_byte / 2, edit.inserted_text.clone()); let new_end_position = pos_for_byte_offset(input, new_end_byte); - InputEdit::new( - start_byte as u32, - old_end_byte as u32, - new_end_byte as u32, - &start_position, - &old_end_position, - &new_end_position, - ) + InputEdit { + start_byte, + old_end_byte, + new_end_byte, + start_position, + old_end_position, + new_end_position, + } } } @@ -124,10 +124,10 @@ fn parse( lang: &NapiLang, old_tree: Option<&Tree>, ) -> std::result::Result { - let mut parser = Parser::new()?; + let mut parser = Parser::new(); let ts_lang = lang.get_ts_language(); parser.set_language(&ts_lang)?; - if let Some(tree) = parser.parse_utf16_le(source.inner.as_slice(), old_tree)? { + if let Some(tree) = parser.parse_utf16_le(source.inner.as_slice(), old_tree) { Ok(tree) } else { Err(TSParseError::TreeUnavailable)