diff --git a/Cargo.lock b/Cargo.lock index e0cd98cbe3..f0f09d26af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2037,7 +2037,7 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.25.4" +version = "0.25.5" dependencies = [ "bindgen", "cc", @@ -2051,7 +2051,7 @@ dependencies = [ [[package]] name = "tree-sitter-cli" -version = "0.25.4" +version = "0.25.5" dependencies = [ "ansi_colours", "anstyle", @@ -2103,7 +2103,7 @@ dependencies = [ [[package]] name = "tree-sitter-config" -version = "0.25.4" +version = "0.25.5" dependencies = [ "anyhow", "etcetera", @@ -2113,7 +2113,7 @@ dependencies = [ [[package]] name = "tree-sitter-generate" -version = "0.25.4" +version = "0.25.5" dependencies = [ "anyhow", "heck", @@ -2134,7 +2134,7 @@ dependencies = [ [[package]] name = "tree-sitter-highlight" -version = "0.25.4" +version = "0.25.5" dependencies = [ "regex", "streaming-iterator", @@ -2148,7 +2148,7 @@ version = "0.1.5" [[package]] name = "tree-sitter-loader" -version = "0.25.4" +version = "0.25.5" dependencies = [ "anyhow", "cc", @@ -2171,7 +2171,7 @@ dependencies = [ [[package]] name = "tree-sitter-tags" -version = "0.25.4" +version = "0.25.5" dependencies = [ "memchr", "regex", diff --git a/Cargo.toml b/Cargo.toml index 50723e0c10..5feb5bd004 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.25.4" +version = "0.25.5" authors = [ "Max Brunsfeld ", "Amaan Qureshi ", diff --git a/Makefile b/Makefile index 946e78e51a..11d18dd140 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ ifeq ($(OS),Windows_NT) $(error Windows is not supported) endif -VERSION := 0.25.4 +VERSION := 0.25.5 DESCRIPTION := An incremental parsing system for programming tools HOMEPAGE_URL := https://tree-sitter.github.io/tree-sitter/ diff --git a/build.zig.zon b/build.zig.zon index ca2438551f..a3faae7b06 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,6 +1,6 @@ .{ .name = "tree-sitter", - .version = "0.25.4", + .version = "0.25.5", .paths = .{ "build.zig", "build.zig.zon", diff --git a/cli/npm/install.js b/cli/npm/install.js old mode 100755 new mode 100644 index f2a4944d5a..6d0fbc57c0 --- a/cli/npm/install.js +++ b/cli/npm/install.js @@ -6,7 +6,8 @@ const http = require('http'); const https = require('https'); const packageJSON = require('./package.json'); -// Look to a results table in https://github.com/tree-sitter/tree-sitter/issues/2196 +https.globalAgent.keepAlive = false; + const matrix = { platform: { 'darwin': { diff --git a/cli/npm/package.json b/cli/npm/package.json index 07f9ea221d..f71d336fcc 100644 --- a/cli/npm/package.json +++ b/cli/npm/package.json @@ -1,6 +1,6 @@ { "name": "tree-sitter-cli", - "version": "0.25.4", + "version": "0.25.5", "author": { "name": "Max Brunsfeld", "email": "maxbrunsfeld@gmail.com" diff --git a/cli/src/tests/helpers/fixtures.rs b/cli/src/tests/helpers/fixtures.rs index 44da9b489c..0b046bcc5f 100644 --- a/cli/src/tests/helpers/fixtures.rs +++ b/cli/src/tests/helpers/fixtures.rs @@ -6,11 +6,13 @@ use std::{ use anyhow::Context; use tree_sitter::Language; -use tree_sitter_generate::{ALLOC_HEADER, ARRAY_HEADER}; +use tree_sitter_generate::{load_grammar_file, ALLOC_HEADER, ARRAY_HEADER}; use tree_sitter_highlight::HighlightConfiguration; use tree_sitter_loader::{CompileConfig, Loader}; use tree_sitter_tags::TagsConfiguration; +use crate::tests::generate_parser; + include!("./dirs.rs"); static TEST_LOADER: LazyLock = LazyLock::new(|| { @@ -40,6 +42,13 @@ pub fn get_language(name: &str) -> Language { TEST_LOADER.load_language_at_path(config).unwrap() } +pub fn get_test_fixture_language(name: &str) -> Language { + let grammar_dir_path = fixtures_dir().join("test_grammars").join(name); + let grammar_json = load_grammar_file(&grammar_dir_path.join("grammar.js"), None).unwrap(); + let (parser_name, parser_code) = generate_parser(&grammar_json).unwrap(); + get_test_language(&parser_name, &parser_code, Some(&grammar_dir_path)) +} + pub fn get_language_queries_path(language_name: &str) -> PathBuf { GRAMMARS_DIR.join(language_name).join("queries") } diff --git a/cli/src/tests/node_test.rs b/cli/src/tests/node_test.rs index 22e920d666..515d73aa62 100644 --- a/cli/src/tests/node_test.rs +++ b/cli/src/tests/node_test.rs @@ -6,7 +6,10 @@ use super::{ helpers::fixtures::{fixtures_dir, get_language, get_test_language}, Rand, }; -use crate::{parse::perform_edit, tests::generate_parser}; +use crate::{ + parse::perform_edit, + tests::{generate_parser, helpers::fixtures::get_test_fixture_language}, +}; const JSON_EXAMPLE: &str = r#" @@ -308,19 +311,8 @@ fn test_parent_of_zero_width_node() { #[test] fn test_next_sibling_of_zero_width_node() { - let grammar_json = load_grammar_file( - &fixtures_dir() - .join("test_grammars") - .join("next_sibling_from_zwt") - .join("grammar.js"), - None, - ) - .unwrap(); - - let (parser_name, parser_code) = generate_parser(&grammar_json).unwrap(); - let mut parser = Parser::new(); - let language = get_test_language(&parser_name, &parser_code, None); + let language = get_test_fixture_language("next_sibling_from_zwt"); parser.set_language(&language).unwrap(); let tree = parser.parse("abdef", None).unwrap(); diff --git a/cli/src/tests/parser_test.rs b/cli/src/tests/parser_test.rs index a1f730d8c6..d8b9767daf 100644 --- a/cli/src/tests/parser_test.rs +++ b/cli/src/tests/parser_test.rs @@ -6,7 +6,6 @@ use std::{ use tree_sitter::{ Decode, IncludedRangesError, InputEdit, LogType, ParseOptions, ParseState, Parser, Point, Range, }; -use tree_sitter_generate::load_grammar_file; use tree_sitter_proc_macro::retry; use super::helpers::{ @@ -17,7 +16,7 @@ use super::helpers::{ use crate::{ fuzz::edits::Edit, parse::perform_edit, - tests::{generate_parser, helpers::fixtures::fixtures_dir, invert_edit}, + tests::{generate_parser, helpers::fixtures::get_test_fixture_language, invert_edit}, }; #[test] @@ -482,15 +481,9 @@ fn test_parsing_empty_file_with_reused_tree() { #[test] fn test_parsing_after_editing_tree_that_depends_on_column_values() { - let dir = fixtures_dir() - .join("test_grammars") - .join("uses_current_column"); - let grammar_json = load_grammar_file(&dir.join("grammar.js"), None).unwrap(); - let (grammar_name, parser_code) = generate_parser(&grammar_json).unwrap(); - let mut parser = Parser::new(); parser - .set_language(&get_test_language(&grammar_name, &parser_code, Some(&dir))) + .set_language(&get_test_fixture_language("uses_current_column")) .unwrap(); let mut code = b" @@ -559,16 +552,9 @@ h + i #[test] fn test_parsing_after_editing_tree_that_depends_on_column_position() { - let dir = fixtures_dir() - .join("test_grammars") - .join("depends_on_column"); - - let grammar_json = load_grammar_file(&dir.join("grammar.js"), None).unwrap(); - let (grammar_name, parser_code) = generate_parser(grammar_json.as_str()).unwrap(); - let mut parser = Parser::new(); parser - .set_language(&get_test_language(&grammar_name, &parser_code, Some(&dir))) + .set_language(&get_test_fixture_language("depends_on_column")) .unwrap(); let mut code = b"\n x".to_vec(); @@ -1702,13 +1688,9 @@ if foo && bar || baz {} #[test] fn test_parsing_with_scanner_logging() { - let dir = fixtures_dir().join("test_grammars").join("external_tokens"); - let grammar_json = load_grammar_file(&dir.join("grammar.js"), None).unwrap(); - let (grammar_name, parser_code) = generate_parser(&grammar_json).unwrap(); - let mut parser = Parser::new(); parser - .set_language(&get_test_language(&grammar_name, &parser_code, Some(&dir))) + .set_language(&get_test_fixture_language("external_tokens")) .unwrap(); let mut found = false; @@ -1726,13 +1708,9 @@ fn test_parsing_with_scanner_logging() { #[test] fn test_parsing_get_column_at_eof() { - let dir = fixtures_dir().join("test_grammars").join("get_col_eof"); - let grammar_json = load_grammar_file(&dir.join("grammar.js"), None).unwrap(); - let (grammar_name, parser_code) = generate_parser(&grammar_json).unwrap(); - let mut parser = Parser::new(); parser - .set_language(&get_test_language(&grammar_name, &parser_code, Some(&dir))) + .set_language(&get_test_fixture_language("get_col_eof")) .unwrap(); parser.parse("a", None).unwrap(); diff --git a/cli/src/tests/tree_test.rs b/cli/src/tests/tree_test.rs index 083955b1da..a5dca96539 100644 --- a/cli/src/tests/tree_test.rs +++ b/cli/src/tests/tree_test.rs @@ -3,7 +3,11 @@ use std::str; use tree_sitter::{InputEdit, Parser, Point, Range, Tree}; use super::helpers::fixtures::get_language; -use crate::{fuzz::edits::Edit, parse::perform_edit, tests::invert_edit}; +use crate::{ + fuzz::edits::Edit, + parse::perform_edit, + tests::{helpers::fixtures::get_test_fixture_language, invert_edit}, +}; #[test] fn test_tree_edit() { @@ -377,6 +381,31 @@ fn test_tree_cursor() { assert_eq!(copy.node().kind(), "struct_item"); } +#[test] +fn test_tree_cursor_previous_sibling_with_aliases() { + let mut parser = Parser::new(); + parser + .set_language(&get_test_fixture_language("aliases_in_root")) + .unwrap(); + + let text = "# comment\nfoo foo"; + let tree = parser.parse(text, None).unwrap(); + let mut cursor = tree.walk(); + assert_eq!(cursor.node().kind(), "document"); + + cursor.goto_first_child(); + assert_eq!(cursor.node().kind(), "comment"); + + assert!(cursor.goto_next_sibling()); + assert_eq!(cursor.node().kind(), "bar"); + + assert!(cursor.goto_previous_sibling()); + assert_eq!(cursor.node().kind(), "comment"); + + assert!(cursor.goto_next_sibling()); + assert_eq!(cursor.node().kind(), "bar"); +} + #[test] fn test_tree_cursor_previous_sibling() { let mut parser = Parser::new(); diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index e240a7d300..62260b54c1 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) project(tree-sitter - VERSION "0.25.4" + VERSION "0.25.5" DESCRIPTION "An incremental parsing system for programming tools" HOMEPAGE_URL "https://tree-sitter.github.io/tree-sitter/" LANGUAGES C) diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index 4a7d89e0dc..87fa8a1fd8 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -1,6 +1,6 @@ { "name": "web-tree-sitter", - "version": "0.25.4", + "version": "0.25.5", "description": "Tree-sitter bindings for the web", "repository": "https://github.com/tree-sitter/tree-sitter", "homepage": "https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_web", diff --git a/lib/src/portable/endian.h b/lib/src/portable/endian.h index 51defc5e7e..f467ec535f 100644 --- a/lib/src/portable/endian.h +++ b/lib/src/portable/endian.h @@ -18,11 +18,13 @@ #if defined(HAVE_ENDIAN_H) || \ defined(__linux__) || \ defined(__GNU__) || \ + defined(__illumos__) || \ defined(__NetBSD__) || \ defined(__OpenBSD__) || \ defined(__CYGWIN__) || \ defined(__MSYS__) || \ - defined(__EMSCRIPTEN__) + defined(__EMSCRIPTEN__) || \ + defined(__wasi__) #if defined(__NetBSD__) #define _NETBSD_SOURCE 1 diff --git a/lib/src/tree_cursor.c b/lib/src/tree_cursor.c index 81e17ca76e..9d2ddd3d92 100644 --- a/lib/src/tree_cursor.c +++ b/lib/src/tree_cursor.c @@ -129,13 +129,17 @@ static inline bool ts_tree_cursor_child_iterator_previous( }; *visible = ts_subtree_visible(*child); bool extra = ts_subtree_extra(*child); + + self->position = length_backtrack(self->position, ts_subtree_padding(*child)); + self->child_index--; + if (!extra && self->alias_sequence) { *visible |= self->alias_sequence[self->structural_child_index]; - self->structural_child_index--; + if (self->child_index > 0) { + self->structural_child_index--; + } } - self->position = length_backtrack(self->position, ts_subtree_padding(*child)); - self->child_index--; // unsigned can underflow so compare it to child_count if (self->child_index < self->parent.ptr->child_count) { diff --git a/test/fixtures/test_grammars/aliases_in_root/corpus.txt b/test/fixtures/test_grammars/aliases_in_root/corpus.txt new file mode 100644 index 0000000000..ed78852b49 --- /dev/null +++ b/test/fixtures/test_grammars/aliases_in_root/corpus.txt @@ -0,0 +1,13 @@ +====================================== +Aliases within the root node +====================================== + +# this is a comment +foo foo + +--- + +(document + (comment) + (bar) + (foo)) diff --git a/test/fixtures/test_grammars/aliases_in_root/grammar.js b/test/fixtures/test_grammars/aliases_in_root/grammar.js new file mode 100644 index 0000000000..02d6164672 --- /dev/null +++ b/test/fixtures/test_grammars/aliases_in_root/grammar.js @@ -0,0 +1,19 @@ +module.exports = grammar({ + name: 'aliases_in_root', + + extras: $ => [ + /\s/, + $.comment, + ], + + rules: { + document: $ => seq( + alias($.foo, $.bar), + $.foo, + ), + + foo: $ => "foo", + + comment: $ => /#.*/ + } +});