From 6500d6d8dc513f71a38cddd403a4ee7e58bdc2eb Mon Sep 17 00:00:00 2001 From: Mikhail Katychev Date: Thu, 4 Dec 2025 10:56:43 -0600 Subject: [PATCH 1/6] chore(style,grammar): remove indirection for punctuation --- grammar.js | 127 +++++++++++++++++++++-------------------------------- 1 file changed, 50 insertions(+), 77 deletions(-) diff --git a/grammar.js b/grammar.js index 0c19937b..28ed5f39 100644 --- a/grammar.js +++ b/grammar.js @@ -138,20 +138,20 @@ module.exports = grammar({ _repeat_newline: ($) => repeat1($._newline), _space: (_$) => /[ \t]+/, _separator: ($) => choice($._space, $._newline), - _terminator: ($) => choice(punc().semicolon, $._newline), + _terminator: ($) => choice(';', $._newline), _pipe_separator: ($) => repeat1( - seq(optional($._repeat_newline), choice(punc().pipe, ...redir_pipe())), + seq(optional($._repeat_newline), choice('|', ...redir_pipe())), ), /// Attributes attribute_list: ($) => - repeat1(seq($.attribute, choice(punc().semicolon, $._newline))), + repeat1(seq($.attribute, choice(';', $._newline))), attribute_identifier: (_$) => token.immediate(/[0-9\p{XID_Start}][0-9\p{XID_Continue}_-]*/), attribute: ($) => seq( - punc().at, + '@', field('type', $.attribute_identifier), repeat(seq($._space, optional($._cmd_arg))), ), @@ -200,10 +200,10 @@ module.exports = grammar({ /// Return types returns: ($) => - seq(optional(punc().colon), choice($._multiple_types, $._one_type)), + seq(optional(':'), choice($._multiple_types, $._one_type)), _one_type: ($) => - seq($._type_annotation, punc().thin_arrow, $._type_annotation), + seq($._type_annotation, '->', $._type_annotation), _types_body: ($) => general_body_rules('', $._one_type, $._entry_separator, $._newline), @@ -231,10 +231,10 @@ module.exports = grammar({ parameter_pipes: ($) => seq( - punc().pipe, + '|', optional($._repeat_newline), repeat($.parameter), - punc().pipe, + '|', ), parameter: ($) => @@ -247,7 +247,7 @@ module.exports = grammar({ ), ), repeat(choice($.param_type, $.param_value)), - repeat(choice($._newline, punc().comma)), + repeat(choice($._newline, ',')), ), _param_name: ($) => @@ -261,7 +261,7 @@ module.exports = grammar({ param_type: ($) => seq( optional($._repeat_newline), - punc().colon, + ':', optional($._repeat_newline), $._type_annotation, field('completion', optional($.param_completer)), @@ -270,7 +270,7 @@ module.exports = grammar({ param_value: ($) => seq( optional($._repeat_newline), - punc().eq, + '=', optional($._repeat_newline), field( 'param_value', @@ -298,7 +298,7 @@ module.exports = grammar({ _collection_annotation: ($) => seq( - punc().colon, + ':', $._all_type, field('completion', optional($.param_completer)), ), @@ -349,7 +349,7 @@ module.exports = grammar({ param_completer: ($) => seq( - token.immediate(punc().at), + token.immediate('@'), choice( field('command', $.cmd_identifier), field('command', $.val_string), @@ -360,10 +360,10 @@ module.exports = grammar({ ), param_rest: ($) => - seq(punc().rest, optional(punc().dollar), field('name', $.identifier)), + seq('...', optional('$'), field('name', $.identifier)), param_opt: ($) => - seq(field('name', $.identifier), token.immediate(punc().question)), + seq(field('name', $.identifier), token.immediate('?')), param_long_flag: ($) => seq(operator().long_flag, $.long_flag_identifier), @@ -441,14 +441,14 @@ module.exports = grammar({ match_arm: ($) => seq( field('pattern', $.match_pattern), - punc().fat_arrow, + '=>', field('expression', $._match_expression), ), default_arm: ($) => seq( - field('default_pattern', punc().underscore), - punc().fat_arrow, + field('default_pattern', '_'), + '=>', field('expression', $._match_expression), ), @@ -457,11 +457,11 @@ module.exports = grammar({ match_pattern: ($) => choice( - seq(punc().underscore, $.match_guard), + seq('_', $.match_guard), seq($._match_pattern, optional($.match_guard)), seq( $._match_pattern, - repeat(seq(optional($._newline), punc().pipe, $._match_pattern)), + repeat(seq(optional($._newline), '|', $._match_pattern)), ), ), @@ -499,7 +499,7 @@ module.exports = grammar({ $._entry_separator, $._newline, null, - choice($._newline, punc().comma), + choice($._newline, ','), ), _match_pattern_list: ($) => @@ -521,7 +521,7 @@ module.exports = grammar({ _match_pattern_rest: ($) => seq( operator().range_inclusive, - seq(token.immediate(punc().dollar), $.identifier), + seq(token.immediate('$'), $.identifier), ), _match_pattern_record_body: ($) => @@ -762,7 +762,7 @@ module.exports = grammar({ $._terminator, null, [ - repeat1(seq(optional($._repeat_newline), punc().semicolon)), + repeat1(seq(optional($._repeat_newline), ';')), optional($._repeat_newline), ], $._terminator, @@ -805,19 +805,19 @@ module.exports = grammar({ _spread_variable: ($) => seq( - punc().spread_dollar, + '...$', field('name', $.identifier), optional($.cell_path), ), val_variable: ($) => seq( - punc().dollar, + '$', field('name', choice('nu', 'in', 'env', $.identifier)), optional($.cell_path), ), - val_cellpath: ($) => seq(punc().dollar, $.cell_path), + val_cellpath: ($) => seq('$', $.cell_path), val_number: ($) => $._val_number, @@ -881,7 +881,7 @@ module.exports = grammar({ seq( choice('0b', '0o', '0x'), token.immediate(brack().open_brack), - repeat(field('digit', seq($.hex_digit, optional(punc().comma)))), + repeat(field('digit', seq($.hex_digit, optional(',')))), brack().close_brack, ), @@ -1051,7 +1051,7 @@ module.exports = grammar({ $._entry_separator, $._newline, null, - choice($._newline, punc().comma), + choice($._newline, ','), ), val_entry: ($) => @@ -1103,7 +1103,7 @@ module.exports = grammar({ ), _entry_separator: (_$) => - token(prec(prec_map().higher, choice(punc().comma, /\s/))), + token(prec(prec_map().higher, choice(',', /\s/))), record_entry: ($) => choice( @@ -1126,7 +1126,7 @@ module.exports = grammar({ ...Object.values(modifier()).map((x) => alias(x, $.identifier)), ), ), - token(prec(prec_map().higher, punc().colon)), + token(prec(prec_map().higher, ':')), field( 'value', choice( @@ -1149,13 +1149,13 @@ module.exports = grammar({ }, _table_head_separator: (_$) => - token(prec(prec_map().higher, seq(/\s*/, punc().semicolon))), + token(prec(prec_map().higher, seq(/\s*/, ';'))), _table_head: ($) => seq( optional($._repeat_newline), field('head', $.val_list), - alias($._table_head_separator, punc().semicolon), + alias($._table_head_separator, ';'), ), _table_body: ($) => @@ -1185,10 +1185,10 @@ module.exports = grammar({ _path_suffix: ($) => choice( - punc().question, - punc().exclamation, - seq(punc().question, punc().exclamation), - seq(punc().exclamation, punc().question), + '?', + '!', + seq('?', '!'), + seq('!', '?'), ), path: ($) => { @@ -1197,7 +1197,7 @@ module.exports = grammar({ $.val_string, ); - return seq(punc().dot, path, optional($._path_suffix)); + return seq('.', path, optional($._path_suffix)); }, /// Single-use env variables: FOO=BAR cmd @@ -1205,7 +1205,7 @@ module.exports = grammar({ env_var: ($) => seq( field('variable', alias($.cmd_identifier, $.identifier)), - token.immediate(punc().eq), + token.immediate('='), field( 'value', choice( @@ -1258,7 +1258,7 @@ module.exports = grammar({ ), _flag_equals_value: ($) => - seq(token.immediate(punc().eq), field('value', $._flag_value)), + seq(token.immediate('='), field('value', $._flag_value)), short_flag: ($) => seq( @@ -1325,7 +1325,7 @@ module.exports = grammar({ /// Comments - comment: (_$) => seq(punc().hash, /.*/), + comment: (_$) => seq('#', /.*/), }, }); @@ -1472,7 +1472,7 @@ function _block_body_rules(suffix) { optional(modifier().visibility), keyword().alias, $._command_name, - punc().eq, + '=', field('value', alias_for_suffix($, 'pipeline', suffix)), ), @@ -1513,7 +1513,7 @@ function _block_body_rules(suffix) { seq( field('name', $._variable_name), field('type', optional($.param_type)), - punc().eq, + '=', field('value', alias_for_suffix($, 'pipeline', suffix)), ), @@ -1525,7 +1525,7 @@ function _block_body_rules(suffix) { field( 'opr', choice( - punc().eq, + '=', operator().assign_add, operator().assign_sub, operator().assign_mul, @@ -1578,8 +1578,8 @@ function _command_rule(parenthesized) { return prec.right( seq( choice( - field('head', seq(optional(punc().caret), $.cmd_identifier)), - field('head', seq(punc().caret, $._stringish)), + field('head', seq(optional('^'), $.cmd_identifier)), + field('head', seq('^', $._stringish)), ), repeat(seq(sep, optional($._cmd_arg))), ), @@ -1750,7 +1750,7 @@ function _decimal_rule(immediate) { digits, ), ), - seq(head_digits, token.immediate(punc().dot), optional(digits)), + seq(head_digits, token.immediate('.'), optional(digits)), seq( token( seq( @@ -1758,15 +1758,15 @@ function _decimal_rule(immediate) { digits, ), ), - token.immediate(punc().dot), + token.immediate('.'), optional(digits), ), - token(seq(head_token(punc().dot), digits)), + token(seq(head_token('.'), digits)), token( seq( choice(head_token(operator().minus), head_token(operator().plus)), optional(token.immediate(/_+/)), - token.immediate(punc().dot), + token.immediate('.'), digits, ), ), @@ -1817,7 +1817,7 @@ function _range_rule(anonymous) { } const common_choices = [ // 1... works as range from 1 to infinity - seq(start, opr_step_imm, token.immediate(punc().dot)), + seq(start, opr_step_imm, token.immediate('.')), seq(opr, end), seq(opr_step, step, opr_imm, end), ]; @@ -2015,33 +2015,6 @@ function redir_pipe() { return redir().map((x) => x + '|'); } -// punctuation -/** - * - */ -function punc() { - return { - at: '@', - dot: '.', - hash: '#', - pipe: '|', - rest: '...', - eq: '=', - colon: ':', - comma: ',', - caret: '^', - dollar: '$', - spread_dollar: '...$', - fat_arrow: '=>', - thin_arrow: '->', - question: '?', - exclamation: '!', - underscore: '_', - - semicolon: ';', - }; -} - // delimiters /** * From cf914e164a81416bc00b3ccbd1b0132649b3e7e4 Mon Sep 17 00:00:00 2001 From: Mikhail Katychev Date: Thu, 4 Dec 2025 19:50:50 -0600 Subject: [PATCH 2/6] soft disabled npm run test --- package-lock.json | 28 +++++++--------------------- package.json | 6 +++--- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a004aa5..e00c0b95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,10 +19,10 @@ "eslint-config-treesitter": "^1.0.2", "prebuildify": "^6.0.1", "prettier": "^3.6.2", - "tree-sitter-cli": "^0.25.9" + "tree-sitter-cli": "^0.22" }, "peerDependencies": { - "tree-sitter": "^0.25.0" + "tree-sitter": "^0.22" }, "peerDependenciesMeta": { "tree-sitter": { @@ -274,6 +274,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -557,6 +558,7 @@ "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -1499,31 +1501,15 @@ "node": ">=6" } }, - "node_modules/tree-sitter": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.25.0.tgz", - "integrity": "sha512-PGZZzFW63eElZJDe/b/R/LbsjDDYJa5UEjLZJB59RQsMX+fo0j54fqBPn1MGKav/QNa0JR0zBiVaikYDWCj5KQ==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - } - }, "node_modules/tree-sitter-cli": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.25.9.tgz", - "integrity": "sha512-xcS2EJlNdwG529/JcYl5jV0ew/wY+HXvyNe8nkqhDCwQqxCH7odc9oLKxIWePQqmIKgieZ0YaGyieYKQI3MTKQ==", + "version": "0.22.6", + "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.22.6.tgz", + "integrity": "sha512-s7mYOJXi8sIFkt/nLJSqlYZP96VmKTc3BAwIX0rrrlRxWjWuCwixFqwzxWZBQz4R8Hx01iP7z3cT3ih58BUmZQ==", "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { "tree-sitter": "cli.js" - }, - "engines": { - "node": ">=12.0.0" } }, "node_modules/type-check": { diff --git a/package.json b/package.json index 8d7f2549..6e78d1a1 100644 --- a/package.json +++ b/package.json @@ -35,10 +35,10 @@ "eslint-config-treesitter": "^1.0.2", "prebuildify": "^6.0.1", "prettier": "^3.6.2", - "tree-sitter-cli": "^0.25.9" + "tree-sitter-cli": "^0.22" }, "peerDependencies": { - "tree-sitter": "^0.25.0" + "tree-sitter": "^0.22" }, "peerDependenciesMeta": { "tree-sitter": { @@ -49,7 +49,7 @@ "install": "node-gyp-build", "prestart": "tree-sitter build --wasm", "start": "tree-sitter playground", - "test": "node --test bindings/node/*_test.js", + "test": "node --version", "lint": "eslint grammar.js", "format": "prettier --check ." } From 51c2c4a9476aabe5b6726fc2a9e299b6dbc46b26 Mon Sep 17 00:00:00 2001 From: Mikhail Katychev Date: Thu, 4 Dec 2025 19:51:26 -0600 Subject: [PATCH 3/6] revert package.json change --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6e78d1a1..8d7f2549 100644 --- a/package.json +++ b/package.json @@ -35,10 +35,10 @@ "eslint-config-treesitter": "^1.0.2", "prebuildify": "^6.0.1", "prettier": "^3.6.2", - "tree-sitter-cli": "^0.22" + "tree-sitter-cli": "^0.25.9" }, "peerDependencies": { - "tree-sitter": "^0.22" + "tree-sitter": "^0.25.0" }, "peerDependenciesMeta": { "tree-sitter": { @@ -49,7 +49,7 @@ "install": "node-gyp-build", "prestart": "tree-sitter build --wasm", "start": "tree-sitter playground", - "test": "node --version", + "test": "node --test bindings/node/*_test.js", "lint": "eslint grammar.js", "format": "prettier --check ." } From dcbf7c1b4ad3e6dca9f40cb199a7f1640daa2ba6 Mon Sep 17 00:00:00 2001 From: Mikhail Katychev Date: Thu, 4 Dec 2025 19:52:52 -0600 Subject: [PATCH 4/6] ran prettier format --- grammar.js | 54 ++++++++++++------------------------------------------ 1 file changed, 12 insertions(+), 42 deletions(-) diff --git a/grammar.js b/grammar.js index 28ed5f39..f2f132bf 100644 --- a/grammar.js +++ b/grammar.js @@ -140,13 +140,10 @@ module.exports = grammar({ _separator: ($) => choice($._space, $._newline), _terminator: ($) => choice(';', $._newline), _pipe_separator: ($) => - repeat1( - seq(optional($._repeat_newline), choice('|', ...redir_pipe())), - ), + repeat1(seq(optional($._repeat_newline), choice('|', ...redir_pipe()))), /// Attributes - attribute_list: ($) => - repeat1(seq($.attribute, choice(';', $._newline))), + attribute_list: ($) => repeat1(seq($.attribute, choice(';', $._newline))), attribute_identifier: (_$) => token.immediate(/[0-9\p{XID_Start}][0-9\p{XID_Continue}_-]*/), attribute: ($) => @@ -199,11 +196,9 @@ module.exports = grammar({ ), /// Return types - returns: ($) => - seq(optional(':'), choice($._multiple_types, $._one_type)), + returns: ($) => seq(optional(':'), choice($._multiple_types, $._one_type)), - _one_type: ($) => - seq($._type_annotation, '->', $._type_annotation), + _one_type: ($) => seq($._type_annotation, '->', $._type_annotation), _types_body: ($) => general_body_rules('', $._one_type, $._entry_separator, $._newline), @@ -230,12 +225,7 @@ module.exports = grammar({ ), parameter_pipes: ($) => - seq( - '|', - optional($._repeat_newline), - repeat($.parameter), - '|', - ), + seq('|', optional($._repeat_newline), repeat($.parameter), '|'), parameter: ($) => seq( @@ -297,11 +287,7 @@ module.exports = grammar({ flat_type: (_$) => field('flat_type', flat_types()), _collection_annotation: ($) => - seq( - ':', - $._all_type, - field('completion', optional($.param_completer)), - ), + seq(':', $._all_type, field('completion', optional($.param_completer))), _collection_entry: ($) => seq( field( @@ -359,11 +345,9 @@ module.exports = grammar({ ), ), - param_rest: ($) => - seq('...', optional('$'), field('name', $.identifier)), + param_rest: ($) => seq('...', optional('$'), field('name', $.identifier)), - param_opt: ($) => - seq(field('name', $.identifier), token.immediate('?')), + param_opt: ($) => seq(field('name', $.identifier), token.immediate('?')), param_long_flag: ($) => seq(operator().long_flag, $.long_flag_identifier), @@ -519,10 +503,7 @@ module.exports = grammar({ ), _match_pattern_rest: ($) => - seq( - operator().range_inclusive, - seq(token.immediate('$'), $.identifier), - ), + seq(operator().range_inclusive, seq(token.immediate('$'), $.identifier)), _match_pattern_record_body: ($) => general_body_rules( @@ -804,11 +785,7 @@ module.exports = grammar({ val_bool: (_$) => choice(special().true, special().false), _spread_variable: ($) => - seq( - '...$', - field('name', $.identifier), - optional($.cell_path), - ), + seq('...$', field('name', $.identifier), optional($.cell_path)), val_variable: ($) => seq( @@ -1102,8 +1079,7 @@ module.exports = grammar({ $._newline, ), - _entry_separator: (_$) => - token(prec(prec_map().higher, choice(',', /\s/))), + _entry_separator: (_$) => token(prec(prec_map().higher, choice(',', /\s/))), record_entry: ($) => choice( @@ -1183,13 +1159,7 @@ module.exports = grammar({ cell_path: ($) => repeat1($.path), - _path_suffix: ($) => - choice( - '?', - '!', - seq('?', '!'), - seq('!', '?'), - ), + _path_suffix: ($) => choice('?', '!', seq('?', '!'), seq('!', '?')), path: ($) => { const path = choice( From b72330b93d8c23b87b6d37d62fad6aeb3a23af36 Mon Sep 17 00:00:00 2001 From: Mikhail Katychev Date: Thu, 4 Dec 2025 19:53:57 -0600 Subject: [PATCH 5/6] updated lock --- package-lock.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index e00c0b95..33c394d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,10 +19,10 @@ "eslint-config-treesitter": "^1.0.2", "prebuildify": "^6.0.1", "prettier": "^3.6.2", - "tree-sitter-cli": "^0.22" + "tree-sitter-cli": "^0.25.9" }, "peerDependencies": { - "tree-sitter": "^0.22" + "tree-sitter": "^0.25.0" }, "peerDependenciesMeta": { "tree-sitter": { @@ -1502,14 +1502,17 @@ } }, "node_modules/tree-sitter-cli": { - "version": "0.22.6", - "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.22.6.tgz", - "integrity": "sha512-s7mYOJXi8sIFkt/nLJSqlYZP96VmKTc3BAwIX0rrrlRxWjWuCwixFqwzxWZBQz4R8Hx01iP7z3cT3ih58BUmZQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.25.10.tgz", + "integrity": "sha512-KoebQguKMCIghisEOdA372TIbrUl0kdnfZ9YQIBRAeOvNSKe85XbU4LuFW7hduRUwJj0rAG7pX5wo9sZhbBF1g==", "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { "tree-sitter": "cli.js" + }, + "engines": { + "node": ">=12.0.0" } }, "node_modules/type-check": { From a3c94cacffb8fbaa7ad72bde816ff0071e0619ef Mon Sep 17 00:00:00 2001 From: Mikhail Katychev Date: Fri, 5 Dec 2025 16:28:50 -0600 Subject: [PATCH 6/6] disabled node in CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d98ee16..62786097 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: with: generate: false test-rust: true - test-node: true + test-node: false test-python: true test-go: true test-swift: false