From e030dc3ac8b11732a3d6febb9bf8ab47c528231a Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sun, 2 Nov 2025 16:14:54 +0100 Subject: [PATCH 01/19] Added openspec configs to gitignore --- .gitignore | 5 +++++ Cargo.lock | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6873e9e..67402b4 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,8 @@ coverage_output # MacOS system files .DS_Store + +# Openspec +AGENTS.md +openspec/ +.github/prompts diff --git a/Cargo.lock b/Cargo.lock index b3c640b..e80d47a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -46,7 +46,7 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "amber-lsp" -version = "0.1.9" +version = "0.1.10" dependencies = [ "chumsky", "clap", From 643e3c674ecbdc9be5569956ad88a2b4909c15cd Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sun, 2 Nov 2025 22:54:42 +0100 Subject: [PATCH 02/19] Implemented amber alpha-0.5 version --- .pre-commit-config.yaml | 5 +- Cargo.lock | 282 +- resources/alpha050/builtin.ab | 38 + resources/alpha050/std/array.ab | 84 + resources/alpha050/std/date.ab | 94 + resources/alpha050/std/env.ab | 173 + resources/alpha050/std/fs.ab | 187 + resources/alpha050/std/http.ab | 24 + resources/alpha050/std/math.ab | 34 + resources/alpha050/std/text.ab | 303 + src/analysis/alpha050/exp.rs | 1304 ++ src/analysis/alpha050/global.rs | 601 + src/analysis/alpha050/mod.rs | 3 + src/analysis/alpha050/stmnts.rs | 1233 ++ src/analysis/mod.rs | 1 + src/analysis/types.rs | 3 + src/backend.rs | 7 + src/grammar/alpha034/parser.rs | 2 +- src/grammar/alpha035/parser.rs | 2 +- src/grammar/alpha040/expressions/atom/mod.rs | 2 +- src/grammar/alpha040/parser.rs | 2 +- src/grammar/alpha050/expressions/and.rs | 39 + .../alpha050/expressions/atom/array.rs | 25 + src/grammar/alpha050/expressions/atom/bool.rs | 12 + src/grammar/alpha050/expressions/atom/call.rs | 43 + .../alpha050/expressions/atom/command.rs | 88 + src/grammar/alpha050/expressions/atom/exit.rs | 20 + src/grammar/alpha050/expressions/atom/int.rs | 25 + src/grammar/alpha050/expressions/atom/mod.rs | 76 + src/grammar/alpha050/expressions/atom/null.rs | 11 + .../alpha050/expressions/atom/number.rs | 35 + .../alpha050/expressions/atom/parentheses.rs | 29 + .../alpha050/expressions/atom/status.rs | 11 + src/grammar/alpha050/expressions/atom/text.rs | 55 + src/grammar/alpha050/expressions/atom/var.rs | 11 + src/grammar/alpha050/expressions/cast.rs | 37 + .../alpha050/expressions/comparison.rs | 42 + src/grammar/alpha050/expressions/is.rs | 37 + src/grammar/alpha050/expressions/mod.rs | 21 + src/grammar/alpha050/expressions/or.rs | 37 + src/grammar/alpha050/expressions/product.rs | 39 + src/grammar/alpha050/expressions/range.rs | 36 + src/grammar/alpha050/expressions/sum.rs | 37 + src/grammar/alpha050/expressions/ternary.rs | 60 + src/grammar/alpha050/expressions/unary.rs | 33 + src/grammar/alpha050/global.rs | 329 + src/grammar/alpha050/lexer.rs | 74 + src/grammar/alpha050/mod.rs | 338 + src/grammar/alpha050/parser.rs | 123 + src/grammar/alpha050/semantic_tokens.rs | 948 ++ src/grammar/alpha050/statements/block.rs | 73 + src/grammar/alpha050/statements/comment.rs | 31 + src/grammar/alpha050/statements/const_init.rs | 45 + .../alpha050/statements/failable_handlers.rs | 103 + src/grammar/alpha050/statements/if_cond.rs | 101 + src/grammar/alpha050/statements/keywords.rs | 58 + src/grammar/alpha050/statements/loops.rs | 95 + src/grammar/alpha050/statements/mod.rs | 45 + src/grammar/alpha050/statements/modifiers.rs | 17 + src/grammar/alpha050/statements/move_files.rs | 41 + src/grammar/alpha050/statements/shebang.rs | 10 + src/grammar/alpha050/statements/shorthands.rs | 34 + src/grammar/alpha050/statements/var_init.rs | 43 + src/grammar/alpha050/statements/var_set.rs | 28 + src/grammar/mod.rs | 2 + src/main.rs | 9 +- src/stdlib.rs | 3 + tests/grammar/alpha050.rs | 205 + tests/grammar/mod.rs | 1 + ...__grammar__alpha050__block_singleline.snap | 237 + ...d__grammar__alpha050__comments_in_ifs.snap | 442 + ..._grammar__alpha050__failable_handlers.snap | 582 + .../r#mod__grammar__alpha050__mv_files.snap | 486 + ...#mod__grammar__alpha050__stdlib_array.snap | 2230 +++ ...r#mod__grammar__alpha050__stdlib_date.snap | 3663 +++++ .../r#mod__grammar__alpha050__stdlib_env.snap | 6795 +++++++++ .../r#mod__grammar__alpha050__stdlib_fs.snap | 7289 +++++++++ ...r#mod__grammar__alpha050__stdlib_http.snap | 674 + ...r#mod__grammar__alpha050__stdlib_math.snap | 1337 ++ ...mod__grammar__alpha050__stdlib_text-2.snap | 11394 ++++++++++++++ ...r#mod__grammar__alpha050__stdlib_text.snap | 12336 ++++++++++++++++ ..._alpha050__unfinished_function_call-2.snap | 474 + ...r__alpha050__unfinished_function_call.snap | 480 + 83 files changed, 56237 insertions(+), 181 deletions(-) create mode 100644 resources/alpha050/builtin.ab create mode 100644 resources/alpha050/std/array.ab create mode 100644 resources/alpha050/std/date.ab create mode 100644 resources/alpha050/std/env.ab create mode 100644 resources/alpha050/std/fs.ab create mode 100644 resources/alpha050/std/http.ab create mode 100644 resources/alpha050/std/math.ab create mode 100644 resources/alpha050/std/text.ab create mode 100644 src/analysis/alpha050/exp.rs create mode 100644 src/analysis/alpha050/global.rs create mode 100644 src/analysis/alpha050/mod.rs create mode 100644 src/analysis/alpha050/stmnts.rs create mode 100644 src/grammar/alpha050/expressions/and.rs create mode 100644 src/grammar/alpha050/expressions/atom/array.rs create mode 100644 src/grammar/alpha050/expressions/atom/bool.rs create mode 100644 src/grammar/alpha050/expressions/atom/call.rs create mode 100644 src/grammar/alpha050/expressions/atom/command.rs create mode 100644 src/grammar/alpha050/expressions/atom/exit.rs create mode 100644 src/grammar/alpha050/expressions/atom/int.rs create mode 100644 src/grammar/alpha050/expressions/atom/mod.rs create mode 100644 src/grammar/alpha050/expressions/atom/null.rs create mode 100644 src/grammar/alpha050/expressions/atom/number.rs create mode 100644 src/grammar/alpha050/expressions/atom/parentheses.rs create mode 100644 src/grammar/alpha050/expressions/atom/status.rs create mode 100644 src/grammar/alpha050/expressions/atom/text.rs create mode 100644 src/grammar/alpha050/expressions/atom/var.rs create mode 100644 src/grammar/alpha050/expressions/cast.rs create mode 100644 src/grammar/alpha050/expressions/comparison.rs create mode 100644 src/grammar/alpha050/expressions/is.rs create mode 100644 src/grammar/alpha050/expressions/mod.rs create mode 100644 src/grammar/alpha050/expressions/or.rs create mode 100644 src/grammar/alpha050/expressions/product.rs create mode 100644 src/grammar/alpha050/expressions/range.rs create mode 100644 src/grammar/alpha050/expressions/sum.rs create mode 100644 src/grammar/alpha050/expressions/ternary.rs create mode 100644 src/grammar/alpha050/expressions/unary.rs create mode 100644 src/grammar/alpha050/global.rs create mode 100644 src/grammar/alpha050/lexer.rs create mode 100644 src/grammar/alpha050/mod.rs create mode 100644 src/grammar/alpha050/parser.rs create mode 100644 src/grammar/alpha050/semantic_tokens.rs create mode 100644 src/grammar/alpha050/statements/block.rs create mode 100644 src/grammar/alpha050/statements/comment.rs create mode 100644 src/grammar/alpha050/statements/const_init.rs create mode 100644 src/grammar/alpha050/statements/failable_handlers.rs create mode 100644 src/grammar/alpha050/statements/if_cond.rs create mode 100644 src/grammar/alpha050/statements/keywords.rs create mode 100644 src/grammar/alpha050/statements/loops.rs create mode 100644 src/grammar/alpha050/statements/mod.rs create mode 100644 src/grammar/alpha050/statements/modifiers.rs create mode 100644 src/grammar/alpha050/statements/move_files.rs create mode 100644 src/grammar/alpha050/statements/shebang.rs create mode 100644 src/grammar/alpha050/statements/shorthands.rs create mode 100644 src/grammar/alpha050/statements/var_init.rs create mode 100644 src/grammar/alpha050/statements/var_set.rs create mode 100644 tests/grammar/alpha050.rs create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__block_singleline.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__comments_in_ifs.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__failable_handlers.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__mv_files.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call-2.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call.snap diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ad4700d..1251cc1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,6 @@ repos: hooks: - id: trailing-whitespace - id: end-of-file-fixer - - id: check-added-large-files - id: check-yaml - id: check-toml @@ -12,9 +11,9 @@ repos: hooks: - id: find-fixme-phrase name: Find FIXME phrase - entry: bash -c 'git diff --cached --name-only --diff-filter=ACM | grep -E "\.(txt|js|ts|py|rs|go|java|c|cpp|sh)$" | xargs -r grep -l "FIXME" && exit 1 || exit 0' + entry: bash -c 'git diff --cached --name-only --diff-filter=ACM | grep -E "\.(txt|js|ts|py|rs|go|java|c|cpp|sh|ab)$" | xargs -r grep -l "FIXME" && exit 1 || exit 0' language: system - files: '\.(txt|js|ts|py|rs|go|java|c|cpp|sh)$' + files: '\.(txt|js|ts|py|rs|go|java|c|cpp|sh|ab)$' description: Checks for the "FIXME" phrase in staged text files. - repo: local diff --git a/Cargo.lock b/Cargo.lock index e80d47a..ea753a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,21 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "ahash" version = "0.8.12" @@ -31,9 +16,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -71,9 +56,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -86,9 +71,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -120,24 +105,12 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "backtrace" -version = "0.3.76" +name = "ar_archive_writer" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a" dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", "object", - "rustc-demangle", - "windows-link", ] [[package]] @@ -148,9 +121,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "bytes" @@ -166,9 +139,9 @@ checksum = "6b5271031022835ee8c7582fe67403bd6cb3d962095787af7921027234bab5bf" [[package]] name = "cc" -version = "1.2.39" +version = "1.2.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" +checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" dependencies = [ "find-msvc-tools", "shlex", @@ -176,9 +149,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chumsky" @@ -194,9 +167,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.48" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" +checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" dependencies = [ "clap_builder", "clap_derive", @@ -204,9 +177,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.48" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" +checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" dependencies = [ "anstream", "anstyle", @@ -216,9 +189,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.47" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", @@ -228,9 +201,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "colorchoice" @@ -291,9 +264,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", ] @@ -312,9 +285,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "find-msvc-tools" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" [[package]] name = "fluent-uri" @@ -408,12 +381,6 @@ dependencies = [ "slab", ] -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - [[package]] name = "hashbrown" version = "0.14.5" @@ -474,9 +441,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", "hashbrown 0.16.0", @@ -494,22 +461,11 @@ dependencies = [ "similar", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", -] - [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itoa" @@ -525,17 +481,16 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.176" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -564,33 +519,24 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "wasi", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "nu-ansi-term" -version = "0.50.1" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -601,9 +547,9 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "object" -version = "0.37.3" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -616,9 +562,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "pad" @@ -631,9 +577,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -641,15 +587,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -720,19 +666,20 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "psm" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" +checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01" dependencies = [ + "ar_archive_writer", "cc", ] @@ -768,11 +715,11 @@ checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] @@ -802,12 +749,6 @@ dependencies = [ "str_indices", ] -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -930,19 +871,19 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "stacker" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b" +checksum = "e1f8b29fb42aafcea4edeeb6b2f2d7ecd0d969c48b4cf0d2e64aafc471dd6e59" dependencies = [ "cc", "cfg-if", @@ -965,9 +906,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.106" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -1062,29 +1003,26 @@ dependencies = [ [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", @@ -1093,9 +1031,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -1222,9 +1160,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-width" @@ -1258,35 +1196,35 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.60.2" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-targets 0.53.4", + "windows-link", ] [[package]] @@ -1307,19 +1245,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.4" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -1330,9 +1268,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -1342,9 +1280,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -1354,9 +1292,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -1366,9 +1304,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -1378,9 +1316,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -1390,9 +1328,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -1402,9 +1340,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -1414,9 +1352,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "zerocopy" diff --git a/resources/alpha050/builtin.ab b/resources/alpha050/builtin.ab new file mode 100644 index 0000000..fae16c5 --- /dev/null +++ b/resources/alpha050/builtin.ab @@ -0,0 +1,38 @@ +/// This builtin reads one line at a time from a text file. +/// It can be used in place of an array in an iterative for loop (with or without an index). +/// This is efficient because each line is read into memory, and processed before the next line is read: +/// +/// ```amber +/// for line in lines("foo.txt") { +/// echo line +/// } +/// +/// for index, line in lines("bar.txt") { +/// echo "\#{index} {line}" +/// } +/// ``` +/// +/// Alternatively, it can be used as the right hand side of an array assignment. +/// This is inefficient because the entire file is read into memory in one go: +/// +/// ```amber +/// let lines = lines("foo.txt") +/// lines += lines("bar.txt") +/// echo len(lines) +/// ``` +pub fun lines(path: Text): [Text] {} + +/// For a `Text` value, this builtin calculates and returns the length (in ASCII characters) as a Num type. +/// It is transpiled to `${#TEXT}`: +/// ```amber +/// // Returns 37 +/// echo len("Jackdaws love my big sphinx of quartz") +/// ``` +/// For an `Array` `[]` value, it calculates and returns the length of the array as a Num type. +/// It is transpiled to `${#ARRAY[@]}`: +/// +/// ```amber +/// // Returns 5 +/// echo len(["one", "two", "three", "four", "five"]) +/// ``` +pub fun len(value): Int {} diff --git a/resources/alpha050/std/array.ab b/resources/alpha050/std/array.ab new file mode 100644 index 0000000..492f1a5 --- /dev/null +++ b/resources/alpha050/std/array.ab @@ -0,0 +1,84 @@ +/// Returns index of the first value found in the specified array. +/// +/// If the value is not found, the function returns -1. +pub fun array_find(array, value): Int { + for index, element in array { + if value as Text == element as Text { + return index + } + } + return -1 +} + +/// Searches for a value in an array and returns an array with the index of the various items. +pub fun array_find_all(array, value): [Int] { + let result = [Int] + for index, element in array { + if value as Text == element as Text { + result += [index] + } + } + return result +} + +/// Checks if a value is in the array. +pub fun array_contains(array, value) { + let result = array_find(array, value) + return result >= 0 +} + +/// Returns the first element in the array; if the array is empty, the return +/// value is undefined. +pub fun array_first(array) { + return array[0] +} + +/// Returns the last element in the array; if the array is empty, the return +/// value is undefined. +pub fun array_last(array) { + let index = len(array) - 1 + if index < 0: + fail 1 + return array[index] +} + +/// Removes an element at the index from the array; if the index is negative +/// or beyond the end, the return value is undefined, but the array will be +/// unchanged. +pub fun array_remove_at(ref array: [], index: Int): Null { + let offset = index + 1 + let length = len(array) + array = array[0..index] + array[offset..length] +} + +/// Removes an element at the index from the array, and returns it +pub fun array_extract_at(ref array: [], index: Int) { + if index < 0 or index >= len(array): + fail 1 + let element = array[index] + let offset = index + 1 + let length = len(array) + array = array[0..index] + array[offset..length] + return element +} + +/// Removes the last element from the array, and returns it; if the array +/// is empty, the return value is undefined, but the array will be unchanged. +pub fun array_pop(ref array: []) { + let length = len(array) + let index = length - 1 + if index < 0: + fail 1 + let element = array[index] + array = array[0..index] + return element +} + +/// Removes the first element from the array, and returns it; if the array +/// is empty, the return value is undefined, but the array will be unchanged. +pub fun array_shift(ref array: []) { + let length = len(array) + let element = array[0] + array = array[1..length] + return element +} diff --git a/resources/alpha050/std/date.ab b/resources/alpha050/std/date.ab new file mode 100644 index 0000000..5914ffc --- /dev/null +++ b/resources/alpha050/std/date.ab @@ -0,0 +1,94 @@ +/// All dates are internally stored as miliseconds since the Epoch (1970-01-01 00:00 UTC). + +/// Transform date from unix epoch to a human-readable format described by a posix format string. +/// If no format is specified, "%F %T" is used. +/// For more info about format type "man date" in your shell or see . +/// +/// Format includes the following patterns: +/// - `%%` - a literal % +/// - `%a` - locale's abbreviated weekday name (e.g., Sun) +/// - `%A` - locale's full weekday name (e.g., Sunday) +/// - `%b` - locale's abbreviated month name (e.g., Jan) +/// - `%B` - locale's full month name (e.g., January) +/// - `%d` - day of month (e.g., 01) +/// - `%D` - date; same as %m/%d/%y +/// - `%F` - full date; like %+4Y-%m-%d +/// - `%H` - hour (00..23) +/// - `%I` - hour (01..12) +/// - `%m` - month (01..12) +/// - `%M` - minute (00..59) +/// - `%N` - nanoseconds (000000000..999999999) +/// - `%p` - locale's equivalent of either AM or PM; blank if unknown +/// - `%T` - time; same as %H:%M:%S +/// - `%Y` - year +pub fun date_format_posix(date: Num, format: Text = "%F %T", utc: Bool = false): Text? { + let utc_flag = utc then "-u" else "" + // Case if this is a GNU date command + return $ date {utc_flag} -d "@{date}" +"{format}" 2>/dev/null $ failed { + // Case if this is a BSD date command + return $ date {utc_flag} -j -r "{date}" +"{format}" $? + } +} + +/// Transforms date from a format described by a posix format string to a unix epoch format (seconds since the Epoch (1970-01-01 00:00 UTC)). +/// If no format is specified, "%F %T" format is used. +/// For more info about format type "man date" on your shell or go to . +#[allow_absurd_cast] +pub fun date_from_posix(date: Text, format: Text = "%F %T", utc: Bool = false): Num? { + let utc_flag = utc then "-u" else "" + // Case if this is a GNU date command + return $ date {utc_flag} -d "\$(date -d "{date}" +"{format}" 2>/dev/null)" +%s 2>/dev/null $ failed { + // Case if this is a BSD date command + return $ date {utc_flag} -j -f "{format}" "{date}" +%s $? as Num + } as Num +} + +/// Returns the current timestamp (seconds since the Epoch (1970-01-01 00:00 UTC)). +#[allow_absurd_cast] +pub fun date_now(): Num { + return trust $ date +%s $ as Num +} + +/// Adds a value to a date passed in the unix epoch format in miliseconds. +/// Example : `date_add(date, 3, "days")` +/// +/// Available units: +/// - years +/// - months +/// - days +/// - hours +/// - minutes +/// - seconds +pub fun date_add(date: Num, amount: Num, unit: Text): Num? { + if { + unit == "years": return date + amount * 365 * 24 * 60 * 60 + unit == "months": return date + amount * 30 * 24 * 60 * 60 + unit == "days": return date + amount * 24 * 60 * 60 + unit == "hours": return date + amount * 60 * 60 + unit == "minutes": return date + amount * 60 + unit == "seconds": return date + amount + else: fail 1 + } +} + +/// Subtracts a value from a date passed in the unix epoch format in miliseconds. +/// Example : `date_sub(date, 5, "hours")` +/// +/// Available units: +/// - years +/// - months +/// - days +/// - hours +/// - minutes +/// - seconds +pub fun date_sub(date: Num, amount: Num, unit: Text): Num? { + if { + unit == "years": return date - amount * 365 * 24 * 60 * 60 + unit == "months": return date - amount * 30 * 24 * 60 * 60 + unit == "days": return date - amount * 24 * 60 * 60 + unit == "hours": return date - amount * 60 * 60 + unit == "minutes": return date - amount * 60 + unit == "seconds": return date - amount + else: fail 1 + } +} diff --git a/resources/alpha050/std/env.ab b/resources/alpha050/std/env.ab new file mode 100644 index 0000000..7cb1634 --- /dev/null +++ b/resources/alpha050/std/env.ab @@ -0,0 +1,173 @@ +import * from "std/fs" +import * from "std/text" + +/// Retrieves the value of an environment variable, optionally sourcing it from a file if not already set. +pub fun env_var_load(var: Text, file: Text = ".env"): Text { + let _var = trust $ echo "\$\{!{nameof var}}" $ + if _var != "" { + return _var + } + + if file_exists(file) { + trust $ source "{file}" $ + return trust $ echo "\$\{!{nameof var}}" $ + } + + return "" +} + +/// Loads the env file in the environment, using `xargs`. +pub fun env_file_load(file: Text = ".env"): Null { + trust $ export "\$(xargs < {file})" > /dev/null $ +} + +/// Checks if a variable inside the shell session exists. +pub fun env_var_test(name: Text): Bool { + $ [[ ! -z \$\{!{nameof name}+z} ]] $ failed { + return false + } + return true +} + +/// Sets a constant inside the shell session. +pub fun env_const_set(name: Text, val: Text): Null? { + $ readonly \${nameof name}="\${nameof val}" 2> /dev/null $? +} + +/// Gets a constant inside the shell session. +pub fun env_const_get(name: Text): Text? { + return $ echo \$\{!{nameof name}} $? +} + +/// Sets a constant inside the shell session. +pub fun env_var_set(name: Text, val: Text): Null? { + $ export \${nameof name}="\${nameof val}" 2> /dev/null $? +} + +/// Gets a constant inside the shell session. +pub fun env_var_get(name: Text): Text? { + return $ echo \$\{!{nameof name}} $? +} + +/// Removes a variable inside the shell session. +pub fun env_var_unset(name: Text): Null? { + $ unset {name} $? +} + +/// Checks if a command exists. +pub fun is_command(command: Text): Bool { + $ [ -x "\$(command -v "{command}")" ] $ failed { + return false + } + return true +} + +/// Creates a prompt and returns the value. +pub fun input_prompt(prompt: Text): Text { + trust $ read -p "\${nameof prompt}" $ + return trust $ echo \$REPLY $ +} + +/// Creates a prompt, hides any user input and returns the value. +pub fun input_hidden(prompt: Text): Text { + trust { + $ read -s -p "\${nameof prompt}" $ + $ echo "" >&2 $ + return $ echo \$REPLY $ + } +} + +/// Creates a confirm prompt (Yes/No), and returns true if the choice is Yes. +/// +/// "No" is the default choice, set default_yes to true for "Yes" as default choice. +pub fun input_confirm(prompt: Text, default_yes: Bool = false): Bool { + let choice_default = default_yes then " [\x1b[1mY/\x1b[0mn]" else " [y/\x1b[1mN\x1b[0m]" + trust { + $ printf "\x1b[1m{prompt}\x1b[0m{choice_default}" $ + $ read -s -n 1 $ + $ printf "\n" $ + } + let result = lowercase(trust $ echo \$REPLY $) + return result == "y" or (result == "" and default_yes) +} + +/// Checks if the command has failed. +pub fun has_failed(command: Text): Bool { + trust silent $ eval {command} $ + return status != 0 +} + +/// Checks if the script is running with a user with root permission. +pub fun is_root(): Bool { + if trust $ id -u $ == "0" { + return true + } + + return false +} + +/// `printf` the text following the arguments. +pub fun printf(format: Text, args: [Text] = [""]): Null { + trust $ {nameof args}=("{format}" "\$\{{nameof args}[@]}") $ + trust $ printf "\$\{{nameof args}[@]}" $ +} + +/// Escapes the text to be used with `printf`. +pub fun escaped(text: Text): Text { + return trust $ echo \${nameof text} | sed -e 's/\\\\/\\\\\\\\/g' -e "s/%/%%/g" $ +} + +/// Prepares a text with formatting options for `printf`. +pub fun styled(message: Text, style: Num, fg: Num, bg: Num): Text { + return "\x1b[{style};{fg};{bg}m{escaped(message)}\x1b[0m" +} + +/// Returns a text as bold. +pub fun bold(message: Text): Text { + return "\x1b[1m{escaped(message)}\x1b[0m" +} + +/// Returns a text as italic. +pub fun italic(message: Text): Text { + return "\x1b[3m{escaped(message)}\x1b[0m" +} + +/// Returns a text as underlined. +pub fun underlined(message: Text): Text { + return "\x1b[4m{escaped(message)}\x1b[0m" +} + +/// Prints a text with a specified color. +pub fun echo_colored(message: Text, color: Num): Null { + printf("\x1b[{color as Text}m%s\x1b[0m\n", [message]) +} + +/// Prints a text as a info message. +pub fun echo_info(message: Text): Null { + printf("\x1b[1;3;97;44m%s\x1b[0m\n", [message]) +} + +/// Prints a text as a success message. +pub fun echo_success(message: Text): Null { + printf("\x1b[1;3;97;42m%s\x1b[0m\n", [message]) +} + +/// Prints a text as a warning message. +pub fun echo_warning(message: Text): Null { + printf("\x1b[1;3;97;43m%s\x1b[0m\n", [message]) +} + +/// Prints a text as a error and exits if the status code is greater than 0. +pub fun echo_error(message: Text, exit_code: Int = 1): Null { + printf("\x1b[1;3;97;41m%s\x1b[0m\n", [message]) + if exit_code > 0 : exit(exit_code) +} + +/// Returns current bash version with major, minor and patch components. +#[allow_absurd_cast] +pub fun bash_version(): [Int] { + let major = trust $ echo "\$\{BASH_VERSINFO[0]}" $ as Int + let minor = trust $ echo "\$\{BASH_VERSINFO[1]}" $ as Int + let patch = trust $ echo "\$\{BASH_VERSINFO[2]}" $ as Int + return [major, minor, patch] +} diff --git a/resources/alpha050/std/fs.ab b/resources/alpha050/std/fs.ab new file mode 100644 index 0000000..5abf06a --- /dev/null +++ b/resources/alpha050/std/fs.ab @@ -0,0 +1,187 @@ +import { match_regex, join, replace_regex, split, trim } from "std/text" + +/// Checks if a directory exists. +pub fun dir_exists(path) { + $ [ -d "{path}" ] $ failed { + return false + } + return true +} + +/// Checks if a file exists. +pub fun file_exists(path) { + $ [ -f "{path}" ] $ failed { + return false + } + return true +} + +/// Gets file contents from a path. +pub fun file_read(path) { + return $ < "{path}" $? +} + +/// Writes content to a file. +/// Doesn't check if the file exist +pub fun file_write(path, content) { + return $ echo "{content}" > "{path}" $? +} + +/// Appends content to a file. +/// +/// Doesn't check if the file exists. +pub fun file_append(path, content) { + return $ echo "{content}" >> "{path}" $? +} + +/// Creates a symbolic link. +/// +/// If the file doesn't exist, it returns a boolean and prints a message. +pub fun symlink_create(origin: Text, destination: Text): Bool { + if file_exists(origin) { + trust $ ln -s "{origin}" "{destination}" $ + return true + } + + echo "The file {origin} doesn't exist!" + return false +} + +/// Creates a directory with all parent directories as required. +pub fun dir_create(path: Text): Null { + if not dir_exists(path) { + trust $ mkdir -p "{path}" $ + } +} + +/// Determine whether mktemp is macOS's. +fun is_mac_os_mktemp(): Bool { + // macOS's mktemp does not have --version + silent $ mktemp --version $ failed { + return true + } + return false +} + +/// Create a temporary directory and return the path. +/// Please note this does not respect _CS_DARWIN_USER_TEMP_DIR environment variable. +pub fun temp_dir_create( + template: Text = "tmp.XXXXXXXXXX", + auto_delete: Bool = false, + force_delete: Bool = false + ): Text? { + if trim(template) == "" { + echo "The template cannot be an empty string!" + fail 1 + } + + let filename = "" + if is_mac_os_mktemp() { + // usage: mktemp [-d] [-p tmpdir] [-q] [-t prefix] [-u] template ... + // mktemp [-d] [-p tmpdir] [-q] [-u] -t prefix + filename = $ mktemp -d -p "\$TMPDIR" "{template}" $? + } else { + filename = $ mktemp -d -p "\$TMPDIR" -t "{template}" $? + } + if filename == "" { + echo "Failed to make a temporary directory" + fail 1 + } + if auto_delete { + if force_delete { + $ trap 'rm -rf {filename}' EXIT $ failed { + echo "Setting auto deletion fails. You must delete temporary dir {filename}." + } + } else { + $ trap 'rmdir {filename}' EXIT $ failed { + echo "Setting auto deletion fails. You must delete temporary dir {filename}." + } + } + } + return filename +} + +/// Changes the permission bits of a file. +/// +/// If the file doesn't exist, it returns `false` and prints a message. +pub fun file_chmod(path: Text, mode: Text): Bool { + if file_exists(path) { + trust $ chmod "{mode}" "{path}" $ + return true + } + + echo "The file {path} doesn't exist!" + return false +} + +/// Changes the owner of a file. +/// +/// If the file doesn't exist, it returns `false` and prints a message. +pub fun file_chown(path: Text, user: Text): Bool { + if file_exists(path) or dir_exists(path) { + trust $ chown -R "{user}" "{path}" $ + return true + } + + echo "The file {path} doesn't exist!" + return false +} + +/// Escapes all characters in the passed-in glob except "*", "?" and "/", +/// to prevent injection attacks. +fun escape_non_glob_chars(path: Text): Text { + return replace_regex(path, "\([^*?/]\)", "\\\\\1") +} + +/// Finds all files or directories matching multiple file globs. When +/// we have union types, this functionality can be merged into the main +/// `glob` function. +pub fun file_glob_all(paths: [Text]): [Text]? { + let combined = "" + if len(paths) == 1 { + combined = escape_non_glob_chars(paths[0]) + } else { + let items = [Text] + for item in paths { + item = escape_non_glob_chars(item) + items += [item] + } + combined = join(items, " ") + } + let files = $ eval "for file in {combined}; do [ -e \\\"\\\$file\\\" ] && echo \\\"\\\$file\\\"; done" $? + return split(files, "\n") +} + +/// Finds all files or directories matching a file glob. +pub fun file_glob(path: Text): [Text]? { + return file_glob_all([path])? +} + +/// Extract the file detecting from the filename the extension +/// Supports: bz2, gz, xz, bz2, deb, rar, rpm, tar(gz/xz/bz), zip(war/jar), 7z +/// Note: Not all the commands supports the output folder path +pub fun file_extract(path: Text, target: Text): Null? { + if file_exists(path) { + if { + match_regex(path, "\.(tar\.bz2|tbz|tbz2)$", true): $ tar xvjf "{path}" -C "{target}" $? + match_regex(path, "\.(tar\.gz|tgz)$", true): $ tar xzf "{path}" -C "{target}" $? + match_regex(path, "\.(tar\.xz|txz)$", true): $ tar xJf "{path}" -C "{target}" $? + match_regex(path, "\.bz2$"): $ bunzip2 "{path}" $? + match_regex(path, "\.deb$"): $ dpkg-deb -xv "{path}" "{target}" $? + match_regex(path, "\.gz$"): $ gunzip "{path}" $? + match_regex(path, "\.rar$"): $ unrar x "{path}" "{target}" $? + match_regex(path, "\.rpm$"): $ rpm2cpio "{path}" | cpio -idm $? + match_regex(path, "\.tar$"): $ tar xf "{path}" -C "{target}" $? + match_regex(path, "\.xz$"): $ xz --decompress "{path}" $? + match_regex(path, "\.7z$"): $ 7z -y "{path}" -o "{target}" $? + match_regex(path, "\.\(zip\|war\|jar\)$"): $ unzip "{path}" -d "{target}" $? + else { + echo "Error: Unsupported file type" + fail 3 + } + } + } else { + echo "Error: File not found" + fail 2 + } +} diff --git a/resources/alpha050/std/http.ab b/resources/alpha050/std/http.ab new file mode 100644 index 0000000..31894bd --- /dev/null +++ b/resources/alpha050/std/http.ab @@ -0,0 +1,24 @@ +import * from "std/env" + +/// Downloads a file from a given URL and saves it to a specified path using available command-line tools. +/// +/// It checks for the availability of common command-line tools (`curl`, `wget`, and `aria2c`, in order) and uses the first available tool to perform the download. +/// If none of the tools are available, the function returns `false`. +pub fun file_download(url: Text, path: Text): Bool { + if { + is_command("curl") { + silent trust $ curl -L -o "{path}" "{url}" $ + } + is_command("wget") { + silent trust $ wget "{url}" -P "{path}" $ + } + is_command("aria2c") { + silent trust $ aria2c "{url}" -d "{path}" $ + } + else { + return false + } + } + + return true +} diff --git a/resources/alpha050/std/math.ab b/resources/alpha050/std/math.ab new file mode 100644 index 0000000..a2d8ec5 --- /dev/null +++ b/resources/alpha050/std/math.ab @@ -0,0 +1,34 @@ +/// Sums an array's contents +#[allow_absurd_cast] +pub fun math_sum(list: [Num]): Num { + return trust $ echo "{list}" | awk '\{s=0; for (i=1; i<=NF; i++) s+=\$i; print s}' $ as Num +} + +/// Returns a number, rounded to the nearest integer +#[allow_absurd_cast] +pub fun math_round(number: Num): Num { + if number > 0 { + return trust $ echo "({number}+0.5)/1" | bc $ as Num + } + + return trust $ echo "({number}-0.5)/1" | bc $ as Num +} + +/// Returns the largest integer less than or equal to a number +#[allow_absurd_cast] +pub fun math_floor(number: Num): Num { + return trust $ echo "{number}" | awk '\{printf "%d", (\$1 < 0 ? int(\$1) - 1 : int(\$1))}' $ as Num +} + +/// Returns the smallest integer greater than or equal to a number +#[allow_absurd_cast] +pub fun math_ceil(number: Num): Num { + return math_floor(number) + 1.0 +} + +/// Returns the absolute value of a number +#[allow_absurd_cast] +pub fun math_abs(number: Num): Num { + if number < 0: return -number + return number +} diff --git a/resources/alpha050/std/text.ab b/resources/alpha050/std/text.ab new file mode 100644 index 0000000..d91a39c --- /dev/null +++ b/resources/alpha050/std/text.ab @@ -0,0 +1,303 @@ +// We cannot import `bash_version` from `env.ab` because it imports `text.ab` making a circular dependency. +// This is a workaround to avoid that issue and the import system should be improved in the future. +#[allow_absurd_cast] +fun bash_version(): [Int] { + let major = trust $ echo "\$\{BASH_VERSINFO[0]}" $ as Int + let minor = trust $ echo "\$\{BASH_VERSINFO[1]}" $ as Int + let patch = trust $ echo "\$\{BASH_VERSINFO[2]}" $ as Int + return [major, minor, patch] +} + +/// Replaces all occurrences of a pattern in the content with the provided replace text. +pub fun replace(source, search, replace) { + // Here we use a command to avoid #646 + let result = "" + if bash_version() >= [4,3] { + trust $ {nameof result}="\$\{{nameof source}//\"\$\{{nameof search}}\"/\"\$\{{nameof replace}}\"}" $ + } else { + trust $ {nameof result}="\$\{{nameof source}//\"\$\{{nameof search}}\"/\$\{{nameof replace}}}" $ + } + return result +} + +/// Replaces the first occurrence of a pattern in the content with the provided replace text. +pub fun replace_one(source, search, replace) { + // Here we use a command to avoid #646 + let result = "" + if bash_version() >= [4,3] { + trust $ {nameof result}="\$\{{nameof source}/\"\$\{{nameof search}}\"/\"\$\{{nameof replace}}\"}" $ + } else { + trust $ {nameof result}="\$\{{nameof source}/\"\$\{{nameof search}}\"/\$\{{nameof replace}}}" $ + } + return result +} + +const SED_VERSION_UNKNOWN = 0 +const SED_VERSION_GNU = 1 +const SED_VERSION_BUSYBOX = 2 + +fun sed_version(): Int { + // We can't match against a word "GNU" because + // alpine's busybox sed returns "This is not GNU sed version" + trust $ re='\bCopyright\b.+\bFree Software Foundation\b'; [[ \$(sed --version 2>/dev/null) =~ \$re ]] $ + if status == 0 { + return SED_VERSION_GNU + } + trust $ re='\bBusyBox\b'; [[ \$(sed 2>&1) =~ \$re ]] $ + if status == 0 { + return SED_VERSION_BUSYBOX + } + return SED_VERSION_UNKNOWN +} + +/// Replaces all occurences of a regex pattern in the content with the provided replace text. +/// +/// Function uses `sed` +pub fun replace_regex(source: Text, search: Text, replace_text: Text, extended: Bool = false): Text { + trust { + const sed_version = sed_version() + search = replace(search, "/", "\/") + replace_text = replace(replace_text, "/", "\/") + if sed_version == SED_VERSION_GNU or sed_version == SED_VERSION_BUSYBOX { + // '\b' is supported but not in POSIX standards. Disable it + search = replace(search, "\\b", "\\\b") + } + if extended { + // GNU sed versions 4.0 through 4.2 support extended regex syntax, + // but only via the "-r" option + if sed_version == SED_VERSION_GNU { + return $ echo "{source}" | sed -r -e "s/{search}/{replace_text}/g" $ + } else { + return $ echo "{source}" | sed -E -e "s/{search}/{replace_text}/g" $ + } + } else { + if sed_version == SED_VERSION_GNU or sed_version == SED_VERSION_BUSYBOX { + // GNU Sed BRE handle \| as a metacharacter, but it is not POSIX standands. Disable it + search = replace(search, "\|", "|") + } + return $ echo "{source}" | sed -e "s/{search}/{replace_text}/g" $ + } + } +} + +/// Splits the input `text` into an array of substrings using the specified `delimiter`. +pub fun split(text: Text, delimiter: Text): [Text] { + let result = [Text] + trust $ IFS="{delimiter}" read -rd '' -a {nameof result} < <(printf %s "\${nameof text}") $ + return result +} + +/// Splits a `text` into an array of substrings based on newline characters. +pub fun split_lines(text: Text): [Text] { + return split(text, "\n") +} + +/// Splits a `text` into an array of substrings based on space character. +pub fun split_words(text: Text): [Text] { + return split(text, " ") +} + +/// Merges text using the delimiter specified. +pub fun join(list: [Text], delimiter: Text): Text { + return trust $ IFS="{delimiter}" ; echo "\$\{{nameof list}[*]}" $ +} + +/// Trims the spaces at top of the text using `sed`. +pub fun trim_left(text: Text): Text { + return trust $ echo "{text}" | sed -e 's/^[[:space:]]*//' $ +} + +/// Trims the spaces at end of the text using `sed`. +pub fun trim_right(text: Text): Text { + return trust $ echo "{text}" | sed -e 's/[[:space:]]*\$//' $ +} + +/// Trims the spaces from the text input. +pub fun trim(text: Text): Text { + return trim_left(trim_right(text)) +} + +/// Makes the text input lowercase using `tr`. +pub fun lowercase(text: Text): Text { + return trust $ echo "{text}" | tr '[:upper:]' '[:lower:]' $ +} + +/// Makes the text input uppercase using `tr`. +pub fun uppercase(text: Text): Text { + return trust $ echo "{text}" | tr '[:lower:]' '[:upper:]' $ +} + +/// Attempts to parse a given text into a number, returning the parsed number or zero if parsing fails. +#[allow_absurd_cast] +pub fun parse_number(text: Text): Num? { + $ [ -n "{text}" ] && [ "{text}" -eq "{text}" ] 2>/dev/null $? + return text as Num +} + +/// Splits a text into an array of individual characters. +pub fun split_chars(text: Text): [Text] { + let chars = [Text] + trust $ for ((i=0; i<\$\{#{nameof text}}; i++)); do + {nameof chars}+=( "\$\{{nameof text}:\$i:1}" ); + done $ + return chars +} + +/// Checks if some text contains a value. +pub fun text_contains(source: Text, search: Text): Bool { + let result = trust $ if [[ "{source}" == *"{search}"* ]]; then + echo 1 + fi $ + + return result == "1" +} + +/// Checks if an array value is in the text. +pub fun text_contains_any(source: Text, searches: [Text]): Bool { + for search in searches { + if text_contains(source, search) { + return true + } + } + + return false +} + +/// Checks if all the arrays values are in the string +pub fun text_contains_all(source: Text, searches: [Text]): Bool { + for search in searches { + if not text_contains(source, search) { + return false + } + } + + return true +} + +/// Match all occurences of a regex pattern. +/// +/// Function uses `sed` +pub fun match_regex(source: Text, search: Text, extended: Bool = false): Bool { + trust { + const sed_version = sed_version() + search = replace(search, "/", "\/") + let output = "" + if sed_version == SED_VERSION_GNU or sed_version == SED_VERSION_BUSYBOX { + // '\b' is supported but not in POSIX standards. Disable it + search = replace(search, "\\b", "\\\b") + } + if extended { + // GNU sed versions 4.0 through 4.2 support extended regex syntax, + // but only via the "-r" option + if sed_version == SED_VERSION_GNU { + // '\b' is not in POSIX standards. Disable it + search = replace(search, "\b", "\\b") + output = $ echo "{source}" | sed -r -ne "/{search}/p" $ + } else { + output = $ echo "{source}" | sed -E -ne "/{search}/p" $ + } + } else { + if sed_version == SED_VERSION_GNU or sed_version == SED_VERSION_BUSYBOX { + // GNU Sed BRE handle \| as a metacharacter, but it is not POSIX standands. Disable it + search = replace(search, "\|", "|") + } + output = $ echo "{source}" | sed -ne "/{search}/p" $ + } + if output != "" { + return true + } + } + return false +} + +/// Checks if an array value (with regular expression) is in the text. +pub fun match_regex_any(text: Text, terms: [Text]): Bool { + for term in terms { + if match_regex(text, term, false) { + return true + } + } + + return false +} + +/// Reverses text using `rev`. +pub fun reversed(text: Text): Text { + return trust $ echo "{text}" | rev $ +} + +/// Checks if text starts with a value. +pub fun starts_with(text: Text, prefix: Text): Bool { + let result = trust $ if [[ "{text}" == "{prefix}"* ]]; then + echo 1 + fi $ + + return result == "1" +} + +/// Checks if text ends with a value. +pub fun ends_with(text: Text, suffix: Text): Bool { + let result = trust $ if [[ "{text}" == *"{suffix}" ]]; then + echo 1 + fi $ + + return result == "1" +} + +/// Returns a substring from `text` starting at the given `index` (0-based). +/// +/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`. +/// If `length` is provided, the substring will include `length` characters; otherwise, it slices to the end of `text`. +/// If `length` is negative, an empty string is returned. +pub fun slice(text: Text, index: Int, length: Int = 0): Text { + if length == 0: length = len(text) - index + if length <= 0: return "" + return trust $ printf "%.{length}s" "\$\{text:{index}}" $ +} + +/// Returns the character from `text` at the specified `index` (0-based). +/// +/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`. +pub fun char_at(text: Text, index: Int): Text { + return trust $ printf "%.1s" "\$\{text:{index}}" $ +} + +/// Capitalize the first letter of the given `text`. +#[allow_absurd_cast] +pub fun capitalized(text: Text): Text { + trust { + if len(text) == 0 { + return text + } + if bash_version() >= [4] { + return $ echo \"\$\{{nameof text}^}\" $ + } + if sed_version() == SED_VERSION_GNU { + // GNU sed supports \U + return $ echo "{text}" | sed "s/^\(.\)/\U\1/" $ + } + const first_letter = uppercase(char_at(text, 0)) + return first_letter + slice(text, 1) + } +} + +/// Pads `text` with the specified `pad` character on left until it reaches the desired `length`. +pub fun lpad(text: Text, pad: Text, length: Num): Text { + if length <= len(text): return text + length = len(text) - length + pad = trust $ printf "%{length}s" "" | tr " " "{pad}" $ + return pad + text +} + +/// Pads `text` with the specified `pad` character on the right until it reaches the desired `length`. +pub fun rpad(text: Text, pad: Text, length: Num): Text { + if length <= len(text): return text + length = len(text) - length + pad = trust $ printf "%{length}s" "" | tr " " "{pad}" $ + return text + pad +} + +/// Pads `text` with zeros on the left until it reaches the desired `length`. +pub fun zfill(text: Text, length: Num): Text { + return lpad(text, "0", length) +} diff --git a/src/analysis/alpha050/exp.rs b/src/analysis/alpha050/exp.rs new file mode 100644 index 0000000..2acbfa2 --- /dev/null +++ b/src/analysis/alpha050/exp.rs @@ -0,0 +1,1304 @@ +use std::vec; + +use chumsky::span::SimpleSpan; + +use crate::{ + analysis::{ + get_symbol_definition_info, insert_symbol_reference, + types::{make_union_type, matches_type, DataType, GenericsMap}, + BlockContext, Context, FunctionArgument, FunctionSymbol, SymbolInfo, SymbolLocation, + SymbolType, VariableSymbol, + }, + files::{FileVersion, Files}, + grammar::{ + alpha050::{Expression, FailableHandler, InterpolatedCommand, InterpolatedText}, + CommandModifier, Spanned, + }, + paths::FileId, +}; + +use super::stmnts::{analyze_failable_handlers, StmntAnalysisResult}; + +#[derive(Debug, Clone)] +pub struct ExpAnalysisResult { + pub exp_ty: DataType, + pub is_propagating_failure: bool, + pub return_ty: Option, +} + +#[tracing::instrument(skip_all)] +pub fn analyze_exp( + file_id: FileId, + file_version: FileVersion, + (exp, exp_span): &Spanned, + expected_type: DataType, + files: &Files, + scoped_generic_types: &GenericsMap, + contexts: &Vec, +) -> ExpAnalysisResult { + let exp_span_inclusive = exp_span.start..=exp_span.end; + + if exp_span_inclusive.is_empty() { + return ExpAnalysisResult { + exp_ty: DataType::Null, + is_propagating_failure: false, + return_ty: None, + }; + } + + let file = (file_id, file_version); + + let mut return_types = vec![]; + let mut is_propagating_failure = false; + + let ty: DataType = match exp { + Expression::ArrayIndex(exp, index) => { + let ExpAnalysisResult { + exp_ty: array_ty, + return_ty, + is_propagating_failure: prop, + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Array(Box::new(DataType::Any)), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + + let ExpAnalysisResult { + return_ty: index_return_ty, + is_propagating_failure: prop, + exp_ty: index_ty, + } = analyze_exp( + file_id, + file_version, + index, + DataType::Union(vec![ + DataType::Int, + DataType::Array(Box::new(DataType::Int)), + ]), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(index_return_ty); + + match array_ty { + DataType::Generic(id) => match scoped_generic_types.get_recursive(id) { + DataType::Array(inner) => match scoped_generic_types.deref_type(&index_ty) { + DataType::Array(_) => array_ty, + _ => *inner, + }, + _ => DataType::Null, + }, + DataType::Array(ref inner) => match scoped_generic_types.deref_type(&index_ty) { + DataType::Array(_) => array_ty, + _ => *inner.clone(), + }, + _ => DataType::Null, + } + } + Expression::Exit(_, exit_code) => { + if let Some(exit_code) = exit_code { + let ExpAnalysisResult { + return_ty, + is_propagating_failure: prop, + .. + } = analyze_exp( + file_id, + file_version, + exit_code, + DataType::Int, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + } + + DataType::Null + } + Expression::FunctionInvocation(modifiers, (name, name_span), args, failable_handlers) => { + let fun_symbol = get_symbol_definition_info(files, name, &file, name_span.start); + + let expected_types = match fun_symbol { + Some(SymbolInfo { + symbol_type: SymbolType::Function(ref fun_symbol), + .. + }) => fun_symbol + .arguments + .iter() + .map(|(arg, _)| (arg.data_type.clone(), arg.is_optional, arg.is_ref)) + .collect::>(), + Some(_) => { + files.report_error(&file, &format!("{name} is not a function"), *exp_span); + + vec![] + } + None => { + files.report_error(&file, &format!("{name} is not defined"), *exp_span); + + vec![] + } + }; + + args.iter().enumerate().for_each(|(idx, arg)| { + if let Some((ty, _, is_ref)) = expected_types.get(idx) { + let ExpAnalysisResult { + is_propagating_failure: propagates_failure, + return_ty, + exp_ty, + } = analyze_exp( + file_id, + file_version, + arg, + ty.clone(), + files, + scoped_generic_types, + contexts, + ); + + match (is_ref, arg.0.clone()) { + (true, Expression::Var((name, span))) => { + if let Some(var) = + get_symbol_definition_info(files, &name, &file, span.start) + { + if let SymbolType::Variable(ref var_symbol) = var.symbol_type { + if var_symbol.is_const { + files.report_error( + &file, + "Cannot modify a constant variable", + span, + ); + } + } + } + } + (true, _) => { + files.report_error( + &file, + "Cannot pass a non-variable as a reference", + arg.1, + ); + } + _ => {} + } + + return_types.extend(return_ty); + is_propagating_failure |= propagates_failure; + + if let DataType::Generic(id) = ty { + scoped_generic_types.constrain_generic_type(*id, exp_ty.clone()); + } + } else { + files.report_error( + &file, + &format!("Function takes only {} arguments", expected_types.len()), + arg.1, + ); + } + }); + + if expected_types + .iter() + .filter(|(_, is_optional, _)| !*is_optional) + .count() + > args.len() + && fun_symbol.is_some() + { + files.report_error( + &file, + &format!("Function takes {} arguments", expected_types.len()), + *name_span, + ); + }; + + let exp_ty = fun_symbol + .clone() + .map(|fun_symbol| fun_symbol.data_type) + .unwrap_or(DataType::Null); + + let StmntAnalysisResult { + return_ty: failure_return_ty, + is_propagating_failure: is_prop, + } = analyze_failable_handlers( + file_id, + file_version, + failable_handlers, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= is_prop; + return_types.extend(failure_return_ty); + + let function_call_scope_end = failable_handlers + .first() + .map(|(_, span)| span.start - 1) + .unwrap_or(exp_span.end - 1); + + if let Some(SymbolInfo { + symbol_type: SymbolType::Function(ref fun_symbol), + ref data_type, + .. + }) = fun_symbol + { + let mut symbol_table = match files.symbol_table.get_mut(&file) { + Some(symbol_table) => symbol_table, + None => { + return ExpAnalysisResult { + exp_ty: DataType::Null, + is_propagating_failure: false, + return_ty: None, + } + } + }; + + let mut last_span_end = name_span.end + 1; + let fun_symbol = SymbolInfo { + name: name.clone(), + symbol_type: SymbolType::Function(FunctionSymbol { + arguments: fun_symbol + .arguments + .iter() + .enumerate() + .map(|(idx, (arg, _))| { + let arg_span = args + .get(idx) + .map(|(_, span)| *span) + .unwrap_or(SimpleSpan::new(last_span_end, exp_span.end)); + + last_span_end = arg_span.end; + ( + FunctionArgument { + name: arg.name.clone(), + data_type: scoped_generic_types.deref_type(&arg.data_type), + is_optional: arg.is_optional, + is_ref: arg.is_ref, + }, + arg_span, + ) + }) + .collect(), + ..fun_symbol.clone() + }), + data_type: scoped_generic_types.deref_type(data_type), + is_definition: false, + undefined: false, + span: *name_span, + contexts: contexts.clone(), + }; + + symbol_table + .symbols + .insert(name_span.start..=name_span.end, fun_symbol.clone()); + + symbol_table + .fun_call_arg_scope + .insert(name_span.end..=function_call_scope_end, fun_symbol); + } + + let has_failure_handler = failable_handlers + .iter() + .any(|(modifier, _)| matches!(modifier, FailableHandler::Failure(_))); + + if matches!( + scoped_generic_types.deref_type(&exp_ty), + DataType::Failable(_) + ) && modifiers.iter().all(|(modifier, _)| { + *modifier != CommandModifier::Unsafe && *modifier != CommandModifier::Trust + }) && contexts.iter().all(|ctx| match ctx { + Context::Block(BlockContext { modifiers }) => modifiers.iter().all(|modifier| { + *modifier != CommandModifier::Unsafe && *modifier != CommandModifier::Trust + }), + _ => true, + }) && !has_failure_handler + { + files.report_error( + &file, + "Failable function must be handled with a failure handler or marked with `trust` modifier", + *name_span, + ); + } + + exp_ty + } + Expression::Var((name, name_span)) => { + insert_symbol_reference( + name, + files, + &SymbolLocation { + file, + start: name_span.start, + end: name_span.end, + }, + scoped_generic_types, + contexts, + ); + + match get_symbol_definition_info(files, name, &file, name_span.start) { + Some(info) => { + if matches!(info.symbol_type, SymbolType::Function(_)) { + files.report_error(&file, &format!("{name} is a function"), *name_span); + } + + info.data_type + } + None => DataType::Null, + } + } + Expression::Add(exp1, exp2) => { + let ExpAnalysisResult { + exp_ty: ty, + return_ty: return1, + is_propagating_failure: is_prop1, + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Union(vec![ + DataType::Number, + DataType::Int, + DataType::Text, + DataType::Array(Box::new(DataType::Union(vec![ + DataType::Number, + DataType::Int, + DataType::Text, + ]))), + ]), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: is_prop2, + exp_ty: right_hand_ty, + } = analyze_exp( + file_id, + file_version, + exp2, + ty.clone(), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= is_prop1 || is_prop2; + + return_types.extend(return1); + return_types.extend(return2); + + if let DataType::Generic(id) = ty { + scoped_generic_types.constrain_generic_type(id, right_hand_ty.clone()); + } + + if !matches_type(&right_hand_ty, &ty, scoped_generic_types) { + files.report_error( + &file, + &format!( + "Expected type {}, found type {}", + right_hand_ty.to_string(scoped_generic_types), + ty.to_string(scoped_generic_types), + ), + exp1.1, + ); + } + + ty + } + Expression::And(exp1, _, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Boolean, + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + .. + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Boolean, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + + return_types.extend(return1); + return_types.extend(return2); + + DataType::Boolean + } + Expression::Array(elements) => { + let types: Vec = elements + .iter() + .map(|exp| { + let ExpAnalysisResult { + exp_ty: ty, + return_ty, + is_propagating_failure: prop, + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Union(vec![DataType::Number, DataType::Int, DataType::Text]), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + + ty + }) + .collect(); + + let array_type = make_union_type(types); + + if let DataType::Union(_) = array_type { + files.report_error( + &file, + "Array must have elements of the same type", + *exp_span, + ); + } + + DataType::Array(Box::new(array_type)) + } + Expression::Cast(exp, _, (ty, _)) => { + let ExpAnalysisResult { + return_ty, + is_propagating_failure: prop, + .. + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + + ty.clone() + } + Expression::Command(modifiers, inter_cmd, failable_handlers) => { + inter_cmd.iter().for_each(|(inter_cmd, _)| { + if let InterpolatedCommand::Expression(exp) = inter_cmd { + let ExpAnalysisResult { + return_ty, + is_propagating_failure: is_prop, + .. + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= is_prop; + return_types.extend(return_ty); + } + }); + + let StmntAnalysisResult { + return_ty: failure_return_ty, + is_propagating_failure: is_prop, + } = analyze_failable_handlers( + file_id, + file_version, + failable_handlers, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= is_prop; + return_types.extend(failure_return_ty); + + let has_failure_handler = failable_handlers + .iter() + .any(|(modifier, _)| matches!(modifier, FailableHandler::Failure(_))); + + if !has_failure_handler + && !modifiers.iter().any(|(modifier, _)| { + *modifier == CommandModifier::Unsafe || *modifier == CommandModifier::Trust + }) + && !contexts.iter().any(|ctx| match ctx { + Context::Block(BlockContext { modifiers }) => { + modifiers.iter().any(|modifier| { + *modifier == CommandModifier::Unsafe + || *modifier == CommandModifier::Trust + }) + } + _ => false, + }) + { + files.report_error(&file, "Command must have a failure handler", *exp_span); + } + + DataType::Text + } + Expression::Divide(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + exp_ty: exp_ty1, + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + exp_ty: exp_ty2, + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + if exp_ty1 == DataType::Number || exp_ty2 == DataType::Number { + DataType::Number + } else { + DataType::Int + } + } + Expression::Eq(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + .. + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + DataType::Boolean + } + Expression::Ge(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Union( + [ + DataType::Number, + DataType::Int, + DataType::Text, + DataType::Array(Box::new(DataType::Union( + [DataType::Number, DataType::Int, DataType::Text].to_vec(), + ))), + ] + .to_vec(), + ), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + .. + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Union( + [ + DataType::Number, + DataType::Int, + DataType::Text, + DataType::Array(Box::new(DataType::Union( + [DataType::Number, DataType::Int, DataType::Text].to_vec(), + ))), + ] + .to_vec(), + ), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + DataType::Boolean + } + Expression::Gt(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Union( + [ + DataType::Number, + DataType::Int, + DataType::Text, + DataType::Array(Box::new(DataType::Union( + [DataType::Number, DataType::Int, DataType::Text].to_vec(), + ))), + ] + .to_vec(), + ), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + .. + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Union( + [ + DataType::Number, + DataType::Int, + DataType::Text, + DataType::Array(Box::new(DataType::Union( + [DataType::Number, DataType::Int, DataType::Text].to_vec(), + ))), + ] + .to_vec(), + ), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + DataType::Boolean + } + Expression::Is(exp, _, _) => { + let ExpAnalysisResult { + return_ty, + is_propagating_failure: prop, + .. + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + + DataType::Boolean + } + Expression::Le(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Union( + [ + DataType::Number, + DataType::Int, + DataType::Text, + DataType::Array(Box::new(DataType::Union( + [DataType::Number, DataType::Int, DataType::Text].to_vec(), + ))), + ] + .to_vec(), + ), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + .. + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Union( + [ + DataType::Number, + DataType::Int, + DataType::Text, + DataType::Array(Box::new(DataType::Union( + [DataType::Number, DataType::Int, DataType::Text].to_vec(), + ))), + ] + .to_vec(), + ), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + DataType::Boolean + } + Expression::Lt(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Union( + [ + DataType::Number, + DataType::Int, + DataType::Text, + DataType::Array(Box::new(DataType::Union( + [DataType::Number, DataType::Int, DataType::Text].to_vec(), + ))), + ] + .to_vec(), + ), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + .. + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Union( + [ + DataType::Number, + DataType::Int, + DataType::Text, + DataType::Array(Box::new(DataType::Union( + [DataType::Number, DataType::Int, DataType::Text].to_vec(), + ))), + ] + .to_vec(), + ), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + DataType::Boolean + } + Expression::Modulo(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + exp_ty: exp_ty1, + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + exp_ty: exp_ty2, + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + if exp_ty1 == DataType::Number || exp_ty2 == DataType::Number { + DataType::Number + } else { + DataType::Int + } + } + Expression::Multiply(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + exp_ty: exp_ty1, + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + exp_ty: exp_ty2, + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + if exp_ty1 == DataType::Number || exp_ty2 == DataType::Number { + DataType::Number + } else { + DataType::Int + } + } + Expression::Nameof(_, exp) => { + let ExpAnalysisResult { + return_ty, + is_propagating_failure: prop, + .. + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + + DataType::Text + } + Expression::Neg(_, exp) => { + let ExpAnalysisResult { + return_ty, + is_propagating_failure: prop, + exp_ty, + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + + exp_ty + } + Expression::Neq(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + .. + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + DataType::Boolean + } + Expression::Not(_, exp) => { + let ExpAnalysisResult { + return_ty, + is_propagating_failure: prop, + .. + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Boolean, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + + DataType::Boolean + } + Expression::Or(exp1, _, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Boolean, + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + .. + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Boolean, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + DataType::Boolean + } + Expression::Parentheses(exp) => { + let ExpAnalysisResult { + return_ty, + is_propagating_failure: prop, + exp_ty, + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + + exp_ty + } + Expression::Range(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Int, + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + .. + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Int, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + DataType::Array(Box::new(DataType::Int)) + } + Expression::Subtract(exp1, exp2) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + exp_ty: exp_ty1, + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + return_ty: return2, + is_propagating_failure: prop2, + exp_ty: exp_ty2, + } = analyze_exp( + file_id, + file_version, + exp2, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2; + return_types.extend(return1); + return_types.extend(return2); + + if exp_ty1 == DataType::Number || exp_ty2 == DataType::Number { + DataType::Number + } else { + DataType::Int + } + } + Expression::Ternary(exp1, _, exp2, _, exp3) => { + let ExpAnalysisResult { + return_ty: return1, + is_propagating_failure: prop1, + .. + } = analyze_exp( + file_id, + file_version, + exp1, + DataType::Boolean, + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + exp_ty: if_true, + return_ty: return2, + is_propagating_failure: prop2, + } = analyze_exp( + file_id, + file_version, + exp2, + expected_type.clone(), + files, + scoped_generic_types, + contexts, + ); + let ExpAnalysisResult { + exp_ty: if_false, + return_ty: return3, + is_propagating_failure: prop3, + } = analyze_exp( + file_id, + file_version, + exp3, + expected_type.clone(), + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop1 || prop2 || prop3; + return_types.extend(return1); + return_types.extend(return2); + return_types.extend(return3); + + make_union_type(vec![if_true, if_false]) + } + Expression::Text(int_text) => { + int_text.iter().for_each(|(text, _)| { + if let InterpolatedText::Expression(exp) = text { + let ExpAnalysisResult { + return_ty, + is_propagating_failure: prop, + .. + } = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + is_propagating_failure |= prop; + return_types.extend(return_ty); + } + }); + + DataType::Text + } + Expression::Number(_) => DataType::Number, + Expression::Int(_) => DataType::Int, + Expression::Boolean(_) => DataType::Boolean, + Expression::Null => DataType::Null, + Expression::Status => { + let mut symbol_table = match files.symbol_table.get_mut(&file) { + Some(symbol_table) => symbol_table, + None => { + return ExpAnalysisResult { + exp_ty: DataType::Null, + is_propagating_failure: false, + return_ty: None, + }; + } + }; + symbol_table.symbols.insert( + exp_span_inclusive, + SymbolInfo { + name: "status".to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { is_const: false }), + data_type: DataType::Int, + is_definition: false, + undefined: false, + span: *exp_span, + contexts: contexts.clone(), + }, + ); + + DataType::Int + } + Expression::Error => DataType::Any, + }; + + if !matches_type(&expected_type, &ty, scoped_generic_types) { + files.report_error( + &file, + &format!( + "Expected type `{}`, found type `{}`", + expected_type.to_string(scoped_generic_types), + ty.to_string(scoped_generic_types) + ), + *exp_span, + ); + } else if let DataType::Generic(id) = ty { + scoped_generic_types.constrain_generic_type(id, expected_type.clone()); + } + + ExpAnalysisResult { + exp_ty: ty, + is_propagating_failure, + return_ty: if return_types.is_empty() { + None + } else { + Some(make_union_type(return_types)) + }, + } +} diff --git a/src/analysis/alpha050/global.rs b/src/analysis/alpha050/global.rs new file mode 100644 index 0000000..ccf2224 --- /dev/null +++ b/src/analysis/alpha050/global.rs @@ -0,0 +1,601 @@ +use crate::{ + analysis::{ + self, import_symbol, insert_symbol_definition, map_import_path, + types::{make_union_type, matches_type, DataType}, + Context, FunctionContext, FunctionSymbol, ImportContext, SymbolInfo, SymbolType, + VariableSymbol, + }, + backend::Backend, + files::FileVersion, + grammar::{ + alpha050::{Block, FunctionArgument, GlobalStatement, ImportContent, Statement}, + Span, Spanned, + }, + paths::FileId, + stdlib::is_builtin_file, +}; + +use super::{ + exp::analyze_exp, + stmnts::{analyze_stmnt, StmntAnalysisResult}, +}; + +#[tracing::instrument(skip_all)] +pub async fn analyze_global_stmnt( + file_id: FileId, + file_version: FileVersion, + ast: &[Spanned], + backend: &Backend, +) { + let mut contexts = vec![]; + + let uri = backend.files.lookup(&file_id); + + let mut default_imports = vec![]; + + if !is_builtin_file(&uri, backend.amber_version.clone()) { + default_imports.push(( + GlobalStatement::Import( + (false, Span::new(0, 0)), + ("import".to_string(), Span::new(0, 0)), + (ImportContent::ImportAll, Span::new(0, 0)), + ("from".to_string(), Span::new(0, 0)), + ("builtin".to_string(), Span::new(0, 0)), + ), + Span::new(0, 0), + )) + } + + for (global, span) in default_imports.iter().chain(ast.iter()) { + match global { + GlobalStatement::FunctionDefinition( + compiler_flags, + (is_pub, _), + _, + (name, name_span), + args, + declared_return_ty, + body, + ) => { + // We create scoped generics map, to not overwrite other generics, not defined here + let scoped_generics_map = backend.files.generic_types.clone(); + + let mut new_generic_types = vec![]; + let mut prev_arg_optional = false; + + args.iter().for_each(|(arg, _)| { + let (name, ty, name_span) = match arg { + FunctionArgument::Generic(_, (name, span)) => { + let generic_id = scoped_generics_map.new_generic_id(); + + scoped_generics_map.constrain_generic_type(generic_id, DataType::Any); + new_generic_types.push(generic_id); + + if prev_arg_optional { + backend.files.report_error( + &(file_id, file_version), + "Optional argument must be the last one", + *span, + ); + } + + (name, DataType::Generic(generic_id), span) + } + FunctionArgument::Typed(_, (name, span), (ty, _)) => { + if prev_arg_optional { + backend.files.report_error( + &(file_id, file_version), + "Optional argument must be the last one", + *span, + ); + } + + (name, ty.clone(), span) + } + FunctionArgument::Optional((is_ref, _), (name, span), ty, exp) => { + prev_arg_optional = true; + + if *is_ref { + backend.files.report_error( + &(file_id, file_version), + "Optional argument cannot be a reference", + *span, + ); + } + + ( + name, + match ty { + Some((ty, _)) => { + analyze_exp( + file_id, + file_version, + exp, + ty.clone(), + &backend.files, + &backend.files.generic_types.clone(), + &vec![], + ); + + ty.clone() + } + None => { + let generic_id = scoped_generics_map.new_generic_id(); + + scoped_generics_map + .constrain_generic_type(generic_id, DataType::Any); + new_generic_types.push(generic_id); + + DataType::Generic(generic_id) + } + }, + span, + ) + } + FunctionArgument::Error => return, + }; + + let mut symbol_table = + match backend.files.symbol_table.get_mut(&(file_id, file_version)) { + Some(symbol_table) => symbol_table, + None => { + tracing::warn!( + "Symbol table not found for file: {:?}, version: {}", + file_id, + file_version.0, + ); + return; + } + }; + + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: name.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { is_const: false }), + data_type: ty, + is_definition: true, + undefined: false, + span: *name_span, + contexts: vec![], + }, + (file_id, file_version), + name_span.end..=span.end, + false, + ); + }); + + let mut return_types = vec![]; + let mut is_propagating = false; + + let mut function_contexts = vec![Context::Function(FunctionContext { + compiler_flags: vec![], + })]; + + body.iter().for_each(|stmnt| { + let StmntAnalysisResult { + return_ty, + is_propagating_failure, + } = analyze_stmnt( + file_id, + file_version, + stmnt, + &backend.files, + span.end, + &scoped_generics_map, + &mut function_contexts, + ); + + is_propagating |= is_propagating_failure; + return_types.extend(return_ty); + }); + + new_generic_types.iter().for_each(|generic_id| { + backend + .files + .generic_types + .constrain_generic_type(*generic_id, scoped_generics_map.get(*generic_id)); + backend.files.generic_types.mark_as_inferred(*generic_id); + }); + + let mut inferred_return_type = match return_types.len() { + 0 => DataType::Null, + _ => make_union_type(return_types), + }; + + if is_propagating && !matches!(inferred_return_type, DataType::Failable(_)) { + inferred_return_type = DataType::Failable(Box::new(inferred_return_type)); + } + + let data_type = match declared_return_ty { + Some((ty, ty_span)) => { + if !matches_type(ty, &inferred_return_type, &backend.files.generic_types) { + backend.files.report_error( + &(file_id, file_version), + &format!( + "Function returns type {inferred_return_type:?}, but expected {ty:?}", + ), + *ty_span, + ); + } + + if is_propagating && !matches!(ty, DataType::Failable(_)) { + backend.files.report_error( + &(file_id, file_version), + "Function is propagating an error, but return type is not failable", + *ty_span, + ); + } + + ty.clone() + } + None => inferred_return_type, + }; + + let mut symbol_table = backend + .files + .symbol_table + .entry((file_id, file_version)) + .or_default(); + + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: name.to_string(), + symbol_type: SymbolType::Function(FunctionSymbol { + arguments: args + .iter() + .filter_map(|(arg, span)| match arg { + FunctionArgument::Generic((is_ref, _), (name, _)) => Some(( + analysis::FunctionArgument { + name: name.clone(), + data_type: DataType::Generic( + new_generic_types.remove(0), + ), + is_optional: false, + is_ref: *is_ref, + }, + *span, + )), + FunctionArgument::Typed((is_ref, _), (name, _), (ty, _)) => { + Some(( + analysis::FunctionArgument { + name: name.clone(), + data_type: ty.clone(), + is_optional: false, + is_ref: *is_ref, + }, + *span, + )) + } + FunctionArgument::Optional((is_ref, _), (name, _), ty, _) => { + Some(( + analysis::FunctionArgument { + name: name.clone(), + data_type: match ty { + Some((ty, _)) => ty.clone(), + None => DataType::Generic( + new_generic_types.remove(0), + ), + }, + is_optional: true, + is_ref: *is_ref, + }, + *span, + )) + } + FunctionArgument::Error => None, + }) + .collect::>(), + is_public: *is_pub, + compiler_flags: compiler_flags + .iter() + .map(|(flag, _)| flag.clone()) + .collect(), + docs: match contexts.clone().last() { + Some(Context::DocString(doc)) => { + contexts.pop(); + Some(doc.clone()) + } + _ => None, + }, + }), + data_type: data_type.clone(), + is_definition: true, + undefined: false, + span: *name_span, + contexts: vec![], + }, + (file_id, file_version), + span.end..=usize::MAX, + *is_pub, + ); + } + GlobalStatement::Import( + (is_public_import, _), + _, + (import_content, _), + _, + (path, path_span), + ) => { + let uri = &backend.files.lookup(&file_id); + + let result = backend + .open_document(&map_import_path(uri, path, backend).await) + .await; + + { + let mut symbol_table = backend + .files + .symbol_table + .entry((file_id, file_version)) + .or_default(); + + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: path.to_string(), + symbol_type: SymbolType::ImportPath, + data_type: DataType::Text, + is_definition: true, + undefined: false, + span: *path_span, + contexts: vec![], + }, + result.clone().unwrap_or((file_id, file_version)), + path_span.start..=path_span.end, + false, + ); + } + + if result.is_err() { + backend.files.report_error( + &(file_id, file_version), + "File doesn't exist", + *path_span, + ); + + continue; + } + + let imported_file = result.clone().unwrap(); + + if backend.files.is_depending_on(&imported_file, file_id) { + backend.files.report_error( + &(file_id, file_version), + "Circular dependency", + *path_span, + ); + + continue; + } + + backend + .files + .add_file_dependency(&(file_id, file_version), imported_file.0); + + let imported_file_symbol_table = + match backend.files.symbol_table.get(&imported_file) { + Some(symbol_table_ref) => symbol_table_ref.clone(), + None => continue, + }; + + match import_content { + ImportContent::ImportSpecific(ident_list) => { + let mut import_context = ImportContext { + public_definitions: imported_file_symbol_table + .public_definitions + .clone(), + imported_symbols: vec![], + }; + + ident_list.iter().for_each(|(ident, span)| { + if import_context.imported_symbols.contains(&ident.to_string()) { + backend.files.report_error( + &(file_id, file_version), + &format!("Duplicate import '{ident}'"), + *span, + ); + + let mut symbol_table = backend + .files + .symbol_table + .entry((file_id, file_version)) + .or_default(); + + symbol_table.symbols.insert( + span.start..=span.end, + SymbolInfo { + name: ident.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { + is_const: false, + }), + data_type: DataType::Null, + is_definition: false, + undefined: true, + span: Span::new(span.start, span.end), + contexts: vec![Context::Import(import_context.clone())], + }, + ); + return; + } + + let symbol_definition = + imported_file_symbol_table.public_definitions.get(ident); + + match symbol_definition { + Some(definition_location) => { + let definition_file_symbol_table = match backend + .files + .symbol_table + .get(&definition_location.file) + { + Some(symbol_table) => symbol_table.clone(), + None => return, + }; + + let symbol_info = match definition_file_symbol_table + .symbols + .get(&definition_location.start) + { + Some(symbol_info) => symbol_info, + None => return, + }; + + let mut symbol_table = backend + .files + .symbol_table + .entry((file_id, file_version)) + .or_default(); + + import_symbol( + &mut symbol_table, + &SymbolInfo { + is_definition: false, + contexts: vec![Context::Import(import_context.clone())], + ..symbol_info.clone() + }, + Some(span.start..=span.end), + definition_location, + *is_public_import, + ); + + import_context.imported_symbols.push(ident.to_string()); + } + None => { + backend.files.report_error( + &(file_id, file_version), + &format!("Could not resolve '{ident}'"), + *span, + ); + + let mut symbol_table = backend + .files + .symbol_table + .entry((file_id, file_version)) + .or_default(); + + symbol_table.symbols.insert( + span.start..=span.end, + SymbolInfo { + name: ident.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { + is_const: false, + }), + data_type: DataType::Null, + is_definition: false, + undefined: true, + span: Span::new(span.start, span.end), + contexts: vec![Context::Import(import_context.clone())], + }, + ); + } + }; + }); + } + ImportContent::ImportAll => imported_file_symbol_table + .public_definitions + .iter() + .for_each(|(_, location)| { + let definition_file_symbol_table = + match backend.files.symbol_table.get(&location.file) { + Some(symbol_table) => symbol_table.clone(), + None => return, + }; + + let symbol_info = + match definition_file_symbol_table.symbols.get(&location.start) { + Some(symbol_info) => symbol_info, + None => return, + }; + + let mut symbol_table = backend + .files + .symbol_table + .entry((file_id, file_version)) + .or_default(); + + import_symbol( + &mut symbol_table, + &SymbolInfo { + is_definition: false, + contexts: vec![Context::Import(ImportContext { + public_definitions: imported_file_symbol_table + .public_definitions + .clone(), + imported_symbols: vec![], + })], + ..symbol_info.clone() + }, + None, + location, + *is_public_import, + ); + }), + } + } + GlobalStatement::Main(_, args, (body, body_span)) => { + if let Some((args, args_span)) = args { + let mut symbol_table = backend + .files + .symbol_table + .entry((file_id, file_version)) + .or_default(); + + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: args.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { is_const: false }), + data_type: DataType::Array(Box::new(DataType::Text)), + is_definition: true, + undefined: false, + span: *args_span, + contexts: vec![], + }, + (file_id, file_version), + args_span.end..=span.end, + false, + ); + } + + match body { + Block::Block(..) => { + analyze_stmnt( + file_id, + file_version, + &(Statement::Block((body.clone(), *body_span)), *body_span), + &backend.files, + body_span.end, + &backend.files.generic_types.clone(), + &mut contexts, + ); + } + Block::Singleline(stmnt) => { + analyze_stmnt( + file_id, + file_version, + stmnt, + &backend.files, + body_span.end, + &backend.files.generic_types.clone(), + &mut contexts, + ); + } + Block::Error => {} + } + } + GlobalStatement::Statement(stmnt) => { + analyze_stmnt( + file_id, + file_version, + stmnt, + &backend.files, + usize::MAX, + &backend.files.generic_types.clone(), + &mut contexts, + ); + } + } + } +} diff --git a/src/analysis/alpha050/mod.rs b/src/analysis/alpha050/mod.rs new file mode 100644 index 0000000..e015a68 --- /dev/null +++ b/src/analysis/alpha050/mod.rs @@ -0,0 +1,3 @@ +pub mod exp; +pub mod global; +pub mod stmnts; diff --git a/src/analysis/alpha050/stmnts.rs b/src/analysis/alpha050/stmnts.rs new file mode 100644 index 0000000..9238c01 --- /dev/null +++ b/src/analysis/alpha050/stmnts.rs @@ -0,0 +1,1233 @@ +use crate::{ + analysis::{ + get_symbol_definition_info, insert_symbol_definition, insert_symbol_reference, + types::{make_union_type, matches_type, GenericsMap}, + BlockContext, Context, DataType, SymbolInfo, SymbolLocation, SymbolType, VariableSymbol, + }, + files::{FileVersion, Files}, + grammar::{ + alpha050::{ + Block, Comment, ElseCondition, FailableHandler, FailureHandler, IfChainContent, + IfCondition, IterLoopVars, Statement, VariableInitType, + }, + CommandModifier, Spanned, + }, + paths::FileId, +}; + +use super::exp::{analyze_exp, ExpAnalysisResult}; + +#[derive(Debug, Clone)] +pub struct StmntAnalysisResult { + pub is_propagating_failure: bool, + pub return_ty: Option, +} + +/// Analyze a statement. +/// +/// Returns the data type of the return statement and a boolean indicating if the +/// statement is propagating a failure. +#[tracing::instrument(skip_all)] +pub fn analyze_stmnt( + file_id: FileId, + file_version: FileVersion, + (stmnt, span): &Spanned, + files: &Files, + scope_end: usize, + scoped_generic_types: &GenericsMap, + contexts: &mut Vec, +) -> StmntAnalysisResult { + let file = (file_id, file_version); + + match stmnt { + Statement::Block(block) => analyze_block( + file_id, + file_version, + block, + files, + scoped_generic_types, + contexts, + ), + Statement::IfChain(_, if_chain) => { + let mut stmnts = vec![]; + let mut exps = vec![]; + + for (if_chain_content, _) in if_chain.iter() { + match if_chain_content { + IfChainContent::IfCondition((condition, _)) => match condition { + IfCondition::IfCondition(exp, block) => { + let exp = analyze_exp( + file_id, + file_version, + exp, + DataType::Boolean, + files, + scoped_generic_types, + contexts, + ); + let stmnt = analyze_block( + file_id, + file_version, + block, + files, + scoped_generic_types, + contexts, + ); + + exps.push(exp); + stmnts.push(stmnt); + } + IfCondition::Error => {} + IfCondition::Comment((Comment::DocString(docs), _)) => { + let _ = handle_doc_strings(docs, contexts); + } + IfCondition::Comment(_) => {} + }, + IfChainContent::Else((else_cond, _)) => match else_cond { + ElseCondition::Else(_, block) => { + let stmnt = analyze_block( + file_id, + file_version, + block, + files, + scoped_generic_types, + contexts, + ); + + stmnts.push(stmnt); + } + }, + IfChainContent::Comment((Comment::DocString(docs), _)) => { + let _ = handle_doc_strings(docs, contexts); + } + IfChainContent::Comment(_) => {} + } + } + + get_stmnt_analysis_result(stmnts, exps) + } + Statement::IfCondition(_, if_cond, comments, else_cond) => { + let mut stmnts = vec![]; + let mut exps = vec![]; + + match &if_cond.0 { + IfCondition::IfCondition(exp, block) => { + let exp = analyze_exp( + file_id, + file_version, + exp, + DataType::Boolean, + files, + scoped_generic_types, + contexts, + ); + let block = analyze_block( + file_id, + file_version, + block, + files, + scoped_generic_types, + contexts, + ); + + stmnts.push(block); + exps.push(exp); + } + IfCondition::Comment((Comment::DocString(docs), _)) => { + let _ = handle_doc_strings(docs, contexts); + } + _ => {} + } + + comments.iter().for_each(|(comment, _)| { + if let Comment::DocString(docs) = comment { + let _ = handle_doc_strings(docs, contexts); + } + }); + + if let Some(else_cond) = else_cond { + match &else_cond.0 { + ElseCondition::Else(_, block) => { + let block = analyze_block( + file_id, + file_version, + block, + files, + scoped_generic_types, + contexts, + ); + + stmnts.push(block); + } + } + } + + get_stmnt_analysis_result(stmnts, exps) + } + Statement::InfiniteLoop(_, block) => { + let mut new_contexts = contexts.clone(); + new_contexts.push(Context::Loop); + + analyze_block( + file_id, + file_version, + block, + files, + scoped_generic_types, + &new_contexts, + ) + } + Statement::WhileLoop(_, exp, block) => { + let exp_analysis = analyze_exp( + file_id, + file_version, + exp, + DataType::Boolean, + files, + scoped_generic_types, + contexts, + ); + + let mut new_contexts = contexts.clone(); + new_contexts.push(Context::Loop); + + let block_analysis = analyze_block( + file_id, + file_version, + block, + files, + scoped_generic_types, + &new_contexts, + ); + + get_stmnt_analysis_result(vec![block_analysis], vec![exp_analysis]) + } + Statement::IterLoop(_, (vars, _), _, exp, block) => { + let block_span = block.1; + + let exp = analyze_exp( + file_id, + file_version, + exp, + DataType::Array(Box::new(DataType::Any)), + files, + scoped_generic_types, + contexts, + ); + + // TODO: Check if DataType is generic + let iter_type = match exp.exp_ty.clone() { + DataType::Array(ty) => *ty, + DataType::Failable(ty) => { + if let DataType::Array(inner_ty) = *ty { + *inner_ty + } else { + DataType::Any + } + } + _ => DataType::Any, + }; + + match &vars { + IterLoopVars::WithIndex((var1, var1_span), (var2, var2_span)) => { + let mut symbol_table = files.symbol_table.entry(file).or_default(); + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: var1.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { is_const: false }), + data_type: DataType::Int, + is_definition: true, + undefined: false, + span: *var1_span, + contexts: contexts.clone(), + }, + file, + block_span.start..=block_span.end, + false, + ); + + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: var2.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { is_const: false }), + data_type: iter_type, + is_definition: true, + undefined: false, + span: *var2_span, + contexts: contexts.clone(), + }, + file, + block_span.start..=block_span.end, + false, + ); + } + IterLoopVars::Single((var, var_span)) => { + let mut symbol_table = files.symbol_table.entry(file).or_default(); + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: var.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { is_const: false }), + data_type: iter_type, + is_definition: true, + undefined: false, + span: *var_span, + contexts: contexts.clone(), + }, + file, + block_span.start..=block_span.end, + false, + ); + } + _ => {} + } + + let mut new_contexts = contexts.clone(); + new_contexts.push(Context::Loop); + + let block = analyze_block( + file_id, + file_version, + block, + files, + scoped_generic_types, + &new_contexts, + ); + + get_stmnt_analysis_result(vec![block], vec![exp]) + } + Statement::VariableInit(_, (var_name, var_span), (value, _)) => { + let exp = match value { + VariableInitType::Expression(exp) => analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ), + VariableInitType::DataType((ty, _)) => ExpAnalysisResult { + exp_ty: ty.clone(), + is_propagating_failure: false, + return_ty: None, + }, + _ => ExpAnalysisResult { + exp_ty: DataType::Error, + is_propagating_failure: false, + return_ty: None, + }, + }; + + let mut symbol_table = files.symbol_table.entry(file).or_default(); + + let var_type = match exp.exp_ty { + DataType::Failable(ty) => scoped_generic_types.deref_type(&ty), + ty => scoped_generic_types.deref_type(&ty), + }; + + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: var_name.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { is_const: false }), + data_type: var_type, + is_definition: true, + undefined: false, + span: *var_span, + contexts: contexts.clone(), + }, + file, + span.end..=scope_end, + false, + ); + + StmntAnalysisResult { + is_propagating_failure: exp.is_propagating_failure, + return_ty: exp.return_ty, + } + } + Statement::ConstInit(_, (var_name, var_span), exp) => { + let exp = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + let mut symbol_table = files.symbol_table.entry(file).or_default(); + + let var_type = match exp.exp_ty { + DataType::Failable(ty) => scoped_generic_types.deref_type(&ty), + ty => scoped_generic_types.deref_type(&ty), + }; + + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: var_name.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { is_const: true }), + data_type: var_type, + is_definition: true, + undefined: false, + span: *var_span, + contexts: contexts.clone(), + }, + file, + span.end..=scope_end, + false, + ); + + StmntAnalysisResult { + is_propagating_failure: exp.is_propagating_failure, + return_ty: exp.return_ty, + } + } + Statement::Echo(_, exp) => { + let exp = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + StmntAnalysisResult { + is_propagating_failure: exp.is_propagating_failure, + return_ty: exp.return_ty, + } + } + Statement::Expression(exp) => { + let exp = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + StmntAnalysisResult { + is_propagating_failure: exp.is_propagating_failure, + return_ty: exp.return_ty, + } + } + Statement::Fail(_, exp) => { + if !contexts + .iter() + .any(|c| matches!(c, Context::Function(_) | Context::Main)) + { + files.report_error( + &file, + "Fail statements can only be used inside of functions or the main block", + *span, + ); + } + + if let Some(exp) = exp { + let exp = analyze_exp( + file_id, + file_version, + exp, + DataType::Int, + files, + scoped_generic_types, + contexts, + ); + + return StmntAnalysisResult { + is_propagating_failure: exp.is_propagating_failure, + return_ty: exp.return_ty, + }; + } + + StmntAnalysisResult { + is_propagating_failure: true, + return_ty: None, + } + } + Statement::Return(_, exp) => { + if !contexts.iter().any(|c| matches!(c, Context::Function(_))) { + files.report_error(&file, "Return statement outside of function", *span); + } + + if let Some(exp) = exp { + let exp_analysis = analyze_exp( + file_id, + file_version, + exp, + DataType::Any, + files, + scoped_generic_types, + contexts, + ); + + if let Some(ty) = exp_analysis.return_ty { + return StmntAnalysisResult { + is_propagating_failure: exp_analysis.is_propagating_failure, + return_ty: Some(make_union_type(vec![ty, exp_analysis.exp_ty])), + }; + } + + return StmntAnalysisResult { + is_propagating_failure: exp_analysis.is_propagating_failure, + return_ty: Some(exp_analysis.exp_ty), + }; + } + + StmntAnalysisResult { + is_propagating_failure: false, + return_ty: None, + } + } + Statement::ShorthandAdd((var, var_span), exp) => { + let var_ty = match get_symbol_definition_info(files, var, &file, var_span.start) { + Some(info) => { + match info.symbol_type { + SymbolType::Function(_) => { + files.report_error(&file, "Cannot assign to a function", *var_span); + } + SymbolType::Variable(var) if var.is_const => { + files.report_error(&file, "Cannot assign to a constant", *var_span); + } + _ => {} + } + + info.data_type + } + None => DataType::Any, + }; + + let default_ty = DataType::Union(vec![ + DataType::Text, + DataType::Number, + DataType::Int, + DataType::Array(Box::new(DataType::Union(vec![ + DataType::Text, + DataType::Number, + DataType::Int, + ]))), + ]); + + let exp_analysis = analyze_exp( + file_id, + file_version, + exp, + var_ty.clone(), + files, + scoped_generic_types, + contexts, + ); + + if !matches_type(&default_ty, &var_ty, scoped_generic_types) + || !matches_type(&exp_analysis.exp_ty, &var_ty, scoped_generic_types) + { + files.report_error( + &file, + &format!( + "Cannot add to variable of type {}", + var_ty.to_string(scoped_generic_types) + ), + *var_span, + ); + } + + if let DataType::Generic(id) = var_ty { + scoped_generic_types.constrain_generic_type(id, exp_analysis.exp_ty); + } + + insert_symbol_reference( + var, + files, + &SymbolLocation { + file, + start: var_span.start, + end: var_span.end, + }, + scoped_generic_types, + contexts, + ); + + StmntAnalysisResult { + is_propagating_failure: exp_analysis.is_propagating_failure, + return_ty: exp_analysis.return_ty, + } + } + Statement::ShorthandDiv((var, var_span), exp) => { + let var_ty = match get_symbol_definition_info(files, var, &file, var_span.start) { + Some(info) => { + match info.symbol_type { + SymbolType::Function(_) => { + files.report_error(&file, "Cannot assign to a function", *var_span); + } + SymbolType::Variable(var) if var.is_const => { + files.report_error(&file, "Cannot assign to a constant", *var_span); + } + _ => {} + } + + info.data_type + } + None => DataType::Any, + }; + + if !matches_type( + &DataType::Union([DataType::Number, DataType::Int].to_vec()), + &var_ty, + scoped_generic_types, + ) { + files.report_error( + &file, + &format!( + "Cannot divide variable of type {}", + var_ty.to_string(scoped_generic_types) + ), + *var_span, + ); + } + + let exp_analysis = analyze_exp( + file_id, + file_version, + exp, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + + if let DataType::Generic(id) = var_ty { + scoped_generic_types.constrain_generic_type(id, exp_analysis.exp_ty); + } + + insert_symbol_reference( + var, + files, + &SymbolLocation { + file, + start: var_span.start, + end: var_span.end, + }, + scoped_generic_types, + contexts, + ); + + StmntAnalysisResult { + is_propagating_failure: exp_analysis.is_propagating_failure, + return_ty: exp_analysis.return_ty, + } + } + Statement::ShorthandModulo((var, var_span), exp) => { + let var_ty = match get_symbol_definition_info(files, var, &file, var_span.start) { + Some(info) => { + match info.symbol_type { + SymbolType::Function(_) => { + files.report_error(&file, "Cannot assign to a function", *var_span); + } + SymbolType::Variable(var) if var.is_const => { + files.report_error(&file, "Cannot assign to a constant", *var_span); + } + _ => {} + } + + info.data_type + } + None => DataType::Any, + }; + + if !matches_type( + &DataType::Union([DataType::Number, DataType::Int].to_vec()), + &var_ty, + scoped_generic_types, + ) { + files.report_error( + &file, + &format!( + "Cannot use modulo with variable of type {}", + var_ty.to_string(scoped_generic_types) + ), + *var_span, + ); + } + + let exp_analysis = analyze_exp( + file_id, + file_version, + exp, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + + if let DataType::Generic(id) = var_ty { + scoped_generic_types.constrain_generic_type(id, exp_analysis.exp_ty); + } + + insert_symbol_reference( + var, + files, + &SymbolLocation { + file, + start: var_span.start, + end: var_span.end, + }, + scoped_generic_types, + contexts, + ); + + StmntAnalysisResult { + is_propagating_failure: exp_analysis.is_propagating_failure, + return_ty: exp_analysis.return_ty, + } + } + Statement::ShorthandMul((var, var_span), exp) => { + let var_ty = match get_symbol_definition_info(files, var, &file, var_span.start) { + Some(info) => { + match info.symbol_type { + SymbolType::Function(_) => { + files.report_error(&file, "Cannot assign to a function", *var_span); + } + SymbolType::Variable(var) if var.is_const => { + files.report_error(&file, "Cannot assign to a constant", *var_span); + } + _ => {} + } + + info.data_type + } + None => DataType::Any, + }; + + if !matches_type( + &DataType::Union([DataType::Number, DataType::Int].to_vec()), + &var_ty, + scoped_generic_types, + ) { + files.report_error( + &file, + &format!( + "Cannot use multiply with variable of type {}", + var_ty.to_string(scoped_generic_types) + ), + *var_span, + ); + } + + let exp_analysis = analyze_exp( + file_id, + file_version, + exp, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + + if let DataType::Generic(id) = var_ty { + scoped_generic_types.constrain_generic_type(id, exp_analysis.exp_ty); + } + + insert_symbol_reference( + var, + files, + &SymbolLocation { + file, + start: var_span.start, + end: var_span.end, + }, + scoped_generic_types, + contexts, + ); + + StmntAnalysisResult { + is_propagating_failure: exp_analysis.is_propagating_failure, + return_ty: exp_analysis.return_ty, + } + } + Statement::ShorthandSub((var, var_span), exp) => { + let var_ty = match get_symbol_definition_info(files, var, &file, var_span.start) { + Some(info) => { + match info.symbol_type { + SymbolType::Function(_) => { + files.report_error(&file, "Cannot assign to a function", *var_span); + } + SymbolType::Variable(var) if var.is_const => { + files.report_error(&file, "Cannot assign to a constant", *var_span); + } + _ => {} + } + + info.data_type + } + None => DataType::Any, + }; + + if !matches_type( + &DataType::Union([DataType::Number, DataType::Int].to_vec()), + &var_ty, + scoped_generic_types, + ) { + files.report_error( + &file, + &format!( + "Cannot use subtract with variable of type {}", + var_ty.to_string(scoped_generic_types) + ), + *var_span, + ); + } + + let exp_analysis = analyze_exp( + file_id, + file_version, + exp, + DataType::Union([DataType::Number, DataType::Int].to_vec()), + files, + scoped_generic_types, + contexts, + ); + + if let DataType::Generic(id) = var_ty { + scoped_generic_types.constrain_generic_type(id, exp_analysis.exp_ty); + } + + insert_symbol_reference( + var, + files, + &SymbolLocation { + file, + start: var_span.start, + end: var_span.end, + }, + scoped_generic_types, + contexts, + ); + + StmntAnalysisResult { + is_propagating_failure: exp_analysis.is_propagating_failure, + return_ty: exp_analysis.return_ty, + } + } + Statement::VariableSet((var, var_span), exp) => { + let var_ty = match get_symbol_definition_info(files, var, &file, var_span.start) { + Some(info) => { + match info.symbol_type { + SymbolType::Function(_) => { + files.report_error(&file, "Cannot assign to a function", *var_span); + } + SymbolType::Variable(var) if var.is_const => { + files.report_error(&file, "Cannot assign to a constant", *var_span); + } + _ => {} + } + + info.data_type + } + None => DataType::Any, + }; + + let exp_analysis = analyze_exp( + file_id, + file_version, + exp, + var_ty, + files, + scoped_generic_types, + contexts, + ); + + insert_symbol_reference( + var, + files, + &SymbolLocation { + file, + start: var_span.start, + end: var_span.end, + }, + scoped_generic_types, + contexts, + ); + + StmntAnalysisResult { + is_propagating_failure: exp_analysis.is_propagating_failure, + return_ty: exp_analysis.return_ty, + } + } + Statement::Break => { + if !contexts.iter().any(|c| matches!(c, Context::Loop)) { + files.report_error(&file, "Break statement outside of loop", *span); + } + + StmntAnalysisResult { + is_propagating_failure: false, + return_ty: None, + } + } + Statement::Continue => { + if !contexts.iter().any(|c| matches!(c, Context::Loop)) { + files.report_error(&file, "Continue statement outside of loop", *span); + } + + StmntAnalysisResult { + is_propagating_failure: false, + return_ty: None, + } + } + Statement::Cd(_, exp) => { + let exp = analyze_exp( + file_id, + file_version, + exp, + DataType::Text, + files, + scoped_generic_types, + contexts, + ); + + StmntAnalysisResult { + is_propagating_failure: exp.is_propagating_failure, + return_ty: exp.return_ty, + } + } + Statement::MoveFiles(modifiers, _, from_exp, to_exp, failable_handlers) => { + let exp1 = analyze_exp( + file_id, + file_version, + from_exp, + DataType::Text, + files, + scoped_generic_types, + contexts, + ); + let exp2 = analyze_exp( + file_id, + file_version, + to_exp, + DataType::Text, + files, + scoped_generic_types, + contexts, + ); + + let stmnt = analyze_failable_handlers( + file_id, + file_version, + failable_handlers, + files, + scoped_generic_types, + contexts, + ); + + let has_failure_handler = failable_handlers + .iter() + .any(|(modifier, _)| matches!(modifier, FailableHandler::Failure(_))); + + if !has_failure_handler + && !modifiers.iter().any(|(modifier, _)| { + *modifier == CommandModifier::Unsafe || *modifier == CommandModifier::Trust + }) + && !contexts.iter().any(|ctx| match ctx { + Context::Block(BlockContext { modifiers }) => { + modifiers.iter().any(|modifier| { + *modifier == CommandModifier::Unsafe + || *modifier == CommandModifier::Trust + }) + } + _ => false, + }) + { + files.report_error(&file, "Command must have a failure handler", *span); + } + + get_stmnt_analysis_result(vec![stmnt], vec![exp1, exp2]) + } + Statement::Comment((Comment::DocString(docs), _)) => handle_doc_strings(docs, contexts), + Statement::Comment(_) | Statement::Shebang(_) | Statement::Error => StmntAnalysisResult { + is_propagating_failure: false, + return_ty: None, + }, + } +} + +fn handle_doc_strings(docs: &String, contexts: &mut Vec) -> StmntAnalysisResult { + match contexts.last() { + Some(Context::DocString(doc_string)) => { + let new_doc_string = format!("{doc_string}\n{docs}"); + *contexts.last_mut().unwrap() = Context::DocString(new_doc_string); + } + _ => { + contexts.push(Context::DocString(docs.clone())); + } + } + + StmntAnalysisResult { + is_propagating_failure: false, + return_ty: None, + } +} + +pub fn analyze_block( + file_id: FileId, + file_version: FileVersion, + (block, span): &Spanned, + files: &Files, + scoped_generic_types: &GenericsMap, + contexts: &[Context], +) -> StmntAnalysisResult { + let mut types: Vec = vec![]; + + let mut is_propagating = false; + + match block { + Block::Block(modifiers, stmnt) => { + let mut new_contexts = contexts.to_owned(); + new_contexts.push(Context::Block(BlockContext { + modifiers: modifiers.iter().map(|(m, _)| m.clone()).collect(), + })); + + for stmnt in stmnt.iter() { + let StmntAnalysisResult { + return_ty, + is_propagating_failure, + } = analyze_stmnt( + file_id, + file_version, + stmnt, + files, + span.end, + scoped_generic_types, + &mut new_contexts, + ); + + if let Some(ty) = return_ty { + types.push(ty); + } + + is_propagating |= is_propagating_failure; + } + } + Block::Singleline(stmnt) => { + let mut working_contexts = contexts.to_owned(); + let StmntAnalysisResult { + return_ty, + is_propagating_failure, + } = analyze_stmnt( + file_id, + file_version, + stmnt, + files, + span.end, + scoped_generic_types, + &mut working_contexts, + ); + + if let Some(ty) = return_ty { + types.push(ty); + } + + is_propagating |= is_propagating_failure; + } + Block::Error => {} + } + + if types.is_empty() { + StmntAnalysisResult { + is_propagating_failure: is_propagating, + return_ty: None, + } + } else { + StmntAnalysisResult { + is_propagating_failure: is_propagating, + return_ty: Some(make_union_type(types)), + } + } +} + +pub fn analyze_failable_handlers( + file_id: FileId, + file_version: FileVersion, + failable_handlers: &[Spanned], + files: &Files, + scoped_generic_types: &GenericsMap, + contexts: &[Context], +) -> StmntAnalysisResult { + let mut types: Vec = vec![]; + let mut is_propagating = false; + let mut contexts = contexts.to_owned(); + + failable_handlers + .iter() + .for_each(|(handler, _)| match handler { + FailableHandler::Failure((failure, span)) => { + match failure { + FailureHandler::Handle(_, exit_code, block) => { + if let Some((code_var, code_var_span)) = exit_code { + let mut symbol_table = files + .symbol_table + .entry((file_id, file_version)) + .or_default(); + + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: code_var.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { + is_const: false, + }), + data_type: DataType::Array(Box::new(DataType::Text)), + is_definition: true, + undefined: false, + span: *code_var_span, + contexts: vec![], + }, + (file_id, file_version), + code_var_span.end..=span.end, + false, + ); + } + + let StmntAnalysisResult { + return_ty, + is_propagating_failure, + } = analyze_stmnt( + file_id, + file_version, + &(Statement::Block(*block.clone()), block.1), + files, + span.end, + scoped_generic_types, + &mut contexts, + ); + + types.extend(return_ty); + is_propagating |= is_propagating_failure; + } + FailureHandler::Propagate => { + if !contexts + .iter() + .any(|c| *c == Context::Main || matches!(c, Context::Function(_))) + { + files.report_error( + &(file_id, file_version), + "Propagate can only be used inside of main block or function", + *span, + ); + } + + is_propagating = true; + } + }; + } + FailableHandler::Succeeded(_, block) => { + let StmntAnalysisResult { + return_ty, + is_propagating_failure, + } = analyze_stmnt( + file_id, + file_version, + &(Statement::Block(*block.clone()), block.1), + files, + block.1.end, + scoped_generic_types, + &mut contexts, + ); + + types.extend(return_ty); + is_propagating |= is_propagating_failure; + } + FailableHandler::Then(_, (code_var, code_var_span), block) => { + let mut symbol_table = files + .symbol_table + .entry((file_id, file_version)) + .or_default(); + + insert_symbol_definition( + &mut symbol_table, + &SymbolInfo { + name: code_var.to_string(), + symbol_type: SymbolType::Variable(VariableSymbol { is_const: false }), + data_type: DataType::Array(Box::new(DataType::Text)), + is_definition: true, + undefined: false, + span: *code_var_span, + contexts: vec![], + }, + (file_id, file_version), + code_var_span.end..=block.1.end, + false, + ); + + let StmntAnalysisResult { + return_ty, + is_propagating_failure, + } = analyze_stmnt( + file_id, + file_version, + &(Statement::Block(*block.clone()), block.1), + files, + block.1.end, + scoped_generic_types, + &mut contexts, + ); + + types.extend(return_ty); + is_propagating |= is_propagating_failure; + } + }); + + if types.is_empty() { + StmntAnalysisResult { + is_propagating_failure: is_propagating, + return_ty: None, + } + } else { + StmntAnalysisResult { + is_propagating_failure: is_propagating, + return_ty: Some(make_union_type(types)), + } + } +} + +fn get_stmnt_analysis_result( + stmnt_analysis: Vec, + exp_analysis: Vec, +) -> StmntAnalysisResult { + let mut is_propagating_failure = false; + let mut return_ty = vec![]; + + for stmnt in stmnt_analysis { + if stmnt.is_propagating_failure { + is_propagating_failure = true; + } + if let Some(ty) = stmnt.return_ty { + return_ty.push(ty); + } + } + + for exp in exp_analysis { + if exp.is_propagating_failure { + is_propagating_failure = true; + } + if let Some(ty) = exp.return_ty { + return_ty.push(ty); + } + } + + StmntAnalysisResult { + is_propagating_failure, + return_ty: if !return_ty.is_empty() { + Some(make_union_type(return_ty)) + } else { + None + }, + } +} diff --git a/src/analysis/mod.rs b/src/analysis/mod.rs index b3a64dd..a2bd989 100644 --- a/src/analysis/mod.rs +++ b/src/analysis/mod.rs @@ -14,6 +14,7 @@ use crate::{ pub mod alpha034; pub mod alpha035; pub mod alpha040; +pub mod alpha050; pub mod types; #[derive(Debug, PartialEq, Eq, Clone)] diff --git a/src/analysis/types.rs b/src/analysis/types.rs index 70761d3..f9f2769 100644 --- a/src/analysis/types.rs +++ b/src/analysis/types.rs @@ -12,6 +12,7 @@ use crate::{ pub enum DataType { Any, Number, + Int, Boolean, Text, Null, @@ -27,6 +28,7 @@ impl DataType { match self { DataType::Any => "Any".to_string(), DataType::Number => "Num".to_string(), + DataType::Int => "Int".to_string(), DataType::Boolean => "Bool".to_string(), DataType::Text => "Text".to_string(), DataType::Null => "Null".to_string(), @@ -209,6 +211,7 @@ impl GenericsMap { .iter() .any(|current| self.is_more_or_equally_specific(current, new)), (_, DataType::Error) => false, + (DataType::Number, DataType::Int) => true, (t1, t2) => *t1 == *t2, } } diff --git a/src/backend.rs b/src/backend.rs index 0c4ceb6..f8dd812 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -27,6 +27,7 @@ pub enum AmberVersion { Alpha034, Alpha035, Alpha040, + Alpha050, } #[derive(Debug)] @@ -58,11 +59,13 @@ impl Backend { AmberVersion::Alpha034 => Box::new(grammar::alpha034::AmberCompiler::new()), AmberVersion::Alpha035 => Box::new(grammar::alpha035::AmberCompiler::new()), AmberVersion::Alpha040 => Box::new(grammar::alpha040::AmberCompiler::new()), + AmberVersion::Alpha050 => Box::new(grammar::alpha050::AmberCompiler::new()), }, token_types: match amber_version { AmberVersion::Alpha034 => Box::new(grammar::alpha034::semantic_tokens::LEGEND_TYPE), AmberVersion::Alpha035 => Box::new(grammar::alpha035::semantic_tokens::LEGEND_TYPE), AmberVersion::Alpha040 => Box::new(grammar::alpha040::semantic_tokens::LEGEND_TYPE), + AmberVersion::Alpha050 => Box::new(grammar::alpha050::semantic_tokens::LEGEND_TYPE), }, amber_version, } @@ -225,6 +228,10 @@ impl Backend { analysis::alpha040::global::analyze_global_stmnt(file_id, version, &ast, self) .await; } + Grammar::Alpha050(Some(ast)) => { + analysis::alpha050::global::analyze_global_stmnt(file_id, version, &ast, self) + .await; + } _ => {} } diff --git a/src/grammar/alpha034/parser.rs b/src/grammar/alpha034/parser.rs index c5593dc..75df53f 100644 --- a/src/grammar/alpha034/parser.rs +++ b/src/grammar/alpha034/parser.rs @@ -7,7 +7,7 @@ use super::{lexer::Token, AmberParser}; const KEYWORDS: &[&str] = &[ "if", "else", "loop", "in", "return", "break", "continue", "true", "false", "null", "fun", "as", "is", "or", "and", "not", "nameof", "status", "fail", "echo", "let", "unsafe", "silent", - "main", "import", "from", "pub", "then", "Text", "Num", "Bool", "Null", "ref", + "main", "import", "from", "pub", "then", "Text", "Num", "Bool", "Null", "ref", "failed", ]; #[inline] diff --git a/src/grammar/alpha035/parser.rs b/src/grammar/alpha035/parser.rs index c5593dc..75df53f 100644 --- a/src/grammar/alpha035/parser.rs +++ b/src/grammar/alpha035/parser.rs @@ -7,7 +7,7 @@ use super::{lexer::Token, AmberParser}; const KEYWORDS: &[&str] = &[ "if", "else", "loop", "in", "return", "break", "continue", "true", "false", "null", "fun", "as", "is", "or", "and", "not", "nameof", "status", "fail", "echo", "let", "unsafe", "silent", - "main", "import", "from", "pub", "then", "Text", "Num", "Bool", "Null", "ref", + "main", "import", "from", "pub", "then", "Text", "Num", "Bool", "Null", "ref", "failed", ]; #[inline] diff --git a/src/grammar/alpha040/expressions/atom/mod.rs b/src/grammar/alpha040/expressions/atom/mod.rs index e4f9de6..b6772cb 100644 --- a/src/grammar/alpha040/expressions/atom/mod.rs +++ b/src/grammar/alpha040/expressions/atom/mod.rs @@ -1,6 +1,6 @@ use crate::{ grammar::{ - alpha034::parser::default_recovery, + alpha040::parser::default_recovery, alpha040::{lexer::Token, AmberParser, Spanned, Statement}, }, T, diff --git a/src/grammar/alpha040/parser.rs b/src/grammar/alpha040/parser.rs index 6e37055..e76b58c 100644 --- a/src/grammar/alpha040/parser.rs +++ b/src/grammar/alpha040/parser.rs @@ -8,7 +8,7 @@ const KEYWORDS: &[&str] = &[ "if", "else", "loop", "in", "return", "break", "continue", "true", "false", "null", "fun", "as", "is", "or", "and", "not", "nameof", "status", "fail", "echo", "let", "unsafe", "silent", "main", "import", "from", "pub", "then", "Text", "Num", "Bool", "Null", "ref", "const", "exit", - "trust", "for", + "trust", "for", "failed", ]; #[inline] diff --git a/src/grammar/alpha050/expressions/and.rs b/src/grammar/alpha050/expressions/and.rs new file mode 100644 index 0000000..ffef80f --- /dev/null +++ b/src/grammar/alpha050/expressions/and.rs @@ -0,0 +1,39 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + }, + T, +}; + +use super::comparison::comparison_parser; + +pub fn and_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + comparison_parser(stmnts.clone(), expr.clone()) + .foldl( + just(T!["and"]) + .map_with(|t, s| (t.to_string(), s.span())) + .then( + comparison_parser(stmnts, expr).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .repeated(), + |lhs, (and_keyword, rhs)| { + let span = SimpleSpan::new(lhs.1.start, rhs.1.end); + + ( + Expression::And(Box::new(lhs), and_keyword, Box::new(rhs)), + span, + ) + }, + ) + .boxed() + .labelled("expression") +} diff --git a/src/grammar/alpha050/expressions/atom/array.rs b/src/grammar/alpha050/expressions/atom/array.rs new file mode 100644 index 0000000..973b182 --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/array.rs @@ -0,0 +1,25 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned}, + T, +}; + +pub fn array_parser<'a>( + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + expr.recover_with(via_parser( + default_recovery().map_with(|_, e| (Expression::Error, e.span())), + )) + .separated_by( + just(T![","]).recover_with(via_parser(default_recovery().rewind().map(|_| T![","]))), + ) + .allow_trailing() + .collect() + .delimited_by( + just(T!["["]), + just(T!["]"]).recover_with(via_parser(default_recovery().or_not().map(|_| T!["]"]))), + ) + .map_with(move |arr, e| (Expression::Array(arr), e.span())) + .boxed() +} diff --git a/src/grammar/alpha050/expressions/atom/bool.rs b/src/grammar/alpha050/expressions/atom/bool.rs new file mode 100644 index 0000000..e76af3c --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/bool.rs @@ -0,0 +1,12 @@ +use crate::{ + grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned}, + T, +}; +use chumsky::prelude::*; + +pub fn bool_parser<'a>() -> impl AmberParser<'a, Spanned> { + choice((just(T!["true"]).to(true), just(T!["false"]).to(false))) + .map_with(|b, e| (Expression::Boolean((b, e.span())), e.span())) + .boxed() + .labelled("boolean") +} diff --git a/src/grammar/alpha050/expressions/atom/call.rs b/src/grammar/alpha050/expressions/atom/call.rs new file mode 100644 index 0000000..4de585c --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/call.rs @@ -0,0 +1,43 @@ +use crate::{ + grammar::alpha050::{ + lexer::Token, + parser::{default_recovery, ident}, + statements::{failable_handlers::failable_handlers_parser, modifiers::modifier_parser}, + AmberParser, Expression, Spanned, Statement, + }, + T, +}; +use chumsky::prelude::*; + +pub fn function_call_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + modifier_parser() + .repeated() + .collect() + .then(ident("function".to_string()).map_with(|name, e| (name, e.span()))) + .then_ignore(just(T!["("])) + .then( + expr.recover_with(via_parser( + default_recovery().map_with(|_, e| (Expression::Error, e.span())), + )) + .separated_by( + just(T![","]) + .recover_with(via_parser(default_recovery().rewind().map(|_| T![","]))), + ) + .allow_trailing() + .collect(), + ) + .then_ignore( + just(T![")"]).recover_with(via_parser(default_recovery().or_not().map(|_| T![")"]))), + ) + .then(failable_handlers_parser(stmnts)) + .map_with(|(((modifier, name), args), failure), e| { + ( + Expression::FunctionInvocation(modifier, name, args, failure), + e.span(), + ) + }) + .boxed() +} diff --git a/src/grammar/alpha050/expressions/atom/command.rs b/src/grammar/alpha050/expressions/atom/command.rs new file mode 100644 index 0000000..4de1146 --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/command.rs @@ -0,0 +1,88 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + lexer::Token, + parser::default_recovery, + statements::{failable_handlers::failable_handlers_parser, modifiers::modifier_parser}, + AmberParser, Expression, InterpolatedCommand, Spanned, Statement, + }, + T, +}; + +pub fn command_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + let escape = just(T!['\\']) + .ignore_then(any()) + .map(|token: Token| InterpolatedCommand::Escape(token.to_string())) + .boxed(); + + let command_option = just(T!["-"]) + .then(just(T!["-"]).or_not()) + .then(none_of([T!["{"], T!["$"], T!["\\"], T!["-"]]).or_not()) + .map(|((_, second_dash), option)| { + let dashes = if second_dash.is_some() { "--" } else { "-" }; + + InterpolatedCommand::CommandOption(format!("{}{}", dashes, option.unwrap_or(T![""]))) + }) + .boxed(); + + let interpolated = expr + .recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )) + .delimited_by( + just(T!['{']), + just(T!['}']).recover_with(via_parser( + default_recovery() + .repeated() + .then(just(T!['}'])) + .or_not() + .map(|_| T!['}']), + )), + ) + .map(|expr| InterpolatedCommand::Expression(Box::new(expr))) + .boxed(); + + modifier_parser() + .repeated() + .collect() + .then(just(T!['$']).map_with(|_, e| (InterpolatedCommand::Text("$".to_string()), e.span()))) + .then( + choice(( + any() + .filter(|c: &Token| { + *c != T!["$"] && *c != T!["{"] && *c != T!["\\"] && *c != T!["-"] + }) + .map(|text| InterpolatedCommand::Text(text.to_string())), + escape, + command_option, + interpolated, + )) + .map_with(|cmd, e| (cmd, e.span())) + .repeated() + .collect::>>(), + ) + .then( + just(T!['$']) + .recover_with(via_parser(default_recovery().or_not().map(|_| T!['$']))) + .map_with(|_, e| (InterpolatedCommand::Text("$".to_string()), e.span())), + ) + .then(failable_handlers_parser(stmnts)) + .map_with(|((((modifier, begin), content), end), handler), e| { + let mut content_with_bounds = vec![begin]; + content_with_bounds.extend(content); + content_with_bounds.push(end); + + ( + Expression::Command(modifier, content_with_bounds, handler), + e.span(), + ) + }) + .boxed() + .labelled("command") +} diff --git a/src/grammar/alpha050/expressions/atom/exit.rs b/src/grammar/alpha050/expressions/atom/exit.rs new file mode 100644 index 0000000..0bde77a --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/exit.rs @@ -0,0 +1,20 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned}, + T, +}; + +pub fn exit_parser<'a>( + exp: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + just(T!["exit"]) + .map_with(|_, e| ("exit".to_string(), e.span())) + .then(exp.or_not()) + .map_with(|(exit_name, exit_code), e| { + ( + Expression::Exit(exit_name, exit_code.map(Box::new)), + e.span(), + ) + }) +} diff --git a/src/grammar/alpha050/expressions/atom/int.rs b/src/grammar/alpha050/expressions/atom/int.rs new file mode 100644 index 0000000..2edfdc9 --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/int.rs @@ -0,0 +1,25 @@ +use chumsky::prelude::*; + +use crate::grammar::alpha050::{lexer::Token, AmberParser, Spanned}; + +use super::Expression; + +pub fn int_parser<'a>() -> impl AmberParser<'a, Spanned> { + let int = any().try_map(|token: Token, span| { + let word = token.to_string(); + + for char in word.chars() { + if !char.is_ascii_digit() { + return Err(Rich::custom(span, "int must contain only digits")); + } + } + + Ok(word) + }); + + int.from_str::() + .unwrapped() + .map_with(|int, e| (Expression::Int((int, e.span())), e.span())) + .boxed() + .labelled("int") +} diff --git a/src/grammar/alpha050/expressions/atom/mod.rs b/src/grammar/alpha050/expressions/atom/mod.rs new file mode 100644 index 0000000..949b42b --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/mod.rs @@ -0,0 +1,76 @@ +use crate::{ + grammar::{ + alpha050::parser::default_recovery, + alpha050::{lexer::Token, AmberParser, Spanned, Statement}, + }, + T, +}; + +use super::super::Expression; +use chumsky::prelude::*; + +mod array; +mod bool; +mod call; +mod command; +mod exit; +mod int; +mod null; +mod number; +mod parentheses; +mod status; +mod text; +mod var; + +pub fn atom_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + choice(( + exit::exit_parser(expr.clone()), + parentheses::parentheses_parser(expr.clone()), + bool::bool_parser(), + null::null_parser(), + status::status_var_parser(), + call::function_call_parser(stmnts.clone(), expr.clone()), + var::var_parser(), + text::text_parser(expr.clone()), + array::array_parser(expr.clone()), + command::command_parser(stmnts.clone(), expr.clone()), + number::number_parser(), + int::int_parser(), + )) + .boxed() +} + +pub fn array_index_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + atom_parser(stmnts.clone(), expr.clone()) + .foldl( + just(T!['[']) + .ignore_then( + expr.recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .then_ignore( + just(T![']']) + .recover_with(via_parser(default_recovery().or_not().map(|_| T![']']))), + ) + .repeated(), + |expr, index| { + let span = SimpleSpan::new(expr.1.start, index.1.end); + + ( + Expression::ArrayIndex(Box::new(expr), Box::new(index)), + span, + ) + }, + ) + .boxed() + .labelled("array index") +} diff --git a/src/grammar/alpha050/expressions/atom/null.rs b/src/grammar/alpha050/expressions/atom/null.rs new file mode 100644 index 0000000..80bfec7 --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/null.rs @@ -0,0 +1,11 @@ +use crate::{ + grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned}, + T, +}; +use chumsky::prelude::*; + +pub fn null_parser<'a>() -> impl AmberParser<'a, Spanned> { + just(T!["null"]) + .map_with(|_, e| (Expression::Null, e.span())) + .boxed() +} diff --git a/src/grammar/alpha050/expressions/atom/number.rs b/src/grammar/alpha050/expressions/atom/number.rs new file mode 100644 index 0000000..769c413 --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/number.rs @@ -0,0 +1,35 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{lexer::Token, AmberParser, Spanned}, + T, +}; + +use super::Expression; + +pub fn number_parser<'a>() -> impl AmberParser<'a, Spanned> { + let int = any().try_map(|token: Token, span| { + let word = token.to_string(); + + for char in word.chars() { + if !char.is_ascii_digit() { + return Err(Rich::custom(span, "int must contain only digits")); + } + } + + Ok(word) + }); + + choice(( + int.then(just(T!['.']).ignore_then(int)) + .map(|(int, float)| format!("{int}.{float}")), + just(T!['.']) + .ignore_then(int) + .map(|float| format!("0.{float}")), + )) + .from_str::() + .unwrapped() + .map_with(|num, e| (Expression::Number((num, e.span())), e.span())) + .boxed() + .labelled("number") +} diff --git a/src/grammar/alpha050/expressions/atom/parentheses.rs b/src/grammar/alpha050/expressions/atom/parentheses.rs new file mode 100644 index 0000000..ab063e3 --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/parentheses.rs @@ -0,0 +1,29 @@ +use crate::{ + grammar::alpha050::{lexer::Token, parser::default_recovery, AmberParser, Spanned}, + T, +}; + +use super::super::Expression; +use chumsky::prelude::*; + +pub fn parentheses_parser<'a>( + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + expr.recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )) + .delimited_by( + just(T!['(']), + just(T![')']).recover_with(via_parser( + default_recovery() + .repeated() + .then(just(T![')'])) + .or_not() + .map(|_| T![')']), + )), + ) + .map_with(|expr, e| (Expression::Parentheses(Box::new(expr)), e.span())) + .boxed() +} diff --git a/src/grammar/alpha050/expressions/atom/status.rs b/src/grammar/alpha050/expressions/atom/status.rs new file mode 100644 index 0000000..7c20eee --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/status.rs @@ -0,0 +1,11 @@ +use crate::{ + grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned}, + T, +}; +use chumsky::prelude::*; + +pub fn status_var_parser<'a>() -> impl AmberParser<'a, Spanned> { + just(T!["status"]) + .map_with(|_, e| (Expression::Status, e.span())) + .boxed() +} diff --git a/src/grammar/alpha050/expressions/atom/text.rs b/src/grammar/alpha050/expressions/atom/text.rs new file mode 100644 index 0000000..c96dd03 --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/text.rs @@ -0,0 +1,55 @@ +use crate::{ + grammar::alpha050::{ + lexer::Token, parser::default_recovery, AmberParser, Expression, InterpolatedText, Spanned, + }, + T, +}; +use chumsky::prelude::*; + +pub fn text_parser<'a>( + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + let escaped = just(T!['\\']) + .ignore_then(any()) + .map_with(|char: Token, e| InterpolatedText::Escape((char.to_string(), e.span()))) + .boxed(); + + let interpolated = expr + .recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )) + .delimited_by( + just(T!['{']), + just(T!['}']).recover_with(via_parser( + default_recovery() + .repeated() + .then(just(T!['}'])) + .or_not() + .map(|_| T!['}']), + )), + ) + .map(|expr| InterpolatedText::Expression(Box::new(expr))) + .boxed(); + + just(T!['"']) + .ignore_then( + choice(( + any() + .filter(|c: &Token| *c != T!['"'] && *c != T!['{'] && *c != T!['\\']) + .map_with(|text, e| InterpolatedText::Text((text.to_string(), e.span()))), + escaped, + interpolated, + )) + .map_with(|expr, e| (expr, e.span())) + .repeated() + .collect(), + ) + .then_ignore( + just(T!['"']).recover_with(via_parser(default_recovery().or_not().map(|_| T!['"']))), + ) + .map_with(|expr, e| (Expression::Text(expr), e.span())) + .boxed() + .labelled("text") +} diff --git a/src/grammar/alpha050/expressions/atom/var.rs b/src/grammar/alpha050/expressions/atom/var.rs new file mode 100644 index 0000000..03d61ae --- /dev/null +++ b/src/grammar/alpha050/expressions/atom/var.rs @@ -0,0 +1,11 @@ +use crate::grammar::alpha050::{parser::ident, AmberParser, Spanned}; + +use super::Expression; +use chumsky::prelude::*; + +pub fn var_parser<'a>() -> impl AmberParser<'a, Spanned> { + ident("variable".to_string()) + .map_with(|name, e| (Expression::Var((name, e.span())), e.span())) + .boxed() + .labelled("variable") +} diff --git a/src/grammar/alpha050/expressions/cast.rs b/src/grammar/alpha050/expressions/cast.rs new file mode 100644 index 0000000..22c2ede --- /dev/null +++ b/src/grammar/alpha050/expressions/cast.rs @@ -0,0 +1,37 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, + Expression, Spanned, Statement, + }, + T, +}; + +use super::unary::unary_parser; + +pub fn cast_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + unary_parser(stmnts, expr) + .foldl( + just(T!["as"]) + .map_with(|t, e| (t.to_string(), e.span())) + .then( + type_parser().recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (DataType::Error, e.span())), + )), + ) + .repeated(), + |expr, (as_keyword, cast)| { + let span = SimpleSpan::new(expr.1.start, cast.1.end); + + (Expression::Cast(Box::new(expr), as_keyword, cast), span) + }, + ) + .boxed() + .labelled("expression") +} diff --git a/src/grammar/alpha050/expressions/comparison.rs b/src/grammar/alpha050/expressions/comparison.rs new file mode 100644 index 0000000..92be98f --- /dev/null +++ b/src/grammar/alpha050/expressions/comparison.rs @@ -0,0 +1,42 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + }, + T, +}; + +use super::sum::sum_parser; + +pub fn comparison_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + sum_parser(stmnts.clone(), expr.clone()) + .foldl( + choice(( + just(T![">="]).to(Expression::Ge as fn(_, _) -> _), + just(T![">"]).to(Expression::Gt as fn(_, _) -> _), + just(T!["<="]).to(Expression::Le as fn(_, _) -> _), + just(T!["<"]).to(Expression::Lt as fn(_, _) -> _), + just(T!["=="]).to(Expression::Eq as fn(_, _) -> _), + just(T!["!="]).to(Expression::Neq as fn(_, _) -> _), + )) + .then( + sum_parser(stmnts.clone(), expr.clone()).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .repeated(), + |lhs, (op, rhs)| { + let span = SimpleSpan::new(lhs.1.start, rhs.1.end); + + (op(Box::new(lhs), Box::new(rhs)), span) + }, + ) + .boxed() + .labelled("expression") +} diff --git a/src/grammar/alpha050/expressions/is.rs b/src/grammar/alpha050/expressions/is.rs new file mode 100644 index 0000000..5ee4bd4 --- /dev/null +++ b/src/grammar/alpha050/expressions/is.rs @@ -0,0 +1,37 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, + Expression, Spanned, Statement, + }, + T, +}; + +use super::cast::cast_parser; + +pub fn is_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + cast_parser(stmnts, expr.clone()) + .foldl( + just(T!["is"]) + .map_with(|t, e| (t.to_string(), e.span())) + .then( + type_parser().recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (DataType::Error, e.span())), + )), + ) + .repeated(), + |expr, (is_keyword, cast)| { + let span = SimpleSpan::new(expr.1.start, cast.1.end); + + (Expression::Is(Box::new(expr), is_keyword, cast), span) + }, + ) + .boxed() + .labelled("expression") +} diff --git a/src/grammar/alpha050/expressions/mod.rs b/src/grammar/alpha050/expressions/mod.rs new file mode 100644 index 0000000..71cb80b --- /dev/null +++ b/src/grammar/alpha050/expressions/mod.rs @@ -0,0 +1,21 @@ +use chumsky::prelude::*; + +use super::{AmberParser, Expression, Spanned, Statement}; + +mod and; +mod atom; +mod cast; +mod comparison; +mod is; +mod or; +mod product; +mod range; +mod sum; +mod ternary; +mod unary; + +pub fn parse_expr<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + recursive(move |expr| ternary::ternary_parser(stmnts, expr).labelled("expression")).boxed() +} diff --git a/src/grammar/alpha050/expressions/or.rs b/src/grammar/alpha050/expressions/or.rs new file mode 100644 index 0000000..364835d --- /dev/null +++ b/src/grammar/alpha050/expressions/or.rs @@ -0,0 +1,37 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{lexer::Token, parser::default_recovery, AmberParser, Spanned, Statement}, + T, +}; + +use super::{and::and_parser, Expression}; + +pub fn or_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + and_parser(stmnts.clone(), expr.clone()) + .foldl( + just(T!["or"]) + .map_with(|t, e| (t.to_string(), e.span())) + .then( + and_parser(stmnts, expr).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .repeated(), + |lhs, (or_keyword, rhs)| { + let span = SimpleSpan::new(lhs.1.start, rhs.1.end); + + ( + Expression::Or(Box::new(lhs), or_keyword, Box::new(rhs)), + span, + ) + }, + ) + .boxed() + .labelled("expression") +} diff --git a/src/grammar/alpha050/expressions/product.rs b/src/grammar/alpha050/expressions/product.rs new file mode 100644 index 0000000..5025d63 --- /dev/null +++ b/src/grammar/alpha050/expressions/product.rs @@ -0,0 +1,39 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + }, + T, +}; + +use super::is::is_parser; + +pub fn product_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + is_parser(stmnts.clone(), expr.clone()) + .foldl( + choice(( + just(T!['*']).to(Expression::Multiply as fn(_, _) -> _), + just(T!['/']).to(Expression::Divide as fn(_, _) -> _), + just(T!['%']).to(Expression::Modulo as fn(_, _) -> _), + )) + .then( + is_parser(stmnts, expr).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .repeated(), + |lhs, (op, rhs)| { + let span = SimpleSpan::new(lhs.1.start, rhs.1.end); + + (op(Box::new(lhs), Box::new(rhs)), span) + }, + ) + .boxed() + .labelled("expression") +} diff --git a/src/grammar/alpha050/expressions/range.rs b/src/grammar/alpha050/expressions/range.rs new file mode 100644 index 0000000..f4b4e64 --- /dev/null +++ b/src/grammar/alpha050/expressions/range.rs @@ -0,0 +1,36 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + }, + T, +}; + +use super::or::or_parser; + +pub fn range_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + or_parser(stmnts.clone(), expr.clone()) + .foldl( + just(T![".."]) + .ignore_then(just(T!["="]).or_not()) + .ignore_then( + or_parser(stmnts, expr).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .repeated(), + |start, end| { + let span = SimpleSpan::new(start.1.start, end.1.end); + + (Expression::Range(Box::new(start), Box::new(end)), span) + }, + ) + .boxed() + .labelled("expression") +} diff --git a/src/grammar/alpha050/expressions/sum.rs b/src/grammar/alpha050/expressions/sum.rs new file mode 100644 index 0000000..b36c8aa --- /dev/null +++ b/src/grammar/alpha050/expressions/sum.rs @@ -0,0 +1,37 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + }, + T, +}; + +use super::product::product_parser; + +pub fn sum_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + product_parser(stmnts.clone(), expr.clone()) + .foldl( + choice(( + just(T!['+']).to(Expression::Add as fn(_, _) -> _), + just(T!['-']).to(Expression::Subtract as fn(_, _) -> _), + )) + .then( + product_parser(stmnts, expr).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .repeated(), + |lhs, (op, rhs)| { + let span = SimpleSpan::new(lhs.1.start, rhs.1.end); + (op(Box::new(lhs), Box::new(rhs)), span) + }, + ) + .boxed() + .labelled("expression") +} diff --git a/src/grammar/alpha050/expressions/ternary.rs b/src/grammar/alpha050/expressions/ternary.rs new file mode 100644 index 0000000..1392746 --- /dev/null +++ b/src/grammar/alpha050/expressions/ternary.rs @@ -0,0 +1,60 @@ +use chumsky::prelude::*; + +use crate::grammar::alpha050::lexer::Token; +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{AmberParser, Spanned, Statement}; +use crate::T; + +use super::range::range_parser; +use super::Expression; + +pub fn ternary_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + range_parser(stmnts, expr.clone()) + .foldl( + just(T!["then"]) + .map_with(|t, e| (t.to_string(), e.span())) + .then( + expr.clone().recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .then( + just(T!["else"]) + .map_with(|t, e| (t.to_string(), e.span())) + .recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| ("".to_string(), e.span())), + )), + ) + .then( + expr.recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .repeated(), + |cond, (((then_keyword, if_true), else_keyword), if_false)| { + let span = SimpleSpan::new(cond.1.start, if_false.1.end); + + ( + Expression::Ternary( + Box::new(cond), + then_keyword, + Box::new(if_true), + else_keyword, + Box::new(if_false), + ), + span, + ) + }, + ) + .boxed() + .labelled("expression") +} diff --git a/src/grammar/alpha050/expressions/unary.rs b/src/grammar/alpha050/expressions/unary.rs new file mode 100644 index 0000000..1d8ba97 --- /dev/null +++ b/src/grammar/alpha050/expressions/unary.rs @@ -0,0 +1,33 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned, Statement}, + T, +}; + +use super::atom::array_index_parser; + +pub fn unary_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + expr: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + choice(( + just(T!['-']) + .map_with(|t, e| ((t.to_string(), e.span()), Expression::Neg as fn(_, _) -> _)), + just(T!["not"]) + .map_with(|t, e| ((t.to_string(), e.span()), Expression::Not as fn(_, _) -> _)), + just(T!["nameof"]).map_with(|t, e| { + ( + (t.to_string(), e.span()), + Expression::Nameof as fn(_, _) -> _, + ) + }), + )) + .repeated() + .foldr(array_index_parser(stmnts, expr), |(op_string, op), expr| { + let span = SimpleSpan::new(expr.1.start, expr.1.end); + + (op(op_string, Box::new(expr)), span) + }) + .boxed() +} diff --git a/src/grammar/alpha050/global.rs b/src/grammar/alpha050/global.rs new file mode 100644 index 0000000..a9f38ff --- /dev/null +++ b/src/grammar/alpha050/global.rs @@ -0,0 +1,329 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{statements::block::block_parser, Block}, + T, +}; + +use super::{ + expressions::parse_expr, + lexer::Token, + parser::{default_recovery, ident}, + statements::statement_parser, + AmberParser, CompilerFlag, DataType, Expression, FunctionArgument, GlobalStatement, + ImportContent, Spanned, Statement, +}; + +pub fn import_parser<'a>() -> impl AmberParser<'a, Spanned> { + let import_all_parser = just(T!["*"]).map_with(|_, e| (ImportContent::ImportAll, e.span())); + + let import_specific_parser = just(T!["{"]) + .ignore_then( + ident("variable".to_string()) + .recover_with(via_parser(default_recovery().map(|_| "".to_string()))) + .map_with(|name, e| (name, e.span())) + .separated_by( + just(T![","]) + .recover_with(via_parser(default_recovery().rewind().map(|_| T![","]))), + ) + .allow_trailing() + .collect(), + ) + .then_ignore( + just(T!["}"]).recover_with(via_parser(default_recovery().or_not().map(|_| T!["}"]))), + ) + .map_with(|vars, e| (ImportContent::ImportSpecific(vars), e.span())) + .boxed(); + + let path_parser = just(T!['"']) + .then( + any() + .filter(|c| *c != T!['"']) + .repeated() + .collect::>() + .map(|name| name.iter().map(|t| t.to_string()).collect::()), + ) + .then( + just(T!['"']).recover_with(via_parser( + default_recovery() + .repeated() + .then(just(T!['"'])) + .or_not() + .map(|_| T!['"']), + )), + ) + .map_with(|((_, path), _): ((Token, String), Token), e| (path, e.span())) + .boxed(); + + just(T!["pub"]) + .or_not() + .map_with(|is_pub, e| (is_pub.is_some(), e.span())) + .then(just(T!["import"]).map_with(|_, e| ("import".to_string(), e.span()))) + .then( + import_all_parser + .or(import_specific_parser) + .recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (ImportContent::ImportAll, e.span())), + )), + ) + .then( + just(T!["from"]) + .recover_with(via_parser(default_recovery().or_not().map(|_| T!["from"]))) + .map_with(|_, e| ("from".to_string(), e.span())), + ) + .then( + path_parser.recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| ("".to_string(), e.span())), + )), + ) + .map_with(|((((is_pub, imp), vars), from), path), e| { + ( + GlobalStatement::Import(is_pub, imp, vars, from, path), + e.span(), + ) + }) + .boxed() + .labelled("import statement") +} + +pub fn type_parser<'a>() -> impl AmberParser<'a, Spanned> { + let literal_type = choice(( + just(T!["Text"]).to(DataType::Text), + just(T!["Num"]).to(DataType::Number), + just(T!["Int"]).to(DataType::Int), + just(T!["Bool"]).to(DataType::Boolean), + just(T!["Null"]).to(DataType::Null), + )) + .boxed(); + + literal_type + .clone() + .or(just(T!["["]) + .ignore_then(literal_type.or_not()) + .then_ignore(just(T!["]"])) + .map(|ty| DataType::Array(Box::new(ty.unwrap_or(DataType::Any))))) + .then( + just(T!["?"]) + .or_not() + .map(|is_optional| is_optional.is_some()), + ) + .map_with(|(ty, is_optional), e| { + ( + match is_optional { + true => DataType::Failable(Box::new(ty)), + _ => ty, + }, + e.span(), + ) + }) + .labelled("type") + .boxed() +} + +fn compiler_flag_parser<'a>() -> impl AmberParser<'a, Spanned> { + just(T!["#"]) + .ignore_then(just(T!["["])) + .ignore_then( + choice(( + just(T!["allow_nested_if_else"]).to(CompilerFlag::AllowNestedIfElse), + just(T!["allow_generic_return"]).to(CompilerFlag::AllowGenericReturn), + just(T!["allow_absurd_cast"]).to(CompilerFlag::AllowAbsurdCast), + )) + .recover_with(via_parser( + default_recovery().or_not().map(|_| CompilerFlag::Error), + )), + ) + .then_ignore( + just(T!["]"]).recover_with(via_parser(default_recovery().or_not().map(|_| T!["]"]))), + ) + .map_with(|flag, e| (flag, e.span())) + .labelled("compiler flag") + .boxed() +} + +pub fn function_parser<'a>() -> impl AmberParser<'a, Spanned> { + let generic_arg_parser = just(T!["ref"]) + .or_not() + .map_with(|is_ref, e| (is_ref.is_some(), e.span())) + .then(ident("argument".to_string())) + .map_with(|(is_ref, name), e| FunctionArgument::Generic(is_ref, (name, e.span()))) + .boxed(); + + let typed_arg_parser = just(T!["ref"]) + .or_not() + .map_with(|is_ref, e| (is_ref.is_some(), e.span())) + .then(ident("argument".to_string()).map_with(|name, e| (name, e.span()))) + .then( + just(T![":"]).ignore_then( + type_parser().recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (DataType::Error, e.span())), + )), + ), + ) + .map(|((is_ref, name), ty)| FunctionArgument::Typed(is_ref, name, ty)) + .boxed(); + + let arg_parser = choice((typed_arg_parser, generic_arg_parser)) + .then( + just(T!['=']) + .ignore_then( + parse_expr(statement_parser()).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .or_not(), + ) + .map_with(|(arg, default), e| { + ( + match (arg.clone(), default) { + (FunctionArgument::Typed(is_ref, name, ty), Some(expr)) => { + FunctionArgument::Optional(is_ref, name, Some(ty), expr) + } + (FunctionArgument::Generic(is_ref, name), Some(expr)) => { + FunctionArgument::Optional(is_ref, name, None, expr) + } + _ => arg, + }, + e.span(), + ) + }) + .labelled("argument") + .boxed(); + + let args_parser = arg_parser + .recover_with(via_parser( + default_recovery().map_with(|_, e| (FunctionArgument::Error, e.span())), + )) + .separated_by( + just(T![","]).recover_with(via_parser(default_recovery().rewind().map(|_| T![","]))), + ) + .allow_trailing() + .collect() + .delimited_by( + just(T!['(']), + just(T![')']).recover_with(via_parser(default_recovery().or_not().map(|_| T![')']))), + ) + .boxed(); + + let ret_parser = just(T![":"]) + .ignore_then( + type_parser().recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (DataType::Error, e.span())), + )), + ) + .boxed(); + + compiler_flag_parser() + .repeated() + .collect() + .then( + just(T!["pub"]) + .or_not() + .map_with(|is_pub, e| (is_pub.is_some(), e.span())), + ) + .then(just(T!["fun"]).map_with(|_, e| ("fun".to_string(), e.span()))) + .then( + ident("function".to_string()) + .map_err(|err| Rich::custom(*err.span(), "Expected function name")) + .recover_with(via_parser( + default_recovery().or_not().map(|_| "".to_string()), + )) + .map_with(|name, e| (name, e.span())), + ) + .then(args_parser.recover_with(via_parser(default_recovery().or_not().map(|_| vec![])))) + .then(ret_parser.or_not()) + .then( + just(T!["{"]) + .ignore_then( + statement_parser() + .recover_with(via_parser( + default_recovery().map_with(|_, e| (Statement::Error, e.span())), + )) + .repeated() + .collect(), + ) + .then_ignore( + just(T!["}"]) + .recover_with(via_parser(default_recovery().or_not().map(|_| T!["}"]))), + ) + .recover_with(via_parser( + default_recovery() + .repeated() + .then(just(T!["}"])) + .or_not() + .map(|_| vec![]), + )), + ) + .map_with( + |((((((compiler_flags, is_pub), fun), name), args), ty), body), e| { + ( + GlobalStatement::FunctionDefinition( + compiler_flags, + is_pub, + fun, + name, + args, + ty, + body, + ), + e.span(), + ) + }, + ) + .boxed() + .labelled("function definition") +} + +pub fn main_parser<'a>() -> impl AmberParser<'a, Spanned> { + just(T!["main"]) + .map_with(|_, e| ("main".to_string(), e.span())) + .then( + just(T!['(']) + .ignore_then( + ident("argument".to_string()) + .recover_with(via_parser(default_recovery().map(|_| "".to_string()))), + ) + .then_ignore( + just(T![')']) + .recover_with(via_parser(default_recovery().or_not().map(|_| T![')']))), + ) + .map_with(|name, e| (name, e.span())) + .or_not(), + ) + .then( + block_parser(statement_parser(), false, true).recover_with(via_parser( + default_recovery().map_with(|_, e| (Block::Error, e.span())), + )), + ) + .map_with(|((main, args), body), e| (GlobalStatement::Main(main, args, body), e.span())) + .boxed() + .labelled("main body") +} + +pub fn global_statement_parser<'a>() -> impl AmberParser<'a, Vec>> { + let statement = statement_parser() + .map(|stmnt| (GlobalStatement::Statement(Box::new(stmnt.clone())), stmnt.1)) + .boxed(); + + choice((import_parser(), function_parser(), main_parser(), statement)) + .recover_with(via_parser(any().map_with(|_, e| { + ( + GlobalStatement::Statement(Box::new((Statement::Error, e.span()))), + e.span(), + ) + }))) + .repeated() + .collect() + .then_ignore(end()) + .boxed() +} diff --git a/src/grammar/alpha050/lexer.rs b/src/grammar/alpha050/lexer.rs new file mode 100644 index 0000000..278aaef --- /dev/null +++ b/src/grammar/alpha050/lexer.rs @@ -0,0 +1,74 @@ +use heraclitus_compiler::prelude::*; + +pub use crate::grammar::Token; + +pub fn get_rules() -> Rules { + let symbols = vec![ + '+', '-', '*', '/', '%', ';', ':', '(', ')', '[', ']', '{', '}', ',', '.', '<', '>', '=', + '!', '?', '\\', '"', '$', '\n', + ]; + let compounds = vec![ + ('<', '='), + ('>', '='), + ('!', '='), + ('=', '='), + ('+', '='), + ('-', '='), + ('*', '='), + ('/', '='), + ('%', '='), + ('.', '.'), + ('/', '/'), + ]; + let region = reg![ + reg!(string as "string literal" => { + begin: "\"", + end: "\"", + tokenize: true, + allow_unclosed_region: true + } => [ + reg!(str_interp as "string interpolation" => { + begin: "{", + end: "}", + tokenize: true, + allow_unclosed_region: true + } ref global) + ]), + reg!(command as "command literal" => { + begin: "$", + end: "$", + tokenize: true, + allow_unclosed_region: true + } => [ + reg!(com_interp as "command interpolation" => { + begin: "{", + end: "}", + tokenize: true, + allow_unclosed_region: true + } ref global) + ]), + reg!(cc_flag as "compiler flag" => { + begin: "#[", + end: "]", + tokenize: true, + allow_unclosed_region: true + }), + reg!(comment as "comment" => { + begin: "//", + end: "\n", + allow_unclosed_region: true + }), + reg!(comment as "shebang" => { + begin: "#!", + end: "\n", + allow_unclosed_region: true + }), + reg!(interp as "interpolation" => { + begin: "{", + end: "}", + tokenize: true, + allow_unclosed_region: true + } ref global) + ]; + Rules::new(symbols, compounds, region) +} diff --git a/src/grammar/alpha050/mod.rs b/src/grammar/alpha050/mod.rs new file mode 100644 index 0000000..adc8e0a --- /dev/null +++ b/src/grammar/alpha050/mod.rs @@ -0,0 +1,338 @@ +use crate::analysis::types::DataType; + +pub use super::Spanned; +use super::{CommandModifier, CompilerFlag, Grammar, LSPAnalysis, ParserResponse, Span}; +use chumsky::{ + error::Rich, + extra::Err, + input::{Input, SpannedInput}, + span::SimpleSpan, + Parser, +}; +use heraclitus_compiler::prelude::*; +use lexer::{get_rules, Token}; +use prelude::lexer::Lexer; +use semantic_tokens::semantic_tokens_from_ast; + +pub mod expressions; +pub mod global; +pub mod lexer; +pub mod parser; +pub mod semantic_tokens; +pub mod statements; + +#[derive(PartialEq, Debug, Clone)] +pub enum InterpolatedText { + Escape(Spanned), + Expression(Box>), + Text(Spanned), +} + +#[derive(PartialEq, Debug, Clone)] +pub enum Block { + Block(Vec>, Vec>), + Singleline(Box>), + Error, +} + +#[derive(PartialEq, Debug, Clone)] +pub enum FailureHandler { + Propagate, + Handle( + Spanned, + Option>, + Box>, + ), +} + +#[derive(PartialEq, Debug, Clone)] +pub enum FailableHandler { + Failure(Spanned), + Succeeded(Spanned, Box>), + Then(Spanned, Spanned, Box>), +} + +#[derive(PartialEq, Debug, Clone)] +pub enum InterpolatedCommand { + Escape(String), + CommandOption(String), + Expression(Box>), + Text(String), +} + +#[derive(PartialEq, Debug, Clone)] +pub enum Expression { + Int(Spanned), + Number(Spanned), + Boolean(Spanned), + Text(Vec>), + Parentheses(Box>), + Var(Spanned), + Add(Box>, Box>), + Subtract(Box>, Box>), + Multiply(Box>, Box>), + Divide(Box>, Box>), + Modulo(Box>, Box>), + Neg(Spanned, Box>), + And( + Box>, + Spanned, + Box>, + ), + Or( + Box>, + Spanned, + Box>, + ), + Gt(Box>, Box>), + Ge(Box>, Box>), + Lt(Box>, Box>), + Le(Box>, Box>), + Eq(Box>, Box>), + Neq(Box>, Box>), + Not(Spanned, Box>), + Ternary( + Box>, + Spanned, + Box>, + Spanned, + Box>, + ), + FunctionInvocation( + Vec>, + Spanned, + Vec>, + Vec>, + ), + Command( + Vec>, + Vec>, + Vec>, + ), + Array(Vec>), + Range(Box>, Box>), + Null, + Cast(Box>, Spanned, Spanned), + Status, + Nameof(Spanned, Box>), + Is(Box>, Spanned, Spanned), + ArrayIndex(Box>, Box>), + Exit(Spanned, Option>>), + Error, +} + +#[derive(PartialEq, Debug, Clone)] +pub enum ImportContent { + ImportAll, + ImportSpecific(Vec>), +} + +#[derive(PartialEq, Debug, Clone)] +pub enum FunctionArgument { + Generic(Spanned, Spanned), + Optional( + Spanned, + Spanned, + Option>, + Spanned, + ), + Typed(Spanned, Spanned, Spanned), + Error, +} + +#[derive(PartialEq, Debug, Clone)] +pub enum IfCondition { + IfCondition(Spanned, Spanned), + Comment(Spanned), + Error, +} + +#[derive(PartialEq, Debug, Clone)] +pub enum ElseCondition { + Else(Spanned, Spanned), +} + +#[derive(PartialEq, Debug, Clone)] +pub enum IfChainContent { + IfCondition(Spanned), + Else(Spanned), + Comment(Spanned), +} + +#[derive(PartialEq, Debug, Clone)] +pub enum IterLoopVars { + Single(Spanned), + WithIndex(Spanned, Spanned), + Error, +} + +#[derive(PartialEq, Debug, Clone)] +pub enum VariableInitType { + Expression(Spanned), + DataType(Spanned), + Error, +} + +#[derive(PartialEq, Debug, Clone)] +pub enum Comment { + Comment(String), + DocString(String), +} + +#[derive(PartialEq, Debug, Clone)] +pub enum Statement { + Expression(Box>), + VariableInit(Spanned, Spanned, Spanned), + ConstInit(Spanned, Spanned, Box>), + VariableSet(Spanned, Box>), + IfCondition( + Spanned, + Spanned, + Vec>, + Option>, + ), + IfChain(Spanned, Vec>), + ShorthandAdd(Spanned, Box>), + ShorthandSub(Spanned, Box>), + ShorthandMul(Spanned, Box>), + ShorthandDiv(Spanned, Box>), + ShorthandModulo(Spanned, Box>), + InfiniteLoop(Spanned, Spanned), + WhileLoop(Spanned, Box>, Spanned), + IterLoop( + Spanned, + Spanned, + Spanned, + Box>, + Spanned, + ), + Break, + Continue, + Return(Spanned, Option>>), + Fail(Spanned, Option>>), + Echo(Spanned, Box>), + Cd(Spanned, Box>), + MoveFiles( + Vec>, + Spanned, + Box>, + Box>, + Vec>, + ), + Block(Spanned), + Comment(Spanned), + Shebang(String), + Error, +} + +#[derive(PartialEq, Debug, Clone)] +pub enum GlobalStatement { + /// Import statement + /// + /// is_public, "import", import_content, "from", path + Import( + Spanned, + Spanned, + Spanned, + Spanned, + Spanned, + ), + /// Function definition + /// + /// is_public, "fun", name, args, return_type, body + FunctionDefinition( + Vec>, + Spanned, + Spanned, + Spanned, + Vec>, + Option>, + Vec>, + ), + Main( + Spanned, + Option>, + // Vec>, + Spanned, + ), + Statement(Box>), +} + +#[derive(Debug)] +pub struct AmberCompiler { + lexer: Lexer, +} + +impl Default for AmberCompiler { + fn default() -> Self { + Self::new() + } +} + +impl AmberCompiler { + pub fn new() -> Self { + let lexer = Lexer::new(get_rules()); + + AmberCompiler { lexer } + } + + pub fn parser<'a>(&self) -> impl AmberParser<'a, Vec>> { + global::global_statement_parser() + } +} + +impl LSPAnalysis for AmberCompiler { + #[tracing::instrument(skip_all)] + fn tokenize(&self, input: &str) -> Vec> { + // It should never fail + self.lexer + .tokenize(&input.replace("\r\n", "\n").replace("\r", "\n")) + .expect("Failed to tokenize input") + .iter() + .filter_map(|t| { + if t.word == "\n" { + return None; + } + + Some(( + Token(t.word.clone()), + SimpleSpan::new(t.start, t.start + t.word.chars().count()), + )) + }) + .collect() + } + + #[tracing::instrument(skip_all)] + fn parse<'a>(&self, tokens: &'a [Spanned]) -> ParserResponse<'a> { + let len = tokens.last().map(|t| t.1.end).unwrap_or(0); + let parser_input = tokens.spanned(Span::new(len, len)); + + let result = self.parser().parse(parser_input); + + let semantic_tokens = semantic_tokens_from_ast(result.output()); + + let string_errors = result + .errors() + .map(|e| e.clone().map_token(|t| t.0)) + .collect(); + + ParserResponse { + ast: Grammar::Alpha050(result.into_output()), + errors: string_errors, + semantic_tokens, + } + } +} + +pub type RichError<'src> = Err>; +type AmberInput<'src> = SpannedInput]>; + +pub trait AmberParser<'src, Output>: + Parser<'src, AmberInput<'src>, Output, RichError<'src>> + Clone + Sized + 'src +{ +} + +impl<'src, Output, T> AmberParser<'src, Output> for T where + T: Parser<'src, AmberInput<'src>, Output, RichError<'src>> + Clone + Sized + 'src +{ +} diff --git a/src/grammar/alpha050/parser.rs b/src/grammar/alpha050/parser.rs new file mode 100644 index 0000000..6282afd --- /dev/null +++ b/src/grammar/alpha050/parser.rs @@ -0,0 +1,123 @@ +use chumsky::prelude::*; + +use crate::T; + +use super::{lexer::Token, AmberParser}; + +const KEYWORDS: &[&str] = &[ + "if", + "else", + "loop", + "in", + "return", + "break", + "continue", + "true", + "false", + "null", + "fun", + "as", + "is", + "or", + "and", + "not", + "nameof", + "status", + "fail", + "echo", + "let", + "unsafe", + "silent", + "main", + "import", + "from", + "pub", + "then", + "Text", + "Num", + "Bool", + "Null", + "ref", + "const", + "exit", + "trust", + "for", + "succeeded", + "failed", +]; + +#[inline] +pub fn ident<'a>(ident_name: String) -> impl AmberParser<'a, String> { + any() + .try_map(move |token: Token, span| { + let word = token.to_string(); + let mut chars = word.chars(); + + let first_char = chars.next().unwrap(); + + if word.starts_with("__") { + return Err(Rich::custom( + span, + "identifier cannot start with a double underscore", + )); + } + + if !first_char.is_ascii_alphabetic() && first_char != '_' { + return Err(Rich::custom( + span, + "identifier must start with a letter or an underscore", + )); + } + + for char in chars { + if !char.is_ascii_alphanumeric() && char != '_' { + return Err(Rich::custom( + span, + "identifier must contain only alphanumeric characters or underscores", + )); + } + } + + if KEYWORDS.contains(&word.as_str()) { + return Err(Rich::custom( + span, + format!("keyword used as {ident_name} name"), + )); + } + + Ok(word) + }) + .boxed() +} + +#[inline] +pub fn default_recovery<'a>() -> impl AmberParser<'a, Token> { + let mut keyword_tokens = KEYWORDS.iter().map(|k| T![k]).collect::>(); + + keyword_tokens.extend(vec![ + T!["{"], + T!["}"], + T!["("], + T![")"], + T!['"'], + T!['$'], + T!["["], + T!["]"], + T![".."], + T!["+"], + T!["-"], + T!["*"], + T!["/"], + T!["%"], + T!["="], + T!["=="], + T!["!="], + T!["<"], + T![">"], + T!["<="], + T![">="], + T![","], + ]); + + none_of(keyword_tokens).boxed() +} diff --git a/src/grammar/alpha050/semantic_tokens.rs b/src/grammar/alpha050/semantic_tokens.rs new file mode 100644 index 0000000..ad0dbb4 --- /dev/null +++ b/src/grammar/alpha050/semantic_tokens.rs @@ -0,0 +1,948 @@ +use chumsky::span::SimpleSpan; +use tower_lsp_server::lsp_types::SemanticTokenType; + +use crate::grammar::SpannedSemanticToken; + +use super::*; + +const ESCAPE_SEQUENCE: SemanticTokenType = SemanticTokenType::new("escapeSequence"); +const CONSTANT: SemanticTokenType = SemanticTokenType::new("constant"); + +pub const LEGEND_TYPE: [SemanticTokenType; 13] = [ + SemanticTokenType::FUNCTION, + SemanticTokenType::VARIABLE, + SemanticTokenType::STRING, + SemanticTokenType::COMMENT, + SemanticTokenType::NUMBER, + SemanticTokenType::KEYWORD, + SemanticTokenType::OPERATOR, + SemanticTokenType::PARAMETER, + SemanticTokenType::TYPE, + SemanticTokenType::MODIFIER, + SemanticTokenType::DECORATOR, + ESCAPE_SEQUENCE, + CONSTANT, +]; + +fn hash_semantic_token_type(token_type: SemanticTokenType) -> usize { + LEGEND_TYPE.iter().position(|x| *x == token_type).unwrap() +} + +#[tracing::instrument(skip_all)] +pub fn semantic_tokens_from_ast( + ast: Option<&Vec>>, +) -> Vec { + ast.map_or(vec![], |ast| { + let mut tokens = vec![]; + + for (statement, _) in ast { + match statement { + GlobalStatement::Import( + (is_pub, is_pub_span), + (_, import_keyword_span), + import_content, + (_, from_keyword_span), + (_, path_span), + ) => { + if *is_pub { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::MODIFIER), + *is_pub_span, + )); + } + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *import_keyword_span, + )); + + match import_content { + (ImportContent::ImportAll, span) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *span, + )); + } + (ImportContent::ImportSpecific(vars), _) => { + vars.iter().for_each(|(_, span)| { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *span, + )); + }) + } + } + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *from_keyword_span, + )); + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::STRING), + *path_span, + )); + } + GlobalStatement::FunctionDefinition( + compiler_flags, + is_pub, + fun, + (_, name_span), + args, + ty, + body, + ) => { + compiler_flags.iter().for_each(|(_, span)| { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::DECORATOR), + *span, + )); + }); + + if is_pub.0 { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::MODIFIER), + is_pub.1, + )); + } + + tokens.push((hash_semantic_token_type(SemanticTokenType::KEYWORD), fun.1)); + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::FUNCTION), + *name_span, + )); + + args.iter().for_each(|(arg, _)| match arg { + FunctionArgument::Typed( + (is_ref, is_ref_span), + (_, arg_span), + (_, ty_span), + ) => { + if *is_ref { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *is_ref_span, + )); + } + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::PARAMETER), + *arg_span, + )); + tokens.push(( + hash_semantic_token_type(SemanticTokenType::TYPE), + *ty_span, + )); + } + FunctionArgument::Generic((is_ref, is_ref_span), (_, arg_span)) => { + if *is_ref { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *is_ref_span, + )); + } + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::PARAMETER), + *arg_span, + )); + } + FunctionArgument::Optional( + (is_ref, is_ref_span), + (_, arg_span), + ty, + exp, + ) => { + if *is_ref { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *is_ref_span, + )); + } + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::PARAMETER), + *arg_span, + )); + + if let Some((_, ty_span)) = ty { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::TYPE), + *ty_span, + )); + } + + tokens.extend(semantic_tokens_from_expr(exp)); + } + FunctionArgument::Error => {} + }); + + if let Some((_, ty_span)) = ty { + tokens.push((hash_semantic_token_type(SemanticTokenType::TYPE), *ty_span)); + } + + tokens.extend(semantic_tokens_from_stmnts(body)); + } + GlobalStatement::Main((_, main_span), args, body) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *main_span, + )); + + if let Some((_, args_span)) = args { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *args_span, + )); + } + + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(body.clone()), + body.1, + )])); + } + GlobalStatement::Statement(stmnt) => { + tokens.extend(semantic_tokens_from_stmnts(&[*stmnt.clone()])); + } + } + } + + tokens + }) +} + +fn semantic_tokens_from_stmnts(stmnts: &[Spanned]) -> Vec { + stmnts + .iter() + .flat_map(|(stmnt, span)| match stmnt { + Statement::Block((block, _)) => match block { + Block::Block(modifiers, stmnts) => { + let mut tokens = vec![]; + + modifiers.iter().for_each(|(_, span)| { + tokens.push((hash_semantic_token_type(SemanticTokenType::KEYWORD), *span)); + }); + + tokens.extend(semantic_tokens_from_stmnts(stmnts)); + + tokens + } + Block::Singleline(stmnt) => { + let stmnts = vec![*stmnt.clone()]; + + semantic_tokens_from_stmnts(&stmnts) + } + Block::Error => vec![], + }, + Statement::Break => vec![(hash_semantic_token_type(SemanticTokenType::KEYWORD), *span)], + Statement::Comment(_) => { + vec![(hash_semantic_token_type(SemanticTokenType::COMMENT), *span)] + } + Statement::Shebang(_) => { + vec![(hash_semantic_token_type(SemanticTokenType::COMMENT), *span)] + } + Statement::Continue => { + vec![(hash_semantic_token_type(SemanticTokenType::KEYWORD), *span)] + } + Statement::Echo((_, echo_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *echo_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Statement::Cd((_, cd_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *cd_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Statement::MoveFiles(command_modifiers, (_, mv_span), src, dest, failable_handlers) => { + let mut tokens = vec![]; + + command_modifiers.iter().for_each(|(_, span)| { + tokens.push((hash_semantic_token_type(SemanticTokenType::MODIFIER), *span)); + }); + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *mv_span, + )); + + tokens.extend(semantic_tokens_from_expr(src)); + tokens.extend(semantic_tokens_from_expr(dest)); + + tokens.extend(semantic_tokens_from_failable_handlers(failable_handlers)); + + tokens + } + Statement::Expression(expr) => semantic_tokens_from_expr(expr), + Statement::Fail((_, fail_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *fail_span, + )]; + + if let Some(expr) = expr { + tokens.extend(semantic_tokens_from_expr(expr)); + } + + tokens + } + Statement::IfChain((_, if_span), if_chain) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *if_span, + )]; + + if_chain + .iter() + .for_each(|(chain_cond, _)| match chain_cond { + IfChainContent::IfCondition((if_cond, _)) => match if_cond { + IfCondition::IfCondition(expr, block) => { + tokens.extend(semantic_tokens_from_expr(expr)); + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(block.clone()), + block.1, + )])); + } + IfCondition::Comment(comment) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::COMMENT), + comment.1, + )); + } + IfCondition::Error => {} + }, + IfChainContent::Else((else_cond, _)) => match else_cond { + ElseCondition::Else((_, else_span), block) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *else_span, + )); + + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(block.clone()), + block.1, + )])); + } + }, + IfChainContent::Comment(comment) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::COMMENT), + comment.1, + )); + } + }); + + tokens + } + Statement::IfCondition((_, if_span), (if_cond, _), comments, else_cond) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *if_span, + )]; + + match if_cond { + IfCondition::IfCondition(expr, block) => { + tokens.extend(semantic_tokens_from_expr(expr)); + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(block.clone()), + block.1, + )])); + } + IfCondition::Comment(comment) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::COMMENT), + comment.1, + )); + } + IfCondition::Error => {} + } + + comments.iter().for_each(|comment| { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::COMMENT), + comment.1, + )); + }); + + if let Some((else_cond, _)) = else_cond { + match else_cond { + ElseCondition::Else((_, else_span), block) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *else_span, + )); + + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(block.clone()), + block.1, + )])); + } + } + } + + tokens + } + Statement::InfiniteLoop((_, loop_span), block) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *loop_span, + )]; + + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(block.clone()), + block.1, + )])); + + tokens + } + Statement::WhileLoop((_, loop_span), expr, block) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *loop_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(block.clone()), + block.1, + )])); + + tokens + } + Statement::IterLoop((_, if_span), (vars, _), (_, in_span), expr, block) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *if_span, + )]; + + match vars { + IterLoopVars::Single((_, span)) => { + tokens.push((hash_semantic_token_type(SemanticTokenType::VARIABLE), *span)); + } + IterLoopVars::WithIndex((_, span1), (_, span2)) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *span1, + )); + tokens.push(( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *span2, + )); + } + IterLoopVars::Error => {} + } + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *in_span, + )); + + tokens.extend(semantic_tokens_from_expr(expr)); + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(block.clone()), + block.1, + )])); + + tokens + } + Statement::Return((_, return_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *return_span, + )]; + + if let Some(expr) = expr { + tokens.extend(semantic_tokens_from_expr(expr)); + } + + tokens + } + Statement::ShorthandAdd((_, var_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *var_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Statement::ShorthandDiv((_, var_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *var_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Statement::ShorthandMul((_, var_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *var_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Statement::ShorthandModulo((_, var_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *var_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Statement::ShorthandSub((_, var_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *var_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Statement::VariableInit((_, let_span), (_, var_span), (val, _)) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *let_span, + )]; + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *var_span, + )); + + match val { + VariableInitType::Expression(expr) => { + tokens.extend(semantic_tokens_from_expr(expr)); + } + VariableInitType::DataType((_, ty_span)) => { + tokens.push((hash_semantic_token_type(SemanticTokenType::TYPE), *ty_span)); + } + &VariableInitType::Error => {} + } + + tokens + } + Statement::ConstInit((_, const_span), (_, var_span), exp) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *const_span, + )]; + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *var_span, + )); + + tokens.extend(semantic_tokens_from_expr(exp)); + + tokens + } + Statement::VariableSet((_, var_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *var_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Statement::Error => vec![], + }) + .collect() +} + +fn semantic_tokens_from_expr((expr, span): &Spanned) -> Vec { + match expr { + Expression::Exit((_, exit_span), exp) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *exit_span, + )]; + + if let Some(expr) = exp { + tokens.extend(semantic_tokens_from_expr(expr)); + } + + tokens + } + Expression::ArrayIndex(array, index) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(array)); + tokens.extend(semantic_tokens_from_expr(index)); + + tokens + } + Expression::Add(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::And(lhs, (_, and_span), rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *and_span, + )); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Array(elements) => elements + .iter() + .flat_map(semantic_tokens_from_expr) + .collect(), + Expression::Boolean(_) => vec![(hash_semantic_token_type(CONSTANT), *span)], + Expression::Cast(expr, (_, as_span), (_, ty_span)) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(expr)); + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *as_span, + )); + tokens.push((hash_semantic_token_type(SemanticTokenType::TYPE), *ty_span)); + + tokens + } + Expression::Command(modifiers, cmd, failable_handlers) => { + let mut tokens = vec![]; + + modifiers.iter().for_each(|(_, span)| { + tokens.push((hash_semantic_token_type(SemanticTokenType::KEYWORD), *span)); + }); + + cmd.iter().for_each(|(inter_cmd, span)| match inter_cmd { + InterpolatedCommand::Text(_) => { + tokens.push((hash_semantic_token_type(SemanticTokenType::STRING), *span)); + } + InterpolatedCommand::Expression(expr) => { + tokens.extend(semantic_tokens_from_expr(expr)); + } + InterpolatedCommand::CommandOption(_) => { + tokens.push((hash_semantic_token_type(CONSTANT), *span)); + } + InterpolatedCommand::Escape(_) => { + tokens.push((hash_semantic_token_type(ESCAPE_SEQUENCE), *span)); + } + }); + + tokens.extend(semantic_tokens_from_failable_handlers(failable_handlers)); + + tokens + } + Expression::Divide(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Eq(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::FunctionInvocation(modifiers, (_, name_span), args, failable_handlers) => { + let mut tokens = vec![]; + + modifiers.iter().for_each(|(_, span)| { + tokens.push((hash_semantic_token_type(SemanticTokenType::KEYWORD), *span)); + }); + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::FUNCTION), + *name_span, + )); + + args.iter().for_each(|expr| { + tokens.extend(semantic_tokens_from_expr(expr)); + }); + + tokens.extend(semantic_tokens_from_failable_handlers(failable_handlers)); + + tokens + } + Expression::Ge(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Gt(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Is(lhs, (_, is_span), (_, ty_span)) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *is_span, + )); + tokens.push((hash_semantic_token_type(SemanticTokenType::TYPE), *ty_span)); + + tokens + } + Expression::Le(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Lt(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Modulo(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Multiply(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Nameof((_, nameof_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *nameof_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Expression::Neg((_, op_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::OPERATOR), + *op_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Expression::Neq(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Not((_, not_span), expr) => { + let mut tokens = vec![( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *not_span, + )]; + + tokens.extend(semantic_tokens_from_expr(expr)); + + tokens + } + Expression::Null => vec![(hash_semantic_token_type(CONSTANT), *span)], + Expression::Number(_) => vec![(hash_semantic_token_type(SemanticTokenType::NUMBER), *span)], + Expression::Int(_) => vec![(hash_semantic_token_type(SemanticTokenType::NUMBER), *span)], + Expression::Or(lhs, (_, or_span), rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *or_span, + )); + + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Parentheses(expr) => semantic_tokens_from_expr(expr), + Expression::Range(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Status => vec![(hash_semantic_token_type(SemanticTokenType::KEYWORD), *span)], + Expression::Subtract(lhs, rhs) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(lhs)); + tokens.extend(semantic_tokens_from_expr(rhs)); + + tokens + } + Expression::Ternary(cond, (_, then_span), if_true, (_, else_span), if_false) => { + let mut tokens = vec![]; + + tokens.extend(semantic_tokens_from_expr(cond)); + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *then_span, + )); + tokens.extend(semantic_tokens_from_expr(if_true)); + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *else_span, + )); + tokens.extend(semantic_tokens_from_expr(if_false)); + + tokens + } + Expression::Text(inter_text) => { + let mut tokens = vec![]; + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::STRING), + SimpleSpan::new(span.start, span.start + 1), + )); + tokens.extend( + inter_text + .iter() + .flat_map(|(text, span)| match text { + &InterpolatedText::Text(_) => { + vec![(hash_semantic_token_type(SemanticTokenType::STRING), *span)] + } + InterpolatedText::Expression(expr) => semantic_tokens_from_expr(expr), + InterpolatedText::Escape(_) => { + vec![(hash_semantic_token_type(SemanticTokenType::STRING), *span)] + } + }) + .collect::>>(), + ); + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::STRING), + SimpleSpan::new(span.end - 1, span.end), + )); + + tokens + } + Expression::Var(_) => vec![(hash_semantic_token_type(SemanticTokenType::VARIABLE), *span)], + Expression::Error => vec![], + } +} + +fn semantic_tokens_from_failable_handlers( + handlers: &[Spanned], +) -> Vec { + handlers + .iter() + .flat_map(|(handler, _)| { + let mut tokens = vec![]; + match handler { + FailableHandler::Failure((failure_handler, failure_span)) => { + match failure_handler { + FailureHandler::Handle((_, failed_span), exit_code, block) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *failed_span, + )); + + if let Some((_, exit_code_span)) = exit_code { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *exit_code_span, + )); + } + + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(*block.clone()), + block.1, + )])); + } + FailureHandler::Propagate => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *failure_span, + )); + } + } + } + FailableHandler::Succeeded((_, failed_span), block) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *failed_span, + )); + + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(*block.clone()), + block.1, + )])); + } + FailableHandler::Then((_, failed_span), (_, exit_code_span), block) => { + tokens.push(( + hash_semantic_token_type(SemanticTokenType::KEYWORD), + *failed_span, + )); + + tokens.push(( + hash_semantic_token_type(SemanticTokenType::VARIABLE), + *exit_code_span, + )); + + tokens.extend(semantic_tokens_from_stmnts(&vec![( + Statement::Block(*block.clone()), + block.1, + )])); + } + }; + + tokens + }) + .collect() +} diff --git a/src/grammar/alpha050/statements/block.rs b/src/grammar/alpha050/statements/block.rs new file mode 100644 index 0000000..9a8b2fc --- /dev/null +++ b/src/grammar/alpha050/statements/block.rs @@ -0,0 +1,73 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + lexer::Token, parser::default_recovery, AmberParser, Block, Spanned, Statement, + }, + T, +}; + +use super::modifiers::modifier_parser; + +pub fn block_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, + with_modifiers: bool, + with_singleline: bool, +) -> impl AmberParser<'a, Spanned> { + let body_parser = stmnts + .clone() + .recover_with(via_parser( + default_recovery().map_with(|_, e| (Statement::Error, e.span())), + )) + .repeated() + .collect() + .delimited_by( + just(T!['{']), + just(T!['}']).recover_with(via_parser(default_recovery().or_not().map(|_| T!['}']))), + ) + .boxed(); + + let body_with_modifiers_parser = modifier_parser() + .repeated() + .collect() + .then(body_parser.clone()) + .map_with(move |(modifier, body), e| (Block::Block(modifier, body), e.span())) + .boxed(); + + let singleline_parser = just(T![':']) + .ignore_then(stmnts.recover_with(via_parser( + default_recovery().map_with(|_, e| (Statement::Error, e.span())), + ))) + .map_with(|body, e| (Block::Singleline(Box::new(body)), e.span())) + .boxed(); + + if with_singleline { + if !with_modifiers { + return choice(( + singleline_parser, + body_parser + .map_with(|body, e| (Block::Block(vec![], body), e.span())) + .boxed(), + )) + .boxed(); + } + + return choice((singleline_parser, body_with_modifiers_parser)).boxed(); + } + + if !with_modifiers { + return body_parser + .map_with(|body, e| (Block::Block(vec![], body), e.span())) + .boxed(); + } + + body_with_modifiers_parser +} + +pub fn block_parser_statement<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + block_parser(stmnts, true, false) + .map_with(|block, e| (Statement::Block(block), e.span())) + .boxed() +} diff --git a/src/grammar/alpha050/statements/comment.rs b/src/grammar/alpha050/statements/comment.rs new file mode 100644 index 0000000..1e440ed --- /dev/null +++ b/src/grammar/alpha050/statements/comment.rs @@ -0,0 +1,31 @@ +use chumsky::prelude::*; + +use crate::grammar::alpha050::{lexer::Token, AmberParser, Comment, Spanned}; + +pub fn comment_parser<'a>() -> impl AmberParser<'a, Spanned> { + choice((doc_string_parser(), single_line_comment_parser())).boxed() +} + +fn single_line_comment_parser<'a>() -> impl AmberParser<'a, Spanned> { + any() + .filter(|t: &Token| t.to_string().starts_with("//")) + .map_with(|com, e| { + ( + Comment::Comment(com.to_string()[2..].trim().to_string()), + e.span(), + ) + }) + .boxed() +} + +fn doc_string_parser<'a>() -> impl AmberParser<'a, Spanned> { + any() + .filter(|t: &Token| t.to_string().starts_with("///")) + .map_with(|doc, e| { + ( + Comment::DocString(doc.to_string()[3..].trim().to_string()), + e.span(), + ) + }) + .boxed() +} diff --git a/src/grammar/alpha050/statements/const_init.rs b/src/grammar/alpha050/statements/const_init.rs new file mode 100644 index 0000000..eeca42e --- /dev/null +++ b/src/grammar/alpha050/statements/const_init.rs @@ -0,0 +1,45 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::{ + alpha050::Expression, + alpha050::{ + expressions::parse_expr, + lexer::Token, + parser::{default_recovery, ident}, + AmberParser, Spanned, Statement, + }, + }, + T, +}; + +pub fn const_init_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + just(T!["const"]) + .map_with(|_, e| ("const".to_string(), e.span())) + .then( + ident("variable".to_string()) + .recover_with(via_parser( + default_recovery().or_not().map(|_| "".to_string()), + )) + .map_with(|name, e| (name, e.span())), + ) + .then_ignore( + just(T!["="]).recover_with(via_parser(default_recovery().or_not().map(|_| T!["="]))), + ) + .then( + parse_expr(stmnts).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .map_with(|((const_keyword, name), value), e| { + ( + Statement::ConstInit(const_keyword, name, Box::new(value)), + e.span(), + ) + }) + .boxed() +} diff --git a/src/grammar/alpha050/statements/failable_handlers.rs b/src/grammar/alpha050/statements/failable_handlers.rs new file mode 100644 index 0000000..41df66e --- /dev/null +++ b/src/grammar/alpha050/statements/failable_handlers.rs @@ -0,0 +1,103 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + lexer::Token, + parser::{default_recovery, ident}, + statements::block::block_parser, + AmberParser, Block, FailableHandler, FailureHandler, Spanned, Statement, + }, + T, +}; + +fn failure_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + let handle_parser = just(T!["failed"]) + .map_with(|t, e| (t.to_string(), e.span())) + .then( + just(T!['(']) + .ignore_then( + ident("failure code argument".to_string()) + .recover_with(via_parser(default_recovery().map(|_| "".to_string()))) + .map_with(|arg, e| (arg, e.span())), + ) + .then_ignore( + just(T![')']).recover_with(via_parser(default_recovery().map(|_| T![')']))), + ) + .or_not(), + ) + .then(block_parser(stmnts, false, true).recover_with(via_parser( + default_recovery().map_with(|_, e| (Block::Error, e.span())), + ))) + .map(|((failed_keyword, failure_code), block)| { + FailureHandler::Handle(failed_keyword, failure_code, Box::new(block)) + }) + .boxed(); + + let prop_parser = just(T!['?']).map(|_| FailureHandler::Propagate).boxed(); + + choice((handle_parser, prop_parser)) + .map_with(|handler, e| (handler, e.span())) + .boxed() + .map_with(|stmnt, e| (FailableHandler::Failure(stmnt), e.span())) +} + +fn succeeded_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + just(T!["succeeded"]) + .map_with(|t, e| (t.to_string(), e.span())) + .then(block_parser(stmnts, false, true).recover_with(via_parser( + default_recovery().map_with(|_, e| (Block::Error, e.span())), + ))) + .map_with(|(succeeded_keyword, block), e| { + ( + FailableHandler::Succeeded(succeeded_keyword, Box::new(block)), + e.span(), + ) + }) + .boxed() +} + +fn then_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + just(T!["then"]) + .map_with(|t, e| (t.to_string(), e.span())) + .then( + just(T!['(']) + .recover_with(via_parser(default_recovery().map(|_| T!['(']))) + .ignore_then( + ident("status code argument".to_string()) + .recover_with(via_parser(default_recovery().map(|_| "".to_string()))) + .map_with(|arg, e| (arg, e.span())), + ) + .then_ignore( + just(T![')']).recover_with(via_parser(default_recovery().map(|_| T![')']))), + ), + ) + .then(block_parser(stmnts, false, true).recover_with(via_parser( + default_recovery().map_with(|_, e| (Block::Error, e.span())), + ))) + .map_with(|((succeeded_keyword, status_code), block), e| { + ( + FailableHandler::Then(succeeded_keyword, status_code, Box::new(block)), + e.span(), + ) + }) + .boxed() +} + +pub fn failable_handlers_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Vec>> { + choice(( + failure_parser(stmnts.clone()), + succeeded_parser(stmnts.clone()), + then_parser(stmnts), + )) + .repeated() + .collect() + .boxed() +} diff --git a/src/grammar/alpha050/statements/if_cond.rs b/src/grammar/alpha050/statements/if_cond.rs new file mode 100644 index 0000000..6b8431f --- /dev/null +++ b/src/grammar/alpha050/statements/if_cond.rs @@ -0,0 +1,101 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + expressions::parse_expr, lexer::Token, parser::default_recovery, statements::comment, + AmberParser, Comment, ElseCondition, IfChainContent, IfCondition, Spanned, Statement, + }, + T, +}; + +use super::block::block_parser; + +fn else_cond_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + let else_condition = just(T!["else"]) + .map_with(|_, e| ("else".to_string(), e.span())) + .then(block_parser(stmnts.clone(), false, true)) + .map_with(|(else_keyword, body), e| (ElseCondition::Else(else_keyword, body), e.span())) + .boxed(); + + else_condition +} + +fn cond_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + let if_condition = parse_expr(stmnts.clone()) + .then(block_parser(stmnts, false, true)) + .map_with(|(cond, body), e| (IfCondition::IfCondition(cond, body), e.span())); + + if_condition.boxed() +} + +pub fn if_cond_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + just(T!["if"]) + .map_with(|_, e| ("if".to_string(), e.span())) + .then(cond_parser(stmnts.clone())) + .then( + comment::comment_parser() + .repeated() + .collect::>>(), + ) + .then(else_cond_parser(stmnts).or_not()) + .map_with(|(((if_keyword, if_cond), comments), else_cond), e| { + ( + Statement::IfCondition(if_keyword, if_cond, comments, else_cond), + e.span(), + ) + }) + .boxed() +} + +pub fn if_chain_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + just(T!["if"]) + .map_with(|_, e| ("if".to_string(), e.span())) + .then_ignore(just(T!["{"])) + .then( + choice(( + cond_parser(stmnts.clone()), + comment::comment_parser().map_with(|c, e| (IfCondition::Comment(c), e.span())), + )) + .recover_with(via_parser( + default_recovery().map_with(|_, e| (IfCondition::Error, e.span())), + )) + .repeated() + .collect::>>(), + ) + .then(else_cond_parser(stmnts).or_not()) + .then( + comment::comment_parser() + .repeated() + .collect::>>(), + ) + .then_ignore( + just(T!["}"]).recover_with(via_parser(default_recovery().or_not().map(|_| T!["}"]))), + ) + .map_with(|(((if_keyword, if_conds), else_cond), comments), e| { + let mut if_chain: Vec> = if_conds + .into_iter() + .map(|if_cond| (IfChainContent::IfCondition(if_cond.clone()), if_cond.1)) + .collect::>(); + + if let Some(else_cond) = else_cond { + if_chain.push((IfChainContent::Else(else_cond.clone()), else_cond.1)); + } + + if_chain.extend( + comments + .into_iter() + .map(|c| (IfChainContent::Comment(c.clone()), c.1)), + ); + + (Statement::IfChain(if_keyword, if_chain), e.span()) + }) + .boxed() +} diff --git a/src/grammar/alpha050/statements/keywords.rs b/src/grammar/alpha050/statements/keywords.rs new file mode 100644 index 0000000..4defffa --- /dev/null +++ b/src/grammar/alpha050/statements/keywords.rs @@ -0,0 +1,58 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + expressions::parse_expr, lexer::Token, parser::default_recovery, AmberParser, Expression, + Spanned, Statement, + }, + T, +}; + +pub fn keywords_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + choice(( + just(T!["break"]).map_with(|_, e| (Statement::Break, e.span())), + just(T!["continue"]).map_with(|_, e| (Statement::Continue, e.span())), + just(T!["return"]) + .map_with(|_, e| ("return".to_string(), e.span())) + .then(parse_expr(stmnts.clone()).or_not()) + .map_with(|(return_keyword, expr), e| { + ( + Statement::Return(return_keyword, expr.map(Box::new)), + e.span(), + ) + }), + just(T!["fail"]) + .map_with(|_, e| ("fail".to_string(), e.span())) + .then(parse_expr(stmnts.clone()).or_not()) + .map_with(|(fail_keyword, expr), e| { + (Statement::Fail(fail_keyword, expr.map(Box::new)), e.span()) + }), + just(T!["echo"]) + .map_with(|_, e| ("echo".to_string(), e.span())) + .then( + parse_expr(stmnts.clone()).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .map_with(|(echo_keyword, expr), e| { + (Statement::Echo(echo_keyword, Box::new(expr)), e.span()) + }), + just(T!["cd"]) + .map_with(|_, e| ("cd".to_string(), e.span())) + .then( + parse_expr(stmnts).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .map_with(|(echo_keyword, expr), e| { + (Statement::Cd(echo_keyword, Box::new(expr)), e.span()) + }), + )) + .boxed() +} diff --git a/src/grammar/alpha050/statements/loops.rs b/src/grammar/alpha050/statements/loops.rs new file mode 100644 index 0000000..b935a2a --- /dev/null +++ b/src/grammar/alpha050/statements/loops.rs @@ -0,0 +1,95 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + expressions::parse_expr, + lexer::Token, + parser::{default_recovery, ident}, + AmberParser, Block, Expression, IterLoopVars, Spanned, Statement, + }, + T, +}; + +use super::block::block_parser; + +pub fn inf_loop_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + just(T!["loop"]) + .map_with(|_, e| ("loop".to_string(), e.span())) + .then(block_parser(stmnts, false, true)) + .map_with(|(loop_keyword, block), e| { + (Statement::InfiniteLoop(loop_keyword, block), e.span()) + }) + .boxed() +} + +pub fn iter_loop_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + let single_var = ident("variable".to_string()) + .map_with(|txt, e| (IterLoopVars::Single((txt, e.span())), e.span())); + let with_index_var = ident("variable".to_string()) + .map_with(|txt, e| (txt, e.span())) + .then_ignore(just(T![","])) + .then( + ident("variable".to_string()) + .recover_with(via_parser( + default_recovery().or_not().map(|_| "".to_string()), + )) + .map_with(|txt, e| (txt, e.span())), + ) + .map_with(|(var, index), e| (IterLoopVars::WithIndex(var, index), e.span())); + + just(T!["for"]) + .map_with(|_, e| ("for".to_string(), e.span())) + .then( + choice((with_index_var, single_var)).recover_with(via_parser( + default_recovery().map_with(|_, e| (IterLoopVars::Error, e.span())), + )), + ) + .then( + just(T!["in"]) + .recover_with(via_parser(any().or_not().map(|_| T!["in"]))) + .map_with(|t, e| (t.to_string(), e.span())), + ) + .then( + parse_expr(stmnts.clone()).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .then( + block_parser(stmnts, false, true).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Block::Error, e.span())), + )), + ) + .map_with(|((((loop_keyword, vars), in_keyword), expr), body), e| { + ( + Statement::IterLoop(loop_keyword, vars, in_keyword, Box::new(expr), body), + e.span(), + ) + }) + .boxed() +} + +pub fn while_loop_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + just(T!["while"]) + .map_with(|_, e| ("while".to_string(), e.span())) + .then(parse_expr(stmnts.clone()).recover_with(via_parser( + default_recovery().map_with(|_, e| (Expression::Error, e.span())), + ))) + .then(block_parser(stmnts, false, true)) + .map_with(|((loop_keyword, exp), block), e| { + ( + Statement::WhileLoop(loop_keyword, Box::new(exp), block), + e.span(), + ) + }) + .boxed() +} diff --git a/src/grammar/alpha050/statements/mod.rs b/src/grammar/alpha050/statements/mod.rs new file mode 100644 index 0000000..7f3b9ae --- /dev/null +++ b/src/grammar/alpha050/statements/mod.rs @@ -0,0 +1,45 @@ +use chumsky::prelude::*; + +use crate::{grammar::Token, T}; + +use super::{expressions::parse_expr, AmberParser, Spanned, Statement}; + +pub mod block; +pub mod comment; +pub mod const_init; +pub mod failable_handlers; +pub mod if_cond; +pub mod keywords; +pub mod loops; +pub mod modifiers; +pub mod move_files; +pub mod shebang; +pub mod shorthands; +pub mod var_init; +pub mod var_set; + +pub fn statement_parser<'a>() -> impl AmberParser<'a, Spanned> { + recursive(|stmnt| { + choice(( + comment::comment_parser().map_with(|com, e| (Statement::Comment(com), e.span())), + shebang::shebang_parser(), + var_init::var_init_parser(stmnt.clone()), + var_set::var_set_parser(stmnt.clone()), + block::block_parser_statement(stmnt.clone()), + if_cond::if_chain_parser(stmnt.clone()), + if_cond::if_cond_parser(stmnt.clone()), + shorthands::shorthand_parser(stmnt.clone()), + loops::inf_loop_parser(stmnt.clone()), + loops::iter_loop_parser(stmnt.clone()), + loops::while_loop_parser(stmnt.clone()), + keywords::keywords_parser(stmnt.clone()), + move_files::move_files_parser(stmnt.clone()), + const_init::const_init_parser(stmnt.clone()), + parse_expr(stmnt).map_with(|expr, e| (Statement::Expression(Box::new(expr)), e.span())), + )) + .then_ignore(just(T![';']).or_not()) + .boxed() + .labelled("statement") + }) + .boxed() +} diff --git a/src/grammar/alpha050/statements/modifiers.rs b/src/grammar/alpha050/statements/modifiers.rs new file mode 100644 index 0000000..c918e0e --- /dev/null +++ b/src/grammar/alpha050/statements/modifiers.rs @@ -0,0 +1,17 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{lexer::Token, AmberParser, CommandModifier, Spanned}, + T, +}; + +pub fn modifier_parser<'a>() -> impl AmberParser<'a, Spanned> { + choice(( + just(T!["trust"]).to(CommandModifier::Trust), + just(T!["unsafe"]).to(CommandModifier::Unsafe), + just(T!["silent"]).to(CommandModifier::Silent), + )) + .map_with(|modifier, e| (modifier, e.span())) + .labelled("modifier") + .boxed() +} diff --git a/src/grammar/alpha050/statements/move_files.rs b/src/grammar/alpha050/statements/move_files.rs new file mode 100644 index 0000000..758a623 --- /dev/null +++ b/src/grammar/alpha050/statements/move_files.rs @@ -0,0 +1,41 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + expressions::parse_expr, lexer::Token, parser::default_recovery, AmberParser, Expression, + Spanned, Statement, + }, + T, +}; + +use super::{failable_handlers::failable_handlers_parser, modifiers::modifier_parser}; + +pub fn move_files_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + modifier_parser() + .repeated() + .collect() + .then(just(T!["mv"]).map_with(|modif, e| (modif.to_string(), e.span()))) + .then( + parse_expr(stmnts.clone()).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .then( + parse_expr(stmnts.clone()).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .then(failable_handlers_parser(stmnts.clone())) + .map_with(|((((modif, mv), src), dest), fail), e| { + ( + Statement::MoveFiles(modif, mv, Box::new(src), Box::new(dest), fail), + e.span(), + ) + }) +} diff --git a/src/grammar/alpha050/statements/shebang.rs b/src/grammar/alpha050/statements/shebang.rs new file mode 100644 index 0000000..5f30c88 --- /dev/null +++ b/src/grammar/alpha050/statements/shebang.rs @@ -0,0 +1,10 @@ +use chumsky::prelude::*; + +use crate::grammar::alpha050::{lexer::Token, AmberParser, Spanned, Statement}; + +pub fn shebang_parser<'a>() -> impl AmberParser<'a, Spanned> { + any() + .filter(|t: &Token| t.to_string().starts_with("#!")) + .map_with(|shebang, e| (Statement::Shebang(shebang.to_string()), e.span())) + .boxed() +} diff --git a/src/grammar/alpha050/statements/shorthands.rs b/src/grammar/alpha050/statements/shorthands.rs new file mode 100644 index 0000000..5073327 --- /dev/null +++ b/src/grammar/alpha050/statements/shorthands.rs @@ -0,0 +1,34 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + expressions::parse_expr, + lexer::Token, + parser::{default_recovery, ident}, + AmberParser, Expression, Spanned, Statement, + }, + T, +}; + +pub fn shorthand_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + ident("variable".to_string()) + .map_with(|name, e| (name, e.span())) + .then(choice(( + just(T!["+="]).to(Statement::ShorthandAdd as fn(_, _) -> _), + just(T!["-="]).to(Statement::ShorthandSub as fn(_, _) -> _), + just(T!["*="]).to(Statement::ShorthandMul as fn(_, _) -> _), + just(T!["/="]).to(Statement::ShorthandDiv as fn(_, _) -> _), + just(T!["%="]).to(Statement::ShorthandModulo as fn(_, _) -> _), + ))) + .then( + parse_expr(stmnts).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .map_with(|((name, op), value), e| (op(name, Box::new(value)), e.span())) + .boxed() +} diff --git a/src/grammar/alpha050/statements/var_init.rs b/src/grammar/alpha050/statements/var_init.rs new file mode 100644 index 0000000..39f6c2d --- /dev/null +++ b/src/grammar/alpha050/statements/var_init.rs @@ -0,0 +1,43 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + expressions::parse_expr, + global::type_parser, + lexer::Token, + parser::{default_recovery, ident}, + AmberParser, Spanned, Statement, VariableInitType, + }, + T, +}; + +pub fn var_init_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + just(T!["let"]) + .map_with(|_, e| ("let".to_string(), e.span())) + .then( + ident("variable".to_string()) + .recover_with(via_parser( + default_recovery().or_not().map(|_| "".to_string()), + )) + .map_with(|name, e| (name, e.span())), + ) + .then_ignore( + just(T!["="]).recover_with(via_parser(default_recovery().or_not().map(|_| T!["="]))), + ) + .then( + choice(( + type_parser().map(VariableInitType::DataType), + parse_expr(stmnts).map(VariableInitType::Expression), + )) + .recover_with(via_parser( + default_recovery().or_not().map(|_| VariableInitType::Error), + )) + .map_with(|val, e| (val, e.span())), + ) + .map_with(|((let_keyword, name), value), e| { + (Statement::VariableInit(let_keyword, name, value), e.span()) + }) + .boxed() +} diff --git a/src/grammar/alpha050/statements/var_set.rs b/src/grammar/alpha050/statements/var_set.rs new file mode 100644 index 0000000..8e6e65f --- /dev/null +++ b/src/grammar/alpha050/statements/var_set.rs @@ -0,0 +1,28 @@ +use chumsky::prelude::*; + +use crate::{ + grammar::alpha050::{ + expressions::parse_expr, + lexer::Token, + parser::{default_recovery, ident}, + AmberParser, Expression, Spanned, Statement, + }, + T, +}; + +pub fn var_set_parser<'a>( + stmnts: impl AmberParser<'a, Spanned>, +) -> impl AmberParser<'a, Spanned> { + ident("variable".to_string()) + .map_with(|name, e| (name, e.span())) + .then_ignore(just(T!["="])) + .then( + parse_expr(stmnts).recover_with(via_parser( + default_recovery() + .or_not() + .map_with(|_, e| (Expression::Error, e.span())), + )), + ) + .map_with(|(name, value), e| (Statement::VariableSet(name, Box::new(value)), e.span())) + .boxed() +} diff --git a/src/grammar/mod.rs b/src/grammar/mod.rs index 934d4bd..ad5ee0a 100644 --- a/src/grammar/mod.rs +++ b/src/grammar/mod.rs @@ -4,12 +4,14 @@ use std::fmt::{self, Debug, Display}; pub mod alpha034; pub mod alpha035; pub mod alpha040; +pub mod alpha050; #[derive(Debug, PartialEq, Clone)] pub enum Grammar { Alpha034(Option>>), Alpha035(Option>>), Alpha040(Option>>), + Alpha050(Option>>), } pub type Span = SimpleSpan; diff --git a/src/main.rs b/src/main.rs index 25478bf..0c82716 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,7 @@ enum CliAmberVersion { Alpha034, Alpha035, Alpha040, + Alpha050, } impl From for AmberVersion { @@ -24,6 +25,7 @@ impl From for AmberVersion { CliAmberVersion::Alpha034 => AmberVersion::Alpha034, CliAmberVersion::Alpha035 => AmberVersion::Alpha035, CliAmberVersion::Alpha040 => AmberVersion::Alpha040, + CliAmberVersion::Alpha050 => AmberVersion::Alpha050, } } } @@ -35,6 +37,7 @@ impl ValueEnum for CliAmberVersion { CliAmberVersion::Alpha034, CliAmberVersion::Alpha035, CliAmberVersion::Alpha040, + CliAmberVersion::Alpha050, ] } @@ -44,6 +47,7 @@ impl ValueEnum for CliAmberVersion { CliAmberVersion::Alpha034 => Some(PossibleValue::new("0.3.4-alpha")), CliAmberVersion::Alpha035 => Some(PossibleValue::new("0.3.5-alpha")), CliAmberVersion::Alpha040 => Some(PossibleValue::new("0.4.0-alpha")), + CliAmberVersion::Alpha050 => Some(PossibleValue::new("0.5.0-alpha")), } } } @@ -112,7 +116,7 @@ fn detect_amber_version() -> AmberVersion { Ok(output) => String::from_utf8_lossy(&output.stdout).to_string(), Err(e) => { tracing::error!("Failed to execute amber command: {}", e); - return AmberVersion::Alpha040; // Default to the latest version if detection fails + return AmberVersion::Alpha050; // Default to the latest version if detection fails } }; @@ -120,6 +124,7 @@ fn detect_amber_version() -> AmberVersion { Some("0.3.4-alpha") => AmberVersion::Alpha034, Some("0.3.5-alpha") => AmberVersion::Alpha035, Some("0.4.0-alpha") => AmberVersion::Alpha040, - _ => AmberVersion::Alpha040, + Some("0.5.0-alpha") => AmberVersion::Alpha050, + _ => AmberVersion::Alpha050, } } diff --git a/src/stdlib.rs b/src/stdlib.rs index 2b91f1d..0f2d7a6 100644 --- a/src/stdlib.rs +++ b/src/stdlib.rs @@ -19,6 +19,7 @@ fn get_stdlib_dir(amber_version: AmberVersion) -> Result "alpha034", AmberVersion::Alpha035 => "alpha035", AmberVersion::Alpha040 => "alpha040", + AmberVersion::Alpha050 => "alpha050", }; Ok(current_exe()? @@ -62,6 +63,7 @@ pub async fn save_resources(backend: &Backend) -> PathBuf { AmberVersion::Alpha034 => "alpha034/".to_string(), AmberVersion::Alpha035 => "alpha035/".to_string(), AmberVersion::Alpha040 => "alpha040/".to_string(), + AmberVersion::Alpha050 => "alpha050/".to_string(), }; let _ = backend.files.fs.create_dir_all(&stdlib_dir).await; @@ -113,6 +115,7 @@ pub async fn resolve(backend: &Backend, path: String) -> Option { AmberVersion::Alpha034 => PathBuf::from("alpha034"), AmberVersion::Alpha035 => PathBuf::from("alpha035"), AmberVersion::Alpha040 => PathBuf::from("alpha040"), + AmberVersion::Alpha050 => PathBuf::from("alpha050"), } .join(file_path.clone()); diff --git a/tests/grammar/alpha050.rs b/tests/grammar/alpha050.rs new file mode 100644 index 0000000..f6884cb --- /dev/null +++ b/tests/grammar/alpha050.rs @@ -0,0 +1,205 @@ +use std::fs::read_to_string; + +use chumsky::error::Rich; +use insta::assert_debug_snapshot; + +use amber_lsp::grammar::{ + alpha050::{lexer::Token, AmberCompiler, GlobalStatement, Spanned}, + LSPAnalysis, ParserResponse, +}; + +fn tokenize(input: &str) -> Vec> { + AmberCompiler::new().tokenize(input) +} + +fn parse( + tokens: &[Spanned], +) -> (Option>>, Vec>) { + let ParserResponse { + ast, + errors, + semantic_tokens: _, + } = AmberCompiler::new().parse(tokens); + + let ast = match ast { + amber_lsp::grammar::Grammar::Alpha050(ast) => ast, + _ => panic!("Unexpected AST"), + }; + + (ast, errors) +} + +fn parse_unwrap(tokens: &[Spanned]) -> Vec> { + let (ast, errors) = parse(tokens); + if !errors.is_empty() { + panic!("Errors: {errors:?}"); + } + ast.unwrap() +} + +#[test] +fn test_stdlib_array() { + let stdlib = read_to_string("resources/alpha050/std/array.ab").unwrap(); + + assert_debug_snapshot!(parse_unwrap(&tokenize(&stdlib))); +} + +#[test] +fn test_stdlib_date() { + let stdlib = read_to_string("resources/alpha050/std/date.ab").unwrap(); + + assert_debug_snapshot!(parse_unwrap(&tokenize(&stdlib))); +} + +#[test] +fn test_stdlib_env() { + let stdlib = read_to_string("resources/alpha050/std/env.ab").unwrap(); + + assert_debug_snapshot!(parse_unwrap(&tokenize(&stdlib))); +} + +#[test] +fn test_stdlib_fs() { + let stdlib = read_to_string("resources/alpha050/std/fs.ab").unwrap(); + + assert_debug_snapshot!(parse_unwrap(&tokenize(&stdlib))); +} + +#[test] +fn test_stdlib_http() { + let stdlib = read_to_string("resources/alpha050/std/http.ab").unwrap(); + + assert_debug_snapshot!(parse_unwrap(&tokenize(&stdlib))); +} + +#[test] +fn test_stdlib_math() { + let stdlib = read_to_string("resources/alpha050/std/math.ab").unwrap(); + + assert_debug_snapshot!(parse_unwrap(&tokenize(&stdlib))); +} + +#[test] +fn test_stdlib_text() { + let stdlib = read_to_string("resources/alpha050/std/text.ab").unwrap(); + + let tokens = tokenize(&stdlib); + + assert_debug_snapshot!(tokens); + + assert_debug_snapshot!(parse_unwrap(&tokens)); +} + +#[test] +fn test_unfinished_function_call() { + let input = " + import { array_contains } from \"std/array\" + + let x = [1, 2, 3] + let y = 2 + + echo array_contains(x, y) + + let line = 213 + + for idx, line in lines(\"text.txt\") { + echo line + } + + // fun foo(x: Num, y: Text) { + + // } + + fun foo(x: Num, y: Text) { + } + + // fun abc() {} + + array_contains([1, 2, 3],) + "; + + let tokens = tokenize(input); + assert_debug_snapshot!(tokens); + + let result = parse(&tokens); + + assert_debug_snapshot!(result); +} + +#[test] +fn test_comments_in_ifs() { + let input = r#" + if { + 1 == 2: echo "x" // test comment + // another comment + 2 == 2 { + echo "y" + } + // another + else: echo "z" // comment + // super comment + /// doc comment + } + + if age >= 16: echo "Welcome" // comment + // comment in between + else: echo "Entry not allowed" // another comment +"#; + + assert_debug_snapshot!(parse(&tokenize(input))); +} + +#[test] +fn test_block_singleline() { + let input = r#" + main { + echo 4 + } + + main(args): echo args + + $$ failed { + echo "failed" + } + $$ failed: echo "failed" + +"#; + + assert_debug_snapshot!(parse_unwrap(&tokenize(input))); +} + +#[test] +fn test_failable_handlers() { + let input = r#" + $$ succeeded(code): echo code // should fail + $$ succeeded: echo "success" // should succeed + + $$ failed(code): echo code // should succeed + $$ failed: echo "failed" // should succeed + + $$ then(code): echo code // should succeed + $$ then: echo "then" // should fail + +"#; + + assert_debug_snapshot!(parse(&tokenize(input))); +} + +#[test] +fn test_mv_files() { + let input = r#" + mv "/tmp/a" "/tmp/b" + + unsafe mv "/tmp/a" "/tmp/b" + + mv "/tmp/a" "/tmp/b" failed { + echo "Error" + } + + unsafe { + mv "/tmp/a" "/tmp/b" + } +"#; + + assert_debug_snapshot!(parse_unwrap(&tokenize(input))); +} diff --git a/tests/grammar/mod.rs b/tests/grammar/mod.rs index 81ce839..95940a5 100644 --- a/tests/grammar/mod.rs +++ b/tests/grammar/mod.rs @@ -1,3 +1,4 @@ pub mod alpha034; pub mod alpha035; pub mod alpha040; +pub mod alpha050; diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__block_singleline.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__block_singleline.snap new file mode 100644 index 0000000..d6746a5 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__block_singleline.snap @@ -0,0 +1,237 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokenize(input)) +--- +[ + ( + Main( + ( + "main", + 5..9, + ), + None, + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 16..20, + ), + ( + Int( + ( + 4, + 21..22, + ), + ), + 21..22, + ), + ), + 16..22, + ), + ], + ), + 10..28, + ), + ), + 5..28, + ), + ( + Main( + ( + "main", + 34..38, + ), + Some( + ( + "args", + 38..44, + ), + ), + ( + Singleline( + ( + Echo( + ( + "echo", + 46..50, + ), + ( + Var( + ( + "args", + 51..55, + ), + ), + 51..55, + ), + ), + 46..55, + ), + ), + 44..55, + ), + ), + 34..55, + ), + ( + Statement( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 61..62, + ), + ( + Text( + "$", + ), + 62..63, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 64..70, + ), + None, + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 81..85, + ), + ( + Text( + [ + ( + Text( + ( + "failed", + 87..93, + ), + ), + 87..93, + ), + ], + ), + 86..94, + ), + ), + 81..94, + ), + ], + ), + 71..100, + ), + ), + 64..100, + ), + ), + 64..100, + ), + ], + ), + 61..100, + ), + ), + 61..100, + ), + ), + 61..100, + ), + ( + Statement( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 105..106, + ), + ( + Text( + "$", + ), + 106..107, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 108..114, + ), + None, + ( + Singleline( + ( + Echo( + ( + "echo", + 116..120, + ), + ( + Text( + [ + ( + Text( + ( + "failed", + 122..128, + ), + ), + 122..128, + ), + ], + ), + 121..129, + ), + ), + 116..129, + ), + ), + 114..129, + ), + ), + 108..129, + ), + ), + 108..129, + ), + ], + ), + 105..129, + ), + ), + 105..129, + ), + ), + 105..129, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__comments_in_ifs.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__comments_in_ifs.snap new file mode 100644 index 0000000..3a867fd --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__comments_in_ifs.snap @@ -0,0 +1,442 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse(&tokenize(input)) +--- +( + Some( + [ + ( + Statement( + ( + IfChain( + ( + "if", + 5..7, + ), + [ + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Int( + ( + 1, + 18..19, + ), + ), + 18..19, + ), + ( + Int( + ( + 2, + 23..24, + ), + ), + 23..24, + ), + ), + 18..24, + ), + ( + Singleline( + ( + Echo( + ( + "echo", + 26..30, + ), + ( + Text( + [ + ( + Text( + ( + "x", + 32..33, + ), + ), + 32..33, + ), + ], + ), + 31..34, + ), + ), + 26..34, + ), + ), + 24..34, + ), + ), + 18..34, + ), + ), + 18..34, + ), + ( + IfCondition( + ( + Comment( + ( + Comment( + "test comment", + ), + 35..51, + ), + ), + 35..51, + ), + ), + 35..51, + ), + ( + IfCondition( + ( + Comment( + ( + Comment( + "another comment", + ), + 59..78, + ), + ), + 59..78, + ), + ), + 59..78, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Int( + ( + 2, + 86..87, + ), + ), + 86..87, + ), + ( + Int( + ( + 2, + 91..92, + ), + ), + 91..92, + ), + ), + 86..92, + ), + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 107..111, + ), + ( + Text( + [ + ( + Text( + ( + "y", + 113..114, + ), + ), + 113..114, + ), + ], + ), + 112..115, + ), + ), + 107..115, + ), + ], + ), + 93..125, + ), + ), + 86..125, + ), + ), + 86..125, + ), + ( + IfCondition( + ( + Comment( + ( + Comment( + "another", + ), + 134..145, + ), + ), + 134..145, + ), + ), + 134..145, + ), + ( + Else( + ( + Else( + ( + "else", + 153..157, + ), + ( + Singleline( + ( + Echo( + ( + "echo", + 159..163, + ), + ( + Text( + [ + ( + Text( + ( + "z", + 165..166, + ), + ), + 165..166, + ), + ], + ), + 164..167, + ), + ), + 159..167, + ), + ), + 157..167, + ), + ), + 153..167, + ), + ), + 153..167, + ), + ( + Comment( + ( + Comment( + "comment", + ), + 168..179, + ), + ), + 168..179, + ), + ( + Comment( + ( + Comment( + "super comment", + ), + 187..204, + ), + ), + 187..204, + ), + ( + Comment( + ( + DocString( + "doc comment", + ), + 212..228, + ), + ), + 212..228, + ), + ], + ), + 5..233, + ), + ), + 5..233, + ), + ( + Statement( + ( + IfCondition( + ( + "if", + 239..241, + ), + ( + IfCondition( + ( + Ge( + ( + Var( + ( + "age", + 242..245, + ), + ), + 242..245, + ), + ( + Int( + ( + 16, + 249..251, + ), + ), + 249..251, + ), + ), + 242..251, + ), + ( + Singleline( + ( + Echo( + ( + "echo", + 253..257, + ), + ( + Text( + [ + ( + Text( + ( + "Welcome", + 259..266, + ), + ), + 259..266, + ), + ], + ), + 258..267, + ), + ), + 253..267, + ), + ), + 251..267, + ), + ), + 242..267, + ), + [ + ( + Comment( + "comment", + ), + 268..279, + ), + ( + Comment( + "comment in between", + ), + 283..305, + ), + ], + Some( + ( + Else( + ( + "else", + 309..313, + ), + ( + Singleline( + ( + Echo( + ( + "echo", + 315..319, + ), + ( + Text( + [ + ( + Text( + ( + "Entry", + 321..326, + ), + ), + 321..326, + ), + ( + Text( + ( + "not", + 327..330, + ), + ), + 327..330, + ), + ( + Text( + ( + "allowed", + 331..338, + ), + ), + 331..338, + ), + ], + ), + 320..339, + ), + ), + 315..339, + ), + ), + 313..339, + ), + ), + 309..339, + ), + ), + ), + 239..339, + ), + ), + 239..339, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "another comment", + ), + 340..359, + ), + ), + 340..359, + ), + ), + 340..359, + ), + ], + ), + [], +) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__failable_handlers.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__failable_handlers.snap new file mode 100644 index 0000000..554bc17 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__failable_handlers.snap @@ -0,0 +1,582 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse(&tokenize(input)) +--- +( + Some( + [ + ( + Statement( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5..6, + ), + ( + Text( + "$", + ), + 6..7, + ), + ], + [], + ), + 5..7, + ), + ), + 5..7, + ), + ), + 5..7, + ), + ( + Statement( + ( + Error, + 8..17, + ), + ), + 8..17, + ), + ( + Statement( + ( + Expression( + ( + Parentheses( + ( + Var( + ( + "code", + 18..22, + ), + ), + 18..22, + ), + ), + 17..23, + ), + ), + 17..23, + ), + ), + 17..23, + ), + ( + Statement( + ( + Error, + 23..24, + ), + ), + 23..24, + ), + ( + Statement( + ( + Echo( + ( + "echo", + 25..29, + ), + ( + Var( + ( + "code", + 30..34, + ), + ), + 30..34, + ), + ), + 25..34, + ), + ), + 25..34, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "should fail", + ), + 35..50, + ), + ), + 35..50, + ), + ), + 35..50, + ), + ( + Statement( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 54..55, + ), + ( + Text( + "$", + ), + 55..56, + ), + ], + [ + ( + Succeeded( + ( + "succeeded", + 57..66, + ), + ( + Singleline( + ( + Echo( + ( + "echo", + 68..72, + ), + ( + Text( + [ + ( + Text( + ( + "success", + 74..81, + ), + ), + 74..81, + ), + ], + ), + 73..82, + ), + ), + 68..82, + ), + ), + 66..82, + ), + ), + 57..82, + ), + ], + ), + 54..82, + ), + ), + 54..82, + ), + ), + 54..82, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "should succeed", + ), + 83..101, + ), + ), + 83..101, + ), + ), + 83..101, + ), + ( + Statement( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 106..107, + ), + ( + Text( + "$", + ), + 107..108, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 109..115, + ), + Some( + ( + "code", + 116..120, + ), + ), + ( + Singleline( + ( + Echo( + ( + "echo", + 123..127, + ), + ( + Var( + ( + "code", + 128..132, + ), + ), + 128..132, + ), + ), + 123..132, + ), + ), + 121..132, + ), + ), + 109..132, + ), + ), + 109..132, + ), + ], + ), + 106..132, + ), + ), + 106..132, + ), + ), + 106..132, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "should succeed", + ), + 133..151, + ), + ), + 133..151, + ), + ), + 133..151, + ), + ( + Statement( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 155..156, + ), + ( + Text( + "$", + ), + 156..157, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 158..164, + ), + None, + ( + Singleline( + ( + Echo( + ( + "echo", + 166..170, + ), + ( + Text( + [ + ( + Text( + ( + "failed", + 172..178, + ), + ), + 172..178, + ), + ], + ), + 171..179, + ), + ), + 166..179, + ), + ), + 164..179, + ), + ), + 158..179, + ), + ), + 158..179, + ), + ], + ), + 155..179, + ), + ), + 155..179, + ), + ), + 155..179, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "should succeed", + ), + 180..198, + ), + ), + 180..198, + ), + ), + 180..198, + ), + ( + Statement( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 203..204, + ), + ( + Text( + "$", + ), + 204..205, + ), + ], + [ + ( + Then( + ( + "then", + 206..210, + ), + ( + "code", + 211..215, + ), + ( + Singleline( + ( + Echo( + ( + "echo", + 218..222, + ), + ( + Var( + ( + "code", + 223..227, + ), + ), + 223..227, + ), + ), + 218..227, + ), + ), + 216..227, + ), + ), + 206..227, + ), + ], + ), + 203..227, + ), + ), + 203..227, + ), + ), + 203..227, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "should succeed", + ), + 228..246, + ), + ), + 228..246, + ), + ), + 228..246, + ), + ( + Statement( + ( + Expression( + ( + Ternary( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 250..251, + ), + ( + Text( + "$", + ), + 251..252, + ), + ], + [], + ), + 250..252, + ), + ( + "then", + 253..257, + ), + ( + Error, + 257..258, + ), + ( + "", + 259..258, + ), + ( + Error, + 259..258, + ), + ), + 250..258, + ), + ), + 250..258, + ), + ), + 250..258, + ), + ( + Statement( + ( + Echo( + ( + "echo", + 259..263, + ), + ( + Text( + [ + ( + Text( + ( + "then", + 265..269, + ), + ), + 265..269, + ), + ], + ), + 264..270, + ), + ), + 259..270, + ), + ), + 259..270, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "should fail", + ), + 271..286, + ), + ), + 271..286, + ), + ), + 271..286, + ), + ], + ), + [ + found "(" at 17..18 expected '":"', or '"{"', + found end of input at 23..24 expected something else, + keyword used as status code argument name at 259..263, + found "echo" at 259..263 expected '"else"', + found "echo" at 259..263 expected something else, + ], +) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__mv_files.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__mv_files.snap new file mode 100644 index 0000000..1f9b9eb --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__mv_files.snap @@ -0,0 +1,486 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokenize(input)) +--- +[ + ( + Statement( + ( + MoveFiles( + [], + ( + "mv", + 5..7, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 9..10, + ), + ), + 9..10, + ), + ( + Text( + ( + "tmp", + 10..13, + ), + ), + 10..13, + ), + ( + Text( + ( + "/", + 13..14, + ), + ), + 13..14, + ), + ( + Text( + ( + "a", + 14..15, + ), + ), + 14..15, + ), + ], + ), + 8..16, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 18..19, + ), + ), + 18..19, + ), + ( + Text( + ( + "tmp", + 19..22, + ), + ), + 19..22, + ), + ( + Text( + ( + "/", + 22..23, + ), + ), + 22..23, + ), + ( + Text( + ( + "b", + 23..24, + ), + ), + 23..24, + ), + ], + ), + 17..25, + ), + [], + ), + 5..25, + ), + ), + 5..25, + ), + ( + Statement( + ( + MoveFiles( + [ + ( + Unsafe, + 31..37, + ), + ], + ( + "mv", + 38..40, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 42..43, + ), + ), + 42..43, + ), + ( + Text( + ( + "tmp", + 43..46, + ), + ), + 43..46, + ), + ( + Text( + ( + "/", + 46..47, + ), + ), + 46..47, + ), + ( + Text( + ( + "a", + 47..48, + ), + ), + 47..48, + ), + ], + ), + 41..49, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 51..52, + ), + ), + 51..52, + ), + ( + Text( + ( + "tmp", + 52..55, + ), + ), + 52..55, + ), + ( + Text( + ( + "/", + 55..56, + ), + ), + 55..56, + ), + ( + Text( + ( + "b", + 56..57, + ), + ), + 56..57, + ), + ], + ), + 50..58, + ), + [], + ), + 31..58, + ), + ), + 31..58, + ), + ( + Statement( + ( + MoveFiles( + [], + ( + "mv", + 64..66, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 68..69, + ), + ), + 68..69, + ), + ( + Text( + ( + "tmp", + 69..72, + ), + ), + 69..72, + ), + ( + Text( + ( + "/", + 72..73, + ), + ), + 72..73, + ), + ( + Text( + ( + "a", + 73..74, + ), + ), + 73..74, + ), + ], + ), + 67..75, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 77..78, + ), + ), + 77..78, + ), + ( + Text( + ( + "tmp", + 78..81, + ), + ), + 78..81, + ), + ( + Text( + ( + "/", + 81..82, + ), + ), + 81..82, + ), + ( + Text( + ( + "b", + 82..83, + ), + ), + 82..83, + ), + ], + ), + 76..84, + ), + [ + ( + Failure( + ( + Handle( + ( + "failed", + 85..91, + ), + None, + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 102..106, + ), + ( + Text( + [ + ( + Text( + ( + "Error", + 108..113, + ), + ), + 108..113, + ), + ], + ), + 107..114, + ), + ), + 102..114, + ), + ], + ), + 92..120, + ), + ), + 85..120, + ), + ), + 85..120, + ), + ], + ), + 64..120, + ), + ), + 64..120, + ), + ( + Statement( + ( + Block( + ( + Block( + [ + ( + Unsafe, + 126..132, + ), + ], + [ + ( + MoveFiles( + [], + ( + "mv", + 143..145, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 147..148, + ), + ), + 147..148, + ), + ( + Text( + ( + "tmp", + 148..151, + ), + ), + 148..151, + ), + ( + Text( + ( + "/", + 151..152, + ), + ), + 151..152, + ), + ( + Text( + ( + "a", + 152..153, + ), + ), + 152..153, + ), + ], + ), + 146..154, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 156..157, + ), + ), + 156..157, + ), + ( + Text( + ( + "tmp", + 157..160, + ), + ), + 157..160, + ), + ( + Text( + ( + "/", + 160..161, + ), + ), + 160..161, + ), + ( + Text( + ( + "b", + 161..162, + ), + ), + 161..162, + ), + ], + ), + 155..163, + ), + [], + ), + 143..163, + ), + ], + ), + 126..169, + ), + ), + 126..169, + ), + ), + 126..169, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap new file mode 100644 index 0000000..3e618b2 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap @@ -0,0 +1,2230 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokenize(&stdlib)) +--- +[ + ( + Statement( + ( + Comment( + ( + DocString( + "Returns index of the first value found in the specified array.", + ), + 0..67, + ), + ), + 0..67, + ), + ), + 0..67, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 67..71, + ), + ), + 67..71, + ), + ), + 67..71, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If the value is not found, the function returns -1.", + ), + 71..127, + ), + ), + 71..127, + ), + ), + 71..127, + ), + ( + FunctionDefinition( + [], + ( + true, + 127..130, + ), + ( + "fun", + 131..134, + ), + ( + "array_find", + 135..145, + ), + [ + ( + Generic( + ( + false, + 146..146, + ), + ( + "array", + 146..151, + ), + ), + 146..151, + ), + ( + Generic( + ( + false, + 153..152, + ), + ( + "value", + 153..158, + ), + ), + 153..158, + ), + ], + Some( + ( + Int, + 161..164, + ), + ), + [ + ( + IterLoop( + ( + "for", + 171..174, + ), + ( + WithIndex( + ( + "index", + 175..180, + ), + ( + "element", + 182..189, + ), + ), + 175..189, + ), + ( + "in", + 190..192, + ), + ( + Var( + ( + "array", + 193..198, + ), + ), + 193..198, + ), + ( + Block( + [], + [ + ( + IfCondition( + ( + "if", + 209..211, + ), + ( + IfCondition( + ( + Eq( + ( + Cast( + ( + Var( + ( + "value", + 212..217, + ), + ), + 212..217, + ), + ( + "as", + 218..220, + ), + ( + Text, + 221..225, + ), + ), + 212..225, + ), + ( + Cast( + ( + Var( + ( + "element", + 229..236, + ), + ), + 229..236, + ), + ( + "as", + 237..239, + ), + ( + Text, + 240..244, + ), + ), + 229..244, + ), + ), + 212..244, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 259..265, + ), + Some( + ( + Var( + ( + "index", + 266..271, + ), + ), + 266..271, + ), + ), + ), + 259..271, + ), + ], + ), + 245..281, + ), + ), + 212..281, + ), + [], + None, + ), + 209..281, + ), + ], + ), + 199..287, + ), + ), + 171..287, + ), + ( + Return( + ( + "return", + 292..298, + ), + Some( + ( + Neg( + ( + "-", + 299..300, + ), + ( + Int( + ( + 1, + 300..301, + ), + ), + 300..301, + ), + ), + 300..301, + ), + ), + ), + 292..301, + ), + ], + ), + 127..303, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Searches for a value in an array and returns an array with the index of the various items.", + ), + 305..400, + ), + ), + 305..400, + ), + ), + 305..400, + ), + ( + FunctionDefinition( + [], + ( + true, + 400..403, + ), + ( + "fun", + 404..407, + ), + ( + "array_find_all", + 408..422, + ), + [ + ( + Generic( + ( + false, + 423..423, + ), + ( + "array", + 423..428, + ), + ), + 423..428, + ), + ( + Generic( + ( + false, + 430..429, + ), + ( + "value", + 430..435, + ), + ), + 430..435, + ), + ], + Some( + ( + [Int], + 438..443, + ), + ), + [ + ( + VariableInit( + ( + "let", + 450..453, + ), + ( + "result", + 454..460, + ), + ( + DataType( + ( + [Int], + 463..468, + ), + ), + 463..468, + ), + ), + 450..468, + ), + ( + IterLoop( + ( + "for", + 473..476, + ), + ( + WithIndex( + ( + "index", + 477..482, + ), + ( + "element", + 484..491, + ), + ), + 477..491, + ), + ( + "in", + 492..494, + ), + ( + Var( + ( + "array", + 495..500, + ), + ), + 495..500, + ), + ( + Block( + [], + [ + ( + IfCondition( + ( + "if", + 511..513, + ), + ( + IfCondition( + ( + Eq( + ( + Cast( + ( + Var( + ( + "value", + 514..519, + ), + ), + 514..519, + ), + ( + "as", + 520..522, + ), + ( + Text, + 523..527, + ), + ), + 514..527, + ), + ( + Cast( + ( + Var( + ( + "element", + 531..538, + ), + ), + 531..538, + ), + ( + "as", + 539..541, + ), + ( + Text, + 542..546, + ), + ), + 531..546, + ), + ), + 514..546, + ), + ( + Block( + [], + [ + ( + ShorthandAdd( + ( + "result", + 561..567, + ), + ( + Array( + [ + ( + Var( + ( + "index", + 572..577, + ), + ), + 572..577, + ), + ], + ), + 571..578, + ), + ), + 561..578, + ), + ], + ), + 547..588, + ), + ), + 514..588, + ), + [], + None, + ), + 511..588, + ), + ], + ), + 501..594, + ), + ), + 473..594, + ), + ( + Return( + ( + "return", + 599..605, + ), + Some( + ( + Var( + ( + "result", + 606..612, + ), + ), + 606..612, + ), + ), + ), + 599..612, + ), + ], + ), + 400..614, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if a value is in the array.", + ), + 616..655, + ), + ), + 616..655, + ), + ), + 616..655, + ), + ( + FunctionDefinition( + [], + ( + true, + 655..658, + ), + ( + "fun", + 659..662, + ), + ( + "array_contains", + 663..677, + ), + [ + ( + Generic( + ( + false, + 678..678, + ), + ( + "array", + 678..683, + ), + ), + 678..683, + ), + ( + Generic( + ( + false, + 685..684, + ), + ( + "value", + 685..690, + ), + ), + 685..690, + ), + ], + None, + [ + ( + VariableInit( + ( + "let", + 698..701, + ), + ( + "result", + 702..708, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "array_find", + 711..721, + ), + [ + ( + Var( + ( + "array", + 722..727, + ), + ), + 722..727, + ), + ( + Var( + ( + "value", + 729..734, + ), + ), + 729..734, + ), + ], + [], + ), + 711..735, + ), + ), + 711..735, + ), + ), + 698..735, + ), + ( + Return( + ( + "return", + 740..746, + ), + Some( + ( + Ge( + ( + Var( + ( + "result", + 747..753, + ), + ), + 747..753, + ), + ( + Int( + ( + 0, + 757..758, + ), + ), + 757..758, + ), + ), + 747..758, + ), + ), + ), + 740..758, + ), + ], + ), + 655..760, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns the first element in the array; if the array is empty, the return", + ), + 762..840, + ), + ), + 762..840, + ), + ), + 762..840, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "value is undefined.", + ), + 840..864, + ), + ), + 840..864, + ), + ), + 840..864, + ), + ( + FunctionDefinition( + [], + ( + true, + 864..867, + ), + ( + "fun", + 868..871, + ), + ( + "array_first", + 872..883, + ), + [ + ( + Generic( + ( + false, + 884..884, + ), + ( + "array", + 884..889, + ), + ), + 884..889, + ), + ], + None, + [ + ( + Return( + ( + "return", + 897..903, + ), + Some( + ( + ArrayIndex( + ( + Var( + ( + "array", + 904..909, + ), + ), + 904..909, + ), + ( + Int( + ( + 0, + 910..911, + ), + ), + 910..911, + ), + ), + 904..911, + ), + ), + ), + 897..912, + ), + ], + ), + 864..914, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns the last element in the array; if the array is empty, the return", + ), + 916..993, + ), + ), + 916..993, + ), + ), + 916..993, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "value is undefined.", + ), + 993..1017, + ), + ), + 993..1017, + ), + ), + 993..1017, + ), + ( + FunctionDefinition( + [], + ( + true, + 1017..1020, + ), + ( + "fun", + 1021..1024, + ), + ( + "array_last", + 1025..1035, + ), + [ + ( + Generic( + ( + false, + 1036..1036, + ), + ( + "array", + 1036..1041, + ), + ), + 1036..1041, + ), + ], + None, + [ + ( + VariableInit( + ( + "let", + 1049..1052, + ), + ( + "index", + 1053..1058, + ), + ( + Expression( + ( + Subtract( + ( + FunctionInvocation( + [], + ( + "len", + 1061..1064, + ), + [ + ( + Var( + ( + "array", + 1065..1070, + ), + ), + 1065..1070, + ), + ], + [], + ), + 1061..1071, + ), + ( + Int( + ( + 1, + 1074..1075, + ), + ), + 1074..1075, + ), + ), + 1061..1075, + ), + ), + 1061..1075, + ), + ), + 1049..1075, + ), + ( + IfCondition( + ( + "if", + 1080..1082, + ), + ( + IfCondition( + ( + Lt( + ( + Var( + ( + "index", + 1083..1088, + ), + ), + 1083..1088, + ), + ( + Int( + ( + 0, + 1091..1092, + ), + ), + 1091..1092, + ), + ), + 1083..1092, + ), + ( + Singleline( + ( + Fail( + ( + "fail", + 1102..1106, + ), + Some( + ( + Int( + ( + 1, + 1107..1108, + ), + ), + 1107..1108, + ), + ), + ), + 1102..1108, + ), + ), + 1092..1108, + ), + ), + 1083..1108, + ), + [], + None, + ), + 1080..1108, + ), + ( + Return( + ( + "return", + 1113..1119, + ), + Some( + ( + ArrayIndex( + ( + Var( + ( + "array", + 1120..1125, + ), + ), + 1120..1125, + ), + ( + Var( + ( + "index", + 1126..1131, + ), + ), + 1126..1131, + ), + ), + 1120..1131, + ), + ), + ), + 1113..1132, + ), + ], + ), + 1017..1134, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Removes an element at the index from the array; if the index is negative", + ), + 1136..1213, + ), + ), + 1136..1213, + ), + ), + 1136..1213, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "or beyond the end, the return value is undefined, but the array will be", + ), + 1213..1289, + ), + ), + 1213..1289, + ), + ), + 1213..1289, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "unchanged.", + ), + 1289..1304, + ), + ), + 1289..1304, + ), + ), + 1289..1304, + ), + ( + FunctionDefinition( + [], + ( + true, + 1304..1307, + ), + ( + "fun", + 1308..1311, + ), + ( + "array_remove_at", + 1312..1327, + ), + [ + ( + Typed( + ( + true, + 1328..1331, + ), + ( + "array", + 1332..1337, + ), + ( + [Any], + 1339..1341, + ), + ), + 1328..1341, + ), + ( + Typed( + ( + false, + 1343..1342, + ), + ( + "index", + 1343..1348, + ), + ( + Int, + 1350..1353, + ), + ), + 1343..1353, + ), + ], + Some( + ( + Null, + 1356..1360, + ), + ), + [ + ( + VariableInit( + ( + "let", + 1367..1370, + ), + ( + "offset", + 1371..1377, + ), + ( + Expression( + ( + Add( + ( + Var( + ( + "index", + 1380..1385, + ), + ), + 1380..1385, + ), + ( + Int( + ( + 1, + 1388..1389, + ), + ), + 1388..1389, + ), + ), + 1380..1389, + ), + ), + 1380..1389, + ), + ), + 1367..1389, + ), + ( + VariableInit( + ( + "let", + 1394..1397, + ), + ( + "length", + 1398..1404, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "len", + 1407..1410, + ), + [ + ( + Var( + ( + "array", + 1411..1416, + ), + ), + 1411..1416, + ), + ], + [], + ), + 1407..1417, + ), + ), + 1407..1417, + ), + ), + 1394..1417, + ), + ( + VariableSet( + ( + "array", + 1422..1427, + ), + ( + Add( + ( + ArrayIndex( + ( + Var( + ( + "array", + 1430..1435, + ), + ), + 1430..1435, + ), + ( + Range( + ( + Int( + ( + 0, + 1436..1437, + ), + ), + 1436..1437, + ), + ( + Var( + ( + "index", + 1439..1444, + ), + ), + 1439..1444, + ), + ), + 1436..1444, + ), + ), + 1430..1444, + ), + ( + ArrayIndex( + ( + Var( + ( + "array", + 1448..1453, + ), + ), + 1448..1453, + ), + ( + Range( + ( + Var( + ( + "offset", + 1454..1460, + ), + ), + 1454..1460, + ), + ( + Var( + ( + "length", + 1462..1468, + ), + ), + 1462..1468, + ), + ), + 1454..1468, + ), + ), + 1448..1468, + ), + ), + 1430..1468, + ), + ), + 1422..1469, + ), + ], + ), + 1304..1471, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Removes an element at the index from the array, and returns it", + ), + 1473..1540, + ), + ), + 1473..1540, + ), + ), + 1473..1540, + ), + ( + FunctionDefinition( + [], + ( + true, + 1540..1543, + ), + ( + "fun", + 1544..1547, + ), + ( + "array_extract_at", + 1548..1564, + ), + [ + ( + Typed( + ( + true, + 1565..1568, + ), + ( + "array", + 1569..1574, + ), + ( + [Any], + 1576..1578, + ), + ), + 1565..1578, + ), + ( + Typed( + ( + false, + 1580..1579, + ), + ( + "index", + 1580..1585, + ), + ( + Int, + 1587..1590, + ), + ), + 1580..1590, + ), + ], + None, + [ + ( + IfCondition( + ( + "if", + 1598..1600, + ), + ( + IfCondition( + ( + Or( + ( + Lt( + ( + Var( + ( + "index", + 1601..1606, + ), + ), + 1601..1606, + ), + ( + Int( + ( + 0, + 1609..1610, + ), + ), + 1609..1610, + ), + ), + 1601..1610, + ), + ( + "or", + 1611..1613, + ), + ( + Ge( + ( + Var( + ( + "index", + 1614..1619, + ), + ), + 1614..1619, + ), + ( + FunctionInvocation( + [], + ( + "len", + 1623..1626, + ), + [ + ( + Var( + ( + "array", + 1627..1632, + ), + ), + 1627..1632, + ), + ], + [], + ), + 1623..1633, + ), + ), + 1614..1633, + ), + ), + 1601..1633, + ), + ( + Singleline( + ( + Fail( + ( + "fail", + 1643..1647, + ), + Some( + ( + Int( + ( + 1, + 1648..1649, + ), + ), + 1648..1649, + ), + ), + ), + 1643..1649, + ), + ), + 1633..1649, + ), + ), + 1601..1649, + ), + [], + None, + ), + 1598..1649, + ), + ( + VariableInit( + ( + "let", + 1654..1657, + ), + ( + "element", + 1658..1665, + ), + ( + Expression( + ( + ArrayIndex( + ( + Var( + ( + "array", + 1668..1673, + ), + ), + 1668..1673, + ), + ( + Var( + ( + "index", + 1674..1679, + ), + ), + 1674..1679, + ), + ), + 1668..1679, + ), + ), + 1668..1680, + ), + ), + 1654..1680, + ), + ( + VariableInit( + ( + "let", + 1685..1688, + ), + ( + "offset", + 1689..1695, + ), + ( + Expression( + ( + Add( + ( + Var( + ( + "index", + 1698..1703, + ), + ), + 1698..1703, + ), + ( + Int( + ( + 1, + 1706..1707, + ), + ), + 1706..1707, + ), + ), + 1698..1707, + ), + ), + 1698..1707, + ), + ), + 1685..1707, + ), + ( + VariableInit( + ( + "let", + 1712..1715, + ), + ( + "length", + 1716..1722, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "len", + 1725..1728, + ), + [ + ( + Var( + ( + "array", + 1729..1734, + ), + ), + 1729..1734, + ), + ], + [], + ), + 1725..1735, + ), + ), + 1725..1735, + ), + ), + 1712..1735, + ), + ( + VariableSet( + ( + "array", + 1740..1745, + ), + ( + Add( + ( + ArrayIndex( + ( + Var( + ( + "array", + 1748..1753, + ), + ), + 1748..1753, + ), + ( + Range( + ( + Int( + ( + 0, + 1754..1755, + ), + ), + 1754..1755, + ), + ( + Var( + ( + "index", + 1757..1762, + ), + ), + 1757..1762, + ), + ), + 1754..1762, + ), + ), + 1748..1762, + ), + ( + ArrayIndex( + ( + Var( + ( + "array", + 1766..1771, + ), + ), + 1766..1771, + ), + ( + Range( + ( + Var( + ( + "offset", + 1772..1778, + ), + ), + 1772..1778, + ), + ( + Var( + ( + "length", + 1780..1786, + ), + ), + 1780..1786, + ), + ), + 1772..1786, + ), + ), + 1766..1786, + ), + ), + 1748..1786, + ), + ), + 1740..1787, + ), + ( + Return( + ( + "return", + 1792..1798, + ), + Some( + ( + Var( + ( + "element", + 1799..1806, + ), + ), + 1799..1806, + ), + ), + ), + 1792..1806, + ), + ], + ), + 1540..1808, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Removes the last element from the array, and returns it; if the array", + ), + 1810..1884, + ), + ), + 1810..1884, + ), + ), + 1810..1884, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "is empty, the return value is undefined, but the array will be unchanged.", + ), + 1884..1962, + ), + ), + 1884..1962, + ), + ), + 1884..1962, + ), + ( + FunctionDefinition( + [], + ( + true, + 1962..1965, + ), + ( + "fun", + 1966..1969, + ), + ( + "array_pop", + 1970..1979, + ), + [ + ( + Typed( + ( + true, + 1980..1983, + ), + ( + "array", + 1984..1989, + ), + ( + [Any], + 1991..1993, + ), + ), + 1980..1993, + ), + ], + None, + [ + ( + VariableInit( + ( + "let", + 2001..2004, + ), + ( + "length", + 2005..2011, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "len", + 2014..2017, + ), + [ + ( + Var( + ( + "array", + 2018..2023, + ), + ), + 2018..2023, + ), + ], + [], + ), + 2014..2024, + ), + ), + 2014..2024, + ), + ), + 2001..2024, + ), + ( + VariableInit( + ( + "let", + 2029..2032, + ), + ( + "index", + 2033..2038, + ), + ( + Expression( + ( + Subtract( + ( + Var( + ( + "length", + 2041..2047, + ), + ), + 2041..2047, + ), + ( + Int( + ( + 1, + 2050..2051, + ), + ), + 2050..2051, + ), + ), + 2041..2051, + ), + ), + 2041..2051, + ), + ), + 2029..2051, + ), + ( + IfCondition( + ( + "if", + 2056..2058, + ), + ( + IfCondition( + ( + Lt( + ( + Var( + ( + "index", + 2059..2064, + ), + ), + 2059..2064, + ), + ( + Int( + ( + 0, + 2067..2068, + ), + ), + 2067..2068, + ), + ), + 2059..2068, + ), + ( + Singleline( + ( + Fail( + ( + "fail", + 2078..2082, + ), + Some( + ( + Int( + ( + 1, + 2083..2084, + ), + ), + 2083..2084, + ), + ), + ), + 2078..2084, + ), + ), + 2068..2084, + ), + ), + 2059..2084, + ), + [], + None, + ), + 2056..2084, + ), + ( + VariableInit( + ( + "let", + 2089..2092, + ), + ( + "element", + 2093..2100, + ), + ( + Expression( + ( + ArrayIndex( + ( + Var( + ( + "array", + 2103..2108, + ), + ), + 2103..2108, + ), + ( + Var( + ( + "index", + 2109..2114, + ), + ), + 2109..2114, + ), + ), + 2103..2114, + ), + ), + 2103..2115, + ), + ), + 2089..2115, + ), + ( + VariableSet( + ( + "array", + 2120..2125, + ), + ( + ArrayIndex( + ( + Var( + ( + "array", + 2128..2133, + ), + ), + 2128..2133, + ), + ( + Range( + ( + Int( + ( + 0, + 2134..2135, + ), + ), + 2134..2135, + ), + ( + Var( + ( + "index", + 2137..2142, + ), + ), + 2137..2142, + ), + ), + 2134..2142, + ), + ), + 2128..2142, + ), + ), + 2120..2143, + ), + ( + Return( + ( + "return", + 2148..2154, + ), + Some( + ( + Var( + ( + "element", + 2155..2162, + ), + ), + 2155..2162, + ), + ), + ), + 2148..2162, + ), + ], + ), + 1962..2164, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Removes the first element from the array, and returns it; if the array", + ), + 2166..2241, + ), + ), + 2166..2241, + ), + ), + 2166..2241, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "is empty, the return value is undefined, but the array will be unchanged.", + ), + 2241..2319, + ), + ), + 2241..2319, + ), + ), + 2241..2319, + ), + ( + FunctionDefinition( + [], + ( + true, + 2319..2322, + ), + ( + "fun", + 2323..2326, + ), + ( + "array_shift", + 2327..2338, + ), + [ + ( + Typed( + ( + true, + 2339..2342, + ), + ( + "array", + 2343..2348, + ), + ( + [Any], + 2350..2352, + ), + ), + 2339..2352, + ), + ], + None, + [ + ( + VariableInit( + ( + "let", + 2360..2363, + ), + ( + "length", + 2364..2370, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "len", + 2373..2376, + ), + [ + ( + Var( + ( + "array", + 2377..2382, + ), + ), + 2377..2382, + ), + ], + [], + ), + 2373..2383, + ), + ), + 2373..2383, + ), + ), + 2360..2383, + ), + ( + VariableInit( + ( + "let", + 2388..2391, + ), + ( + "element", + 2392..2399, + ), + ( + Expression( + ( + ArrayIndex( + ( + Var( + ( + "array", + 2402..2407, + ), + ), + 2402..2407, + ), + ( + Int( + ( + 0, + 2408..2409, + ), + ), + 2408..2409, + ), + ), + 2402..2409, + ), + ), + 2402..2410, + ), + ), + 2388..2410, + ), + ( + VariableSet( + ( + "array", + 2415..2420, + ), + ( + ArrayIndex( + ( + Var( + ( + "array", + 2423..2428, + ), + ), + 2423..2428, + ), + ( + Range( + ( + Int( + ( + 1, + 2429..2430, + ), + ), + 2429..2430, + ), + ( + Var( + ( + "length", + 2432..2438, + ), + ), + 2432..2438, + ), + ), + 2429..2438, + ), + ), + 2423..2438, + ), + ), + 2415..2439, + ), + ( + Return( + ( + "return", + 2444..2450, + ), + Some( + ( + Var( + ( + "element", + 2451..2458, + ), + ), + 2451..2458, + ), + ), + ), + 2444..2458, + ), + ], + ), + 2319..2460, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap new file mode 100644 index 0000000..de65a4c --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap @@ -0,0 +1,3663 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokenize(&stdlib)) +--- +[ + ( + Statement( + ( + Comment( + ( + DocString( + "All dates are internally stored as miliseconds since the Epoch (1970-01-01 00:00 UTC).", + ), + 0..91, + ), + ), + 0..91, + ), + ), + 0..91, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Transform date from unix epoch to a human-readable format described by a posix format string.", + ), + 92..190, + ), + ), + 92..190, + ), + ), + 92..190, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If no format is specified, \"%F %T\" is used.", + ), + 190..238, + ), + ), + 190..238, + ), + ), + 190..238, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "For more info about format type \"man date\" in your shell or see .", + ), + 238..353, + ), + ), + 238..353, + ), + ), + 238..353, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 353..357, + ), + ), + 353..357, + ), + ), + 353..357, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Format includes the following patterns:", + ), + 357..401, + ), + ), + 357..401, + ), + ), + 357..401, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%%` - a literal %", + ), + 401..426, + ), + ), + 401..426, + ), + ), + 401..426, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%a` - locale's abbreviated weekday name (e.g., Sun)", + ), + 426..485, + ), + ), + 426..485, + ), + ), + 426..485, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%A` - locale's full weekday name (e.g., Sunday)", + ), + 485..540, + ), + ), + 485..540, + ), + ), + 485..540, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%b` - locale's abbreviated month name (e.g., Jan)", + ), + 540..597, + ), + ), + 540..597, + ), + ), + 540..597, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%B` - locale's full month name (e.g., January)", + ), + 597..651, + ), + ), + 597..651, + ), + ), + 597..651, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%d` - day of month (e.g., 01)", + ), + 651..688, + ), + ), + 651..688, + ), + ), + 651..688, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%D` - date; same as %m/%d/%y", + ), + 688..724, + ), + ), + 688..724, + ), + ), + 688..724, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%F` - full date; like %+4Y-%m-%d", + ), + 724..764, + ), + ), + 724..764, + ), + ), + 724..764, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%H` - hour (00..23)", + ), + 764..791, + ), + ), + 764..791, + ), + ), + 764..791, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%I` - hour (01..12)", + ), + 791..818, + ), + ), + 791..818, + ), + ), + 791..818, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%m` - month (01..12)", + ), + 818..846, + ), + ), + 818..846, + ), + ), + 818..846, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%M` - minute (00..59)", + ), + 846..875, + ), + ), + 846..875, + ), + ), + 846..875, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%N` - nanoseconds (000000000..999999999)", + ), + 875..923, + ), + ), + 875..923, + ), + ), + 875..923, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%p` - locale's equivalent of either AM or PM; blank if unknown", + ), + 923..993, + ), + ), + 923..993, + ), + ), + 923..993, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%T` - time; same as %H:%M:%S", + ), + 993..1029, + ), + ), + 993..1029, + ), + ), + 993..1029, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- `%Y` - year", + ), + 1029..1047, + ), + ), + 1029..1047, + ), + ), + 1029..1047, + ), + ( + FunctionDefinition( + [], + ( + true, + 1047..1050, + ), + ( + "fun", + 1051..1054, + ), + ( + "date_format_posix", + 1055..1072, + ), + [ + ( + Typed( + ( + false, + 1073..1073, + ), + ( + "date", + 1073..1077, + ), + ( + Num, + 1079..1082, + ), + ), + 1073..1082, + ), + ( + Optional( + ( + false, + 1084..1083, + ), + ( + "format", + 1084..1090, + ), + Some( + ( + Text, + 1092..1096, + ), + ), + ( + Text( + [ + ( + Text( + ( + "%", + 1100..1101, + ), + ), + 1100..1101, + ), + ( + Text( + ( + "F", + 1101..1102, + ), + ), + 1101..1102, + ), + ( + Text( + ( + "%", + 1103..1104, + ), + ), + 1103..1104, + ), + ( + Text( + ( + "T", + 1104..1105, + ), + ), + 1104..1105, + ), + ], + ), + 1099..1106, + ), + ), + 1084..1106, + ), + ( + Optional( + ( + false, + 1108..1107, + ), + ( + "utc", + 1108..1111, + ), + Some( + ( + Bool, + 1113..1117, + ), + ), + ( + Boolean( + ( + false, + 1120..1125, + ), + ), + 1120..1125, + ), + ), + 1108..1125, + ), + ], + Some( + ( + Text?, + 1128..1133, + ), + ), + [ + ( + VariableInit( + ( + "let", + 1140..1143, + ), + ( + "utc_flag", + 1144..1152, + ), + ( + Expression( + ( + Ternary( + ( + Var( + ( + "utc", + 1155..1158, + ), + ), + 1155..1158, + ), + ( + "then", + 1159..1163, + ), + ( + Text( + [ + ( + Text( + ( + "-", + 1165..1166, + ), + ), + 1165..1166, + ), + ( + Text( + ( + "u", + 1166..1167, + ), + ), + 1166..1167, + ), + ], + ), + 1164..1168, + ), + ( + "else", + 1169..1173, + ), + ( + Text( + [], + ), + 1174..1176, + ), + ), + 1155..1176, + ), + ), + 1155..1176, + ), + ), + 1140..1176, + ), + ( + Comment( + ( + Comment( + "Case if this is a GNU date command", + ), + 1181..1219, + ), + ), + 1181..1219, + ), + ( + Return( + ( + "return", + 1223..1229, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 1230..1231, + ), + ( + Text( + "date", + ), + 1232..1236, + ), + ( + Expression( + ( + Var( + ( + "utc_flag", + 1238..1246, + ), + ), + 1238..1246, + ), + ), + 1237..1247, + ), + ( + CommandOption( + "-d", + ), + 1248..1250, + ), + ( + Text( + "\"", + ), + 1251..1252, + ), + ( + Text( + "@", + ), + 1252..1253, + ), + ( + Expression( + ( + Var( + ( + "date", + 1254..1258, + ), + ), + 1254..1258, + ), + ), + 1253..1259, + ), + ( + Text( + "\"", + ), + 1259..1260, + ), + ( + Text( + "+", + ), + 1261..1262, + ), + ( + Text( + "\"", + ), + 1262..1263, + ), + ( + Expression( + ( + Var( + ( + "format", + 1264..1270, + ), + ), + 1264..1270, + ), + ), + 1263..1271, + ), + ( + Text( + "\"", + ), + 1271..1272, + ), + ( + Text( + "2", + ), + 1273..1274, + ), + ( + Text( + ">", + ), + 1274..1275, + ), + ( + Text( + "/", + ), + 1275..1276, + ), + ( + Text( + "dev", + ), + 1276..1279, + ), + ( + Text( + "/", + ), + 1279..1280, + ), + ( + Text( + "null", + ), + 1280..1284, + ), + ( + Text( + "$", + ), + 1285..1286, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 1287..1293, + ), + None, + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "Case if this is a BSD date command", + ), + 1304..1342, + ), + ), + 1304..1342, + ), + ( + Return( + ( + "return", + 1350..1356, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 1357..1358, + ), + ( + Text( + "date", + ), + 1359..1363, + ), + ( + Expression( + ( + Var( + ( + "utc_flag", + 1365..1373, + ), + ), + 1365..1373, + ), + ), + 1364..1374, + ), + ( + CommandOption( + "-j", + ), + 1375..1377, + ), + ( + CommandOption( + "-r", + ), + 1378..1380, + ), + ( + Text( + "\"", + ), + 1381..1382, + ), + ( + Expression( + ( + Var( + ( + "date", + 1383..1387, + ), + ), + 1383..1387, + ), + ), + 1382..1388, + ), + ( + Text( + "\"", + ), + 1388..1389, + ), + ( + Text( + "+", + ), + 1390..1391, + ), + ( + Text( + "\"", + ), + 1391..1392, + ), + ( + Expression( + ( + Var( + ( + "format", + 1393..1399, + ), + ), + 1393..1399, + ), + ), + 1392..1400, + ), + ( + Text( + "\"", + ), + 1400..1401, + ), + ( + Text( + "$", + ), + 1402..1403, + ), + ], + [ + ( + Failure( + ( + Propagate, + 1403..1404, + ), + ), + 1403..1404, + ), + ], + ), + 1357..1404, + ), + ), + ), + 1350..1404, + ), + ], + ), + 1294..1410, + ), + ), + 1287..1410, + ), + ), + 1287..1410, + ), + ], + ), + 1230..1410, + ), + ), + ), + 1223..1410, + ), + ], + ), + 1047..1412, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Transforms date from a format described by a posix format string to a unix epoch format (seconds since the Epoch (1970-01-01 00:00 UTC)).", + ), + 1414..1556, + ), + ), + 1414..1556, + ), + ), + 1414..1556, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If no format is specified, \"%F %T\" format is used.", + ), + 1556..1611, + ), + ), + 1556..1611, + ), + ), + 1556..1611, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "For more info about format type \"man date\" on your shell or go to .", + ), + 1611..1728, + ), + ), + 1611..1728, + ), + ), + 1611..1728, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 1728..1748, + ), + ], + ( + true, + 1749..1752, + ), + ( + "fun", + 1753..1756, + ), + ( + "date_from_posix", + 1757..1772, + ), + [ + ( + Typed( + ( + false, + 1773..1773, + ), + ( + "date", + 1773..1777, + ), + ( + Text, + 1779..1783, + ), + ), + 1773..1783, + ), + ( + Optional( + ( + false, + 1785..1784, + ), + ( + "format", + 1785..1791, + ), + Some( + ( + Text, + 1793..1797, + ), + ), + ( + Text( + [ + ( + Text( + ( + "%", + 1801..1802, + ), + ), + 1801..1802, + ), + ( + Text( + ( + "F", + 1802..1803, + ), + ), + 1802..1803, + ), + ( + Text( + ( + "%", + 1804..1805, + ), + ), + 1804..1805, + ), + ( + Text( + ( + "T", + 1805..1806, + ), + ), + 1805..1806, + ), + ], + ), + 1800..1807, + ), + ), + 1785..1807, + ), + ( + Optional( + ( + false, + 1809..1808, + ), + ( + "utc", + 1809..1812, + ), + Some( + ( + Bool, + 1814..1818, + ), + ), + ( + Boolean( + ( + false, + 1821..1826, + ), + ), + 1821..1826, + ), + ), + 1809..1826, + ), + ], + Some( + ( + Num?, + 1829..1833, + ), + ), + [ + ( + VariableInit( + ( + "let", + 1840..1843, + ), + ( + "utc_flag", + 1844..1852, + ), + ( + Expression( + ( + Ternary( + ( + Var( + ( + "utc", + 1855..1858, + ), + ), + 1855..1858, + ), + ( + "then", + 1859..1863, + ), + ( + Text( + [ + ( + Text( + ( + "-", + 1865..1866, + ), + ), + 1865..1866, + ), + ( + Text( + ( + "u", + 1866..1867, + ), + ), + 1866..1867, + ), + ], + ), + 1864..1868, + ), + ( + "else", + 1869..1873, + ), + ( + Text( + [], + ), + 1874..1876, + ), + ), + 1855..1876, + ), + ), + 1855..1876, + ), + ), + 1840..1876, + ), + ( + Comment( + ( + Comment( + "Case if this is a GNU date command", + ), + 1881..1919, + ), + ), + 1881..1919, + ), + ( + Return( + ( + "return", + 1923..1929, + ), + Some( + ( + Cast( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 1930..1931, + ), + ( + Text( + "date", + ), + 1932..1936, + ), + ( + Expression( + ( + Var( + ( + "utc_flag", + 1938..1946, + ), + ), + 1938..1946, + ), + ), + 1937..1947, + ), + ( + CommandOption( + "-d", + ), + 1948..1950, + ), + ( + Text( + "\"", + ), + 1951..1952, + ), + ( + Escape( + "$", + ), + 1952..1954, + ), + ( + Text( + "(", + ), + 1954..1955, + ), + ( + Text( + "date", + ), + 1955..1959, + ), + ( + CommandOption( + "-d", + ), + 1960..1962, + ), + ( + Text( + "\"", + ), + 1963..1964, + ), + ( + Expression( + ( + Var( + ( + "date", + 1965..1969, + ), + ), + 1965..1969, + ), + ), + 1964..1970, + ), + ( + Text( + "\"", + ), + 1970..1971, + ), + ( + Text( + "+", + ), + 1972..1973, + ), + ( + Text( + "\"", + ), + 1973..1974, + ), + ( + Expression( + ( + Var( + ( + "format", + 1975..1981, + ), + ), + 1975..1981, + ), + ), + 1974..1982, + ), + ( + Text( + "\"", + ), + 1982..1983, + ), + ( + Text( + "2", + ), + 1984..1985, + ), + ( + Text( + ">", + ), + 1985..1986, + ), + ( + Text( + "/", + ), + 1986..1987, + ), + ( + Text( + "dev", + ), + 1987..1990, + ), + ( + Text( + "/", + ), + 1990..1991, + ), + ( + Text( + "null", + ), + 1991..1995, + ), + ( + Text( + ")", + ), + 1995..1996, + ), + ( + Text( + "\"", + ), + 1996..1997, + ), + ( + Text( + "+", + ), + 1998..1999, + ), + ( + Text( + "%", + ), + 1999..2000, + ), + ( + Text( + "s", + ), + 2000..2001, + ), + ( + Text( + "2", + ), + 2002..2003, + ), + ( + Text( + ">", + ), + 2003..2004, + ), + ( + Text( + "/", + ), + 2004..2005, + ), + ( + Text( + "dev", + ), + 2005..2008, + ), + ( + Text( + "/", + ), + 2008..2009, + ), + ( + Text( + "null", + ), + 2009..2013, + ), + ( + Text( + "$", + ), + 2014..2015, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 2016..2022, + ), + None, + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "Case if this is a BSD date command", + ), + 2033..2071, + ), + ), + 2033..2071, + ), + ( + Return( + ( + "return", + 2079..2085, + ), + Some( + ( + Cast( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2086..2087, + ), + ( + Text( + "date", + ), + 2088..2092, + ), + ( + Expression( + ( + Var( + ( + "utc_flag", + 2094..2102, + ), + ), + 2094..2102, + ), + ), + 2093..2103, + ), + ( + CommandOption( + "-j", + ), + 2104..2106, + ), + ( + CommandOption( + "-f", + ), + 2107..2109, + ), + ( + Text( + "\"", + ), + 2110..2111, + ), + ( + Expression( + ( + Var( + ( + "format", + 2112..2118, + ), + ), + 2112..2118, + ), + ), + 2111..2119, + ), + ( + Text( + "\"", + ), + 2119..2120, + ), + ( + Text( + "\"", + ), + 2121..2122, + ), + ( + Expression( + ( + Var( + ( + "date", + 2123..2127, + ), + ), + 2123..2127, + ), + ), + 2122..2128, + ), + ( + Text( + "\"", + ), + 2128..2129, + ), + ( + Text( + "+", + ), + 2130..2131, + ), + ( + Text( + "%", + ), + 2131..2132, + ), + ( + Text( + "s", + ), + 2132..2133, + ), + ( + Text( + "$", + ), + 2134..2135, + ), + ], + [ + ( + Failure( + ( + Propagate, + 2135..2136, + ), + ), + 2135..2136, + ), + ], + ), + 2086..2136, + ), + ( + "as", + 2137..2139, + ), + ( + Num, + 2140..2143, + ), + ), + 2086..2143, + ), + ), + ), + 2079..2143, + ), + ], + ), + 2023..2149, + ), + ), + 2016..2149, + ), + ), + 2016..2149, + ), + ], + ), + 1930..2149, + ), + ( + "as", + 2150..2152, + ), + ( + Num, + 2153..2156, + ), + ), + 1930..2156, + ), + ), + ), + 1923..2156, + ), + ], + ), + 1728..2158, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns the current timestamp (seconds since the Epoch (1970-01-01 00:00 UTC)).", + ), + 2160..2244, + ), + ), + 2160..2244, + ), + ), + 2160..2244, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 2244..2264, + ), + ], + ( + true, + 2265..2268, + ), + ( + "fun", + 2269..2272, + ), + ( + "date_now", + 2273..2281, + ), + [], + Some( + ( + Num, + 2285..2288, + ), + ), + [ + ( + Return( + ( + "return", + 2295..2301, + ), + Some( + ( + Cast( + ( + Command( + [ + ( + Trust, + 2302..2307, + ), + ], + [ + ( + Text( + "$", + ), + 2308..2309, + ), + ( + Text( + "date", + ), + 2310..2314, + ), + ( + Text( + "+", + ), + 2315..2316, + ), + ( + Text( + "%", + ), + 2316..2317, + ), + ( + Text( + "s", + ), + 2317..2318, + ), + ( + Text( + "$", + ), + 2319..2320, + ), + ], + [], + ), + 2302..2320, + ), + ( + "as", + 2321..2323, + ), + ( + Num, + 2324..2327, + ), + ), + 2302..2327, + ), + ), + ), + 2295..2327, + ), + ], + ), + 2244..2329, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Adds a value to a date passed in the unix epoch format in miliseconds.", + ), + 2331..2406, + ), + ), + 2331..2406, + ), + ), + 2331..2406, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Example : `date_add(date, 3, \"days\")`", + ), + 2406..2448, + ), + ), + 2406..2448, + ), + ), + 2406..2448, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 2448..2452, + ), + ), + 2448..2452, + ), + ), + 2448..2452, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Available units:", + ), + 2452..2473, + ), + ), + 2452..2473, + ), + ), + 2452..2473, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- years", + ), + 2473..2485, + ), + ), + 2473..2485, + ), + ), + 2473..2485, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- months", + ), + 2485..2498, + ), + ), + 2485..2498, + ), + ), + 2485..2498, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- days", + ), + 2498..2509, + ), + ), + 2498..2509, + ), + ), + 2498..2509, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- hours", + ), + 2509..2521, + ), + ), + 2509..2521, + ), + ), + 2509..2521, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- minutes", + ), + 2521..2535, + ), + ), + 2521..2535, + ), + ), + 2521..2535, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- seconds", + ), + 2535..2549, + ), + ), + 2535..2549, + ), + ), + 2535..2549, + ), + ( + FunctionDefinition( + [], + ( + true, + 2549..2552, + ), + ( + "fun", + 2553..2556, + ), + ( + "date_add", + 2557..2565, + ), + [ + ( + Typed( + ( + false, + 2566..2566, + ), + ( + "date", + 2566..2570, + ), + ( + Num, + 2572..2575, + ), + ), + 2566..2575, + ), + ( + Typed( + ( + false, + 2577..2576, + ), + ( + "amount", + 2577..2583, + ), + ( + Num, + 2585..2588, + ), + ), + 2577..2588, + ), + ( + Typed( + ( + false, + 2590..2589, + ), + ( + "unit", + 2590..2594, + ), + ( + Text, + 2596..2600, + ), + ), + 2590..2600, + ), + ], + Some( + ( + Num?, + 2603..2607, + ), + ), + [ + ( + IfChain( + ( + "if", + 2614..2616, + ), + [ + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 2627..2631, + ), + ), + 2627..2631, + ), + ( + Text( + [ + ( + Text( + ( + "years", + 2636..2641, + ), + ), + 2636..2641, + ), + ], + ), + 2635..2642, + ), + ), + 2627..2642, + ), + ( + Singleline( + ( + Return( + ( + "return", + 2644..2650, + ), + Some( + ( + Add( + ( + Var( + ( + "date", + 2651..2655, + ), + ), + 2651..2655, + ), + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Var( + ( + "amount", + 2658..2664, + ), + ), + 2658..2664, + ), + ( + Int( + ( + 365, + 2667..2670, + ), + ), + 2667..2670, + ), + ), + 2658..2670, + ), + ( + Int( + ( + 24, + 2673..2675, + ), + ), + 2673..2675, + ), + ), + 2658..2675, + ), + ( + Int( + ( + 60, + 2678..2680, + ), + ), + 2678..2680, + ), + ), + 2658..2680, + ), + ( + Int( + ( + 60, + 2683..2685, + ), + ), + 2683..2685, + ), + ), + 2658..2685, + ), + ), + 2651..2685, + ), + ), + ), + 2644..2685, + ), + ), + 2642..2685, + ), + ), + 2627..2685, + ), + ), + 2627..2685, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 2694..2698, + ), + ), + 2694..2698, + ), + ( + Text( + [ + ( + Text( + ( + "months", + 2703..2709, + ), + ), + 2703..2709, + ), + ], + ), + 2702..2710, + ), + ), + 2694..2710, + ), + ( + Singleline( + ( + Return( + ( + "return", + 2712..2718, + ), + Some( + ( + Add( + ( + Var( + ( + "date", + 2719..2723, + ), + ), + 2719..2723, + ), + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Var( + ( + "amount", + 2726..2732, + ), + ), + 2726..2732, + ), + ( + Int( + ( + 30, + 2735..2737, + ), + ), + 2735..2737, + ), + ), + 2726..2737, + ), + ( + Int( + ( + 24, + 2740..2742, + ), + ), + 2740..2742, + ), + ), + 2726..2742, + ), + ( + Int( + ( + 60, + 2745..2747, + ), + ), + 2745..2747, + ), + ), + 2726..2747, + ), + ( + Int( + ( + 60, + 2750..2752, + ), + ), + 2750..2752, + ), + ), + 2726..2752, + ), + ), + 2719..2752, + ), + ), + ), + 2712..2752, + ), + ), + 2710..2752, + ), + ), + 2694..2752, + ), + ), + 2694..2752, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 2761..2765, + ), + ), + 2761..2765, + ), + ( + Text( + [ + ( + Text( + ( + "days", + 2770..2774, + ), + ), + 2770..2774, + ), + ], + ), + 2769..2775, + ), + ), + 2761..2775, + ), + ( + Singleline( + ( + Return( + ( + "return", + 2777..2783, + ), + Some( + ( + Add( + ( + Var( + ( + "date", + 2784..2788, + ), + ), + 2784..2788, + ), + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Var( + ( + "amount", + 2791..2797, + ), + ), + 2791..2797, + ), + ( + Int( + ( + 24, + 2800..2802, + ), + ), + 2800..2802, + ), + ), + 2791..2802, + ), + ( + Int( + ( + 60, + 2805..2807, + ), + ), + 2805..2807, + ), + ), + 2791..2807, + ), + ( + Int( + ( + 60, + 2810..2812, + ), + ), + 2810..2812, + ), + ), + 2791..2812, + ), + ), + 2784..2812, + ), + ), + ), + 2777..2812, + ), + ), + 2775..2812, + ), + ), + 2761..2812, + ), + ), + 2761..2812, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 2821..2825, + ), + ), + 2821..2825, + ), + ( + Text( + [ + ( + Text( + ( + "hours", + 2830..2835, + ), + ), + 2830..2835, + ), + ], + ), + 2829..2836, + ), + ), + 2821..2836, + ), + ( + Singleline( + ( + Return( + ( + "return", + 2838..2844, + ), + Some( + ( + Add( + ( + Var( + ( + "date", + 2845..2849, + ), + ), + 2845..2849, + ), + ( + Multiply( + ( + Multiply( + ( + Var( + ( + "amount", + 2852..2858, + ), + ), + 2852..2858, + ), + ( + Int( + ( + 60, + 2861..2863, + ), + ), + 2861..2863, + ), + ), + 2852..2863, + ), + ( + Int( + ( + 60, + 2866..2868, + ), + ), + 2866..2868, + ), + ), + 2852..2868, + ), + ), + 2845..2868, + ), + ), + ), + 2838..2868, + ), + ), + 2836..2868, + ), + ), + 2821..2868, + ), + ), + 2821..2868, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 2877..2881, + ), + ), + 2877..2881, + ), + ( + Text( + [ + ( + Text( + ( + "minutes", + 2886..2893, + ), + ), + 2886..2893, + ), + ], + ), + 2885..2894, + ), + ), + 2877..2894, + ), + ( + Singleline( + ( + Return( + ( + "return", + 2896..2902, + ), + Some( + ( + Add( + ( + Var( + ( + "date", + 2903..2907, + ), + ), + 2903..2907, + ), + ( + Multiply( + ( + Var( + ( + "amount", + 2910..2916, + ), + ), + 2910..2916, + ), + ( + Int( + ( + 60, + 2919..2921, + ), + ), + 2919..2921, + ), + ), + 2910..2921, + ), + ), + 2903..2921, + ), + ), + ), + 2896..2921, + ), + ), + 2894..2921, + ), + ), + 2877..2921, + ), + ), + 2877..2921, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 2930..2934, + ), + ), + 2930..2934, + ), + ( + Text( + [ + ( + Text( + ( + "seconds", + 2939..2946, + ), + ), + 2939..2946, + ), + ], + ), + 2938..2947, + ), + ), + 2930..2947, + ), + ( + Singleline( + ( + Return( + ( + "return", + 2949..2955, + ), + Some( + ( + Add( + ( + Var( + ( + "date", + 2956..2960, + ), + ), + 2956..2960, + ), + ( + Var( + ( + "amount", + 2963..2969, + ), + ), + 2963..2969, + ), + ), + 2956..2969, + ), + ), + ), + 2949..2969, + ), + ), + 2947..2969, + ), + ), + 2930..2969, + ), + ), + 2930..2969, + ), + ( + Else( + ( + Else( + ( + "else", + 2978..2982, + ), + ( + Singleline( + ( + Fail( + ( + "fail", + 2984..2988, + ), + Some( + ( + Int( + ( + 1, + 2989..2990, + ), + ), + 2989..2990, + ), + ), + ), + 2984..2990, + ), + ), + 2982..2990, + ), + ), + 2978..2990, + ), + ), + 2978..2990, + ), + ], + ), + 2614..2996, + ), + ], + ), + 2549..2998, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Subtracts a value from a date passed in the unix epoch format in miliseconds.", + ), + 3000..3082, + ), + ), + 3000..3082, + ), + ), + 3000..3082, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Example : `date_sub(date, 5, \"hours\")`", + ), + 3082..3125, + ), + ), + 3082..3125, + ), + ), + 3082..3125, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 3125..3129, + ), + ), + 3125..3129, + ), + ), + 3125..3129, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Available units:", + ), + 3129..3150, + ), + ), + 3129..3150, + ), + ), + 3129..3150, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- years", + ), + 3150..3162, + ), + ), + 3150..3162, + ), + ), + 3150..3162, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- months", + ), + 3162..3175, + ), + ), + 3162..3175, + ), + ), + 3162..3175, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- days", + ), + 3175..3186, + ), + ), + 3175..3186, + ), + ), + 3175..3186, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- hours", + ), + 3186..3198, + ), + ), + 3186..3198, + ), + ), + 3186..3198, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- minutes", + ), + 3198..3212, + ), + ), + 3198..3212, + ), + ), + 3198..3212, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "- seconds", + ), + 3212..3226, + ), + ), + 3212..3226, + ), + ), + 3212..3226, + ), + ( + FunctionDefinition( + [], + ( + true, + 3226..3229, + ), + ( + "fun", + 3230..3233, + ), + ( + "date_sub", + 3234..3242, + ), + [ + ( + Typed( + ( + false, + 3243..3243, + ), + ( + "date", + 3243..3247, + ), + ( + Num, + 3249..3252, + ), + ), + 3243..3252, + ), + ( + Typed( + ( + false, + 3254..3253, + ), + ( + "amount", + 3254..3260, + ), + ( + Num, + 3262..3265, + ), + ), + 3254..3265, + ), + ( + Typed( + ( + false, + 3267..3266, + ), + ( + "unit", + 3267..3271, + ), + ( + Text, + 3273..3277, + ), + ), + 3267..3277, + ), + ], + Some( + ( + Num?, + 3280..3284, + ), + ), + [ + ( + IfChain( + ( + "if", + 3291..3293, + ), + [ + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 3304..3308, + ), + ), + 3304..3308, + ), + ( + Text( + [ + ( + Text( + ( + "years", + 3313..3318, + ), + ), + 3313..3318, + ), + ], + ), + 3312..3319, + ), + ), + 3304..3319, + ), + ( + Singleline( + ( + Return( + ( + "return", + 3321..3327, + ), + Some( + ( + Subtract( + ( + Var( + ( + "date", + 3328..3332, + ), + ), + 3328..3332, + ), + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Var( + ( + "amount", + 3335..3341, + ), + ), + 3335..3341, + ), + ( + Int( + ( + 365, + 3344..3347, + ), + ), + 3344..3347, + ), + ), + 3335..3347, + ), + ( + Int( + ( + 24, + 3350..3352, + ), + ), + 3350..3352, + ), + ), + 3335..3352, + ), + ( + Int( + ( + 60, + 3355..3357, + ), + ), + 3355..3357, + ), + ), + 3335..3357, + ), + ( + Int( + ( + 60, + 3360..3362, + ), + ), + 3360..3362, + ), + ), + 3335..3362, + ), + ), + 3328..3362, + ), + ), + ), + 3321..3362, + ), + ), + 3319..3362, + ), + ), + 3304..3362, + ), + ), + 3304..3362, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 3371..3375, + ), + ), + 3371..3375, + ), + ( + Text( + [ + ( + Text( + ( + "months", + 3380..3386, + ), + ), + 3380..3386, + ), + ], + ), + 3379..3387, + ), + ), + 3371..3387, + ), + ( + Singleline( + ( + Return( + ( + "return", + 3389..3395, + ), + Some( + ( + Subtract( + ( + Var( + ( + "date", + 3396..3400, + ), + ), + 3396..3400, + ), + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Var( + ( + "amount", + 3403..3409, + ), + ), + 3403..3409, + ), + ( + Int( + ( + 30, + 3412..3414, + ), + ), + 3412..3414, + ), + ), + 3403..3414, + ), + ( + Int( + ( + 24, + 3417..3419, + ), + ), + 3417..3419, + ), + ), + 3403..3419, + ), + ( + Int( + ( + 60, + 3422..3424, + ), + ), + 3422..3424, + ), + ), + 3403..3424, + ), + ( + Int( + ( + 60, + 3427..3429, + ), + ), + 3427..3429, + ), + ), + 3403..3429, + ), + ), + 3396..3429, + ), + ), + ), + 3389..3429, + ), + ), + 3387..3429, + ), + ), + 3371..3429, + ), + ), + 3371..3429, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 3438..3442, + ), + ), + 3438..3442, + ), + ( + Text( + [ + ( + Text( + ( + "days", + 3447..3451, + ), + ), + 3447..3451, + ), + ], + ), + 3446..3452, + ), + ), + 3438..3452, + ), + ( + Singleline( + ( + Return( + ( + "return", + 3454..3460, + ), + Some( + ( + Subtract( + ( + Var( + ( + "date", + 3461..3465, + ), + ), + 3461..3465, + ), + ( + Multiply( + ( + Multiply( + ( + Multiply( + ( + Var( + ( + "amount", + 3468..3474, + ), + ), + 3468..3474, + ), + ( + Int( + ( + 24, + 3477..3479, + ), + ), + 3477..3479, + ), + ), + 3468..3479, + ), + ( + Int( + ( + 60, + 3482..3484, + ), + ), + 3482..3484, + ), + ), + 3468..3484, + ), + ( + Int( + ( + 60, + 3487..3489, + ), + ), + 3487..3489, + ), + ), + 3468..3489, + ), + ), + 3461..3489, + ), + ), + ), + 3454..3489, + ), + ), + 3452..3489, + ), + ), + 3438..3489, + ), + ), + 3438..3489, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 3498..3502, + ), + ), + 3498..3502, + ), + ( + Text( + [ + ( + Text( + ( + "hours", + 3507..3512, + ), + ), + 3507..3512, + ), + ], + ), + 3506..3513, + ), + ), + 3498..3513, + ), + ( + Singleline( + ( + Return( + ( + "return", + 3515..3521, + ), + Some( + ( + Subtract( + ( + Var( + ( + "date", + 3522..3526, + ), + ), + 3522..3526, + ), + ( + Multiply( + ( + Multiply( + ( + Var( + ( + "amount", + 3529..3535, + ), + ), + 3529..3535, + ), + ( + Int( + ( + 60, + 3538..3540, + ), + ), + 3538..3540, + ), + ), + 3529..3540, + ), + ( + Int( + ( + 60, + 3543..3545, + ), + ), + 3543..3545, + ), + ), + 3529..3545, + ), + ), + 3522..3545, + ), + ), + ), + 3515..3545, + ), + ), + 3513..3545, + ), + ), + 3498..3545, + ), + ), + 3498..3545, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 3554..3558, + ), + ), + 3554..3558, + ), + ( + Text( + [ + ( + Text( + ( + "minutes", + 3563..3570, + ), + ), + 3563..3570, + ), + ], + ), + 3562..3571, + ), + ), + 3554..3571, + ), + ( + Singleline( + ( + Return( + ( + "return", + 3573..3579, + ), + Some( + ( + Subtract( + ( + Var( + ( + "date", + 3580..3584, + ), + ), + 3580..3584, + ), + ( + Multiply( + ( + Var( + ( + "amount", + 3587..3593, + ), + ), + 3587..3593, + ), + ( + Int( + ( + 60, + 3596..3598, + ), + ), + 3596..3598, + ), + ), + 3587..3598, + ), + ), + 3580..3598, + ), + ), + ), + 3573..3598, + ), + ), + 3571..3598, + ), + ), + 3554..3598, + ), + ), + 3554..3598, + ), + ( + IfCondition( + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "unit", + 3607..3611, + ), + ), + 3607..3611, + ), + ( + Text( + [ + ( + Text( + ( + "seconds", + 3616..3623, + ), + ), + 3616..3623, + ), + ], + ), + 3615..3624, + ), + ), + 3607..3624, + ), + ( + Singleline( + ( + Return( + ( + "return", + 3626..3632, + ), + Some( + ( + Subtract( + ( + Var( + ( + "date", + 3633..3637, + ), + ), + 3633..3637, + ), + ( + Var( + ( + "amount", + 3640..3646, + ), + ), + 3640..3646, + ), + ), + 3633..3646, + ), + ), + ), + 3626..3646, + ), + ), + 3624..3646, + ), + ), + 3607..3646, + ), + ), + 3607..3646, + ), + ( + Else( + ( + Else( + ( + "else", + 3655..3659, + ), + ( + Singleline( + ( + Fail( + ( + "fail", + 3661..3665, + ), + Some( + ( + Int( + ( + 1, + 3666..3667, + ), + ), + 3666..3667, + ), + ), + ), + 3661..3667, + ), + ), + 3659..3667, + ), + ), + 3655..3667, + ), + ), + 3655..3667, + ), + ], + ), + 3291..3673, + ), + ], + ), + 3226..3675, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap new file mode 100644 index 0000000..fa54f2c --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap @@ -0,0 +1,6795 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokenize(&stdlib)) +--- +[ + ( + Import( + ( + false, + 0..6, + ), + ( + "import", + 0..6, + ), + ( + ImportAll, + 7..8, + ), + ( + "from", + 9..13, + ), + ( + "std/fs", + 14..22, + ), + ), + 0..22, + ), + ( + Import( + ( + false, + 23..22, + ), + ( + "import", + 23..29, + ), + ( + ImportAll, + 30..31, + ), + ( + "from", + 32..36, + ), + ( + "std/text", + 37..47, + ), + ), + 23..47, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Retrieves the value of an environment variable, optionally sourcing it from a file if not already set.", + ), + 49..156, + ), + ), + 49..156, + ), + ), + 49..156, + ), + ( + FunctionDefinition( + [], + ( + true, + 156..159, + ), + ( + "fun", + 160..163, + ), + ( + "env_var_load", + 164..176, + ), + [ + ( + Typed( + ( + false, + 177..177, + ), + ( + "var", + 177..180, + ), + ( + Text, + 182..186, + ), + ), + 177..186, + ), + ( + Optional( + ( + false, + 188..187, + ), + ( + "file", + 188..192, + ), + Some( + ( + Text, + 194..198, + ), + ), + ( + Text( + [ + ( + Text( + ( + ".", + 202..203, + ), + ), + 202..203, + ), + ( + Text( + ( + "env", + 203..206, + ), + ), + 203..206, + ), + ], + ), + 201..207, + ), + ), + 188..207, + ), + ], + Some( + ( + Text, + 210..214, + ), + ), + [ + ( + VariableInit( + ( + "let", + 221..224, + ), + ( + "_var", + 225..229, + ), + ( + Expression( + ( + Command( + [ + ( + Trust, + 232..237, + ), + ], + [ + ( + Text( + "$", + ), + 238..239, + ), + ( + Text( + "echo", + ), + 240..244, + ), + ( + Text( + "\"", + ), + 245..246, + ), + ( + Escape( + "$", + ), + 246..248, + ), + ( + Escape( + "{", + ), + 248..250, + ), + ( + Text( + "!", + ), + 250..251, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 252..258, + ), + ( + Var( + ( + "var", + 259..262, + ), + ), + 259..262, + ), + ), + 259..262, + ), + ), + 251..263, + ), + ( + Text( + "}", + ), + 263..264, + ), + ( + Text( + "\"", + ), + 264..265, + ), + ( + Text( + "$", + ), + 266..267, + ), + ], + [], + ), + 232..267, + ), + ), + 232..267, + ), + ), + 221..267, + ), + ( + IfCondition( + ( + "if", + 272..274, + ), + ( + IfCondition( + ( + Neq( + ( + Var( + ( + "_var", + 275..279, + ), + ), + 275..279, + ), + ( + Text( + [], + ), + 283..285, + ), + ), + 275..285, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 296..302, + ), + Some( + ( + Var( + ( + "_var", + 303..307, + ), + ), + 303..307, + ), + ), + ), + 296..307, + ), + ], + ), + 286..313, + ), + ), + 275..313, + ), + [], + None, + ), + 272..313, + ), + ( + IfCondition( + ( + "if", + 319..321, + ), + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "file_exists", + 322..333, + ), + [ + ( + Var( + ( + "file", + 334..338, + ), + ), + 334..338, + ), + ], + [], + ), + 322..339, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 350..355, + ), + ], + [ + ( + Text( + "$", + ), + 356..357, + ), + ( + Text( + "source", + ), + 358..364, + ), + ( + Text( + "\"", + ), + 365..366, + ), + ( + Expression( + ( + Var( + ( + "file", + 367..371, + ), + ), + 367..371, + ), + ), + 366..372, + ), + ( + Text( + "\"", + ), + 372..373, + ), + ( + Text( + "$", + ), + 374..375, + ), + ], + [], + ), + 350..375, + ), + ), + 350..375, + ), + ( + Return( + ( + "return", + 384..390, + ), + Some( + ( + Command( + [ + ( + Trust, + 391..396, + ), + ], + [ + ( + Text( + "$", + ), + 397..398, + ), + ( + Text( + "echo", + ), + 399..403, + ), + ( + Text( + "\"", + ), + 404..405, + ), + ( + Escape( + "$", + ), + 405..407, + ), + ( + Escape( + "{", + ), + 407..409, + ), + ( + Text( + "!", + ), + 409..410, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 411..417, + ), + ( + Var( + ( + "var", + 418..421, + ), + ), + 418..421, + ), + ), + 418..421, + ), + ), + 410..422, + ), + ( + Text( + "}", + ), + 422..423, + ), + ( + Text( + "\"", + ), + 423..424, + ), + ( + Text( + "$", + ), + 425..426, + ), + ], + [], + ), + 391..426, + ), + ), + ), + 384..426, + ), + ], + ), + 340..432, + ), + ), + 322..432, + ), + [], + None, + ), + 319..432, + ), + ( + Return( + ( + "return", + 438..444, + ), + Some( + ( + Text( + [], + ), + 445..447, + ), + ), + ), + 438..447, + ), + ], + ), + 156..449, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Loads the env file in the environment, using `xargs`.", + ), + 451..509, + ), + ), + 451..509, + ), + ), + 451..509, + ), + ( + FunctionDefinition( + [], + ( + true, + 509..512, + ), + ( + "fun", + 513..516, + ), + ( + "env_file_load", + 517..530, + ), + [ + ( + Optional( + ( + false, + 531..531, + ), + ( + "file", + 531..535, + ), + Some( + ( + Text, + 537..541, + ), + ), + ( + Text( + [ + ( + Text( + ( + ".", + 545..546, + ), + ), + 545..546, + ), + ( + Text( + ( + "env", + 546..549, + ), + ), + 546..549, + ), + ], + ), + 544..550, + ), + ), + 531..550, + ), + ], + Some( + ( + Null, + 553..557, + ), + ), + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 564..569, + ), + ], + [ + ( + Text( + "$", + ), + 570..571, + ), + ( + Text( + "export", + ), + 572..578, + ), + ( + Text( + "\"", + ), + 579..580, + ), + ( + Escape( + "$", + ), + 580..582, + ), + ( + Text( + "(", + ), + 582..583, + ), + ( + Text( + "xargs", + ), + 583..588, + ), + ( + Text( + "<", + ), + 589..590, + ), + ( + Expression( + ( + Var( + ( + "file", + 592..596, + ), + ), + 592..596, + ), + ), + 591..597, + ), + ( + Text( + ")", + ), + 597..598, + ), + ( + Text( + "\"", + ), + 598..599, + ), + ( + Text( + ">", + ), + 600..601, + ), + ( + Text( + "/", + ), + 602..603, + ), + ( + Text( + "dev", + ), + 603..606, + ), + ( + Text( + "/", + ), + 606..607, + ), + ( + Text( + "null", + ), + 607..611, + ), + ( + Text( + "$", + ), + 612..613, + ), + ], + [], + ), + 564..613, + ), + ), + 564..613, + ), + ], + ), + 509..615, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if a variable inside the shell session exists.", + ), + 617..675, + ), + ), + 617..675, + ), + ), + 617..675, + ), + ( + FunctionDefinition( + [], + ( + true, + 675..678, + ), + ( + "fun", + 679..682, + ), + ( + "env_var_test", + 683..695, + ), + [ + ( + Typed( + ( + false, + 696..696, + ), + ( + "name", + 696..700, + ), + ( + Text, + 702..706, + ), + ), + 696..706, + ), + ], + Some( + ( + Bool, + 709..713, + ), + ), + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 720..721, + ), + ( + Text( + "[", + ), + 722..723, + ), + ( + Text( + "[", + ), + 723..724, + ), + ( + Text( + "!", + ), + 725..726, + ), + ( + CommandOption( + "-z", + ), + 727..729, + ), + ( + Escape( + "$", + ), + 730..732, + ), + ( + Escape( + "{", + ), + 732..734, + ), + ( + Text( + "!", + ), + 734..735, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 736..742, + ), + ( + Var( + ( + "name", + 743..747, + ), + ), + 743..747, + ), + ), + 743..747, + ), + ), + 735..748, + ), + ( + Text( + "+", + ), + 748..749, + ), + ( + Text( + "z", + ), + 749..750, + ), + ( + Text( + "}", + ), + 750..751, + ), + ( + Text( + "]", + ), + 752..753, + ), + ( + Text( + "]", + ), + 753..754, + ), + ( + Text( + "$", + ), + 755..756, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 757..763, + ), + None, + ( + Block( + [], + [ + ( + Return( + ( + "return", + 774..780, + ), + Some( + ( + Boolean( + ( + false, + 781..786, + ), + ), + 781..786, + ), + ), + ), + 774..786, + ), + ], + ), + 764..792, + ), + ), + 757..792, + ), + ), + 757..792, + ), + ], + ), + 720..792, + ), + ), + 720..792, + ), + ( + Return( + ( + "return", + 797..803, + ), + Some( + ( + Boolean( + ( + true, + 804..808, + ), + ), + 804..808, + ), + ), + ), + 797..808, + ), + ], + ), + 675..810, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Sets a constant inside the shell session.", + ), + 812..858, + ), + ), + 812..858, + ), + ), + 812..858, + ), + ( + FunctionDefinition( + [], + ( + true, + 858..861, + ), + ( + "fun", + 862..865, + ), + ( + "env_const_set", + 866..879, + ), + [ + ( + Typed( + ( + false, + 880..880, + ), + ( + "name", + 880..884, + ), + ( + Text, + 886..890, + ), + ), + 880..890, + ), + ( + Typed( + ( + false, + 892..891, + ), + ( + "val", + 892..895, + ), + ( + Text, + 897..901, + ), + ), + 892..901, + ), + ], + Some( + ( + Null?, + 904..909, + ), + ), + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 916..917, + ), + ( + Text( + "readonly", + ), + 918..926, + ), + ( + Escape( + "$", + ), + 927..929, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 930..936, + ), + ( + Var( + ( + "name", + 937..941, + ), + ), + 937..941, + ), + ), + 937..941, + ), + ), + 929..942, + ), + ( + Text( + "=", + ), + 942..943, + ), + ( + Text( + "\"", + ), + 943..944, + ), + ( + Escape( + "$", + ), + 944..946, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 947..953, + ), + ( + Var( + ( + "val", + 954..957, + ), + ), + 954..957, + ), + ), + 954..957, + ), + ), + 946..958, + ), + ( + Text( + "\"", + ), + 958..959, + ), + ( + Text( + "2", + ), + 960..961, + ), + ( + Text( + ">", + ), + 961..962, + ), + ( + Text( + "/", + ), + 963..964, + ), + ( + Text( + "dev", + ), + 964..967, + ), + ( + Text( + "/", + ), + 967..968, + ), + ( + Text( + "null", + ), + 968..972, + ), + ( + Text( + "$", + ), + 973..974, + ), + ], + [ + ( + Failure( + ( + Propagate, + 974..975, + ), + ), + 974..975, + ), + ], + ), + 916..975, + ), + ), + 916..975, + ), + ], + ), + 858..977, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Gets a constant inside the shell session.", + ), + 979..1025, + ), + ), + 979..1025, + ), + ), + 979..1025, + ), + ( + FunctionDefinition( + [], + ( + true, + 1025..1028, + ), + ( + "fun", + 1029..1032, + ), + ( + "env_const_get", + 1033..1046, + ), + [ + ( + Typed( + ( + false, + 1047..1047, + ), + ( + "name", + 1047..1051, + ), + ( + Text, + 1053..1057, + ), + ), + 1047..1057, + ), + ], + Some( + ( + Text?, + 1060..1065, + ), + ), + [ + ( + Return( + ( + "return", + 1072..1078, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 1079..1080, + ), + ( + Text( + "echo", + ), + 1081..1085, + ), + ( + Escape( + "$", + ), + 1086..1088, + ), + ( + Escape( + "{", + ), + 1088..1090, + ), + ( + Text( + "!", + ), + 1090..1091, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1092..1098, + ), + ( + Var( + ( + "name", + 1099..1103, + ), + ), + 1099..1103, + ), + ), + 1099..1103, + ), + ), + 1091..1104, + ), + ( + Text( + "}", + ), + 1104..1105, + ), + ( + Text( + "$", + ), + 1106..1107, + ), + ], + [ + ( + Failure( + ( + Propagate, + 1107..1108, + ), + ), + 1107..1108, + ), + ], + ), + 1079..1108, + ), + ), + ), + 1072..1108, + ), + ], + ), + 1025..1110, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Sets a constant inside the shell session.", + ), + 1112..1158, + ), + ), + 1112..1158, + ), + ), + 1112..1158, + ), + ( + FunctionDefinition( + [], + ( + true, + 1158..1161, + ), + ( + "fun", + 1162..1165, + ), + ( + "env_var_set", + 1166..1177, + ), + [ + ( + Typed( + ( + false, + 1178..1178, + ), + ( + "name", + 1178..1182, + ), + ( + Text, + 1184..1188, + ), + ), + 1178..1188, + ), + ( + Typed( + ( + false, + 1190..1189, + ), + ( + "val", + 1190..1193, + ), + ( + Text, + 1195..1199, + ), + ), + 1190..1199, + ), + ], + Some( + ( + Null?, + 1202..1207, + ), + ), + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 1214..1215, + ), + ( + Text( + "export", + ), + 1216..1222, + ), + ( + Escape( + "$", + ), + 1223..1225, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1226..1232, + ), + ( + Var( + ( + "name", + 1233..1237, + ), + ), + 1233..1237, + ), + ), + 1233..1237, + ), + ), + 1225..1238, + ), + ( + Text( + "=", + ), + 1238..1239, + ), + ( + Text( + "\"", + ), + 1239..1240, + ), + ( + Escape( + "$", + ), + 1240..1242, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1243..1249, + ), + ( + Var( + ( + "val", + 1250..1253, + ), + ), + 1250..1253, + ), + ), + 1250..1253, + ), + ), + 1242..1254, + ), + ( + Text( + "\"", + ), + 1254..1255, + ), + ( + Text( + "2", + ), + 1256..1257, + ), + ( + Text( + ">", + ), + 1257..1258, + ), + ( + Text( + "/", + ), + 1259..1260, + ), + ( + Text( + "dev", + ), + 1260..1263, + ), + ( + Text( + "/", + ), + 1263..1264, + ), + ( + Text( + "null", + ), + 1264..1268, + ), + ( + Text( + "$", + ), + 1269..1270, + ), + ], + [ + ( + Failure( + ( + Propagate, + 1270..1271, + ), + ), + 1270..1271, + ), + ], + ), + 1214..1271, + ), + ), + 1214..1271, + ), + ], + ), + 1158..1273, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Gets a constant inside the shell session.", + ), + 1275..1321, + ), + ), + 1275..1321, + ), + ), + 1275..1321, + ), + ( + FunctionDefinition( + [], + ( + true, + 1321..1324, + ), + ( + "fun", + 1325..1328, + ), + ( + "env_var_get", + 1329..1340, + ), + [ + ( + Typed( + ( + false, + 1341..1341, + ), + ( + "name", + 1341..1345, + ), + ( + Text, + 1347..1351, + ), + ), + 1341..1351, + ), + ], + Some( + ( + Text?, + 1354..1359, + ), + ), + [ + ( + Return( + ( + "return", + 1366..1372, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 1373..1374, + ), + ( + Text( + "echo", + ), + 1375..1379, + ), + ( + Escape( + "$", + ), + 1380..1382, + ), + ( + Escape( + "{", + ), + 1382..1384, + ), + ( + Text( + "!", + ), + 1384..1385, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1386..1392, + ), + ( + Var( + ( + "name", + 1393..1397, + ), + ), + 1393..1397, + ), + ), + 1393..1397, + ), + ), + 1385..1398, + ), + ( + Text( + "}", + ), + 1398..1399, + ), + ( + Text( + "$", + ), + 1400..1401, + ), + ], + [ + ( + Failure( + ( + Propagate, + 1401..1402, + ), + ), + 1401..1402, + ), + ], + ), + 1373..1402, + ), + ), + ), + 1366..1402, + ), + ], + ), + 1321..1404, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Removes a variable inside the shell session.", + ), + 1406..1455, + ), + ), + 1406..1455, + ), + ), + 1406..1455, + ), + ( + FunctionDefinition( + [], + ( + true, + 1455..1458, + ), + ( + "fun", + 1459..1462, + ), + ( + "env_var_unset", + 1463..1476, + ), + [ + ( + Typed( + ( + false, + 1477..1477, + ), + ( + "name", + 1477..1481, + ), + ( + Text, + 1483..1487, + ), + ), + 1477..1487, + ), + ], + Some( + ( + Null?, + 1490..1495, + ), + ), + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 1502..1503, + ), + ( + Text( + "unset", + ), + 1504..1509, + ), + ( + Expression( + ( + Var( + ( + "name", + 1511..1515, + ), + ), + 1511..1515, + ), + ), + 1510..1516, + ), + ( + Text( + "$", + ), + 1517..1518, + ), + ], + [ + ( + Failure( + ( + Propagate, + 1518..1519, + ), + ), + 1518..1519, + ), + ], + ), + 1502..1519, + ), + ), + 1502..1519, + ), + ], + ), + 1455..1521, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if a command exists.", + ), + 1523..1555, + ), + ), + 1523..1555, + ), + ), + 1523..1555, + ), + ( + FunctionDefinition( + [], + ( + true, + 1555..1558, + ), + ( + "fun", + 1559..1562, + ), + ( + "is_command", + 1563..1573, + ), + [ + ( + Typed( + ( + false, + 1574..1574, + ), + ( + "command", + 1574..1581, + ), + ( + Text, + 1583..1587, + ), + ), + 1574..1587, + ), + ], + Some( + ( + Bool, + 1590..1594, + ), + ), + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 1601..1602, + ), + ( + Text( + "[", + ), + 1603..1604, + ), + ( + CommandOption( + "-x", + ), + 1605..1607, + ), + ( + Text( + "\"", + ), + 1608..1609, + ), + ( + Escape( + "$", + ), + 1609..1611, + ), + ( + Text( + "(", + ), + 1611..1612, + ), + ( + Text( + "command", + ), + 1612..1619, + ), + ( + CommandOption( + "-v", + ), + 1620..1622, + ), + ( + Text( + "\"", + ), + 1623..1624, + ), + ( + Expression( + ( + Var( + ( + "command", + 1625..1632, + ), + ), + 1625..1632, + ), + ), + 1624..1633, + ), + ( + Text( + "\"", + ), + 1633..1634, + ), + ( + Text( + ")", + ), + 1634..1635, + ), + ( + Text( + "\"", + ), + 1635..1636, + ), + ( + Text( + "]", + ), + 1637..1638, + ), + ( + Text( + "$", + ), + 1639..1640, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 1641..1647, + ), + None, + ( + Block( + [], + [ + ( + Return( + ( + "return", + 1658..1664, + ), + Some( + ( + Boolean( + ( + false, + 1665..1670, + ), + ), + 1665..1670, + ), + ), + ), + 1658..1670, + ), + ], + ), + 1648..1676, + ), + ), + 1641..1676, + ), + ), + 1641..1676, + ), + ], + ), + 1601..1676, + ), + ), + 1601..1676, + ), + ( + Return( + ( + "return", + 1681..1687, + ), + Some( + ( + Boolean( + ( + true, + 1688..1692, + ), + ), + 1688..1692, + ), + ), + ), + 1681..1692, + ), + ], + ), + 1555..1694, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Creates a prompt and returns the value.", + ), + 1696..1740, + ), + ), + 1696..1740, + ), + ), + 1696..1740, + ), + ( + FunctionDefinition( + [], + ( + true, + 1740..1743, + ), + ( + "fun", + 1744..1747, + ), + ( + "input_prompt", + 1748..1760, + ), + [ + ( + Typed( + ( + false, + 1761..1761, + ), + ( + "prompt", + 1761..1767, + ), + ( + Text, + 1769..1773, + ), + ), + 1761..1773, + ), + ], + Some( + ( + Text, + 1776..1780, + ), + ), + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 1787..1792, + ), + ], + [ + ( + Text( + "$", + ), + 1793..1794, + ), + ( + Text( + "read", + ), + 1795..1799, + ), + ( + CommandOption( + "-p", + ), + 1800..1802, + ), + ( + Text( + "\"", + ), + 1803..1804, + ), + ( + Escape( + "$", + ), + 1804..1806, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1807..1813, + ), + ( + Var( + ( + "prompt", + 1814..1820, + ), + ), + 1814..1820, + ), + ), + 1814..1820, + ), + ), + 1806..1821, + ), + ( + Text( + "\"", + ), + 1821..1822, + ), + ( + Text( + "$", + ), + 1823..1824, + ), + ], + [], + ), + 1787..1824, + ), + ), + 1787..1824, + ), + ( + Return( + ( + "return", + 1829..1835, + ), + Some( + ( + Command( + [ + ( + Trust, + 1836..1841, + ), + ], + [ + ( + Text( + "$", + ), + 1842..1843, + ), + ( + Text( + "echo", + ), + 1844..1848, + ), + ( + Escape( + "$", + ), + 1849..1851, + ), + ( + Text( + "REPLY", + ), + 1851..1856, + ), + ( + Text( + "$", + ), + 1857..1858, + ), + ], + [], + ), + 1836..1858, + ), + ), + ), + 1829..1858, + ), + ], + ), + 1740..1860, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Creates a prompt, hides any user input and returns the value.", + ), + 1862..1928, + ), + ), + 1862..1928, + ), + ), + 1862..1928, + ), + ( + FunctionDefinition( + [], + ( + true, + 1928..1931, + ), + ( + "fun", + 1932..1935, + ), + ( + "input_hidden", + 1936..1948, + ), + [ + ( + Typed( + ( + false, + 1949..1949, + ), + ( + "prompt", + 1949..1955, + ), + ( + Text, + 1957..1961, + ), + ), + 1949..1961, + ), + ], + Some( + ( + Text, + 1964..1968, + ), + ), + [ + ( + Block( + ( + Block( + [ + ( + Trust, + 1975..1980, + ), + ], + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 1991..1992, + ), + ( + Text( + "read", + ), + 1993..1997, + ), + ( + CommandOption( + "-s", + ), + 1998..2000, + ), + ( + CommandOption( + "-p", + ), + 2001..2003, + ), + ( + Text( + "\"", + ), + 2004..2005, + ), + ( + Escape( + "$", + ), + 2005..2007, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 2008..2014, + ), + ( + Var( + ( + "prompt", + 2015..2021, + ), + ), + 2015..2021, + ), + ), + 2015..2021, + ), + ), + 2007..2022, + ), + ( + Text( + "\"", + ), + 2022..2023, + ), + ( + Text( + "$", + ), + 2024..2025, + ), + ], + [], + ), + 1991..2025, + ), + ), + 1991..2025, + ), + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2034..2035, + ), + ( + Text( + "echo", + ), + 2036..2040, + ), + ( + Text( + "\"", + ), + 2041..2042, + ), + ( + Text( + "\"", + ), + 2042..2043, + ), + ( + Text( + ">", + ), + 2044..2045, + ), + ( + Text( + "&2", + ), + 2045..2047, + ), + ( + Text( + "$", + ), + 2048..2049, + ), + ], + [], + ), + 2034..2049, + ), + ), + 2034..2049, + ), + ( + Return( + ( + "return", + 2058..2064, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2065..2066, + ), + ( + Text( + "echo", + ), + 2067..2071, + ), + ( + Escape( + "$", + ), + 2072..2074, + ), + ( + Text( + "REPLY", + ), + 2074..2079, + ), + ( + Text( + "$", + ), + 2080..2081, + ), + ], + [], + ), + 2065..2081, + ), + ), + ), + 2058..2081, + ), + ], + ), + 1975..2087, + ), + ), + 1975..2087, + ), + ], + ), + 1928..2089, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Creates a confirm prompt (Yes/No), and returns true if the choice is Yes.", + ), + 2091..2169, + ), + ), + 2091..2169, + ), + ), + 2091..2169, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 2169..2173, + ), + ), + 2169..2173, + ), + ), + 2169..2173, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "\"No\" is the default choice, set default_yes to true for \"Yes\" as default choice.", + ), + 2173..2258, + ), + ), + 2173..2258, + ), + ), + 2173..2258, + ), + ( + FunctionDefinition( + [], + ( + true, + 2258..2261, + ), + ( + "fun", + 2262..2265, + ), + ( + "input_confirm", + 2266..2279, + ), + [ + ( + Typed( + ( + false, + 2280..2280, + ), + ( + "prompt", + 2280..2286, + ), + ( + Text, + 2288..2292, + ), + ), + 2280..2292, + ), + ( + Optional( + ( + false, + 2294..2293, + ), + ( + "default_yes", + 2294..2305, + ), + Some( + ( + Bool, + 2307..2311, + ), + ), + ( + Boolean( + ( + false, + 2314..2319, + ), + ), + 2314..2319, + ), + ), + 2294..2319, + ), + ], + Some( + ( + Bool, + 2322..2326, + ), + ), + [ + ( + VariableInit( + ( + "let", + 2333..2336, + ), + ( + "choice_default", + 2337..2351, + ), + ( + Expression( + ( + Ternary( + ( + Var( + ( + "default_yes", + 2354..2365, + ), + ), + 2354..2365, + ), + ( + "then", + 2366..2370, + ), + ( + Text( + [ + ( + Text( + ( + "[", + 2373..2374, + ), + ), + 2373..2374, + ), + ( + Escape( + ( + "x1b", + 2374..2378, + ), + ), + 2374..2378, + ), + ( + Text( + ( + "[", + 2378..2379, + ), + ), + 2378..2379, + ), + ( + Text( + ( + "1mY", + 2379..2382, + ), + ), + 2379..2382, + ), + ( + Text( + ( + "/", + 2382..2383, + ), + ), + 2382..2383, + ), + ( + Escape( + ( + "x1b", + 2383..2387, + ), + ), + 2383..2387, + ), + ( + Text( + ( + "[", + 2387..2388, + ), + ), + 2387..2388, + ), + ( + Text( + ( + "0mn", + 2388..2391, + ), + ), + 2388..2391, + ), + ( + Text( + ( + "]", + 2391..2392, + ), + ), + 2391..2392, + ), + ], + ), + 2371..2393, + ), + ( + "else", + 2394..2398, + ), + ( + Text( + [ + ( + Text( + ( + "[", + 2401..2402, + ), + ), + 2401..2402, + ), + ( + Text( + ( + "y", + 2402..2403, + ), + ), + 2402..2403, + ), + ( + Text( + ( + "/", + 2403..2404, + ), + ), + 2403..2404, + ), + ( + Escape( + ( + "x1b", + 2404..2408, + ), + ), + 2404..2408, + ), + ( + Text( + ( + "[", + 2408..2409, + ), + ), + 2408..2409, + ), + ( + Text( + ( + "1mN", + 2409..2412, + ), + ), + 2409..2412, + ), + ( + Escape( + ( + "x1b", + 2412..2416, + ), + ), + 2412..2416, + ), + ( + Text( + ( + "[", + 2416..2417, + ), + ), + 2416..2417, + ), + ( + Text( + ( + "0m", + 2417..2419, + ), + ), + 2417..2419, + ), + ( + Text( + ( + "]", + 2419..2420, + ), + ), + 2419..2420, + ), + ], + ), + 2399..2421, + ), + ), + 2354..2421, + ), + ), + 2354..2421, + ), + ), + 2333..2421, + ), + ( + Block( + ( + Block( + [ + ( + Trust, + 2426..2431, + ), + ], + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2442..2443, + ), + ( + Text( + "printf", + ), + 2444..2450, + ), + ( + Text( + "\"", + ), + 2451..2452, + ), + ( + Escape( + "x1b", + ), + 2452..2456, + ), + ( + Text( + "[", + ), + 2456..2457, + ), + ( + Text( + "1m", + ), + 2457..2459, + ), + ( + Expression( + ( + Var( + ( + "prompt", + 2460..2466, + ), + ), + 2460..2466, + ), + ), + 2459..2467, + ), + ( + Escape( + "x1b", + ), + 2467..2471, + ), + ( + Text( + "[", + ), + 2471..2472, + ), + ( + Text( + "0m", + ), + 2472..2474, + ), + ( + Expression( + ( + Var( + ( + "choice_default", + 2475..2489, + ), + ), + 2475..2489, + ), + ), + 2474..2490, + ), + ( + Text( + "\"", + ), + 2490..2491, + ), + ( + Text( + "$", + ), + 2492..2493, + ), + ], + [], + ), + 2442..2493, + ), + ), + 2442..2493, + ), + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2502..2503, + ), + ( + Text( + "read", + ), + 2504..2508, + ), + ( + CommandOption( + "-s", + ), + 2509..2511, + ), + ( + CommandOption( + "-n", + ), + 2512..2514, + ), + ( + Text( + "1", + ), + 2515..2516, + ), + ( + Text( + "$", + ), + 2517..2518, + ), + ], + [], + ), + 2502..2518, + ), + ), + 2502..2518, + ), + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2527..2528, + ), + ( + Text( + "printf", + ), + 2529..2535, + ), + ( + Text( + "\"", + ), + 2536..2537, + ), + ( + Escape( + "n", + ), + 2537..2539, + ), + ( + Text( + "\"", + ), + 2539..2540, + ), + ( + Text( + "$", + ), + 2541..2542, + ), + ], + [], + ), + 2527..2542, + ), + ), + 2527..2542, + ), + ], + ), + 2426..2548, + ), + ), + 2426..2548, + ), + ( + VariableInit( + ( + "let", + 2553..2556, + ), + ( + "result", + 2557..2563, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "lowercase", + 2566..2575, + ), + [ + ( + Command( + [ + ( + Trust, + 2576..2581, + ), + ], + [ + ( + Text( + "$", + ), + 2582..2583, + ), + ( + Text( + "echo", + ), + 2584..2588, + ), + ( + Escape( + "$", + ), + 2589..2591, + ), + ( + Text( + "REPLY", + ), + 2591..2596, + ), + ( + Text( + "$", + ), + 2597..2598, + ), + ], + [], + ), + 2576..2598, + ), + ], + [], + ), + 2566..2599, + ), + ), + 2566..2599, + ), + ), + 2553..2599, + ), + ( + Return( + ( + "return", + 2604..2610, + ), + Some( + ( + Or( + ( + Eq( + ( + Var( + ( + "result", + 2611..2617, + ), + ), + 2611..2617, + ), + ( + Text( + [ + ( + Text( + ( + "y", + 2622..2623, + ), + ), + 2622..2623, + ), + ], + ), + 2621..2624, + ), + ), + 2611..2624, + ), + ( + "or", + 2625..2627, + ), + ( + Parentheses( + ( + And( + ( + Eq( + ( + Var( + ( + "result", + 2629..2635, + ), + ), + 2629..2635, + ), + ( + Text( + [], + ), + 2639..2641, + ), + ), + 2629..2641, + ), + ( + "and", + 2642..2645, + ), + ( + Var( + ( + "default_yes", + 2646..2657, + ), + ), + 2646..2657, + ), + ), + 2629..2657, + ), + ), + 2628..2658, + ), + ), + 2611..2658, + ), + ), + ), + 2604..2658, + ), + ], + ), + 2258..2660, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if the command has failed.", + ), + 2662..2700, + ), + ), + 2662..2700, + ), + ), + 2662..2700, + ), + ( + FunctionDefinition( + [], + ( + true, + 2700..2703, + ), + ( + "fun", + 2704..2707, + ), + ( + "has_failed", + 2708..2718, + ), + [ + ( + Typed( + ( + false, + 2719..2719, + ), + ( + "command", + 2719..2726, + ), + ( + Text, + 2728..2732, + ), + ), + 2719..2732, + ), + ], + Some( + ( + Bool, + 2735..2739, + ), + ), + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 2746..2751, + ), + ( + Silent, + 2752..2758, + ), + ], + [ + ( + Text( + "$", + ), + 2759..2760, + ), + ( + Text( + "eval", + ), + 2761..2765, + ), + ( + Expression( + ( + Var( + ( + "command", + 2767..2774, + ), + ), + 2767..2774, + ), + ), + 2766..2775, + ), + ( + Text( + "$", + ), + 2776..2777, + ), + ], + [], + ), + 2746..2777, + ), + ), + 2746..2777, + ), + ( + Return( + ( + "return", + 2782..2788, + ), + Some( + ( + Neq( + ( + Status, + 2789..2795, + ), + ( + Int( + ( + 0, + 2799..2800, + ), + ), + 2799..2800, + ), + ), + 2789..2800, + ), + ), + ), + 2782..2800, + ), + ], + ), + 2700..2802, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if the script is running with a user with root permission.", + ), + 2804..2874, + ), + ), + 2804..2874, + ), + ), + 2804..2874, + ), + ( + FunctionDefinition( + [], + ( + true, + 2874..2877, + ), + ( + "fun", + 2878..2881, + ), + ( + "is_root", + 2882..2889, + ), + [], + Some( + ( + Bool, + 2893..2897, + ), + ), + [ + ( + IfCondition( + ( + "if", + 2904..2906, + ), + ( + IfCondition( + ( + Eq( + ( + Command( + [ + ( + Trust, + 2907..2912, + ), + ], + [ + ( + Text( + "$", + ), + 2913..2914, + ), + ( + Text( + "id", + ), + 2915..2917, + ), + ( + CommandOption( + "-u", + ), + 2918..2920, + ), + ( + Text( + "$", + ), + 2921..2922, + ), + ], + [], + ), + 2907..2922, + ), + ( + Text( + [ + ( + Text( + ( + "0", + 2927..2928, + ), + ), + 2927..2928, + ), + ], + ), + 2926..2929, + ), + ), + 2907..2929, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 2940..2946, + ), + Some( + ( + Boolean( + ( + true, + 2947..2951, + ), + ), + 2947..2951, + ), + ), + ), + 2940..2951, + ), + ], + ), + 2930..2957, + ), + ), + 2907..2957, + ), + [], + None, + ), + 2904..2957, + ), + ( + Return( + ( + "return", + 2963..2969, + ), + Some( + ( + Boolean( + ( + false, + 2970..2975, + ), + ), + 2970..2975, + ), + ), + ), + 2963..2975, + ), + ], + ), + 2874..2977, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "`printf` the text following the arguments.", + ), + 2979..3026, + ), + ), + 2979..3026, + ), + ), + 2979..3026, + ), + ( + FunctionDefinition( + [], + ( + true, + 3026..3029, + ), + ( + "fun", + 3030..3033, + ), + ( + "printf", + 3034..3040, + ), + [ + ( + Typed( + ( + false, + 3041..3041, + ), + ( + "format", + 3041..3047, + ), + ( + Text, + 3049..3053, + ), + ), + 3041..3053, + ), + ( + Optional( + ( + false, + 3055..3054, + ), + ( + "args", + 3055..3059, + ), + Some( + ( + [Text], + 3061..3067, + ), + ), + ( + Array( + [ + ( + Text( + [], + ), + 3071..3073, + ), + ], + ), + 3070..3074, + ), + ), + 3055..3074, + ), + ], + Some( + ( + Null, + 3077..3081, + ), + ), + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 3088..3093, + ), + ], + [ + ( + Text( + "$", + ), + 3094..3095, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 3097..3103, + ), + ( + Var( + ( + "args", + 3104..3108, + ), + ), + 3104..3108, + ), + ), + 3104..3108, + ), + ), + 3096..3109, + ), + ( + Text( + "=", + ), + 3109..3110, + ), + ( + Text( + "(", + ), + 3110..3111, + ), + ( + Text( + "\"", + ), + 3111..3112, + ), + ( + Expression( + ( + Var( + ( + "format", + 3113..3119, + ), + ), + 3113..3119, + ), + ), + 3112..3120, + ), + ( + Text( + "\"", + ), + 3120..3121, + ), + ( + Text( + "\"", + ), + 3122..3123, + ), + ( + Escape( + "$", + ), + 3123..3125, + ), + ( + Escape( + "{", + ), + 3125..3127, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 3128..3134, + ), + ( + Var( + ( + "args", + 3135..3139, + ), + ), + 3135..3139, + ), + ), + 3135..3139, + ), + ), + 3127..3140, + ), + ( + Text( + "[", + ), + 3140..3141, + ), + ( + Text( + "@", + ), + 3141..3142, + ), + ( + Text( + "]", + ), + 3142..3143, + ), + ( + Text( + "}", + ), + 3143..3144, + ), + ( + Text( + "\"", + ), + 3144..3145, + ), + ( + Text( + ")", + ), + 3145..3146, + ), + ( + Text( + "$", + ), + 3147..3148, + ), + ], + [], + ), + 3088..3148, + ), + ), + 3088..3148, + ), + ( + Expression( + ( + Command( + [ + ( + Trust, + 3153..3158, + ), + ], + [ + ( + Text( + "$", + ), + 3159..3160, + ), + ( + Text( + "printf", + ), + 3161..3167, + ), + ( + Text( + "\"", + ), + 3168..3169, + ), + ( + Escape( + "$", + ), + 3169..3171, + ), + ( + Escape( + "{", + ), + 3171..3173, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 3174..3180, + ), + ( + Var( + ( + "args", + 3181..3185, + ), + ), + 3181..3185, + ), + ), + 3181..3185, + ), + ), + 3173..3186, + ), + ( + Text( + "[", + ), + 3186..3187, + ), + ( + Text( + "@", + ), + 3187..3188, + ), + ( + Text( + "]", + ), + 3188..3189, + ), + ( + Text( + "}", + ), + 3189..3190, + ), + ( + Text( + "\"", + ), + 3190..3191, + ), + ( + Text( + "$", + ), + 3192..3193, + ), + ], + [], + ), + 3153..3193, + ), + ), + 3153..3193, + ), + ], + ), + 3026..3195, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Escapes the text to be used with `printf`.", + ), + 3197..3244, + ), + ), + 3197..3244, + ), + ), + 3197..3244, + ), + ( + FunctionDefinition( + [], + ( + true, + 3244..3247, + ), + ( + "fun", + 3248..3251, + ), + ( + "escaped", + 3252..3259, + ), + [ + ( + Typed( + ( + false, + 3260..3260, + ), + ( + "text", + 3260..3264, + ), + ( + Text, + 3266..3270, + ), + ), + 3260..3270, + ), + ], + Some( + ( + Text, + 3273..3277, + ), + ), + [ + ( + Return( + ( + "return", + 3284..3290, + ), + Some( + ( + Command( + [ + ( + Trust, + 3291..3296, + ), + ], + [ + ( + Text( + "$", + ), + 3297..3298, + ), + ( + Text( + "echo", + ), + 3299..3303, + ), + ( + Escape( + "$", + ), + 3304..3306, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 3307..3313, + ), + ( + Var( + ( + "text", + 3314..3318, + ), + ), + 3314..3318, + ), + ), + 3314..3318, + ), + ), + 3306..3319, + ), + ( + Text( + "|", + ), + 3320..3321, + ), + ( + Text( + "sed", + ), + 3322..3325, + ), + ( + CommandOption( + "-e", + ), + 3326..3328, + ), + ( + Text( + "'s", + ), + 3329..3331, + ), + ( + Text( + "/", + ), + 3331..3332, + ), + ( + Escape( + "\\", + ), + 3332..3334, + ), + ( + Escape( + "\\", + ), + 3334..3336, + ), + ( + Text( + "/", + ), + 3336..3337, + ), + ( + Escape( + "\\", + ), + 3337..3339, + ), + ( + Escape( + "\\", + ), + 3339..3341, + ), + ( + Escape( + "\\", + ), + 3341..3343, + ), + ( + Escape( + "\\", + ), + 3343..3345, + ), + ( + Text( + "/", + ), + 3345..3346, + ), + ( + Text( + "g'", + ), + 3346..3348, + ), + ( + CommandOption( + "-e", + ), + 3349..3351, + ), + ( + Text( + "\"", + ), + 3352..3353, + ), + ( + Text( + "s", + ), + 3353..3354, + ), + ( + Text( + "/", + ), + 3354..3355, + ), + ( + Text( + "%", + ), + 3355..3356, + ), + ( + Text( + "/", + ), + 3356..3357, + ), + ( + Text( + "%", + ), + 3357..3358, + ), + ( + Text( + "%", + ), + 3358..3359, + ), + ( + Text( + "/", + ), + 3359..3360, + ), + ( + Text( + "g", + ), + 3360..3361, + ), + ( + Text( + "\"", + ), + 3361..3362, + ), + ( + Text( + "$", + ), + 3363..3364, + ), + ], + [], + ), + 3291..3364, + ), + ), + ), + 3284..3364, + ), + ], + ), + 3244..3366, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Prepares a text with formatting options for `printf`.", + ), + 3368..3426, + ), + ), + 3368..3426, + ), + ), + 3368..3426, + ), + ( + FunctionDefinition( + [], + ( + true, + 3426..3429, + ), + ( + "fun", + 3430..3433, + ), + ( + "styled", + 3434..3440, + ), + [ + ( + Typed( + ( + false, + 3441..3441, + ), + ( + "message", + 3441..3448, + ), + ( + Text, + 3450..3454, + ), + ), + 3441..3454, + ), + ( + Typed( + ( + false, + 3456..3455, + ), + ( + "style", + 3456..3461, + ), + ( + Num, + 3463..3466, + ), + ), + 3456..3466, + ), + ( + Typed( + ( + false, + 3468..3467, + ), + ( + "fg", + 3468..3470, + ), + ( + Num, + 3472..3475, + ), + ), + 3468..3475, + ), + ( + Typed( + ( + false, + 3477..3476, + ), + ( + "bg", + 3477..3479, + ), + ( + Num, + 3481..3484, + ), + ), + 3477..3484, + ), + ], + Some( + ( + Text, + 3487..3491, + ), + ), + [ + ( + Return( + ( + "return", + 3498..3504, + ), + Some( + ( + Text( + [ + ( + Escape( + ( + "x1b", + 3506..3510, + ), + ), + 3506..3510, + ), + ( + Text( + ( + "[", + 3510..3511, + ), + ), + 3510..3511, + ), + ( + Expression( + ( + Var( + ( + "style", + 3512..3517, + ), + ), + 3512..3517, + ), + ), + 3511..3518, + ), + ( + Text( + ( + ";", + 3518..3519, + ), + ), + 3518..3519, + ), + ( + Expression( + ( + Var( + ( + "fg", + 3520..3522, + ), + ), + 3520..3522, + ), + ), + 3519..3523, + ), + ( + Text( + ( + ";", + 3523..3524, + ), + ), + 3523..3524, + ), + ( + Expression( + ( + Var( + ( + "bg", + 3525..3527, + ), + ), + 3525..3527, + ), + ), + 3524..3528, + ), + ( + Text( + ( + "m", + 3528..3529, + ), + ), + 3528..3529, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "escaped", + 3530..3537, + ), + [ + ( + Var( + ( + "message", + 3538..3545, + ), + ), + 3538..3545, + ), + ], + [], + ), + 3530..3546, + ), + ), + 3529..3547, + ), + ( + Escape( + ( + "x1b", + 3547..3551, + ), + ), + 3547..3551, + ), + ( + Text( + ( + "[", + 3551..3552, + ), + ), + 3551..3552, + ), + ( + Text( + ( + "0m", + 3552..3554, + ), + ), + 3552..3554, + ), + ], + ), + 3505..3555, + ), + ), + ), + 3498..3555, + ), + ], + ), + 3426..3557, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns a text as bold.", + ), + 3559..3587, + ), + ), + 3559..3587, + ), + ), + 3559..3587, + ), + ( + FunctionDefinition( + [], + ( + true, + 3587..3590, + ), + ( + "fun", + 3591..3594, + ), + ( + "bold", + 3595..3599, + ), + [ + ( + Typed( + ( + false, + 3600..3600, + ), + ( + "message", + 3600..3607, + ), + ( + Text, + 3609..3613, + ), + ), + 3600..3613, + ), + ], + Some( + ( + Text, + 3616..3620, + ), + ), + [ + ( + Return( + ( + "return", + 3627..3633, + ), + Some( + ( + Text( + [ + ( + Escape( + ( + "x1b", + 3635..3639, + ), + ), + 3635..3639, + ), + ( + Text( + ( + "[", + 3639..3640, + ), + ), + 3639..3640, + ), + ( + Text( + ( + "1m", + 3640..3642, + ), + ), + 3640..3642, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "escaped", + 3643..3650, + ), + [ + ( + Var( + ( + "message", + 3651..3658, + ), + ), + 3651..3658, + ), + ], + [], + ), + 3643..3659, + ), + ), + 3642..3660, + ), + ( + Escape( + ( + "x1b", + 3660..3664, + ), + ), + 3660..3664, + ), + ( + Text( + ( + "[", + 3664..3665, + ), + ), + 3664..3665, + ), + ( + Text( + ( + "0m", + 3665..3667, + ), + ), + 3665..3667, + ), + ], + ), + 3634..3668, + ), + ), + ), + 3627..3668, + ), + ], + ), + 3587..3670, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns a text as italic.", + ), + 3672..3702, + ), + ), + 3672..3702, + ), + ), + 3672..3702, + ), + ( + FunctionDefinition( + [], + ( + true, + 3702..3705, + ), + ( + "fun", + 3706..3709, + ), + ( + "italic", + 3710..3716, + ), + [ + ( + Typed( + ( + false, + 3717..3717, + ), + ( + "message", + 3717..3724, + ), + ( + Text, + 3726..3730, + ), + ), + 3717..3730, + ), + ], + Some( + ( + Text, + 3733..3737, + ), + ), + [ + ( + Return( + ( + "return", + 3744..3750, + ), + Some( + ( + Text( + [ + ( + Escape( + ( + "x1b", + 3752..3756, + ), + ), + 3752..3756, + ), + ( + Text( + ( + "[", + 3756..3757, + ), + ), + 3756..3757, + ), + ( + Text( + ( + "3m", + 3757..3759, + ), + ), + 3757..3759, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "escaped", + 3760..3767, + ), + [ + ( + Var( + ( + "message", + 3768..3775, + ), + ), + 3768..3775, + ), + ], + [], + ), + 3760..3776, + ), + ), + 3759..3777, + ), + ( + Escape( + ( + "x1b", + 3777..3781, + ), + ), + 3777..3781, + ), + ( + Text( + ( + "[", + 3781..3782, + ), + ), + 3781..3782, + ), + ( + Text( + ( + "0m", + 3782..3784, + ), + ), + 3782..3784, + ), + ], + ), + 3751..3785, + ), + ), + ), + 3744..3785, + ), + ], + ), + 3702..3787, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns a text as underlined.", + ), + 3789..3823, + ), + ), + 3789..3823, + ), + ), + 3789..3823, + ), + ( + FunctionDefinition( + [], + ( + true, + 3823..3826, + ), + ( + "fun", + 3827..3830, + ), + ( + "underlined", + 3831..3841, + ), + [ + ( + Typed( + ( + false, + 3842..3842, + ), + ( + "message", + 3842..3849, + ), + ( + Text, + 3851..3855, + ), + ), + 3842..3855, + ), + ], + Some( + ( + Text, + 3858..3862, + ), + ), + [ + ( + Return( + ( + "return", + 3869..3875, + ), + Some( + ( + Text( + [ + ( + Escape( + ( + "x1b", + 3877..3881, + ), + ), + 3877..3881, + ), + ( + Text( + ( + "[", + 3881..3882, + ), + ), + 3881..3882, + ), + ( + Text( + ( + "4m", + 3882..3884, + ), + ), + 3882..3884, + ), + ( + Expression( + ( + FunctionInvocation( + [], + ( + "escaped", + 3885..3892, + ), + [ + ( + Var( + ( + "message", + 3893..3900, + ), + ), + 3893..3900, + ), + ], + [], + ), + 3885..3901, + ), + ), + 3884..3902, + ), + ( + Escape( + ( + "x1b", + 3902..3906, + ), + ), + 3902..3906, + ), + ( + Text( + ( + "[", + 3906..3907, + ), + ), + 3906..3907, + ), + ( + Text( + ( + "0m", + 3907..3909, + ), + ), + 3907..3909, + ), + ], + ), + 3876..3910, + ), + ), + ), + 3869..3910, + ), + ], + ), + 3823..3912, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Prints a text with a specified color.", + ), + 3914..3956, + ), + ), + 3914..3956, + ), + ), + 3914..3956, + ), + ( + FunctionDefinition( + [], + ( + true, + 3956..3959, + ), + ( + "fun", + 3960..3963, + ), + ( + "echo_colored", + 3964..3976, + ), + [ + ( + Typed( + ( + false, + 3977..3977, + ), + ( + "message", + 3977..3984, + ), + ( + Text, + 3986..3990, + ), + ), + 3977..3990, + ), + ( + Typed( + ( + false, + 3992..3991, + ), + ( + "color", + 3992..3997, + ), + ( + Num, + 3999..4002, + ), + ), + 3992..4002, + ), + ], + Some( + ( + Null, + 4005..4009, + ), + ), + [ + ( + Expression( + ( + FunctionInvocation( + [], + ( + "printf", + 4016..4022, + ), + [ + ( + Text( + [ + ( + Escape( + ( + "x1b", + 4024..4028, + ), + ), + 4024..4028, + ), + ( + Text( + ( + "[", + 4028..4029, + ), + ), + 4028..4029, + ), + ( + Expression( + ( + Cast( + ( + Var( + ( + "color", + 4030..4035, + ), + ), + 4030..4035, + ), + ( + "as", + 4036..4038, + ), + ( + Text, + 4039..4043, + ), + ), + 4030..4043, + ), + ), + 4029..4044, + ), + ( + Text( + ( + "m", + 4044..4045, + ), + ), + 4044..4045, + ), + ( + Text( + ( + "%", + 4045..4046, + ), + ), + 4045..4046, + ), + ( + Text( + ( + "s", + 4046..4047, + ), + ), + 4046..4047, + ), + ( + Escape( + ( + "x1b", + 4047..4051, + ), + ), + 4047..4051, + ), + ( + Text( + ( + "[", + 4051..4052, + ), + ), + 4051..4052, + ), + ( + Text( + ( + "0m", + 4052..4054, + ), + ), + 4052..4054, + ), + ( + Escape( + ( + "n", + 4054..4056, + ), + ), + 4054..4056, + ), + ], + ), + 4023..4057, + ), + ( + Array( + [ + ( + Var( + ( + "message", + 4060..4067, + ), + ), + 4060..4067, + ), + ], + ), + 4059..4068, + ), + ], + [], + ), + 4016..4069, + ), + ), + 4016..4069, + ), + ], + ), + 3956..4071, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Prints a text as a info message.", + ), + 4073..4110, + ), + ), + 4073..4110, + ), + ), + 4073..4110, + ), + ( + FunctionDefinition( + [], + ( + true, + 4110..4113, + ), + ( + "fun", + 4114..4117, + ), + ( + "echo_info", + 4118..4127, + ), + [ + ( + Typed( + ( + false, + 4128..4128, + ), + ( + "message", + 4128..4135, + ), + ( + Text, + 4137..4141, + ), + ), + 4128..4141, + ), + ], + Some( + ( + Null, + 4144..4148, + ), + ), + [ + ( + Expression( + ( + FunctionInvocation( + [], + ( + "printf", + 4155..4161, + ), + [ + ( + Text( + [ + ( + Escape( + ( + "x1b", + 4163..4167, + ), + ), + 4163..4167, + ), + ( + Text( + ( + "[", + 4167..4168, + ), + ), + 4167..4168, + ), + ( + Text( + ( + "1", + 4168..4169, + ), + ), + 4168..4169, + ), + ( + Text( + ( + ";", + 4169..4170, + ), + ), + 4169..4170, + ), + ( + Text( + ( + "3", + 4170..4171, + ), + ), + 4170..4171, + ), + ( + Text( + ( + ";", + 4171..4172, + ), + ), + 4171..4172, + ), + ( + Text( + ( + "97", + 4172..4174, + ), + ), + 4172..4174, + ), + ( + Text( + ( + ";", + 4174..4175, + ), + ), + 4174..4175, + ), + ( + Text( + ( + "44m", + 4175..4178, + ), + ), + 4175..4178, + ), + ( + Text( + ( + "%", + 4178..4179, + ), + ), + 4178..4179, + ), + ( + Text( + ( + "s", + 4179..4180, + ), + ), + 4179..4180, + ), + ( + Escape( + ( + "x1b", + 4180..4184, + ), + ), + 4180..4184, + ), + ( + Text( + ( + "[", + 4184..4185, + ), + ), + 4184..4185, + ), + ( + Text( + ( + "0m", + 4185..4187, + ), + ), + 4185..4187, + ), + ( + Escape( + ( + "n", + 4187..4189, + ), + ), + 4187..4189, + ), + ], + ), + 4162..4190, + ), + ( + Array( + [ + ( + Var( + ( + "message", + 4193..4200, + ), + ), + 4193..4200, + ), + ], + ), + 4192..4201, + ), + ], + [], + ), + 4155..4202, + ), + ), + 4155..4202, + ), + ], + ), + 4110..4204, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Prints a text as a success message.", + ), + 4206..4246, + ), + ), + 4206..4246, + ), + ), + 4206..4246, + ), + ( + FunctionDefinition( + [], + ( + true, + 4246..4249, + ), + ( + "fun", + 4250..4253, + ), + ( + "echo_success", + 4254..4266, + ), + [ + ( + Typed( + ( + false, + 4267..4267, + ), + ( + "message", + 4267..4274, + ), + ( + Text, + 4276..4280, + ), + ), + 4267..4280, + ), + ], + Some( + ( + Null, + 4283..4287, + ), + ), + [ + ( + Expression( + ( + FunctionInvocation( + [], + ( + "printf", + 4294..4300, + ), + [ + ( + Text( + [ + ( + Escape( + ( + "x1b", + 4302..4306, + ), + ), + 4302..4306, + ), + ( + Text( + ( + "[", + 4306..4307, + ), + ), + 4306..4307, + ), + ( + Text( + ( + "1", + 4307..4308, + ), + ), + 4307..4308, + ), + ( + Text( + ( + ";", + 4308..4309, + ), + ), + 4308..4309, + ), + ( + Text( + ( + "3", + 4309..4310, + ), + ), + 4309..4310, + ), + ( + Text( + ( + ";", + 4310..4311, + ), + ), + 4310..4311, + ), + ( + Text( + ( + "97", + 4311..4313, + ), + ), + 4311..4313, + ), + ( + Text( + ( + ";", + 4313..4314, + ), + ), + 4313..4314, + ), + ( + Text( + ( + "42m", + 4314..4317, + ), + ), + 4314..4317, + ), + ( + Text( + ( + "%", + 4317..4318, + ), + ), + 4317..4318, + ), + ( + Text( + ( + "s", + 4318..4319, + ), + ), + 4318..4319, + ), + ( + Escape( + ( + "x1b", + 4319..4323, + ), + ), + 4319..4323, + ), + ( + Text( + ( + "[", + 4323..4324, + ), + ), + 4323..4324, + ), + ( + Text( + ( + "0m", + 4324..4326, + ), + ), + 4324..4326, + ), + ( + Escape( + ( + "n", + 4326..4328, + ), + ), + 4326..4328, + ), + ], + ), + 4301..4329, + ), + ( + Array( + [ + ( + Var( + ( + "message", + 4332..4339, + ), + ), + 4332..4339, + ), + ], + ), + 4331..4340, + ), + ], + [], + ), + 4294..4341, + ), + ), + 4294..4341, + ), + ], + ), + 4246..4343, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Prints a text as a warning message.", + ), + 4345..4385, + ), + ), + 4345..4385, + ), + ), + 4345..4385, + ), + ( + FunctionDefinition( + [], + ( + true, + 4385..4388, + ), + ( + "fun", + 4389..4392, + ), + ( + "echo_warning", + 4393..4405, + ), + [ + ( + Typed( + ( + false, + 4406..4406, + ), + ( + "message", + 4406..4413, + ), + ( + Text, + 4415..4419, + ), + ), + 4406..4419, + ), + ], + Some( + ( + Null, + 4422..4426, + ), + ), + [ + ( + Expression( + ( + FunctionInvocation( + [], + ( + "printf", + 4433..4439, + ), + [ + ( + Text( + [ + ( + Escape( + ( + "x1b", + 4441..4445, + ), + ), + 4441..4445, + ), + ( + Text( + ( + "[", + 4445..4446, + ), + ), + 4445..4446, + ), + ( + Text( + ( + "1", + 4446..4447, + ), + ), + 4446..4447, + ), + ( + Text( + ( + ";", + 4447..4448, + ), + ), + 4447..4448, + ), + ( + Text( + ( + "3", + 4448..4449, + ), + ), + 4448..4449, + ), + ( + Text( + ( + ";", + 4449..4450, + ), + ), + 4449..4450, + ), + ( + Text( + ( + "97", + 4450..4452, + ), + ), + 4450..4452, + ), + ( + Text( + ( + ";", + 4452..4453, + ), + ), + 4452..4453, + ), + ( + Text( + ( + "43m", + 4453..4456, + ), + ), + 4453..4456, + ), + ( + Text( + ( + "%", + 4456..4457, + ), + ), + 4456..4457, + ), + ( + Text( + ( + "s", + 4457..4458, + ), + ), + 4457..4458, + ), + ( + Escape( + ( + "x1b", + 4458..4462, + ), + ), + 4458..4462, + ), + ( + Text( + ( + "[", + 4462..4463, + ), + ), + 4462..4463, + ), + ( + Text( + ( + "0m", + 4463..4465, + ), + ), + 4463..4465, + ), + ( + Escape( + ( + "n", + 4465..4467, + ), + ), + 4465..4467, + ), + ], + ), + 4440..4468, + ), + ( + Array( + [ + ( + Var( + ( + "message", + 4471..4478, + ), + ), + 4471..4478, + ), + ], + ), + 4470..4479, + ), + ], + [], + ), + 4433..4480, + ), + ), + 4433..4480, + ), + ], + ), + 4385..4482, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Prints a text as a error and exits if the status code is greater than 0.", + ), + 4484..4561, + ), + ), + 4484..4561, + ), + ), + 4484..4561, + ), + ( + FunctionDefinition( + [], + ( + true, + 4561..4564, + ), + ( + "fun", + 4565..4568, + ), + ( + "echo_error", + 4569..4579, + ), + [ + ( + Typed( + ( + false, + 4580..4580, + ), + ( + "message", + 4580..4587, + ), + ( + Text, + 4589..4593, + ), + ), + 4580..4593, + ), + ( + Optional( + ( + false, + 4595..4594, + ), + ( + "exit_code", + 4595..4604, + ), + Some( + ( + Int, + 4606..4609, + ), + ), + ( + Int( + ( + 1, + 4612..4613, + ), + ), + 4612..4613, + ), + ), + 4595..4613, + ), + ], + Some( + ( + Null, + 4616..4620, + ), + ), + [ + ( + Expression( + ( + FunctionInvocation( + [], + ( + "printf", + 4627..4633, + ), + [ + ( + Text( + [ + ( + Escape( + ( + "x1b", + 4635..4639, + ), + ), + 4635..4639, + ), + ( + Text( + ( + "[", + 4639..4640, + ), + ), + 4639..4640, + ), + ( + Text( + ( + "1", + 4640..4641, + ), + ), + 4640..4641, + ), + ( + Text( + ( + ";", + 4641..4642, + ), + ), + 4641..4642, + ), + ( + Text( + ( + "3", + 4642..4643, + ), + ), + 4642..4643, + ), + ( + Text( + ( + ";", + 4643..4644, + ), + ), + 4643..4644, + ), + ( + Text( + ( + "97", + 4644..4646, + ), + ), + 4644..4646, + ), + ( + Text( + ( + ";", + 4646..4647, + ), + ), + 4646..4647, + ), + ( + Text( + ( + "41m", + 4647..4650, + ), + ), + 4647..4650, + ), + ( + Text( + ( + "%", + 4650..4651, + ), + ), + 4650..4651, + ), + ( + Text( + ( + "s", + 4651..4652, + ), + ), + 4651..4652, + ), + ( + Escape( + ( + "x1b", + 4652..4656, + ), + ), + 4652..4656, + ), + ( + Text( + ( + "[", + 4656..4657, + ), + ), + 4656..4657, + ), + ( + Text( + ( + "0m", + 4657..4659, + ), + ), + 4657..4659, + ), + ( + Escape( + ( + "n", + 4659..4661, + ), + ), + 4659..4661, + ), + ], + ), + 4634..4662, + ), + ( + Array( + [ + ( + Var( + ( + "message", + 4665..4672, + ), + ), + 4665..4672, + ), + ], + ), + 4664..4673, + ), + ], + [], + ), + 4627..4674, + ), + ), + 4627..4674, + ), + ( + IfCondition( + ( + "if", + 4679..4681, + ), + ( + IfCondition( + ( + Gt( + ( + Var( + ( + "exit_code", + 4682..4691, + ), + ), + 4682..4691, + ), + ( + Int( + ( + 0, + 4694..4695, + ), + ), + 4694..4695, + ), + ), + 4682..4695, + ), + ( + Singleline( + ( + Expression( + ( + Exit( + ( + "exit", + 4698..4702, + ), + Some( + ( + Parentheses( + ( + Var( + ( + "exit_code", + 4703..4712, + ), + ), + 4703..4712, + ), + ), + 4702..4713, + ), + ), + ), + 4698..4713, + ), + ), + 4698..4713, + ), + ), + 4696..4713, + ), + ), + 4682..4713, + ), + [], + None, + ), + 4679..4713, + ), + ], + ), + 4561..4715, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns current bash version with major, minor and patch components.", + ), + 4717..4790, + ), + ), + 4717..4790, + ), + ), + 4717..4790, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 4790..4810, + ), + ], + ( + true, + 4811..4814, + ), + ( + "fun", + 4815..4818, + ), + ( + "bash_version", + 4819..4831, + ), + [], + Some( + ( + [Int], + 4835..4840, + ), + ), + [ + ( + VariableInit( + ( + "let", + 4847..4850, + ), + ( + "major", + 4851..4856, + ), + ( + Expression( + ( + Cast( + ( + Command( + [ + ( + Trust, + 4859..4864, + ), + ], + [ + ( + Text( + "$", + ), + 4865..4866, + ), + ( + Text( + "echo", + ), + 4867..4871, + ), + ( + Text( + "\"", + ), + 4872..4873, + ), + ( + Escape( + "$", + ), + 4873..4875, + ), + ( + Escape( + "{", + ), + 4875..4877, + ), + ( + Text( + "BASH_VERSINFO", + ), + 4877..4890, + ), + ( + Text( + "[", + ), + 4890..4891, + ), + ( + Text( + "0", + ), + 4891..4892, + ), + ( + Text( + "]", + ), + 4892..4893, + ), + ( + Text( + "}", + ), + 4893..4894, + ), + ( + Text( + "\"", + ), + 4894..4895, + ), + ( + Text( + "$", + ), + 4896..4897, + ), + ], + [], + ), + 4859..4897, + ), + ( + "as", + 4898..4900, + ), + ( + Int, + 4901..4904, + ), + ), + 4859..4904, + ), + ), + 4859..4904, + ), + ), + 4847..4904, + ), + ( + VariableInit( + ( + "let", + 4909..4912, + ), + ( + "minor", + 4913..4918, + ), + ( + Expression( + ( + Cast( + ( + Command( + [ + ( + Trust, + 4921..4926, + ), + ], + [ + ( + Text( + "$", + ), + 4927..4928, + ), + ( + Text( + "echo", + ), + 4929..4933, + ), + ( + Text( + "\"", + ), + 4934..4935, + ), + ( + Escape( + "$", + ), + 4935..4937, + ), + ( + Escape( + "{", + ), + 4937..4939, + ), + ( + Text( + "BASH_VERSINFO", + ), + 4939..4952, + ), + ( + Text( + "[", + ), + 4952..4953, + ), + ( + Text( + "1", + ), + 4953..4954, + ), + ( + Text( + "]", + ), + 4954..4955, + ), + ( + Text( + "}", + ), + 4955..4956, + ), + ( + Text( + "\"", + ), + 4956..4957, + ), + ( + Text( + "$", + ), + 4958..4959, + ), + ], + [], + ), + 4921..4959, + ), + ( + "as", + 4960..4962, + ), + ( + Int, + 4963..4966, + ), + ), + 4921..4966, + ), + ), + 4921..4966, + ), + ), + 4909..4966, + ), + ( + VariableInit( + ( + "let", + 4971..4974, + ), + ( + "patch", + 4975..4980, + ), + ( + Expression( + ( + Cast( + ( + Command( + [ + ( + Trust, + 4983..4988, + ), + ], + [ + ( + Text( + "$", + ), + 4989..4990, + ), + ( + Text( + "echo", + ), + 4991..4995, + ), + ( + Text( + "\"", + ), + 4996..4997, + ), + ( + Escape( + "$", + ), + 4997..4999, + ), + ( + Escape( + "{", + ), + 4999..5001, + ), + ( + Text( + "BASH_VERSINFO", + ), + 5001..5014, + ), + ( + Text( + "[", + ), + 5014..5015, + ), + ( + Text( + "2", + ), + 5015..5016, + ), + ( + Text( + "]", + ), + 5016..5017, + ), + ( + Text( + "}", + ), + 5017..5018, + ), + ( + Text( + "\"", + ), + 5018..5019, + ), + ( + Text( + "$", + ), + 5020..5021, + ), + ], + [], + ), + 4983..5021, + ), + ( + "as", + 5022..5024, + ), + ( + Int, + 5025..5028, + ), + ), + 4983..5028, + ), + ), + 4983..5028, + ), + ), + 4971..5028, + ), + ( + Return( + ( + "return", + 5033..5039, + ), + Some( + ( + Array( + [ + ( + Var( + ( + "major", + 5041..5046, + ), + ), + 5041..5046, + ), + ( + Var( + ( + "minor", + 5048..5053, + ), + ), + 5048..5053, + ), + ( + Var( + ( + "patch", + 5055..5060, + ), + ), + 5055..5060, + ), + ], + ), + 5040..5061, + ), + ), + ), + 5033..5061, + ), + ], + ), + 4790..5063, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap new file mode 100644 index 0000000..2b46bfa --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap @@ -0,0 +1,7289 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokenize(&stdlib)) +--- +[ + ( + Import( + ( + false, + 0..6, + ), + ( + "import", + 0..6, + ), + ( + ImportSpecific( + [ + ( + "match_regex", + 9..20, + ), + ( + "join", + 22..26, + ), + ( + "replace_regex", + 28..41, + ), + ( + "split", + 43..48, + ), + ( + "trim", + 50..54, + ), + ], + ), + 7..56, + ), + ( + "from", + 57..61, + ), + ( + "std/text", + 62..72, + ), + ), + 0..72, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if a directory exists.", + ), + 74..108, + ), + ), + 74..108, + ), + ), + 74..108, + ), + ( + FunctionDefinition( + [], + ( + true, + 108..111, + ), + ( + "fun", + 112..115, + ), + ( + "dir_exists", + 116..126, + ), + [ + ( + Generic( + ( + false, + 127..127, + ), + ( + "path", + 127..131, + ), + ), + 127..131, + ), + ], + None, + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 139..140, + ), + ( + Text( + "[", + ), + 141..142, + ), + ( + CommandOption( + "-d", + ), + 143..145, + ), + ( + Text( + "\"", + ), + 146..147, + ), + ( + Expression( + ( + Var( + ( + "path", + 148..152, + ), + ), + 148..152, + ), + ), + 147..153, + ), + ( + Text( + "\"", + ), + 153..154, + ), + ( + Text( + "]", + ), + 155..156, + ), + ( + Text( + "$", + ), + 157..158, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 159..165, + ), + None, + ( + Block( + [], + [ + ( + Return( + ( + "return", + 176..182, + ), + Some( + ( + Boolean( + ( + false, + 183..188, + ), + ), + 183..188, + ), + ), + ), + 176..188, + ), + ], + ), + 166..194, + ), + ), + 159..194, + ), + ), + 159..194, + ), + ], + ), + 139..194, + ), + ), + 139..194, + ), + ( + Return( + ( + "return", + 199..205, + ), + Some( + ( + Boolean( + ( + true, + 206..210, + ), + ), + 206..210, + ), + ), + ), + 199..210, + ), + ], + ), + 108..212, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if a file exists.", + ), + 214..243, + ), + ), + 214..243, + ), + ), + 214..243, + ), + ( + FunctionDefinition( + [], + ( + true, + 243..246, + ), + ( + "fun", + 247..250, + ), + ( + "file_exists", + 251..262, + ), + [ + ( + Generic( + ( + false, + 263..263, + ), + ( + "path", + 263..267, + ), + ), + 263..267, + ), + ], + None, + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 275..276, + ), + ( + Text( + "[", + ), + 277..278, + ), + ( + CommandOption( + "-f", + ), + 279..281, + ), + ( + Text( + "\"", + ), + 282..283, + ), + ( + Expression( + ( + Var( + ( + "path", + 284..288, + ), + ), + 284..288, + ), + ), + 283..289, + ), + ( + Text( + "\"", + ), + 289..290, + ), + ( + Text( + "]", + ), + 291..292, + ), + ( + Text( + "$", + ), + 293..294, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 295..301, + ), + None, + ( + Block( + [], + [ + ( + Return( + ( + "return", + 312..318, + ), + Some( + ( + Boolean( + ( + false, + 319..324, + ), + ), + 319..324, + ), + ), + ), + 312..324, + ), + ], + ), + 302..330, + ), + ), + 295..330, + ), + ), + 295..330, + ), + ], + ), + 275..330, + ), + ), + 275..330, + ), + ( + Return( + ( + "return", + 335..341, + ), + Some( + ( + Boolean( + ( + true, + 342..346, + ), + ), + 342..346, + ), + ), + ), + 335..346, + ), + ], + ), + 243..348, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Gets file contents from a path.", + ), + 350..386, + ), + ), + 350..386, + ), + ), + 350..386, + ), + ( + FunctionDefinition( + [], + ( + true, + 386..389, + ), + ( + "fun", + 390..393, + ), + ( + "file_read", + 394..403, + ), + [ + ( + Generic( + ( + false, + 404..404, + ), + ( + "path", + 404..408, + ), + ), + 404..408, + ), + ], + None, + [ + ( + Return( + ( + "return", + 416..422, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 423..424, + ), + ( + Text( + "<", + ), + 425..426, + ), + ( + Text( + "\"", + ), + 427..428, + ), + ( + Expression( + ( + Var( + ( + "path", + 429..433, + ), + ), + 429..433, + ), + ), + 428..434, + ), + ( + Text( + "\"", + ), + 434..435, + ), + ( + Text( + "$", + ), + 436..437, + ), + ], + [ + ( + Failure( + ( + Propagate, + 437..438, + ), + ), + 437..438, + ), + ], + ), + 423..438, + ), + ), + ), + 416..438, + ), + ], + ), + 386..440, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Writes content to a file.", + ), + 442..472, + ), + ), + 442..472, + ), + ), + 442..472, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Doesn't check if the file exist", + ), + 472..508, + ), + ), + 472..508, + ), + ), + 472..508, + ), + ( + FunctionDefinition( + [], + ( + true, + 508..511, + ), + ( + "fun", + 512..515, + ), + ( + "file_write", + 516..526, + ), + [ + ( + Generic( + ( + false, + 527..527, + ), + ( + "path", + 527..531, + ), + ), + 527..531, + ), + ( + Generic( + ( + false, + 533..532, + ), + ( + "content", + 533..540, + ), + ), + 533..540, + ), + ], + None, + [ + ( + Return( + ( + "return", + 548..554, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 555..556, + ), + ( + Text( + "echo", + ), + 557..561, + ), + ( + Text( + "\"", + ), + 562..563, + ), + ( + Expression( + ( + Var( + ( + "content", + 564..571, + ), + ), + 564..571, + ), + ), + 563..572, + ), + ( + Text( + "\"", + ), + 572..573, + ), + ( + Text( + ">", + ), + 574..575, + ), + ( + Text( + "\"", + ), + 576..577, + ), + ( + Expression( + ( + Var( + ( + "path", + 578..582, + ), + ), + 578..582, + ), + ), + 577..583, + ), + ( + Text( + "\"", + ), + 583..584, + ), + ( + Text( + "$", + ), + 585..586, + ), + ], + [ + ( + Failure( + ( + Propagate, + 586..587, + ), + ), + 586..587, + ), + ], + ), + 555..587, + ), + ), + ), + 548..587, + ), + ], + ), + 508..589, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Appends content to a file.", + ), + 591..622, + ), + ), + 591..622, + ), + ), + 591..622, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 622..626, + ), + ), + 622..626, + ), + ), + 622..626, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Doesn't check if the file exists.", + ), + 626..664, + ), + ), + 626..664, + ), + ), + 626..664, + ), + ( + FunctionDefinition( + [], + ( + true, + 664..667, + ), + ( + "fun", + 668..671, + ), + ( + "file_append", + 672..683, + ), + [ + ( + Generic( + ( + false, + 684..684, + ), + ( + "path", + 684..688, + ), + ), + 684..688, + ), + ( + Generic( + ( + false, + 690..689, + ), + ( + "content", + 690..697, + ), + ), + 690..697, + ), + ], + None, + [ + ( + Return( + ( + "return", + 705..711, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 712..713, + ), + ( + Text( + "echo", + ), + 714..718, + ), + ( + Text( + "\"", + ), + 719..720, + ), + ( + Expression( + ( + Var( + ( + "content", + 721..728, + ), + ), + 721..728, + ), + ), + 720..729, + ), + ( + Text( + "\"", + ), + 729..730, + ), + ( + Text( + ">", + ), + 731..732, + ), + ( + Text( + ">", + ), + 732..733, + ), + ( + Text( + "\"", + ), + 734..735, + ), + ( + Expression( + ( + Var( + ( + "path", + 736..740, + ), + ), + 736..740, + ), + ), + 735..741, + ), + ( + Text( + "\"", + ), + 741..742, + ), + ( + Text( + "$", + ), + 743..744, + ), + ], + [ + ( + Failure( + ( + Propagate, + 744..745, + ), + ), + 744..745, + ), + ], + ), + 712..745, + ), + ), + ), + 705..745, + ), + ], + ), + 664..747, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Creates a symbolic link.", + ), + 749..778, + ), + ), + 749..778, + ), + ), + 749..778, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 778..782, + ), + ), + 778..782, + ), + ), + 778..782, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If the file doesn't exist, it returns a boolean and prints a message.", + ), + 782..856, + ), + ), + 782..856, + ), + ), + 782..856, + ), + ( + FunctionDefinition( + [], + ( + true, + 856..859, + ), + ( + "fun", + 860..863, + ), + ( + "symlink_create", + 864..878, + ), + [ + ( + Typed( + ( + false, + 879..879, + ), + ( + "origin", + 879..885, + ), + ( + Text, + 887..891, + ), + ), + 879..891, + ), + ( + Typed( + ( + false, + 893..892, + ), + ( + "destination", + 893..904, + ), + ( + Text, + 906..910, + ), + ), + 893..910, + ), + ], + Some( + ( + Bool, + 913..917, + ), + ), + [ + ( + IfCondition( + ( + "if", + 924..926, + ), + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "file_exists", + 927..938, + ), + [ + ( + Var( + ( + "origin", + 939..945, + ), + ), + 939..945, + ), + ], + [], + ), + 927..946, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 957..962, + ), + ], + [ + ( + Text( + "$", + ), + 963..964, + ), + ( + Text( + "ln", + ), + 965..967, + ), + ( + CommandOption( + "-s", + ), + 968..970, + ), + ( + Text( + "\"", + ), + 971..972, + ), + ( + Expression( + ( + Var( + ( + "origin", + 973..979, + ), + ), + 973..979, + ), + ), + 972..980, + ), + ( + Text( + "\"", + ), + 980..981, + ), + ( + Text( + "\"", + ), + 982..983, + ), + ( + Expression( + ( + Var( + ( + "destination", + 984..995, + ), + ), + 984..995, + ), + ), + 983..996, + ), + ( + Text( + "\"", + ), + 996..997, + ), + ( + Text( + "$", + ), + 998..999, + ), + ], + [], + ), + 957..999, + ), + ), + 957..999, + ), + ( + Return( + ( + "return", + 1008..1014, + ), + Some( + ( + Boolean( + ( + true, + 1015..1019, + ), + ), + 1015..1019, + ), + ), + ), + 1008..1019, + ), + ], + ), + 947..1025, + ), + ), + 927..1025, + ), + [], + None, + ), + 924..1025, + ), + ( + Echo( + ( + "echo", + 1031..1035, + ), + ( + Text( + [ + ( + Text( + ( + "The", + 1037..1040, + ), + ), + 1037..1040, + ), + ( + Text( + ( + "file", + 1041..1045, + ), + ), + 1041..1045, + ), + ( + Expression( + ( + Var( + ( + "origin", + 1047..1053, + ), + ), + 1047..1053, + ), + ), + 1046..1054, + ), + ( + Text( + ( + "doesn't", + 1055..1062, + ), + ), + 1055..1062, + ), + ( + Text( + ( + "exist", + 1063..1068, + ), + ), + 1063..1068, + ), + ( + Text( + ( + "!", + 1068..1069, + ), + ), + 1068..1069, + ), + ], + ), + 1036..1070, + ), + ), + 1031..1070, + ), + ( + Return( + ( + "return", + 1075..1081, + ), + Some( + ( + Boolean( + ( + false, + 1082..1087, + ), + ), + 1082..1087, + ), + ), + ), + 1075..1087, + ), + ], + ), + 856..1089, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Creates a directory with all parent directories as required.", + ), + 1091..1156, + ), + ), + 1091..1156, + ), + ), + 1091..1156, + ), + ( + FunctionDefinition( + [], + ( + true, + 1156..1159, + ), + ( + "fun", + 1160..1163, + ), + ( + "dir_create", + 1164..1174, + ), + [ + ( + Typed( + ( + false, + 1175..1175, + ), + ( + "path", + 1175..1179, + ), + ( + Text, + 1181..1185, + ), + ), + 1175..1185, + ), + ], + Some( + ( + Null, + 1188..1192, + ), + ), + [ + ( + IfCondition( + ( + "if", + 1199..1201, + ), + ( + IfCondition( + ( + Not( + ( + "not", + 1202..1205, + ), + ( + FunctionInvocation( + [], + ( + "dir_exists", + 1206..1216, + ), + [ + ( + Var( + ( + "path", + 1217..1221, + ), + ), + 1217..1221, + ), + ], + [], + ), + 1206..1222, + ), + ), + 1206..1222, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 1233..1238, + ), + ], + [ + ( + Text( + "$", + ), + 1239..1240, + ), + ( + Text( + "mkdir", + ), + 1241..1246, + ), + ( + CommandOption( + "-p", + ), + 1247..1249, + ), + ( + Text( + "\"", + ), + 1250..1251, + ), + ( + Expression( + ( + Var( + ( + "path", + 1252..1256, + ), + ), + 1252..1256, + ), + ), + 1251..1257, + ), + ( + Text( + "\"", + ), + 1257..1258, + ), + ( + Text( + "$", + ), + 1259..1260, + ), + ], + [], + ), + 1233..1260, + ), + ), + 1233..1260, + ), + ], + ), + 1223..1266, + ), + ), + 1202..1266, + ), + [], + None, + ), + 1199..1266, + ), + ], + ), + 1156..1268, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Determine whether mktemp is macOS's.", + ), + 1270..1311, + ), + ), + 1270..1311, + ), + ), + 1270..1311, + ), + ( + FunctionDefinition( + [], + ( + false, + 1311..1311, + ), + ( + "fun", + 1311..1314, + ), + ( + "is_mac_os_mktemp", + 1315..1331, + ), + [], + Some( + ( + Bool, + 1335..1339, + ), + ), + [ + ( + Comment( + ( + Comment( + "macOS's mktemp does not have --version", + ), + 1346..1388, + ), + ), + 1346..1388, + ), + ( + Expression( + ( + Command( + [ + ( + Silent, + 1392..1398, + ), + ], + [ + ( + Text( + "$", + ), + 1399..1400, + ), + ( + Text( + "mktemp", + ), + 1401..1407, + ), + ( + CommandOption( + "--version", + ), + 1408..1417, + ), + ( + Text( + "$", + ), + 1418..1419, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 1420..1426, + ), + None, + ( + Block( + [], + [ + ( + Return( + ( + "return", + 1437..1443, + ), + Some( + ( + Boolean( + ( + true, + 1444..1448, + ), + ), + 1444..1448, + ), + ), + ), + 1437..1448, + ), + ], + ), + 1427..1454, + ), + ), + 1420..1454, + ), + ), + 1420..1454, + ), + ], + ), + 1392..1454, + ), + ), + 1392..1454, + ), + ( + Return( + ( + "return", + 1459..1465, + ), + Some( + ( + Boolean( + ( + false, + 1466..1471, + ), + ), + 1466..1471, + ), + ), + ), + 1459..1471, + ), + ], + ), + 1311..1473, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Create a temporary directory and return the path.", + ), + 1475..1529, + ), + ), + 1475..1529, + ), + ), + 1475..1529, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Please note this does not respect _CS_DARWIN_USER_TEMP_DIR environment variable.", + ), + 1529..1614, + ), + ), + 1529..1614, + ), + ), + 1529..1614, + ), + ( + FunctionDefinition( + [], + ( + true, + 1614..1617, + ), + ( + "fun", + 1618..1621, + ), + ( + "temp_dir_create", + 1622..1637, + ), + [ + ( + Optional( + ( + false, + 1647..1638, + ), + ( + "template", + 1647..1655, + ), + Some( + ( + Text, + 1657..1661, + ), + ), + ( + Text( + [ + ( + Text( + ( + "tmp", + 1665..1668, + ), + ), + 1665..1668, + ), + ( + Text( + ( + ".", + 1668..1669, + ), + ), + 1668..1669, + ), + ( + Text( + ( + "XXXXXXXXXX", + 1669..1679, + ), + ), + 1669..1679, + ), + ], + ), + 1664..1680, + ), + ), + 1647..1680, + ), + ( + Optional( + ( + false, + 1690..1681, + ), + ( + "auto_delete", + 1690..1701, + ), + Some( + ( + Bool, + 1703..1707, + ), + ), + ( + Boolean( + ( + false, + 1710..1715, + ), + ), + 1710..1715, + ), + ), + 1690..1715, + ), + ( + Optional( + ( + false, + 1725..1716, + ), + ( + "force_delete", + 1725..1737, + ), + Some( + ( + Bool, + 1739..1743, + ), + ), + ( + Boolean( + ( + false, + 1746..1751, + ), + ), + 1746..1751, + ), + ), + 1725..1751, + ), + ], + Some( + ( + Text?, + 1759..1764, + ), + ), + [ + ( + IfCondition( + ( + "if", + 1771..1773, + ), + ( + IfCondition( + ( + Eq( + ( + FunctionInvocation( + [], + ( + "trim", + 1774..1778, + ), + [ + ( + Var( + ( + "template", + 1779..1787, + ), + ), + 1779..1787, + ), + ], + [], + ), + 1774..1788, + ), + ( + Text( + [], + ), + 1792..1794, + ), + ), + 1774..1794, + ), + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 1805..1809, + ), + ( + Text( + [ + ( + Text( + ( + "The", + 1811..1814, + ), + ), + 1811..1814, + ), + ( + Text( + ( + "template", + 1815..1823, + ), + ), + 1815..1823, + ), + ( + Text( + ( + "cannot", + 1824..1830, + ), + ), + 1824..1830, + ), + ( + Text( + ( + "be", + 1831..1833, + ), + ), + 1831..1833, + ), + ( + Text( + ( + "an", + 1834..1836, + ), + ), + 1834..1836, + ), + ( + Text( + ( + "empty", + 1837..1842, + ), + ), + 1837..1842, + ), + ( + Text( + ( + "string", + 1843..1849, + ), + ), + 1843..1849, + ), + ( + Text( + ( + "!", + 1849..1850, + ), + ), + 1849..1850, + ), + ], + ), + 1810..1851, + ), + ), + 1805..1851, + ), + ( + Fail( + ( + "fail", + 1860..1864, + ), + Some( + ( + Int( + ( + 1, + 1865..1866, + ), + ), + 1865..1866, + ), + ), + ), + 1860..1866, + ), + ], + ), + 1795..1872, + ), + ), + 1774..1872, + ), + [], + None, + ), + 1771..1872, + ), + ( + VariableInit( + ( + "let", + 1878..1881, + ), + ( + "filename", + 1882..1890, + ), + ( + Expression( + ( + Text( + [], + ), + 1893..1895, + ), + ), + 1893..1895, + ), + ), + 1878..1895, + ), + ( + IfCondition( + ( + "if", + 1900..1902, + ), + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "is_mac_os_mktemp", + 1903..1919, + ), + [], + [], + ), + 1903..1921, + ), + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "usage: mktemp [-d] [-p tmpdir] [-q] [-t prefix] [-u] template ...", + ), + 1932..2001, + ), + ), + 1932..2001, + ), + ( + Comment( + ( + Comment( + "mktemp [-d] [-p tmpdir] [-q] [-u] -t prefix", + ), + 2009..2063, + ), + ), + 2009..2063, + ), + ( + VariableSet( + ( + "filename", + 2071..2079, + ), + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2082..2083, + ), + ( + Text( + "mktemp", + ), + 2084..2090, + ), + ( + CommandOption( + "-d", + ), + 2091..2093, + ), + ( + CommandOption( + "-p", + ), + 2094..2096, + ), + ( + Text( + "\"", + ), + 2097..2098, + ), + ( + Escape( + "$", + ), + 2098..2100, + ), + ( + Text( + "TMPDIR", + ), + 2100..2106, + ), + ( + Text( + "\"", + ), + 2106..2107, + ), + ( + Text( + "\"", + ), + 2108..2109, + ), + ( + Expression( + ( + Var( + ( + "template", + 2110..2118, + ), + ), + 2110..2118, + ), + ), + 2109..2119, + ), + ( + Text( + "\"", + ), + 2119..2120, + ), + ( + Text( + "$", + ), + 2121..2122, + ), + ], + [ + ( + Failure( + ( + Propagate, + 2122..2123, + ), + ), + 2122..2123, + ), + ], + ), + 2082..2123, + ), + ), + 2071..2123, + ), + ], + ), + 1922..2129, + ), + ), + 1903..2129, + ), + [], + Some( + ( + Else( + ( + "else", + 2130..2134, + ), + ( + Block( + [], + [ + ( + VariableSet( + ( + "filename", + 2145..2153, + ), + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2156..2157, + ), + ( + Text( + "mktemp", + ), + 2158..2164, + ), + ( + CommandOption( + "-d", + ), + 2165..2167, + ), + ( + CommandOption( + "-p", + ), + 2168..2170, + ), + ( + Text( + "\"", + ), + 2171..2172, + ), + ( + Escape( + "$", + ), + 2172..2174, + ), + ( + Text( + "TMPDIR", + ), + 2174..2180, + ), + ( + Text( + "\"", + ), + 2180..2181, + ), + ( + CommandOption( + "-t", + ), + 2182..2184, + ), + ( + Text( + "\"", + ), + 2185..2186, + ), + ( + Expression( + ( + Var( + ( + "template", + 2187..2195, + ), + ), + 2187..2195, + ), + ), + 2186..2196, + ), + ( + Text( + "\"", + ), + 2196..2197, + ), + ( + Text( + "$", + ), + 2198..2199, + ), + ], + [ + ( + Failure( + ( + Propagate, + 2199..2200, + ), + ), + 2199..2200, + ), + ], + ), + 2156..2200, + ), + ), + 2145..2200, + ), + ], + ), + 2135..2206, + ), + ), + 2130..2206, + ), + ), + ), + 1900..2206, + ), + ( + IfCondition( + ( + "if", + 2211..2213, + ), + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "filename", + 2214..2222, + ), + ), + 2214..2222, + ), + ( + Text( + [], + ), + 2226..2228, + ), + ), + 2214..2228, + ), + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 2239..2243, + ), + ( + Text( + [ + ( + Text( + ( + "Failed", + 2245..2251, + ), + ), + 2245..2251, + ), + ( + Text( + ( + "to", + 2252..2254, + ), + ), + 2252..2254, + ), + ( + Text( + ( + "make", + 2255..2259, + ), + ), + 2255..2259, + ), + ( + Text( + ( + "a", + 2260..2261, + ), + ), + 2260..2261, + ), + ( + Text( + ( + "temporary", + 2262..2271, + ), + ), + 2262..2271, + ), + ( + Text( + ( + "directory", + 2272..2281, + ), + ), + 2272..2281, + ), + ], + ), + 2244..2282, + ), + ), + 2239..2282, + ), + ( + Fail( + ( + "fail", + 2291..2295, + ), + Some( + ( + Int( + ( + 1, + 2296..2297, + ), + ), + 2296..2297, + ), + ), + ), + 2291..2297, + ), + ], + ), + 2229..2303, + ), + ), + 2214..2303, + ), + [], + None, + ), + 2211..2303, + ), + ( + IfCondition( + ( + "if", + 2308..2310, + ), + ( + IfCondition( + ( + Var( + ( + "auto_delete", + 2311..2322, + ), + ), + 2311..2322, + ), + ( + Block( + [], + [ + ( + IfCondition( + ( + "if", + 2333..2335, + ), + ( + IfCondition( + ( + Var( + ( + "force_delete", + 2336..2348, + ), + ), + 2336..2348, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2363..2364, + ), + ( + Text( + "trap", + ), + 2365..2369, + ), + ( + Text( + "'rm", + ), + 2370..2373, + ), + ( + CommandOption( + "-rf", + ), + 2374..2377, + ), + ( + Expression( + ( + Var( + ( + "filename", + 2379..2387, + ), + ), + 2379..2387, + ), + ), + 2378..2388, + ), + ( + Text( + "'", + ), + 2388..2389, + ), + ( + Text( + "EXIT", + ), + 2390..2394, + ), + ( + Text( + "$", + ), + 2395..2396, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 2397..2403, + ), + None, + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 2422..2426, + ), + ( + Text( + [ + ( + Text( + ( + "Setting", + 2428..2435, + ), + ), + 2428..2435, + ), + ( + Text( + ( + "auto", + 2436..2440, + ), + ), + 2436..2440, + ), + ( + Text( + ( + "deletion", + 2441..2449, + ), + ), + 2441..2449, + ), + ( + Text( + ( + "fails", + 2450..2455, + ), + ), + 2450..2455, + ), + ( + Text( + ( + ".", + 2455..2456, + ), + ), + 2455..2456, + ), + ( + Text( + ( + "You", + 2457..2460, + ), + ), + 2457..2460, + ), + ( + Text( + ( + "must", + 2461..2465, + ), + ), + 2461..2465, + ), + ( + Text( + ( + "delete", + 2466..2472, + ), + ), + 2466..2472, + ), + ( + Text( + ( + "temporary", + 2473..2482, + ), + ), + 2473..2482, + ), + ( + Text( + ( + "dir", + 2483..2486, + ), + ), + 2483..2486, + ), + ( + Expression( + ( + Var( + ( + "filename", + 2488..2496, + ), + ), + 2488..2496, + ), + ), + 2487..2497, + ), + ( + Text( + ( + ".", + 2497..2498, + ), + ), + 2497..2498, + ), + ], + ), + 2427..2499, + ), + ), + 2422..2499, + ), + ], + ), + 2404..2513, + ), + ), + 2397..2513, + ), + ), + 2397..2513, + ), + ], + ), + 2363..2513, + ), + ), + 2363..2513, + ), + ], + ), + 2349..2523, + ), + ), + 2336..2523, + ), + [], + Some( + ( + Else( + ( + "else", + 2524..2528, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2543..2544, + ), + ( + Text( + "trap", + ), + 2545..2549, + ), + ( + Text( + "'rmdir", + ), + 2550..2556, + ), + ( + Expression( + ( + Var( + ( + "filename", + 2558..2566, + ), + ), + 2558..2566, + ), + ), + 2557..2567, + ), + ( + Text( + "'", + ), + 2567..2568, + ), + ( + Text( + "EXIT", + ), + 2569..2573, + ), + ( + Text( + "$", + ), + 2574..2575, + ), + ], + [ + ( + Failure( + ( + Handle( + ( + "failed", + 2576..2582, + ), + None, + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 2601..2605, + ), + ( + Text( + [ + ( + Text( + ( + "Setting", + 2607..2614, + ), + ), + 2607..2614, + ), + ( + Text( + ( + "auto", + 2615..2619, + ), + ), + 2615..2619, + ), + ( + Text( + ( + "deletion", + 2620..2628, + ), + ), + 2620..2628, + ), + ( + Text( + ( + "fails", + 2629..2634, + ), + ), + 2629..2634, + ), + ( + Text( + ( + ".", + 2634..2635, + ), + ), + 2634..2635, + ), + ( + Text( + ( + "You", + 2636..2639, + ), + ), + 2636..2639, + ), + ( + Text( + ( + "must", + 2640..2644, + ), + ), + 2640..2644, + ), + ( + Text( + ( + "delete", + 2645..2651, + ), + ), + 2645..2651, + ), + ( + Text( + ( + "temporary", + 2652..2661, + ), + ), + 2652..2661, + ), + ( + Text( + ( + "dir", + 2662..2665, + ), + ), + 2662..2665, + ), + ( + Expression( + ( + Var( + ( + "filename", + 2667..2675, + ), + ), + 2667..2675, + ), + ), + 2666..2676, + ), + ( + Text( + ( + ".", + 2676..2677, + ), + ), + 2676..2677, + ), + ], + ), + 2606..2678, + ), + ), + 2601..2678, + ), + ], + ), + 2583..2692, + ), + ), + 2576..2692, + ), + ), + 2576..2692, + ), + ], + ), + 2543..2692, + ), + ), + 2543..2692, + ), + ], + ), + 2529..2702, + ), + ), + 2524..2702, + ), + ), + ), + 2333..2702, + ), + ], + ), + 2323..2708, + ), + ), + 2311..2708, + ), + [], + None, + ), + 2308..2708, + ), + ( + Return( + ( + "return", + 2713..2719, + ), + Some( + ( + Var( + ( + "filename", + 2720..2728, + ), + ), + 2720..2728, + ), + ), + ), + 2713..2728, + ), + ], + ), + 1614..2730, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Changes the permission bits of a file.", + ), + 2732..2775, + ), + ), + 2732..2775, + ), + ), + 2732..2775, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 2775..2779, + ), + ), + 2775..2779, + ), + ), + 2775..2779, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If the file doesn't exist, it returns `false` and prints a message.", + ), + 2779..2851, + ), + ), + 2779..2851, + ), + ), + 2779..2851, + ), + ( + FunctionDefinition( + [], + ( + true, + 2851..2854, + ), + ( + "fun", + 2855..2858, + ), + ( + "file_chmod", + 2859..2869, + ), + [ + ( + Typed( + ( + false, + 2870..2870, + ), + ( + "path", + 2870..2874, + ), + ( + Text, + 2876..2880, + ), + ), + 2870..2880, + ), + ( + Typed( + ( + false, + 2882..2881, + ), + ( + "mode", + 2882..2886, + ), + ( + Text, + 2888..2892, + ), + ), + 2882..2892, + ), + ], + Some( + ( + Bool, + 2895..2899, + ), + ), + [ + ( + IfCondition( + ( + "if", + 2906..2908, + ), + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "file_exists", + 2909..2920, + ), + [ + ( + Var( + ( + "path", + 2921..2925, + ), + ), + 2921..2925, + ), + ], + [], + ), + 2909..2926, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 2937..2942, + ), + ], + [ + ( + Text( + "$", + ), + 2943..2944, + ), + ( + Text( + "chmod", + ), + 2945..2950, + ), + ( + Text( + "\"", + ), + 2951..2952, + ), + ( + Expression( + ( + Var( + ( + "mode", + 2953..2957, + ), + ), + 2953..2957, + ), + ), + 2952..2958, + ), + ( + Text( + "\"", + ), + 2958..2959, + ), + ( + Text( + "\"", + ), + 2960..2961, + ), + ( + Expression( + ( + Var( + ( + "path", + 2962..2966, + ), + ), + 2962..2966, + ), + ), + 2961..2967, + ), + ( + Text( + "\"", + ), + 2967..2968, + ), + ( + Text( + "$", + ), + 2969..2970, + ), + ], + [], + ), + 2937..2970, + ), + ), + 2937..2970, + ), + ( + Return( + ( + "return", + 2979..2985, + ), + Some( + ( + Boolean( + ( + true, + 2986..2990, + ), + ), + 2986..2990, + ), + ), + ), + 2979..2990, + ), + ], + ), + 2927..2996, + ), + ), + 2909..2996, + ), + [], + None, + ), + 2906..2996, + ), + ( + Echo( + ( + "echo", + 3002..3006, + ), + ( + Text( + [ + ( + Text( + ( + "The", + 3008..3011, + ), + ), + 3008..3011, + ), + ( + Text( + ( + "file", + 3012..3016, + ), + ), + 3012..3016, + ), + ( + Expression( + ( + Var( + ( + "path", + 3018..3022, + ), + ), + 3018..3022, + ), + ), + 3017..3023, + ), + ( + Text( + ( + "doesn't", + 3024..3031, + ), + ), + 3024..3031, + ), + ( + Text( + ( + "exist", + 3032..3037, + ), + ), + 3032..3037, + ), + ( + Text( + ( + "!", + 3037..3038, + ), + ), + 3037..3038, + ), + ], + ), + 3007..3039, + ), + ), + 3002..3039, + ), + ( + Return( + ( + "return", + 3044..3050, + ), + Some( + ( + Boolean( + ( + false, + 3051..3056, + ), + ), + 3051..3056, + ), + ), + ), + 3044..3056, + ), + ], + ), + 2851..3058, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Changes the owner of a file.", + ), + 3060..3093, + ), + ), + 3060..3093, + ), + ), + 3060..3093, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 3093..3097, + ), + ), + 3093..3097, + ), + ), + 3093..3097, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If the file doesn't exist, it returns `false` and prints a message.", + ), + 3097..3169, + ), + ), + 3097..3169, + ), + ), + 3097..3169, + ), + ( + FunctionDefinition( + [], + ( + true, + 3169..3172, + ), + ( + "fun", + 3173..3176, + ), + ( + "file_chown", + 3177..3187, + ), + [ + ( + Typed( + ( + false, + 3188..3188, + ), + ( + "path", + 3188..3192, + ), + ( + Text, + 3194..3198, + ), + ), + 3188..3198, + ), + ( + Typed( + ( + false, + 3200..3199, + ), + ( + "user", + 3200..3204, + ), + ( + Text, + 3206..3210, + ), + ), + 3200..3210, + ), + ], + Some( + ( + Bool, + 3213..3217, + ), + ), + [ + ( + IfCondition( + ( + "if", + 3224..3226, + ), + ( + IfCondition( + ( + Or( + ( + FunctionInvocation( + [], + ( + "file_exists", + 3227..3238, + ), + [ + ( + Var( + ( + "path", + 3239..3243, + ), + ), + 3239..3243, + ), + ], + [], + ), + 3227..3244, + ), + ( + "or", + 3245..3247, + ), + ( + FunctionInvocation( + [], + ( + "dir_exists", + 3248..3258, + ), + [ + ( + Var( + ( + "path", + 3259..3263, + ), + ), + 3259..3263, + ), + ], + [], + ), + 3248..3264, + ), + ), + 3227..3264, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 3275..3280, + ), + ], + [ + ( + Text( + "$", + ), + 3281..3282, + ), + ( + Text( + "chown", + ), + 3283..3288, + ), + ( + CommandOption( + "-R", + ), + 3289..3291, + ), + ( + Text( + "\"", + ), + 3292..3293, + ), + ( + Expression( + ( + Var( + ( + "user", + 3294..3298, + ), + ), + 3294..3298, + ), + ), + 3293..3299, + ), + ( + Text( + "\"", + ), + 3299..3300, + ), + ( + Text( + "\"", + ), + 3301..3302, + ), + ( + Expression( + ( + Var( + ( + "path", + 3303..3307, + ), + ), + 3303..3307, + ), + ), + 3302..3308, + ), + ( + Text( + "\"", + ), + 3308..3309, + ), + ( + Text( + "$", + ), + 3310..3311, + ), + ], + [], + ), + 3275..3311, + ), + ), + 3275..3311, + ), + ( + Return( + ( + "return", + 3320..3326, + ), + Some( + ( + Boolean( + ( + true, + 3327..3331, + ), + ), + 3327..3331, + ), + ), + ), + 3320..3331, + ), + ], + ), + 3265..3337, + ), + ), + 3227..3337, + ), + [], + None, + ), + 3224..3337, + ), + ( + Echo( + ( + "echo", + 3343..3347, + ), + ( + Text( + [ + ( + Text( + ( + "The", + 3349..3352, + ), + ), + 3349..3352, + ), + ( + Text( + ( + "file", + 3353..3357, + ), + ), + 3353..3357, + ), + ( + Expression( + ( + Var( + ( + "path", + 3359..3363, + ), + ), + 3359..3363, + ), + ), + 3358..3364, + ), + ( + Text( + ( + "doesn't", + 3365..3372, + ), + ), + 3365..3372, + ), + ( + Text( + ( + "exist", + 3373..3378, + ), + ), + 3373..3378, + ), + ( + Text( + ( + "!", + 3378..3379, + ), + ), + 3378..3379, + ), + ], + ), + 3348..3380, + ), + ), + 3343..3380, + ), + ( + Return( + ( + "return", + 3385..3391, + ), + Some( + ( + Boolean( + ( + false, + 3392..3397, + ), + ), + 3392..3397, + ), + ), + ), + 3385..3397, + ), + ], + ), + 3169..3399, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Escapes all characters in the passed-in glob except \"*\", \"?\" and \"/\",", + ), + 3401..3475, + ), + ), + 3401..3475, + ), + ), + 3401..3475, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "to prevent injection attacks.", + ), + 3475..3509, + ), + ), + 3475..3509, + ), + ), + 3475..3509, + ), + ( + FunctionDefinition( + [], + ( + false, + 3509..3509, + ), + ( + "fun", + 3509..3512, + ), + ( + "escape_non_glob_chars", + 3513..3534, + ), + [ + ( + Typed( + ( + false, + 3535..3535, + ), + ( + "path", + 3535..3539, + ), + ( + Text, + 3541..3545, + ), + ), + 3535..3545, + ), + ], + Some( + ( + Text, + 3548..3552, + ), + ), + [ + ( + Return( + ( + "return", + 3559..3565, + ), + Some( + ( + FunctionInvocation( + [], + ( + "replace_regex", + 3566..3579, + ), + [ + ( + Var( + ( + "path", + 3580..3584, + ), + ), + 3580..3584, + ), + ( + Text( + [ + ( + Escape( + ( + "(", + 3587..3589, + ), + ), + 3587..3589, + ), + ( + Text( + ( + "[", + 3589..3590, + ), + ), + 3589..3590, + ), + ( + Text( + ( + "^", + 3590..3591, + ), + ), + 3590..3591, + ), + ( + Text( + ( + "*", + 3591..3592, + ), + ), + 3591..3592, + ), + ( + Text( + ( + "?", + 3592..3593, + ), + ), + 3592..3593, + ), + ( + Text( + ( + "/", + 3593..3594, + ), + ), + 3593..3594, + ), + ( + Text( + ( + "]", + 3594..3595, + ), + ), + 3594..3595, + ), + ( + Escape( + ( + ")", + 3595..3597, + ), + ), + 3595..3597, + ), + ], + ), + 3586..3598, + ), + ( + Text( + [ + ( + Escape( + ( + "\\", + 3601..3603, + ), + ), + 3601..3603, + ), + ( + Escape( + ( + "\\", + 3603..3605, + ), + ), + 3603..3605, + ), + ( + Escape( + ( + "1", + 3605..3607, + ), + ), + 3605..3607, + ), + ], + ), + 3600..3608, + ), + ], + [], + ), + 3566..3609, + ), + ), + ), + 3559..3609, + ), + ], + ), + 3509..3611, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Finds all files or directories matching multiple file globs. When", + ), + 3613..3683, + ), + ), + 3613..3683, + ), + ), + 3613..3683, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "we have union types, this functionality can be merged into the main", + ), + 3683..3755, + ), + ), + 3683..3755, + ), + ), + 3683..3755, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "`glob` function.", + ), + 3755..3776, + ), + ), + 3755..3776, + ), + ), + 3755..3776, + ), + ( + FunctionDefinition( + [], + ( + true, + 3776..3779, + ), + ( + "fun", + 3780..3783, + ), + ( + "file_glob_all", + 3784..3797, + ), + [ + ( + Typed( + ( + false, + 3798..3798, + ), + ( + "paths", + 3798..3803, + ), + ( + [Text], + 3805..3811, + ), + ), + 3798..3811, + ), + ], + Some( + ( + [Text]?, + 3814..3821, + ), + ), + [ + ( + VariableInit( + ( + "let", + 3828..3831, + ), + ( + "combined", + 3832..3840, + ), + ( + Expression( + ( + Text( + [], + ), + 3843..3845, + ), + ), + 3843..3845, + ), + ), + 3828..3845, + ), + ( + IfCondition( + ( + "if", + 3850..3852, + ), + ( + IfCondition( + ( + Eq( + ( + FunctionInvocation( + [], + ( + "len", + 3853..3856, + ), + [ + ( + Var( + ( + "paths", + 3857..3862, + ), + ), + 3857..3862, + ), + ], + [], + ), + 3853..3863, + ), + ( + Int( + ( + 1, + 3867..3868, + ), + ), + 3867..3868, + ), + ), + 3853..3868, + ), + ( + Block( + [], + [ + ( + VariableSet( + ( + "combined", + 3879..3887, + ), + ( + FunctionInvocation( + [], + ( + "escape_non_glob_chars", + 3890..3911, + ), + [ + ( + ArrayIndex( + ( + Var( + ( + "paths", + 3912..3917, + ), + ), + 3912..3917, + ), + ( + Int( + ( + 0, + 3918..3919, + ), + ), + 3918..3919, + ), + ), + 3912..3919, + ), + ], + [], + ), + 3890..3921, + ), + ), + 3879..3921, + ), + ], + ), + 3869..3927, + ), + ), + 3853..3927, + ), + [], + Some( + ( + Else( + ( + "else", + 3928..3932, + ), + ( + Block( + [], + [ + ( + VariableInit( + ( + "let", + 3943..3946, + ), + ( + "items", + 3947..3952, + ), + ( + DataType( + ( + [Text], + 3955..3961, + ), + ), + 3955..3961, + ), + ), + 3943..3961, + ), + ( + IterLoop( + ( + "for", + 3970..3973, + ), + ( + Single( + ( + "item", + 3974..3978, + ), + ), + 3974..3978, + ), + ( + "in", + 3979..3981, + ), + ( + Var( + ( + "paths", + 3982..3987, + ), + ), + 3982..3987, + ), + ( + Block( + [], + [ + ( + VariableSet( + ( + "item", + 4002..4006, + ), + ( + FunctionInvocation( + [], + ( + "escape_non_glob_chars", + 4009..4030, + ), + [ + ( + Var( + ( + "item", + 4031..4035, + ), + ), + 4031..4035, + ), + ], + [], + ), + 4009..4036, + ), + ), + 4002..4036, + ), + ( + ShorthandAdd( + ( + "items", + 4049..4054, + ), + ( + Array( + [ + ( + Var( + ( + "item", + 4059..4063, + ), + ), + 4059..4063, + ), + ], + ), + 4058..4064, + ), + ), + 4049..4064, + ), + ], + ), + 3988..4074, + ), + ), + 3970..4074, + ), + ( + VariableSet( + ( + "combined", + 4083..4091, + ), + ( + FunctionInvocation( + [], + ( + "join", + 4094..4098, + ), + [ + ( + Var( + ( + "items", + 4099..4104, + ), + ), + 4099..4104, + ), + ( + Text( + [], + ), + 4106..4109, + ), + ], + [], + ), + 4094..4110, + ), + ), + 4083..4110, + ), + ], + ), + 3933..4116, + ), + ), + 3928..4116, + ), + ), + ), + 3850..4116, + ), + ( + VariableInit( + ( + "let", + 4121..4124, + ), + ( + "files", + 4125..4130, + ), + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 4133..4134, + ), + ( + Text( + "eval", + ), + 4135..4139, + ), + ( + Text( + "\"", + ), + 4140..4141, + ), + ( + Text( + "for", + ), + 4141..4144, + ), + ( + Text( + "file", + ), + 4145..4149, + ), + ( + Text( + "in", + ), + 4150..4152, + ), + ( + Expression( + ( + Var( + ( + "combined", + 4154..4162, + ), + ), + 4154..4162, + ), + ), + 4153..4163, + ), + ( + Text( + ";", + ), + 4163..4164, + ), + ( + Text( + "do", + ), + 4165..4167, + ), + ( + Text( + "[", + ), + 4168..4169, + ), + ( + CommandOption( + "-e", + ), + 4170..4172, + ), + ( + Escape( + "\\", + ), + 4173..4175, + ), + ( + Escape( + "\"", + ), + 4175..4177, + ), + ( + Escape( + "\\", + ), + 4177..4179, + ), + ( + Escape( + "$", + ), + 4179..4181, + ), + ( + Text( + "file", + ), + 4181..4185, + ), + ( + Escape( + "\\", + ), + 4185..4187, + ), + ( + Escape( + "\"", + ), + 4187..4189, + ), + ( + Text( + "]", + ), + 4190..4191, + ), + ( + Text( + "&&", + ), + 4192..4194, + ), + ( + Text( + "echo", + ), + 4195..4199, + ), + ( + Escape( + "\\", + ), + 4200..4202, + ), + ( + Escape( + "\"", + ), + 4202..4204, + ), + ( + Escape( + "\\", + ), + 4204..4206, + ), + ( + Escape( + "$", + ), + 4206..4208, + ), + ( + Text( + "file", + ), + 4208..4212, + ), + ( + Escape( + "\\", + ), + 4212..4214, + ), + ( + Escape( + "\"", + ), + 4214..4216, + ), + ( + Text( + ";", + ), + 4216..4217, + ), + ( + Text( + "done", + ), + 4218..4222, + ), + ( + Text( + "\"", + ), + 4222..4223, + ), + ( + Text( + "$", + ), + 4224..4225, + ), + ], + [ + ( + Failure( + ( + Propagate, + 4225..4226, + ), + ), + 4225..4226, + ), + ], + ), + 4133..4226, + ), + ), + 4133..4226, + ), + ), + 4121..4226, + ), + ( + Return( + ( + "return", + 4231..4237, + ), + Some( + ( + FunctionInvocation( + [], + ( + "split", + 4238..4243, + ), + [ + ( + Var( + ( + "files", + 4244..4249, + ), + ), + 4244..4249, + ), + ( + Text( + [ + ( + Escape( + ( + "n", + 4252..4254, + ), + ), + 4252..4254, + ), + ], + ), + 4251..4255, + ), + ], + [], + ), + 4238..4256, + ), + ), + ), + 4231..4256, + ), + ], + ), + 3776..4258, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Finds all files or directories matching a file glob.", + ), + 4260..4317, + ), + ), + 4260..4317, + ), + ), + 4260..4317, + ), + ( + FunctionDefinition( + [], + ( + true, + 4317..4320, + ), + ( + "fun", + 4321..4324, + ), + ( + "file_glob", + 4325..4334, + ), + [ + ( + Typed( + ( + false, + 4335..4335, + ), + ( + "path", + 4335..4339, + ), + ( + Text, + 4341..4345, + ), + ), + 4335..4345, + ), + ], + Some( + ( + [Text]?, + 4348..4355, + ), + ), + [ + ( + Return( + ( + "return", + 4362..4368, + ), + Some( + ( + FunctionInvocation( + [], + ( + "file_glob_all", + 4369..4382, + ), + [ + ( + Array( + [ + ( + Var( + ( + "path", + 4384..4388, + ), + ), + 4384..4388, + ), + ], + ), + 4383..4389, + ), + ], + [ + ( + Failure( + ( + Propagate, + 4390..4391, + ), + ), + 4390..4391, + ), + ], + ), + 4369..4391, + ), + ), + ), + 4362..4391, + ), + ], + ), + 4317..4393, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Extract the file detecting from the filename the extension", + ), + 4395..4458, + ), + ), + 4395..4458, + ), + ), + 4395..4458, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Supports: bz2, gz, xz, bz2, deb, rar, rpm, tar(gz/xz/bz), zip(war/jar), 7z", + ), + 4458..4537, + ), + ), + 4458..4537, + ), + ), + 4458..4537, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Note: Not all the commands supports the output folder path", + ), + 4537..4600, + ), + ), + 4537..4600, + ), + ), + 4537..4600, + ), + ( + FunctionDefinition( + [], + ( + true, + 4600..4603, + ), + ( + "fun", + 4604..4607, + ), + ( + "file_extract", + 4608..4620, + ), + [ + ( + Typed( + ( + false, + 4621..4621, + ), + ( + "path", + 4621..4625, + ), + ( + Text, + 4627..4631, + ), + ), + 4621..4631, + ), + ( + Typed( + ( + false, + 4633..4632, + ), + ( + "target", + 4633..4639, + ), + ( + Text, + 4641..4645, + ), + ), + 4633..4645, + ), + ], + Some( + ( + Null?, + 4648..4653, + ), + ), + [ + ( + IfCondition( + ( + "if", + 4660..4662, + ), + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "file_exists", + 4663..4674, + ), + [ + ( + Var( + ( + "path", + 4675..4679, + ), + ), + 4675..4679, + ), + ], + [], + ), + 4663..4680, + ), + ( + Block( + [], + [ + ( + IfChain( + ( + "if", + 4691..4693, + ), + [ + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 4708..4719, + ), + [ + ( + Var( + ( + "path", + 4720..4724, + ), + ), + 4720..4724, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 4727..4729, + ), + ), + 4727..4729, + ), + ( + Text( + ( + "(", + 4729..4730, + ), + ), + 4729..4730, + ), + ( + Text( + ( + "tar", + 4730..4733, + ), + ), + 4730..4733, + ), + ( + Escape( + ( + ".", + 4733..4735, + ), + ), + 4733..4735, + ), + ( + Text( + ( + "bz2|tbz|tbz2", + 4735..4747, + ), + ), + 4735..4747, + ), + ( + Text( + ( + ")", + 4747..4748, + ), + ), + 4747..4748, + ), + ( + Text( + ( + "$", + 4748..4749, + ), + ), + 4748..4749, + ), + ], + ), + 4726..4750, + ), + ( + Boolean( + ( + true, + 4752..4756, + ), + ), + 4752..4756, + ), + ], + [], + ), + 4708..4757, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 4759..4760, + ), + ( + Text( + "tar", + ), + 4761..4764, + ), + ( + Text( + "xvjf", + ), + 4765..4769, + ), + ( + Text( + "\"", + ), + 4770..4771, + ), + ( + Expression( + ( + Var( + ( + "path", + 4772..4776, + ), + ), + 4772..4776, + ), + ), + 4771..4777, + ), + ( + Text( + "\"", + ), + 4777..4778, + ), + ( + CommandOption( + "-C", + ), + 4779..4781, + ), + ( + Text( + "\"", + ), + 4782..4783, + ), + ( + Expression( + ( + Var( + ( + "target", + 4784..4790, + ), + ), + 4784..4790, + ), + ), + 4783..4791, + ), + ( + Text( + "\"", + ), + 4791..4792, + ), + ( + Text( + "$", + ), + 4793..4794, + ), + ], + [ + ( + Failure( + ( + Propagate, + 4794..4795, + ), + ), + 4794..4795, + ), + ], + ), + 4759..4795, + ), + ), + 4759..4795, + ), + ), + 4757..4795, + ), + ), + 4708..4795, + ), + ), + 4708..4795, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 4808..4819, + ), + [ + ( + Var( + ( + "path", + 4820..4824, + ), + ), + 4820..4824, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 4827..4829, + ), + ), + 4827..4829, + ), + ( + Text( + ( + "(", + 4829..4830, + ), + ), + 4829..4830, + ), + ( + Text( + ( + "tar", + 4830..4833, + ), + ), + 4830..4833, + ), + ( + Escape( + ( + ".", + 4833..4835, + ), + ), + 4833..4835, + ), + ( + Text( + ( + "gz|tgz", + 4835..4841, + ), + ), + 4835..4841, + ), + ( + Text( + ( + ")", + 4841..4842, + ), + ), + 4841..4842, + ), + ( + Text( + ( + "$", + 4842..4843, + ), + ), + 4842..4843, + ), + ], + ), + 4826..4844, + ), + ( + Boolean( + ( + true, + 4846..4850, + ), + ), + 4846..4850, + ), + ], + [], + ), + 4808..4851, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 4853..4854, + ), + ( + Text( + "tar", + ), + 4855..4858, + ), + ( + Text( + "xzf", + ), + 4859..4862, + ), + ( + Text( + "\"", + ), + 4863..4864, + ), + ( + Expression( + ( + Var( + ( + "path", + 4865..4869, + ), + ), + 4865..4869, + ), + ), + 4864..4870, + ), + ( + Text( + "\"", + ), + 4870..4871, + ), + ( + CommandOption( + "-C", + ), + 4872..4874, + ), + ( + Text( + "\"", + ), + 4875..4876, + ), + ( + Expression( + ( + Var( + ( + "target", + 4877..4883, + ), + ), + 4877..4883, + ), + ), + 4876..4884, + ), + ( + Text( + "\"", + ), + 4884..4885, + ), + ( + Text( + "$", + ), + 4886..4887, + ), + ], + [ + ( + Failure( + ( + Propagate, + 4887..4888, + ), + ), + 4887..4888, + ), + ], + ), + 4853..4888, + ), + ), + 4853..4888, + ), + ), + 4851..4888, + ), + ), + 4808..4888, + ), + ), + 4808..4888, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 4901..4912, + ), + [ + ( + Var( + ( + "path", + 4913..4917, + ), + ), + 4913..4917, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 4920..4922, + ), + ), + 4920..4922, + ), + ( + Text( + ( + "(", + 4922..4923, + ), + ), + 4922..4923, + ), + ( + Text( + ( + "tar", + 4923..4926, + ), + ), + 4923..4926, + ), + ( + Escape( + ( + ".", + 4926..4928, + ), + ), + 4926..4928, + ), + ( + Text( + ( + "xz|txz", + 4928..4934, + ), + ), + 4928..4934, + ), + ( + Text( + ( + ")", + 4934..4935, + ), + ), + 4934..4935, + ), + ( + Text( + ( + "$", + 4935..4936, + ), + ), + 4935..4936, + ), + ], + ), + 4919..4937, + ), + ( + Boolean( + ( + true, + 4939..4943, + ), + ), + 4939..4943, + ), + ], + [], + ), + 4901..4944, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 4946..4947, + ), + ( + Text( + "tar", + ), + 4948..4951, + ), + ( + Text( + "xJf", + ), + 4952..4955, + ), + ( + Text( + "\"", + ), + 4956..4957, + ), + ( + Expression( + ( + Var( + ( + "path", + 4958..4962, + ), + ), + 4958..4962, + ), + ), + 4957..4963, + ), + ( + Text( + "\"", + ), + 4963..4964, + ), + ( + CommandOption( + "-C", + ), + 4965..4967, + ), + ( + Text( + "\"", + ), + 4968..4969, + ), + ( + Expression( + ( + Var( + ( + "target", + 4970..4976, + ), + ), + 4970..4976, + ), + ), + 4969..4977, + ), + ( + Text( + "\"", + ), + 4977..4978, + ), + ( + Text( + "$", + ), + 4979..4980, + ), + ], + [ + ( + Failure( + ( + Propagate, + 4980..4981, + ), + ), + 4980..4981, + ), + ], + ), + 4946..4981, + ), + ), + 4946..4981, + ), + ), + 4944..4981, + ), + ), + 4901..4981, + ), + ), + 4901..4981, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 4994..5005, + ), + [ + ( + Var( + ( + "path", + 5006..5010, + ), + ), + 5006..5010, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 5013..5015, + ), + ), + 5013..5015, + ), + ( + Text( + ( + "bz2", + 5015..5018, + ), + ), + 5015..5018, + ), + ( + Text( + ( + "$", + 5018..5019, + ), + ), + 5018..5019, + ), + ], + ), + 5012..5020, + ), + ], + [], + ), + 4994..5021, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5023..5024, + ), + ( + Text( + "bunzip2", + ), + 5025..5032, + ), + ( + Text( + "\"", + ), + 5033..5034, + ), + ( + Expression( + ( + Var( + ( + "path", + 5035..5039, + ), + ), + 5035..5039, + ), + ), + 5034..5040, + ), + ( + Text( + "\"", + ), + 5040..5041, + ), + ( + Text( + "$", + ), + 5042..5043, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5043..5044, + ), + ), + 5043..5044, + ), + ], + ), + 5023..5044, + ), + ), + 5023..5044, + ), + ), + 5021..5044, + ), + ), + 4994..5044, + ), + ), + 4994..5044, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 5057..5068, + ), + [ + ( + Var( + ( + "path", + 5069..5073, + ), + ), + 5069..5073, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 5076..5078, + ), + ), + 5076..5078, + ), + ( + Text( + ( + "deb", + 5078..5081, + ), + ), + 5078..5081, + ), + ( + Text( + ( + "$", + 5081..5082, + ), + ), + 5081..5082, + ), + ], + ), + 5075..5083, + ), + ], + [], + ), + 5057..5084, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5086..5087, + ), + ( + Text( + "dpkg", + ), + 5088..5092, + ), + ( + CommandOption( + "-deb", + ), + 5092..5096, + ), + ( + CommandOption( + "-xv", + ), + 5097..5100, + ), + ( + Text( + "\"", + ), + 5101..5102, + ), + ( + Expression( + ( + Var( + ( + "path", + 5103..5107, + ), + ), + 5103..5107, + ), + ), + 5102..5108, + ), + ( + Text( + "\"", + ), + 5108..5109, + ), + ( + Text( + "\"", + ), + 5110..5111, + ), + ( + Expression( + ( + Var( + ( + "target", + 5112..5118, + ), + ), + 5112..5118, + ), + ), + 5111..5119, + ), + ( + Text( + "\"", + ), + 5119..5120, + ), + ( + Text( + "$", + ), + 5121..5122, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5122..5123, + ), + ), + 5122..5123, + ), + ], + ), + 5086..5123, + ), + ), + 5086..5123, + ), + ), + 5084..5123, + ), + ), + 5057..5123, + ), + ), + 5057..5123, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 5136..5147, + ), + [ + ( + Var( + ( + "path", + 5148..5152, + ), + ), + 5148..5152, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 5155..5157, + ), + ), + 5155..5157, + ), + ( + Text( + ( + "gz", + 5157..5159, + ), + ), + 5157..5159, + ), + ( + Text( + ( + "$", + 5159..5160, + ), + ), + 5159..5160, + ), + ], + ), + 5154..5161, + ), + ], + [], + ), + 5136..5162, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5164..5165, + ), + ( + Text( + "gunzip", + ), + 5166..5172, + ), + ( + Text( + "\"", + ), + 5173..5174, + ), + ( + Expression( + ( + Var( + ( + "path", + 5175..5179, + ), + ), + 5175..5179, + ), + ), + 5174..5180, + ), + ( + Text( + "\"", + ), + 5180..5181, + ), + ( + Text( + "$", + ), + 5182..5183, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5183..5184, + ), + ), + 5183..5184, + ), + ], + ), + 5164..5184, + ), + ), + 5164..5184, + ), + ), + 5162..5184, + ), + ), + 5136..5184, + ), + ), + 5136..5184, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 5197..5208, + ), + [ + ( + Var( + ( + "path", + 5209..5213, + ), + ), + 5209..5213, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 5216..5218, + ), + ), + 5216..5218, + ), + ( + Text( + ( + "rar", + 5218..5221, + ), + ), + 5218..5221, + ), + ( + Text( + ( + "$", + 5221..5222, + ), + ), + 5221..5222, + ), + ], + ), + 5215..5223, + ), + ], + [], + ), + 5197..5224, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5226..5227, + ), + ( + Text( + "unrar", + ), + 5228..5233, + ), + ( + Text( + "x", + ), + 5234..5235, + ), + ( + Text( + "\"", + ), + 5236..5237, + ), + ( + Expression( + ( + Var( + ( + "path", + 5238..5242, + ), + ), + 5238..5242, + ), + ), + 5237..5243, + ), + ( + Text( + "\"", + ), + 5243..5244, + ), + ( + Text( + "\"", + ), + 5245..5246, + ), + ( + Expression( + ( + Var( + ( + "target", + 5247..5253, + ), + ), + 5247..5253, + ), + ), + 5246..5254, + ), + ( + Text( + "\"", + ), + 5254..5255, + ), + ( + Text( + "$", + ), + 5256..5257, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5257..5258, + ), + ), + 5257..5258, + ), + ], + ), + 5226..5258, + ), + ), + 5226..5258, + ), + ), + 5224..5258, + ), + ), + 5197..5258, + ), + ), + 5197..5258, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 5271..5282, + ), + [ + ( + Var( + ( + "path", + 5283..5287, + ), + ), + 5283..5287, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 5290..5292, + ), + ), + 5290..5292, + ), + ( + Text( + ( + "rpm", + 5292..5295, + ), + ), + 5292..5295, + ), + ( + Text( + ( + "$", + 5295..5296, + ), + ), + 5295..5296, + ), + ], + ), + 5289..5297, + ), + ], + [], + ), + 5271..5298, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5300..5301, + ), + ( + Text( + "rpm2cpio", + ), + 5302..5310, + ), + ( + Text( + "\"", + ), + 5311..5312, + ), + ( + Expression( + ( + Var( + ( + "path", + 5313..5317, + ), + ), + 5313..5317, + ), + ), + 5312..5318, + ), + ( + Text( + "\"", + ), + 5318..5319, + ), + ( + Text( + "|", + ), + 5320..5321, + ), + ( + Text( + "cpio", + ), + 5322..5326, + ), + ( + CommandOption( + "-idm", + ), + 5327..5331, + ), + ( + Text( + "$", + ), + 5332..5333, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5333..5334, + ), + ), + 5333..5334, + ), + ], + ), + 5300..5334, + ), + ), + 5300..5334, + ), + ), + 5298..5334, + ), + ), + 5271..5334, + ), + ), + 5271..5334, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 5347..5358, + ), + [ + ( + Var( + ( + "path", + 5359..5363, + ), + ), + 5359..5363, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 5366..5368, + ), + ), + 5366..5368, + ), + ( + Text( + ( + "tar", + 5368..5371, + ), + ), + 5368..5371, + ), + ( + Text( + ( + "$", + 5371..5372, + ), + ), + 5371..5372, + ), + ], + ), + 5365..5373, + ), + ], + [], + ), + 5347..5374, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5376..5377, + ), + ( + Text( + "tar", + ), + 5378..5381, + ), + ( + Text( + "xf", + ), + 5382..5384, + ), + ( + Text( + "\"", + ), + 5385..5386, + ), + ( + Expression( + ( + Var( + ( + "path", + 5387..5391, + ), + ), + 5387..5391, + ), + ), + 5386..5392, + ), + ( + Text( + "\"", + ), + 5392..5393, + ), + ( + CommandOption( + "-C", + ), + 5394..5396, + ), + ( + Text( + "\"", + ), + 5397..5398, + ), + ( + Expression( + ( + Var( + ( + "target", + 5399..5405, + ), + ), + 5399..5405, + ), + ), + 5398..5406, + ), + ( + Text( + "\"", + ), + 5406..5407, + ), + ( + Text( + "$", + ), + 5408..5409, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5409..5410, + ), + ), + 5409..5410, + ), + ], + ), + 5376..5410, + ), + ), + 5376..5410, + ), + ), + 5374..5410, + ), + ), + 5347..5410, + ), + ), + 5347..5410, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 5423..5434, + ), + [ + ( + Var( + ( + "path", + 5435..5439, + ), + ), + 5435..5439, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 5442..5444, + ), + ), + 5442..5444, + ), + ( + Text( + ( + "xz", + 5444..5446, + ), + ), + 5444..5446, + ), + ( + Text( + ( + "$", + 5446..5447, + ), + ), + 5446..5447, + ), + ], + ), + 5441..5448, + ), + ], + [], + ), + 5423..5449, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5451..5452, + ), + ( + Text( + "xz", + ), + 5453..5455, + ), + ( + CommandOption( + "--decompress", + ), + 5456..5468, + ), + ( + Text( + "\"", + ), + 5469..5470, + ), + ( + Expression( + ( + Var( + ( + "path", + 5471..5475, + ), + ), + 5471..5475, + ), + ), + 5470..5476, + ), + ( + Text( + "\"", + ), + 5476..5477, + ), + ( + Text( + "$", + ), + 5478..5479, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5479..5480, + ), + ), + 5479..5480, + ), + ], + ), + 5451..5480, + ), + ), + 5451..5480, + ), + ), + 5449..5480, + ), + ), + 5423..5480, + ), + ), + 5423..5480, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 5493..5504, + ), + [ + ( + Var( + ( + "path", + 5505..5509, + ), + ), + 5505..5509, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 5512..5514, + ), + ), + 5512..5514, + ), + ( + Text( + ( + "7z", + 5514..5516, + ), + ), + 5514..5516, + ), + ( + Text( + ( + "$", + 5516..5517, + ), + ), + 5516..5517, + ), + ], + ), + 5511..5518, + ), + ], + [], + ), + 5493..5519, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5521..5522, + ), + ( + Text( + "7z", + ), + 5523..5525, + ), + ( + CommandOption( + "-y", + ), + 5526..5528, + ), + ( + Text( + "\"", + ), + 5529..5530, + ), + ( + Expression( + ( + Var( + ( + "path", + 5531..5535, + ), + ), + 5531..5535, + ), + ), + 5530..5536, + ), + ( + Text( + "\"", + ), + 5536..5537, + ), + ( + CommandOption( + "-o", + ), + 5538..5540, + ), + ( + Text( + "\"", + ), + 5541..5542, + ), + ( + Expression( + ( + Var( + ( + "target", + 5543..5549, + ), + ), + 5543..5549, + ), + ), + 5542..5550, + ), + ( + Text( + "\"", + ), + 5550..5551, + ), + ( + Text( + "$", + ), + 5552..5553, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5553..5554, + ), + ), + 5553..5554, + ), + ], + ), + 5521..5554, + ), + ), + 5521..5554, + ), + ), + 5519..5554, + ), + ), + 5493..5554, + ), + ), + 5493..5554, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 5567..5578, + ), + [ + ( + Var( + ( + "path", + 5579..5583, + ), + ), + 5579..5583, + ), + ( + Text( + [ + ( + Escape( + ( + ".", + 5586..5588, + ), + ), + 5586..5588, + ), + ( + Escape( + ( + "(", + 5588..5590, + ), + ), + 5588..5590, + ), + ( + Text( + ( + "zip", + 5590..5593, + ), + ), + 5590..5593, + ), + ( + Escape( + ( + "|war", + 5593..5598, + ), + ), + 5593..5598, + ), + ( + Escape( + ( + "|jar", + 5598..5603, + ), + ), + 5598..5603, + ), + ( + Escape( + ( + ")", + 5603..5605, + ), + ), + 5603..5605, + ), + ( + Text( + ( + "$", + 5605..5606, + ), + ), + 5605..5606, + ), + ], + ), + 5585..5607, + ), + ], + [], + ), + 5567..5608, + ), + ( + Singleline( + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5610..5611, + ), + ( + Text( + "unzip", + ), + 5612..5617, + ), + ( + Text( + "\"", + ), + 5618..5619, + ), + ( + Expression( + ( + Var( + ( + "path", + 5620..5624, + ), + ), + 5620..5624, + ), + ), + 5619..5625, + ), + ( + Text( + "\"", + ), + 5625..5626, + ), + ( + CommandOption( + "-d", + ), + 5627..5629, + ), + ( + Text( + "\"", + ), + 5630..5631, + ), + ( + Expression( + ( + Var( + ( + "target", + 5632..5638, + ), + ), + 5632..5638, + ), + ), + 5631..5639, + ), + ( + Text( + "\"", + ), + 5639..5640, + ), + ( + Text( + "$", + ), + 5641..5642, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5642..5643, + ), + ), + 5642..5643, + ), + ], + ), + 5610..5643, + ), + ), + 5610..5643, + ), + ), + 5608..5643, + ), + ), + 5567..5643, + ), + ), + 5567..5643, + ), + ( + Else( + ( + Else( + ( + "else", + 5656..5660, + ), + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 5679..5683, + ), + ( + Text( + [ + ( + Text( + ( + "Error", + 5685..5690, + ), + ), + 5685..5690, + ), + ( + Text( + ( + ":", + 5690..5691, + ), + ), + 5690..5691, + ), + ( + Text( + ( + "Unsupported", + 5692..5703, + ), + ), + 5692..5703, + ), + ( + Text( + ( + "file", + 5704..5708, + ), + ), + 5704..5708, + ), + ( + Text( + ( + "type", + 5709..5713, + ), + ), + 5709..5713, + ), + ], + ), + 5684..5714, + ), + ), + 5679..5714, + ), + ( + Fail( + ( + "fail", + 5731..5735, + ), + Some( + ( + Int( + ( + 3, + 5736..5737, + ), + ), + 5736..5737, + ), + ), + ), + 5731..5737, + ), + ], + ), + 5661..5751, + ), + ), + 5656..5751, + ), + ), + 5656..5751, + ), + ], + ), + 4691..5761, + ), + ], + ), + 4681..5767, + ), + ), + 4663..5767, + ), + [], + Some( + ( + Else( + ( + "else", + 5768..5772, + ), + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 5783..5787, + ), + ( + Text( + [ + ( + Text( + ( + "Error", + 5789..5794, + ), + ), + 5789..5794, + ), + ( + Text( + ( + ":", + 5794..5795, + ), + ), + 5794..5795, + ), + ( + Text( + ( + "File", + 5796..5800, + ), + ), + 5796..5800, + ), + ( + Text( + ( + "not", + 5801..5804, + ), + ), + 5801..5804, + ), + ( + Text( + ( + "found", + 5805..5810, + ), + ), + 5805..5810, + ), + ], + ), + 5788..5811, + ), + ), + 5783..5811, + ), + ( + Fail( + ( + "fail", + 5820..5824, + ), + Some( + ( + Int( + ( + 2, + 5825..5826, + ), + ), + 5825..5826, + ), + ), + ), + 5820..5826, + ), + ], + ), + 5773..5832, + ), + ), + 5768..5832, + ), + ), + ), + 4660..5832, + ), + ], + ), + 4600..5834, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap new file mode 100644 index 0000000..24057a8 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap @@ -0,0 +1,674 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokenize(&stdlib)) +--- +[ + ( + Import( + ( + false, + 0..6, + ), + ( + "import", + 0..6, + ), + ( + ImportAll, + 7..8, + ), + ( + "from", + 9..13, + ), + ( + "std/env", + 14..23, + ), + ), + 0..23, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Downloads a file from a given URL and saves it to a specified path using available command-line tools.", + ), + 25..132, + ), + ), + 25..132, + ), + ), + 25..132, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 132..136, + ), + ), + 132..136, + ), + ), + 132..136, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "It checks for the availability of common command-line tools (`curl`, `wget`, and `aria2c`, in order) and uses the first available tool to perform the download.", + ), + 136..300, + ), + ), + 136..300, + ), + ), + 136..300, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If none of the tools are available, the function returns `false`.", + ), + 300..370, + ), + ), + 300..370, + ), + ), + 300..370, + ), + ( + FunctionDefinition( + [], + ( + true, + 370..373, + ), + ( + "fun", + 374..377, + ), + ( + "file_download", + 378..391, + ), + [ + ( + Typed( + ( + false, + 392..392, + ), + ( + "url", + 392..395, + ), + ( + Text, + 397..401, + ), + ), + 392..401, + ), + ( + Typed( + ( + false, + 403..402, + ), + ( + "path", + 403..407, + ), + ( + Text, + 409..413, + ), + ), + 403..413, + ), + ], + Some( + ( + Bool, + 416..420, + ), + ), + [ + ( + IfChain( + ( + "if", + 427..429, + ), + [ + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "is_command", + 440..450, + ), + [ + ( + Text( + [ + ( + Text( + ( + "curl", + 452..456, + ), + ), + 452..456, + ), + ], + ), + 451..457, + ), + ], + [], + ), + 440..458, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Silent, + 473..479, + ), + ( + Trust, + 480..485, + ), + ], + [ + ( + Text( + "$", + ), + 486..487, + ), + ( + Text( + "curl", + ), + 488..492, + ), + ( + CommandOption( + "-L", + ), + 493..495, + ), + ( + CommandOption( + "-o", + ), + 496..498, + ), + ( + Text( + "\"", + ), + 499..500, + ), + ( + Expression( + ( + Var( + ( + "path", + 501..505, + ), + ), + 501..505, + ), + ), + 500..506, + ), + ( + Text( + "\"", + ), + 506..507, + ), + ( + Text( + "\"", + ), + 508..509, + ), + ( + Expression( + ( + Var( + ( + "url", + 510..513, + ), + ), + 510..513, + ), + ), + 509..514, + ), + ( + Text( + "\"", + ), + 514..515, + ), + ( + Text( + "$", + ), + 516..517, + ), + ], + [], + ), + 473..517, + ), + ), + 473..517, + ), + ], + ), + 459..527, + ), + ), + 440..527, + ), + ), + 440..527, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "is_command", + 536..546, + ), + [ + ( + Text( + [ + ( + Text( + ( + "wget", + 548..552, + ), + ), + 548..552, + ), + ], + ), + 547..553, + ), + ], + [], + ), + 536..554, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Silent, + 569..575, + ), + ( + Trust, + 576..581, + ), + ], + [ + ( + Text( + "$", + ), + 582..583, + ), + ( + Text( + "wget", + ), + 584..588, + ), + ( + Text( + "\"", + ), + 589..590, + ), + ( + Expression( + ( + Var( + ( + "url", + 591..594, + ), + ), + 591..594, + ), + ), + 590..595, + ), + ( + Text( + "\"", + ), + 595..596, + ), + ( + CommandOption( + "-P", + ), + 597..599, + ), + ( + Text( + "\"", + ), + 600..601, + ), + ( + Expression( + ( + Var( + ( + "path", + 602..606, + ), + ), + 602..606, + ), + ), + 601..607, + ), + ( + Text( + "\"", + ), + 607..608, + ), + ( + Text( + "$", + ), + 609..610, + ), + ], + [], + ), + 569..610, + ), + ), + 569..610, + ), + ], + ), + 555..620, + ), + ), + 536..620, + ), + ), + 536..620, + ), + ( + IfCondition( + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "is_command", + 629..639, + ), + [ + ( + Text( + [ + ( + Text( + ( + "aria2c", + 641..647, + ), + ), + 641..647, + ), + ], + ), + 640..648, + ), + ], + [], + ), + 629..649, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Silent, + 664..670, + ), + ( + Trust, + 671..676, + ), + ], + [ + ( + Text( + "$", + ), + 677..678, + ), + ( + Text( + "aria2c", + ), + 679..685, + ), + ( + Text( + "\"", + ), + 686..687, + ), + ( + Expression( + ( + Var( + ( + "url", + 688..691, + ), + ), + 688..691, + ), + ), + 687..692, + ), + ( + Text( + "\"", + ), + 692..693, + ), + ( + CommandOption( + "-d", + ), + 694..696, + ), + ( + Text( + "\"", + ), + 697..698, + ), + ( + Expression( + ( + Var( + ( + "path", + 699..703, + ), + ), + 699..703, + ), + ), + 698..704, + ), + ( + Text( + "\"", + ), + 704..705, + ), + ( + Text( + "$", + ), + 706..707, + ), + ], + [], + ), + 664..707, + ), + ), + 664..707, + ), + ], + ), + 650..717, + ), + ), + 629..717, + ), + ), + 629..717, + ), + ( + Else( + ( + Else( + ( + "else", + 726..730, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 745..751, + ), + Some( + ( + Boolean( + ( + false, + 752..757, + ), + ), + 752..757, + ), + ), + ), + 745..757, + ), + ], + ), + 731..767, + ), + ), + 726..767, + ), + ), + 726..767, + ), + ], + ), + 427..773, + ), + ( + Return( + ( + "return", + 779..785, + ), + Some( + ( + Boolean( + ( + true, + 786..790, + ), + ), + 786..790, + ), + ), + ), + 779..790, + ), + ], + ), + 370..792, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap new file mode 100644 index 0000000..b4f0b52 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap @@ -0,0 +1,1337 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokenize(&stdlib)) +--- +[ + ( + Statement( + ( + Comment( + ( + DocString( + "Sums an array's contents", + ), + 0..29, + ), + ), + 0..29, + ), + ), + 0..29, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 29..49, + ), + ], + ( + true, + 50..53, + ), + ( + "fun", + 54..57, + ), + ( + "math_sum", + 58..66, + ), + [ + ( + Typed( + ( + false, + 67..67, + ), + ( + "list", + 67..71, + ), + ( + [Num], + 73..78, + ), + ), + 67..78, + ), + ], + Some( + ( + Num, + 81..84, + ), + ), + [ + ( + Return( + ( + "return", + 91..97, + ), + Some( + ( + Cast( + ( + Command( + [ + ( + Trust, + 98..103, + ), + ], + [ + ( + Text( + "$", + ), + 104..105, + ), + ( + Text( + "echo", + ), + 106..110, + ), + ( + Text( + "\"", + ), + 111..112, + ), + ( + Expression( + ( + Var( + ( + "list", + 113..117, + ), + ), + 113..117, + ), + ), + 112..118, + ), + ( + Text( + "\"", + ), + 118..119, + ), + ( + Text( + "|", + ), + 120..121, + ), + ( + Text( + "awk", + ), + 122..125, + ), + ( + Text( + "'", + ), + 126..127, + ), + ( + Escape( + "{", + ), + 127..129, + ), + ( + Text( + "s", + ), + 129..130, + ), + ( + Text( + "=", + ), + 130..131, + ), + ( + Text( + "0", + ), + 131..132, + ), + ( + Text( + ";", + ), + 132..133, + ), + ( + Text( + "for", + ), + 134..137, + ), + ( + Text( + "(", + ), + 138..139, + ), + ( + Text( + "i", + ), + 139..140, + ), + ( + Text( + "=", + ), + 140..141, + ), + ( + Text( + "1", + ), + 141..142, + ), + ( + Text( + ";", + ), + 142..143, + ), + ( + Text( + "i", + ), + 144..145, + ), + ( + Text( + "<=", + ), + 145..147, + ), + ( + Text( + "NF", + ), + 147..149, + ), + ( + Text( + ";", + ), + 149..150, + ), + ( + Text( + "i", + ), + 151..152, + ), + ( + Text( + "+", + ), + 152..153, + ), + ( + Text( + "+", + ), + 153..154, + ), + ( + Text( + ")", + ), + 154..155, + ), + ( + Text( + "s", + ), + 156..157, + ), + ( + Text( + "+=", + ), + 157..159, + ), + ( + Escape( + "$", + ), + 159..161, + ), + ( + Text( + "i", + ), + 161..162, + ), + ( + Text( + ";", + ), + 162..163, + ), + ( + Text( + "print", + ), + 164..169, + ), + ( + Text( + "s", + ), + 170..171, + ), + ( + Text( + "}", + ), + 171..172, + ), + ( + Text( + "'", + ), + 172..173, + ), + ( + Text( + "$", + ), + 174..175, + ), + ], + [], + ), + 98..175, + ), + ( + "as", + 176..178, + ), + ( + Num, + 179..182, + ), + ), + 98..182, + ), + ), + ), + 91..182, + ), + ], + ), + 29..184, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns a number, rounded to the nearest integer", + ), + 186..239, + ), + ), + 186..239, + ), + ), + 186..239, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 239..259, + ), + ], + ( + true, + 260..263, + ), + ( + "fun", + 264..267, + ), + ( + "math_round", + 268..278, + ), + [ + ( + Typed( + ( + false, + 279..279, + ), + ( + "number", + 279..285, + ), + ( + Num, + 287..290, + ), + ), + 279..290, + ), + ], + Some( + ( + Num, + 293..296, + ), + ), + [ + ( + IfCondition( + ( + "if", + 303..305, + ), + ( + IfCondition( + ( + Gt( + ( + Var( + ( + "number", + 306..312, + ), + ), + 306..312, + ), + ( + Int( + ( + 0, + 315..316, + ), + ), + 315..316, + ), + ), + 306..316, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 327..333, + ), + Some( + ( + Cast( + ( + Command( + [ + ( + Trust, + 334..339, + ), + ], + [ + ( + Text( + "$", + ), + 340..341, + ), + ( + Text( + "echo", + ), + 342..346, + ), + ( + Text( + "\"", + ), + 347..348, + ), + ( + Text( + "(", + ), + 348..349, + ), + ( + Expression( + ( + Var( + ( + "number", + 350..356, + ), + ), + 350..356, + ), + ), + 349..357, + ), + ( + Text( + "+", + ), + 357..358, + ), + ( + Text( + "0", + ), + 358..359, + ), + ( + Text( + ".", + ), + 359..360, + ), + ( + Text( + "5", + ), + 360..361, + ), + ( + Text( + ")", + ), + 361..362, + ), + ( + Text( + "/", + ), + 362..363, + ), + ( + Text( + "1", + ), + 363..364, + ), + ( + Text( + "\"", + ), + 364..365, + ), + ( + Text( + "|", + ), + 366..367, + ), + ( + Text( + "bc", + ), + 368..370, + ), + ( + Text( + "$", + ), + 371..372, + ), + ], + [], + ), + 334..372, + ), + ( + "as", + 373..375, + ), + ( + Num, + 376..379, + ), + ), + 334..379, + ), + ), + ), + 327..379, + ), + ], + ), + 317..385, + ), + ), + 306..385, + ), + [], + None, + ), + 303..385, + ), + ( + Return( + ( + "return", + 391..397, + ), + Some( + ( + Cast( + ( + Command( + [ + ( + Trust, + 398..403, + ), + ], + [ + ( + Text( + "$", + ), + 404..405, + ), + ( + Text( + "echo", + ), + 406..410, + ), + ( + Text( + "\"", + ), + 411..412, + ), + ( + Text( + "(", + ), + 412..413, + ), + ( + Expression( + ( + Var( + ( + "number", + 414..420, + ), + ), + 414..420, + ), + ), + 413..421, + ), + ( + CommandOption( + "-0", + ), + 421..423, + ), + ( + Text( + ".", + ), + 423..424, + ), + ( + Text( + "5", + ), + 424..425, + ), + ( + Text( + ")", + ), + 425..426, + ), + ( + Text( + "/", + ), + 426..427, + ), + ( + Text( + "1", + ), + 427..428, + ), + ( + Text( + "\"", + ), + 428..429, + ), + ( + Text( + "|", + ), + 430..431, + ), + ( + Text( + "bc", + ), + 432..434, + ), + ( + Text( + "$", + ), + 435..436, + ), + ], + [], + ), + 398..436, + ), + ( + "as", + 437..439, + ), + ( + Num, + 440..443, + ), + ), + 398..443, + ), + ), + ), + 391..443, + ), + ], + ), + 239..445, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns the largest integer less than or equal to a number", + ), + 447..510, + ), + ), + 447..510, + ), + ), + 447..510, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 510..530, + ), + ], + ( + true, + 531..534, + ), + ( + "fun", + 535..538, + ), + ( + "math_floor", + 539..549, + ), + [ + ( + Typed( + ( + false, + 550..550, + ), + ( + "number", + 550..556, + ), + ( + Num, + 558..561, + ), + ), + 550..561, + ), + ], + Some( + ( + Num, + 564..567, + ), + ), + [ + ( + Return( + ( + "return", + 574..580, + ), + Some( + ( + Cast( + ( + Command( + [ + ( + Trust, + 581..586, + ), + ], + [ + ( + Text( + "$", + ), + 587..588, + ), + ( + Text( + "echo", + ), + 589..593, + ), + ( + Text( + "\"", + ), + 594..595, + ), + ( + Expression( + ( + Var( + ( + "number", + 596..602, + ), + ), + 596..602, + ), + ), + 595..603, + ), + ( + Text( + "\"", + ), + 603..604, + ), + ( + Text( + "|", + ), + 605..606, + ), + ( + Text( + "awk", + ), + 607..610, + ), + ( + Text( + "'", + ), + 611..612, + ), + ( + Escape( + "{", + ), + 612..614, + ), + ( + Text( + "printf", + ), + 614..620, + ), + ( + Text( + "\"", + ), + 621..622, + ), + ( + Text( + "%", + ), + 622..623, + ), + ( + Text( + "d", + ), + 623..624, + ), + ( + Text( + "\"", + ), + 624..625, + ), + ( + Text( + ",", + ), + 625..626, + ), + ( + Text( + "(", + ), + 627..628, + ), + ( + Escape( + "$", + ), + 628..630, + ), + ( + Text( + "1", + ), + 630..631, + ), + ( + Text( + "<", + ), + 632..633, + ), + ( + Text( + "0", + ), + 634..635, + ), + ( + Text( + "?", + ), + 636..637, + ), + ( + Text( + "int", + ), + 638..641, + ), + ( + Text( + "(", + ), + 641..642, + ), + ( + Escape( + "$", + ), + 642..644, + ), + ( + Text( + "1", + ), + 644..645, + ), + ( + Text( + ")", + ), + 645..646, + ), + ( + CommandOption( + "-1", + ), + 647..650, + ), + ( + Text( + ":", + ), + 651..652, + ), + ( + Text( + "int", + ), + 653..656, + ), + ( + Text( + "(", + ), + 656..657, + ), + ( + Escape( + "$", + ), + 657..659, + ), + ( + Text( + "1", + ), + 659..660, + ), + ( + Text( + ")", + ), + 660..661, + ), + ( + Text( + ")", + ), + 661..662, + ), + ( + Text( + "}", + ), + 662..663, + ), + ( + Text( + "'", + ), + 663..664, + ), + ( + Text( + "$", + ), + 665..666, + ), + ], + [], + ), + 581..666, + ), + ( + "as", + 667..669, + ), + ( + Num, + 670..673, + ), + ), + 581..673, + ), + ), + ), + 574..673, + ), + ], + ), + 510..675, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns the smallest integer greater than or equal to a number", + ), + 677..744, + ), + ), + 677..744, + ), + ), + 677..744, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 744..764, + ), + ], + ( + true, + 765..768, + ), + ( + "fun", + 769..772, + ), + ( + "math_ceil", + 773..782, + ), + [ + ( + Typed( + ( + false, + 783..783, + ), + ( + "number", + 783..789, + ), + ( + Num, + 791..794, + ), + ), + 783..794, + ), + ], + Some( + ( + Num, + 797..800, + ), + ), + [ + ( + Return( + ( + "return", + 807..813, + ), + Some( + ( + Add( + ( + FunctionInvocation( + [], + ( + "math_floor", + 814..824, + ), + [ + ( + Var( + ( + "number", + 825..831, + ), + ), + 825..831, + ), + ], + [], + ), + 814..832, + ), + ( + Number( + ( + 1.0, + 835..838, + ), + ), + 835..838, + ), + ), + 814..838, + ), + ), + ), + 807..838, + ), + ], + ), + 744..840, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns the absolute value of a number", + ), + 842..885, + ), + ), + 842..885, + ), + ), + 842..885, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 885..905, + ), + ], + ( + true, + 906..909, + ), + ( + "fun", + 910..913, + ), + ( + "math_abs", + 914..922, + ), + [ + ( + Typed( + ( + false, + 923..923, + ), + ( + "number", + 923..929, + ), + ( + Num, + 931..934, + ), + ), + 923..934, + ), + ], + Some( + ( + Num, + 937..940, + ), + ), + [ + ( + IfCondition( + ( + "if", + 947..949, + ), + ( + IfCondition( + ( + Lt( + ( + Var( + ( + "number", + 950..956, + ), + ), + 950..956, + ), + ( + Int( + ( + 0, + 959..960, + ), + ), + 959..960, + ), + ), + 950..960, + ), + ( + Singleline( + ( + Return( + ( + "return", + 962..968, + ), + Some( + ( + Neg( + ( + "-", + 969..970, + ), + ( + Var( + ( + "number", + 970..976, + ), + ), + 970..976, + ), + ), + 970..976, + ), + ), + ), + 962..976, + ), + ), + 960..976, + ), + ), + 950..976, + ), + [], + None, + ), + 947..976, + ), + ( + Return( + ( + "return", + 981..987, + ), + Some( + ( + Var( + ( + "number", + 988..994, + ), + ), + 988..994, + ), + ), + ), + 981..994, + ), + ], + ), + 885..996, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap new file mode 100644 index 0000000..c26b72e --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap @@ -0,0 +1,11394 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokens) +--- +[ + ( + Statement( + ( + Comment( + ( + Comment( + "We cannot import `bash_version` from `env.ab` because it imports `text.ab` making a circular dependency.", + ), + 0..108, + ), + ), + 0..108, + ), + ), + 0..108, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "This is a workaround to avoid that issue and the import system should be improved in the future.", + ), + 108..208, + ), + ), + 108..208, + ), + ), + 108..208, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 208..228, + ), + ], + ( + false, + 229..228, + ), + ( + "fun", + 229..232, + ), + ( + "bash_version", + 233..245, + ), + [], + Some( + ( + [Int], + 249..254, + ), + ), + [ + ( + VariableInit( + ( + "let", + 261..264, + ), + ( + "major", + 265..270, + ), + ( + Expression( + ( + Cast( + ( + Command( + [ + ( + Trust, + 273..278, + ), + ], + [ + ( + Text( + "$", + ), + 279..280, + ), + ( + Text( + "echo", + ), + 281..285, + ), + ( + Text( + "\"", + ), + 286..287, + ), + ( + Escape( + "$", + ), + 287..289, + ), + ( + Escape( + "{", + ), + 289..291, + ), + ( + Text( + "BASH_VERSINFO", + ), + 291..304, + ), + ( + Text( + "[", + ), + 304..305, + ), + ( + Text( + "0", + ), + 305..306, + ), + ( + Text( + "]", + ), + 306..307, + ), + ( + Text( + "}", + ), + 307..308, + ), + ( + Text( + "\"", + ), + 308..309, + ), + ( + Text( + "$", + ), + 310..311, + ), + ], + [], + ), + 273..311, + ), + ( + "as", + 312..314, + ), + ( + Int, + 315..318, + ), + ), + 273..318, + ), + ), + 273..318, + ), + ), + 261..318, + ), + ( + VariableInit( + ( + "let", + 323..326, + ), + ( + "minor", + 327..332, + ), + ( + Expression( + ( + Cast( + ( + Command( + [ + ( + Trust, + 335..340, + ), + ], + [ + ( + Text( + "$", + ), + 341..342, + ), + ( + Text( + "echo", + ), + 343..347, + ), + ( + Text( + "\"", + ), + 348..349, + ), + ( + Escape( + "$", + ), + 349..351, + ), + ( + Escape( + "{", + ), + 351..353, + ), + ( + Text( + "BASH_VERSINFO", + ), + 353..366, + ), + ( + Text( + "[", + ), + 366..367, + ), + ( + Text( + "1", + ), + 367..368, + ), + ( + Text( + "]", + ), + 368..369, + ), + ( + Text( + "}", + ), + 369..370, + ), + ( + Text( + "\"", + ), + 370..371, + ), + ( + Text( + "$", + ), + 372..373, + ), + ], + [], + ), + 335..373, + ), + ( + "as", + 374..376, + ), + ( + Int, + 377..380, + ), + ), + 335..380, + ), + ), + 335..380, + ), + ), + 323..380, + ), + ( + VariableInit( + ( + "let", + 385..388, + ), + ( + "patch", + 389..394, + ), + ( + Expression( + ( + Cast( + ( + Command( + [ + ( + Trust, + 397..402, + ), + ], + [ + ( + Text( + "$", + ), + 403..404, + ), + ( + Text( + "echo", + ), + 405..409, + ), + ( + Text( + "\"", + ), + 410..411, + ), + ( + Escape( + "$", + ), + 411..413, + ), + ( + Escape( + "{", + ), + 413..415, + ), + ( + Text( + "BASH_VERSINFO", + ), + 415..428, + ), + ( + Text( + "[", + ), + 428..429, + ), + ( + Text( + "2", + ), + 429..430, + ), + ( + Text( + "]", + ), + 430..431, + ), + ( + Text( + "}", + ), + 431..432, + ), + ( + Text( + "\"", + ), + 432..433, + ), + ( + Text( + "$", + ), + 434..435, + ), + ], + [], + ), + 397..435, + ), + ( + "as", + 436..438, + ), + ( + Int, + 439..442, + ), + ), + 397..442, + ), + ), + 397..442, + ), + ), + 385..442, + ), + ( + Return( + ( + "return", + 447..453, + ), + Some( + ( + Array( + [ + ( + Var( + ( + "major", + 455..460, + ), + ), + 455..460, + ), + ( + Var( + ( + "minor", + 462..467, + ), + ), + 462..467, + ), + ( + Var( + ( + "patch", + 469..474, + ), + ), + 469..474, + ), + ], + ), + 454..475, + ), + ), + ), + 447..475, + ), + ], + ), + 208..477, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Replaces all occurrences of a pattern in the content with the provided replace text.", + ), + 479..568, + ), + ), + 479..568, + ), + ), + 479..568, + ), + ( + FunctionDefinition( + [], + ( + true, + 568..571, + ), + ( + "fun", + 572..575, + ), + ( + "replace", + 576..583, + ), + [ + ( + Generic( + ( + false, + 584..584, + ), + ( + "source", + 584..590, + ), + ), + 584..590, + ), + ( + Generic( + ( + false, + 592..591, + ), + ( + "search", + 592..598, + ), + ), + 592..598, + ), + ( + Generic( + ( + false, + 600..599, + ), + ( + "replace", + 600..607, + ), + ), + 600..607, + ), + ], + None, + [ + ( + Comment( + ( + Comment( + "Here we use a command to avoid #646", + ), + 615..654, + ), + ), + 615..654, + ), + ( + VariableInit( + ( + "let", + 658..661, + ), + ( + "result", + 662..668, + ), + ( + Expression( + ( + Text( + [], + ), + 671..673, + ), + ), + 671..673, + ), + ), + 658..673, + ), + ( + IfCondition( + ( + "if", + 678..680, + ), + ( + IfCondition( + ( + Ge( + ( + FunctionInvocation( + [], + ( + "bash_version", + 681..693, + ), + [], + [], + ), + 681..695, + ), + ( + Array( + [ + ( + Int( + ( + 4, + 700..701, + ), + ), + 700..701, + ), + ( + Int( + ( + 3, + 702..703, + ), + ), + 702..703, + ), + ], + ), + 699..704, + ), + ), + 681..704, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 715..720, + ), + ], + [ + ( + Text( + "$", + ), + 721..722, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 724..730, + ), + ( + Var( + ( + "result", + 731..737, + ), + ), + 731..737, + ), + ), + 731..737, + ), + ), + 723..738, + ), + ( + Text( + "=", + ), + 738..739, + ), + ( + Text( + "\"", + ), + 739..740, + ), + ( + Escape( + "$", + ), + 740..742, + ), + ( + Escape( + "{", + ), + 742..744, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 745..751, + ), + ( + Var( + ( + "source", + 752..758, + ), + ), + 752..758, + ), + ), + 752..758, + ), + ), + 744..759, + ), + ( + Text( + "//", + ), + 759..761, + ), + ( + Escape( + "\"", + ), + 761..763, + ), + ( + Escape( + "$", + ), + 763..765, + ), + ( + Escape( + "{", + ), + 765..767, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 768..774, + ), + ( + Var( + ( + "search", + 775..781, + ), + ), + 775..781, + ), + ), + 775..781, + ), + ), + 767..782, + ), + ( + Text( + "}", + ), + 782..783, + ), + ( + Escape( + "\"", + ), + 783..785, + ), + ( + Text( + "/", + ), + 785..786, + ), + ( + Escape( + "\"", + ), + 786..788, + ), + ( + Escape( + "$", + ), + 788..790, + ), + ( + Escape( + "{", + ), + 790..792, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 793..799, + ), + ( + Var( + ( + "replace", + 800..807, + ), + ), + 800..807, + ), + ), + 800..807, + ), + ), + 792..808, + ), + ( + Text( + "}", + ), + 808..809, + ), + ( + Escape( + "\"", + ), + 809..811, + ), + ( + Text( + "}", + ), + 811..812, + ), + ( + Text( + "\"", + ), + 812..813, + ), + ( + Text( + "$", + ), + 814..815, + ), + ], + [], + ), + 715..815, + ), + ), + 715..815, + ), + ], + ), + 705..821, + ), + ), + 681..821, + ), + [], + Some( + ( + Else( + ( + "else", + 822..826, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 837..842, + ), + ], + [ + ( + Text( + "$", + ), + 843..844, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 846..852, + ), + ( + Var( + ( + "result", + 853..859, + ), + ), + 853..859, + ), + ), + 853..859, + ), + ), + 845..860, + ), + ( + Text( + "=", + ), + 860..861, + ), + ( + Text( + "\"", + ), + 861..862, + ), + ( + Escape( + "$", + ), + 862..864, + ), + ( + Escape( + "{", + ), + 864..866, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 867..873, + ), + ( + Var( + ( + "source", + 874..880, + ), + ), + 874..880, + ), + ), + 874..880, + ), + ), + 866..881, + ), + ( + Text( + "//", + ), + 881..883, + ), + ( + Escape( + "\"", + ), + 883..885, + ), + ( + Escape( + "$", + ), + 885..887, + ), + ( + Escape( + "{", + ), + 887..889, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 890..896, + ), + ( + Var( + ( + "search", + 897..903, + ), + ), + 897..903, + ), + ), + 897..903, + ), + ), + 889..904, + ), + ( + Text( + "}", + ), + 904..905, + ), + ( + Escape( + "\"", + ), + 905..907, + ), + ( + Text( + "/", + ), + 907..908, + ), + ( + Escape( + "$", + ), + 908..910, + ), + ( + Escape( + "{", + ), + 910..912, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 913..919, + ), + ( + Var( + ( + "replace", + 920..927, + ), + ), + 920..927, + ), + ), + 920..927, + ), + ), + 912..928, + ), + ( + Text( + "}", + ), + 928..929, + ), + ( + Text( + "}", + ), + 929..930, + ), + ( + Text( + "\"", + ), + 930..931, + ), + ( + Text( + "$", + ), + 932..933, + ), + ], + [], + ), + 837..933, + ), + ), + 837..933, + ), + ], + ), + 827..939, + ), + ), + 822..939, + ), + ), + ), + 678..939, + ), + ( + Return( + ( + "return", + 944..950, + ), + Some( + ( + Var( + ( + "result", + 951..957, + ), + ), + 951..957, + ), + ), + ), + 944..957, + ), + ], + ), + 568..959, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Replaces the first occurrence of a pattern in the content with the provided replace text.", + ), + 961..1055, + ), + ), + 961..1055, + ), + ), + 961..1055, + ), + ( + FunctionDefinition( + [], + ( + true, + 1055..1058, + ), + ( + "fun", + 1059..1062, + ), + ( + "replace_one", + 1063..1074, + ), + [ + ( + Generic( + ( + false, + 1075..1075, + ), + ( + "source", + 1075..1081, + ), + ), + 1075..1081, + ), + ( + Generic( + ( + false, + 1083..1082, + ), + ( + "search", + 1083..1089, + ), + ), + 1083..1089, + ), + ( + Generic( + ( + false, + 1091..1090, + ), + ( + "replace", + 1091..1098, + ), + ), + 1091..1098, + ), + ], + None, + [ + ( + Comment( + ( + Comment( + "Here we use a command to avoid #646", + ), + 1106..1145, + ), + ), + 1106..1145, + ), + ( + VariableInit( + ( + "let", + 1149..1152, + ), + ( + "result", + 1153..1159, + ), + ( + Expression( + ( + Text( + [], + ), + 1162..1164, + ), + ), + 1162..1164, + ), + ), + 1149..1164, + ), + ( + IfCondition( + ( + "if", + 1169..1171, + ), + ( + IfCondition( + ( + Ge( + ( + FunctionInvocation( + [], + ( + "bash_version", + 1172..1184, + ), + [], + [], + ), + 1172..1186, + ), + ( + Array( + [ + ( + Int( + ( + 4, + 1191..1192, + ), + ), + 1191..1192, + ), + ( + Int( + ( + 3, + 1193..1194, + ), + ), + 1193..1194, + ), + ], + ), + 1190..1195, + ), + ), + 1172..1195, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 1206..1211, + ), + ], + [ + ( + Text( + "$", + ), + 1212..1213, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1215..1221, + ), + ( + Var( + ( + "result", + 1222..1228, + ), + ), + 1222..1228, + ), + ), + 1222..1228, + ), + ), + 1214..1229, + ), + ( + Text( + "=", + ), + 1229..1230, + ), + ( + Text( + "\"", + ), + 1230..1231, + ), + ( + Escape( + "$", + ), + 1231..1233, + ), + ( + Escape( + "{", + ), + 1233..1235, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1236..1242, + ), + ( + Var( + ( + "source", + 1243..1249, + ), + ), + 1243..1249, + ), + ), + 1243..1249, + ), + ), + 1235..1250, + ), + ( + Text( + "/", + ), + 1250..1251, + ), + ( + Escape( + "\"", + ), + 1251..1253, + ), + ( + Escape( + "$", + ), + 1253..1255, + ), + ( + Escape( + "{", + ), + 1255..1257, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1258..1264, + ), + ( + Var( + ( + "search", + 1265..1271, + ), + ), + 1265..1271, + ), + ), + 1265..1271, + ), + ), + 1257..1272, + ), + ( + Text( + "}", + ), + 1272..1273, + ), + ( + Escape( + "\"", + ), + 1273..1275, + ), + ( + Text( + "/", + ), + 1275..1276, + ), + ( + Escape( + "\"", + ), + 1276..1278, + ), + ( + Escape( + "$", + ), + 1278..1280, + ), + ( + Escape( + "{", + ), + 1280..1282, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1283..1289, + ), + ( + Var( + ( + "replace", + 1290..1297, + ), + ), + 1290..1297, + ), + ), + 1290..1297, + ), + ), + 1282..1298, + ), + ( + Text( + "}", + ), + 1298..1299, + ), + ( + Escape( + "\"", + ), + 1299..1301, + ), + ( + Text( + "}", + ), + 1301..1302, + ), + ( + Text( + "\"", + ), + 1302..1303, + ), + ( + Text( + "$", + ), + 1304..1305, + ), + ], + [], + ), + 1206..1305, + ), + ), + 1206..1305, + ), + ], + ), + 1196..1311, + ), + ), + 1172..1311, + ), + [], + Some( + ( + Else( + ( + "else", + 1312..1316, + ), + ( + Block( + [], + [ + ( + Expression( + ( + Command( + [ + ( + Trust, + 1327..1332, + ), + ], + [ + ( + Text( + "$", + ), + 1333..1334, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1336..1342, + ), + ( + Var( + ( + "result", + 1343..1349, + ), + ), + 1343..1349, + ), + ), + 1343..1349, + ), + ), + 1335..1350, + ), + ( + Text( + "=", + ), + 1350..1351, + ), + ( + Text( + "\"", + ), + 1351..1352, + ), + ( + Escape( + "$", + ), + 1352..1354, + ), + ( + Escape( + "{", + ), + 1354..1356, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1357..1363, + ), + ( + Var( + ( + "source", + 1364..1370, + ), + ), + 1364..1370, + ), + ), + 1364..1370, + ), + ), + 1356..1371, + ), + ( + Text( + "/", + ), + 1371..1372, + ), + ( + Escape( + "\"", + ), + 1372..1374, + ), + ( + Escape( + "$", + ), + 1374..1376, + ), + ( + Escape( + "{", + ), + 1376..1378, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1379..1385, + ), + ( + Var( + ( + "search", + 1386..1392, + ), + ), + 1386..1392, + ), + ), + 1386..1392, + ), + ), + 1378..1393, + ), + ( + Text( + "}", + ), + 1393..1394, + ), + ( + Escape( + "\"", + ), + 1394..1396, + ), + ( + Text( + "/", + ), + 1396..1397, + ), + ( + Escape( + "$", + ), + 1397..1399, + ), + ( + Escape( + "{", + ), + 1399..1401, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 1402..1408, + ), + ( + Var( + ( + "replace", + 1409..1416, + ), + ), + 1409..1416, + ), + ), + 1409..1416, + ), + ), + 1401..1417, + ), + ( + Text( + "}", + ), + 1417..1418, + ), + ( + Text( + "}", + ), + 1418..1419, + ), + ( + Text( + "\"", + ), + 1419..1420, + ), + ( + Text( + "$", + ), + 1421..1422, + ), + ], + [], + ), + 1327..1422, + ), + ), + 1327..1422, + ), + ], + ), + 1317..1428, + ), + ), + 1312..1428, + ), + ), + ), + 1169..1428, + ), + ( + Return( + ( + "return", + 1433..1439, + ), + Some( + ( + Var( + ( + "result", + 1440..1446, + ), + ), + 1440..1446, + ), + ), + ), + 1433..1446, + ), + ], + ), + 1055..1448, + ), + ( + Statement( + ( + ConstInit( + ( + "const", + 1450..1455, + ), + ( + "SED_VERSION_UNKNOWN", + 1456..1475, + ), + ( + Int( + ( + 0, + 1478..1479, + ), + ), + 1478..1479, + ), + ), + 1450..1479, + ), + ), + 1450..1479, + ), + ( + Statement( + ( + ConstInit( + ( + "const", + 1480..1485, + ), + ( + "SED_VERSION_GNU", + 1486..1501, + ), + ( + Int( + ( + 1, + 1504..1505, + ), + ), + 1504..1505, + ), + ), + 1480..1505, + ), + ), + 1480..1505, + ), + ( + Statement( + ( + ConstInit( + ( + "const", + 1506..1511, + ), + ( + "SED_VERSION_BUSYBOX", + 1512..1531, + ), + ( + Int( + ( + 2, + 1534..1535, + ), + ), + 1534..1535, + ), + ), + 1506..1535, + ), + ), + 1506..1535, + ), + ( + FunctionDefinition( + [], + ( + false, + 1537..1535, + ), + ( + "fun", + 1537..1540, + ), + ( + "sed_version", + 1541..1552, + ), + [], + Some( + ( + Int, + 1556..1559, + ), + ), + [ + ( + Comment( + ( + Comment( + "We can't match against a word \"GNU\" because", + ), + 1566..1613, + ), + ), + 1566..1613, + ), + ( + Comment( + ( + Comment( + "alpine's busybox sed returns \"This is not GNU sed version\"", + ), + 1617..1679, + ), + ), + 1617..1679, + ), + ( + Expression( + ( + Command( + [ + ( + Trust, + 1683..1688, + ), + ], + [ + ( + Text( + "$", + ), + 1689..1690, + ), + ( + Text( + "re", + ), + 1691..1693, + ), + ( + Text( + "=", + ), + 1693..1694, + ), + ( + Text( + "'", + ), + 1694..1695, + ), + ( + Escape( + "bCopyright", + ), + 1695..1706, + ), + ( + Escape( + "b", + ), + 1706..1708, + ), + ( + Text( + ".", + ), + 1708..1709, + ), + ( + Text( + "+", + ), + 1709..1710, + ), + ( + Escape( + "bFree", + ), + 1710..1716, + ), + ( + Text( + "Software", + ), + 1717..1725, + ), + ( + Text( + "Foundation", + ), + 1726..1736, + ), + ( + Escape( + "b'", + ), + 1736..1739, + ), + ( + Text( + ";", + ), + 1739..1740, + ), + ( + Text( + "[", + ), + 1741..1742, + ), + ( + Text( + "[", + ), + 1742..1743, + ), + ( + Escape( + "$", + ), + 1744..1746, + ), + ( + Text( + "(", + ), + 1746..1747, + ), + ( + Text( + "sed", + ), + 1747..1750, + ), + ( + CommandOption( + "--version", + ), + 1751..1760, + ), + ( + Text( + "2", + ), + 1761..1762, + ), + ( + Text( + ">", + ), + 1762..1763, + ), + ( + Text( + "/", + ), + 1763..1764, + ), + ( + Text( + "dev", + ), + 1764..1767, + ), + ( + Text( + "/", + ), + 1767..1768, + ), + ( + Text( + "null", + ), + 1768..1772, + ), + ( + Text( + ")", + ), + 1772..1773, + ), + ( + Text( + "=", + ), + 1774..1775, + ), + ( + Text( + "~", + ), + 1775..1776, + ), + ( + Escape( + "$", + ), + 1777..1779, + ), + ( + Text( + "re", + ), + 1779..1781, + ), + ( + Text( + "]", + ), + 1782..1783, + ), + ( + Text( + "]", + ), + 1783..1784, + ), + ( + Text( + "$", + ), + 1785..1786, + ), + ], + [], + ), + 1683..1786, + ), + ), + 1683..1786, + ), + ( + IfCondition( + ( + "if", + 1791..1793, + ), + ( + IfCondition( + ( + Eq( + ( + Status, + 1794..1800, + ), + ( + Int( + ( + 0, + 1804..1805, + ), + ), + 1804..1805, + ), + ), + 1794..1805, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 1816..1822, + ), + Some( + ( + Var( + ( + "SED_VERSION_GNU", + 1823..1838, + ), + ), + 1823..1838, + ), + ), + ), + 1816..1838, + ), + ], + ), + 1806..1844, + ), + ), + 1794..1844, + ), + [], + None, + ), + 1791..1844, + ), + ( + Expression( + ( + Command( + [ + ( + Trust, + 1849..1854, + ), + ], + [ + ( + Text( + "$", + ), + 1855..1856, + ), + ( + Text( + "re", + ), + 1857..1859, + ), + ( + Text( + "=", + ), + 1859..1860, + ), + ( + Text( + "'", + ), + 1860..1861, + ), + ( + Escape( + "bBusyBox", + ), + 1861..1870, + ), + ( + Escape( + "b'", + ), + 1870..1873, + ), + ( + Text( + ";", + ), + 1873..1874, + ), + ( + Text( + "[", + ), + 1875..1876, + ), + ( + Text( + "[", + ), + 1876..1877, + ), + ( + Escape( + "$", + ), + 1878..1880, + ), + ( + Text( + "(", + ), + 1880..1881, + ), + ( + Text( + "sed", + ), + 1881..1884, + ), + ( + Text( + "2", + ), + 1885..1886, + ), + ( + Text( + ">", + ), + 1886..1887, + ), + ( + Text( + "&1", + ), + 1887..1889, + ), + ( + Text( + ")", + ), + 1889..1890, + ), + ( + Text( + "=", + ), + 1891..1892, + ), + ( + Text( + "~", + ), + 1892..1893, + ), + ( + Escape( + "$", + ), + 1894..1896, + ), + ( + Text( + "re", + ), + 1896..1898, + ), + ( + Text( + "]", + ), + 1899..1900, + ), + ( + Text( + "]", + ), + 1900..1901, + ), + ( + Text( + "$", + ), + 1902..1903, + ), + ], + [], + ), + 1849..1903, + ), + ), + 1849..1903, + ), + ( + IfCondition( + ( + "if", + 1908..1910, + ), + ( + IfCondition( + ( + Eq( + ( + Status, + 1911..1917, + ), + ( + Int( + ( + 0, + 1921..1922, + ), + ), + 1921..1922, + ), + ), + 1911..1922, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 1933..1939, + ), + Some( + ( + Var( + ( + "SED_VERSION_BUSYBOX", + 1940..1959, + ), + ), + 1940..1959, + ), + ), + ), + 1933..1959, + ), + ], + ), + 1923..1965, + ), + ), + 1911..1965, + ), + [], + None, + ), + 1908..1965, + ), + ( + Return( + ( + "return", + 1970..1976, + ), + Some( + ( + Var( + ( + "SED_VERSION_UNKNOWN", + 1977..1996, + ), + ), + 1977..1996, + ), + ), + ), + 1970..1996, + ), + ], + ), + 1537..1998, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Replaces all occurences of a regex pattern in the content with the provided replace text.", + ), + 2000..2094, + ), + ), + 2000..2094, + ), + ), + 2000..2094, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 2094..2098, + ), + ), + 2094..2098, + ), + ), + 2094..2098, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Function uses `sed`", + ), + 2098..2122, + ), + ), + 2098..2122, + ), + ), + 2098..2122, + ), + ( + FunctionDefinition( + [], + ( + true, + 2122..2125, + ), + ( + "fun", + 2126..2129, + ), + ( + "replace_regex", + 2130..2143, + ), + [ + ( + Typed( + ( + false, + 2144..2144, + ), + ( + "source", + 2144..2150, + ), + ( + Text, + 2152..2156, + ), + ), + 2144..2156, + ), + ( + Typed( + ( + false, + 2158..2157, + ), + ( + "search", + 2158..2164, + ), + ( + Text, + 2166..2170, + ), + ), + 2158..2170, + ), + ( + Typed( + ( + false, + 2172..2171, + ), + ( + "replace_text", + 2172..2184, + ), + ( + Text, + 2186..2190, + ), + ), + 2172..2190, + ), + ( + Optional( + ( + false, + 2192..2191, + ), + ( + "extended", + 2192..2200, + ), + Some( + ( + Bool, + 2202..2206, + ), + ), + ( + Boolean( + ( + false, + 2209..2214, + ), + ), + 2209..2214, + ), + ), + 2192..2214, + ), + ], + Some( + ( + Text, + 2217..2221, + ), + ), + [ + ( + Block( + ( + Block( + [ + ( + Trust, + 2228..2233, + ), + ], + [ + ( + ConstInit( + ( + "const", + 2244..2249, + ), + ( + "sed_version", + 2250..2261, + ), + ( + FunctionInvocation( + [], + ( + "sed_version", + 2264..2275, + ), + [], + [], + ), + 2264..2277, + ), + ), + 2244..2277, + ), + ( + VariableSet( + ( + "search", + 2286..2292, + ), + ( + FunctionInvocation( + [], + ( + "replace", + 2295..2302, + ), + [ + ( + Var( + ( + "search", + 2303..2309, + ), + ), + 2303..2309, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 2312..2313, + ), + ), + 2312..2313, + ), + ], + ), + 2311..2314, + ), + ( + Text( + [ + ( + Escape( + ( + "/", + 2317..2319, + ), + ), + 2317..2319, + ), + ], + ), + 2316..2320, + ), + ], + [], + ), + 2295..2321, + ), + ), + 2286..2321, + ), + ( + VariableSet( + ( + "replace_text", + 2330..2342, + ), + ( + FunctionInvocation( + [], + ( + "replace", + 2345..2352, + ), + [ + ( + Var( + ( + "replace_text", + 2353..2365, + ), + ), + 2353..2365, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 2368..2369, + ), + ), + 2368..2369, + ), + ], + ), + 2367..2370, + ), + ( + Text( + [ + ( + Escape( + ( + "/", + 2373..2375, + ), + ), + 2373..2375, + ), + ], + ), + 2372..2376, + ), + ], + [], + ), + 2345..2377, + ), + ), + 2330..2377, + ), + ( + IfCondition( + ( + "if", + 2386..2388, + ), + ( + IfCondition( + ( + Or( + ( + Eq( + ( + Var( + ( + "sed_version", + 2389..2400, + ), + ), + 2389..2400, + ), + ( + Var( + ( + "SED_VERSION_GNU", + 2404..2419, + ), + ), + 2404..2419, + ), + ), + 2389..2419, + ), + ( + "or", + 2420..2422, + ), + ( + Eq( + ( + Var( + ( + "sed_version", + 2423..2434, + ), + ), + 2423..2434, + ), + ( + Var( + ( + "SED_VERSION_BUSYBOX", + 2438..2457, + ), + ), + 2438..2457, + ), + ), + 2423..2457, + ), + ), + 2389..2457, + ), + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "'\\b' is supported but not in POSIX standards. Disable it", + ), + 2472..2532, + ), + ), + 2472..2532, + ), + ( + VariableSet( + ( + "search", + 2544..2550, + ), + ( + FunctionInvocation( + [], + ( + "replace", + 2553..2560, + ), + [ + ( + Var( + ( + "search", + 2561..2567, + ), + ), + 2561..2567, + ), + ( + Text( + [ + ( + Escape( + ( + "\\", + 2570..2572, + ), + ), + 2570..2572, + ), + ( + Text( + ( + "b", + 2572..2573, + ), + ), + 2572..2573, + ), + ], + ), + 2569..2574, + ), + ( + Text( + [ + ( + Escape( + ( + "\\", + 2577..2579, + ), + ), + 2577..2579, + ), + ( + Escape( + ( + "b", + 2579..2581, + ), + ), + 2579..2581, + ), + ], + ), + 2576..2582, + ), + ], + [], + ), + 2553..2583, + ), + ), + 2544..2583, + ), + ], + ), + 2458..2593, + ), + ), + 2389..2593, + ), + [], + None, + ), + 2386..2593, + ), + ( + IfCondition( + ( + "if", + 2602..2604, + ), + ( + IfCondition( + ( + Var( + ( + "extended", + 2605..2613, + ), + ), + 2605..2613, + ), + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "GNU sed versions 4.0 through 4.2 support extended regex syntax,", + ), + 2628..2695, + ), + ), + 2628..2695, + ), + ( + Comment( + ( + Comment( + "but only via the \"-r\" option", + ), + 2707..2739, + ), + ), + 2707..2739, + ), + ( + IfCondition( + ( + "if", + 2751..2753, + ), + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "sed_version", + 2754..2765, + ), + ), + 2754..2765, + ), + ( + Var( + ( + "SED_VERSION_GNU", + 2769..2784, + ), + ), + 2769..2784, + ), + ), + 2754..2784, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 2803..2809, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2810..2811, + ), + ( + Text( + "echo", + ), + 2812..2816, + ), + ( + Text( + "\"", + ), + 2817..2818, + ), + ( + Expression( + ( + Var( + ( + "source", + 2819..2825, + ), + ), + 2819..2825, + ), + ), + 2818..2826, + ), + ( + Text( + "\"", + ), + 2826..2827, + ), + ( + Text( + "|", + ), + 2828..2829, + ), + ( + Text( + "sed", + ), + 2830..2833, + ), + ( + CommandOption( + "-r", + ), + 2834..2836, + ), + ( + CommandOption( + "-e", + ), + 2837..2839, + ), + ( + Text( + "\"", + ), + 2840..2841, + ), + ( + Text( + "s", + ), + 2841..2842, + ), + ( + Text( + "/", + ), + 2842..2843, + ), + ( + Expression( + ( + Var( + ( + "search", + 2844..2850, + ), + ), + 2844..2850, + ), + ), + 2843..2851, + ), + ( + Text( + "/", + ), + 2851..2852, + ), + ( + Expression( + ( + Var( + ( + "replace_text", + 2853..2865, + ), + ), + 2853..2865, + ), + ), + 2852..2866, + ), + ( + Text( + "/", + ), + 2866..2867, + ), + ( + Text( + "g", + ), + 2867..2868, + ), + ( + Text( + "\"", + ), + 2868..2869, + ), + ( + Text( + "$", + ), + 2870..2871, + ), + ], + [], + ), + 2810..2871, + ), + ), + ), + 2803..2871, + ), + ], + ), + 2785..2885, + ), + ), + 2754..2885, + ), + [], + Some( + ( + Else( + ( + "else", + 2886..2890, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 2909..2915, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 2916..2917, + ), + ( + Text( + "echo", + ), + 2918..2922, + ), + ( + Text( + "\"", + ), + 2923..2924, + ), + ( + Expression( + ( + Var( + ( + "source", + 2925..2931, + ), + ), + 2925..2931, + ), + ), + 2924..2932, + ), + ( + Text( + "\"", + ), + 2932..2933, + ), + ( + Text( + "|", + ), + 2934..2935, + ), + ( + Text( + "sed", + ), + 2936..2939, + ), + ( + CommandOption( + "-E", + ), + 2940..2942, + ), + ( + CommandOption( + "-e", + ), + 2943..2945, + ), + ( + Text( + "\"", + ), + 2946..2947, + ), + ( + Text( + "s", + ), + 2947..2948, + ), + ( + Text( + "/", + ), + 2948..2949, + ), + ( + Expression( + ( + Var( + ( + "search", + 2950..2956, + ), + ), + 2950..2956, + ), + ), + 2949..2957, + ), + ( + Text( + "/", + ), + 2957..2958, + ), + ( + Expression( + ( + Var( + ( + "replace_text", + 2959..2971, + ), + ), + 2959..2971, + ), + ), + 2958..2972, + ), + ( + Text( + "/", + ), + 2972..2973, + ), + ( + Text( + "g", + ), + 2973..2974, + ), + ( + Text( + "\"", + ), + 2974..2975, + ), + ( + Text( + "$", + ), + 2976..2977, + ), + ], + [], + ), + 2916..2977, + ), + ), + ), + 2909..2977, + ), + ], + ), + 2891..2991, + ), + ), + 2886..2991, + ), + ), + ), + 2751..2991, + ), + ], + ), + 2614..3001, + ), + ), + 2605..3001, + ), + [], + Some( + ( + Else( + ( + "else", + 3002..3006, + ), + ( + Block( + [], + [ + ( + IfCondition( + ( + "if", + 3021..3023, + ), + ( + IfCondition( + ( + Or( + ( + Eq( + ( + Var( + ( + "sed_version", + 3024..3035, + ), + ), + 3024..3035, + ), + ( + Var( + ( + "SED_VERSION_GNU", + 3039..3054, + ), + ), + 3039..3054, + ), + ), + 3024..3054, + ), + ( + "or", + 3055..3057, + ), + ( + Eq( + ( + Var( + ( + "sed_version", + 3058..3069, + ), + ), + 3058..3069, + ), + ( + Var( + ( + "SED_VERSION_BUSYBOX", + 3073..3092, + ), + ), + 3073..3092, + ), + ), + 3058..3092, + ), + ), + 3024..3092, + ), + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "GNU Sed BRE handle \\| as a metacharacter, but it is not POSIX standands. Disable it", + ), + 3111..3198, + ), + ), + 3111..3198, + ), + ( + VariableSet( + ( + "search", + 3214..3220, + ), + ( + FunctionInvocation( + [], + ( + "replace", + 3223..3230, + ), + [ + ( + Var( + ( + "search", + 3231..3237, + ), + ), + 3231..3237, + ), + ( + Text( + [ + ( + Escape( + ( + "|", + 3240..3242, + ), + ), + 3240..3242, + ), + ], + ), + 3239..3243, + ), + ( + Text( + [ + ( + Text( + ( + "|", + 3246..3247, + ), + ), + 3246..3247, + ), + ], + ), + 3245..3248, + ), + ], + [], + ), + 3223..3249, + ), + ), + 3214..3249, + ), + ], + ), + 3093..3263, + ), + ), + 3024..3263, + ), + [], + None, + ), + 3021..3263, + ), + ( + Return( + ( + "return", + 3276..3282, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 3283..3284, + ), + ( + Text( + "echo", + ), + 3285..3289, + ), + ( + Text( + "\"", + ), + 3290..3291, + ), + ( + Expression( + ( + Var( + ( + "source", + 3292..3298, + ), + ), + 3292..3298, + ), + ), + 3291..3299, + ), + ( + Text( + "\"", + ), + 3299..3300, + ), + ( + Text( + "|", + ), + 3301..3302, + ), + ( + Text( + "sed", + ), + 3303..3306, + ), + ( + CommandOption( + "-e", + ), + 3307..3309, + ), + ( + Text( + "\"", + ), + 3310..3311, + ), + ( + Text( + "s", + ), + 3311..3312, + ), + ( + Text( + "/", + ), + 3312..3313, + ), + ( + Expression( + ( + Var( + ( + "search", + 3314..3320, + ), + ), + 3314..3320, + ), + ), + 3313..3321, + ), + ( + Text( + "/", + ), + 3321..3322, + ), + ( + Expression( + ( + Var( + ( + "replace_text", + 3323..3335, + ), + ), + 3323..3335, + ), + ), + 3322..3336, + ), + ( + Text( + "/", + ), + 3336..3337, + ), + ( + Text( + "g", + ), + 3337..3338, + ), + ( + Text( + "\"", + ), + 3338..3339, + ), + ( + Text( + "$", + ), + 3340..3341, + ), + ], + [], + ), + 3283..3341, + ), + ), + ), + 3276..3341, + ), + ], + ), + 3007..3351, + ), + ), + 3002..3351, + ), + ), + ), + 2602..3351, + ), + ], + ), + 2228..3357, + ), + ), + 2228..3357, + ), + ], + ), + 2122..3359, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Splits the input `text` into an array of substrings using the specified `delimiter`.", + ), + 3361..3450, + ), + ), + 3361..3450, + ), + ), + 3361..3450, + ), + ( + FunctionDefinition( + [], + ( + true, + 3450..3453, + ), + ( + "fun", + 3454..3457, + ), + ( + "split", + 3458..3463, + ), + [ + ( + Typed( + ( + false, + 3464..3464, + ), + ( + "text", + 3464..3468, + ), + ( + Text, + 3470..3474, + ), + ), + 3464..3474, + ), + ( + Typed( + ( + false, + 3476..3475, + ), + ( + "delimiter", + 3476..3485, + ), + ( + Text, + 3487..3491, + ), + ), + 3476..3491, + ), + ], + Some( + ( + [Text], + 3494..3500, + ), + ), + [ + ( + VariableInit( + ( + "let", + 3507..3510, + ), + ( + "result", + 3511..3517, + ), + ( + DataType( + ( + [Text], + 3520..3526, + ), + ), + 3520..3526, + ), + ), + 3507..3526, + ), + ( + Expression( + ( + Command( + [ + ( + Trust, + 3531..3536, + ), + ], + [ + ( + Text( + "$", + ), + 3537..3538, + ), + ( + Text( + "IFS", + ), + 3539..3542, + ), + ( + Text( + "=", + ), + 3542..3543, + ), + ( + Text( + "\"", + ), + 3543..3544, + ), + ( + Expression( + ( + Var( + ( + "delimiter", + 3545..3554, + ), + ), + 3545..3554, + ), + ), + 3544..3555, + ), + ( + Text( + "\"", + ), + 3555..3556, + ), + ( + Text( + "read", + ), + 3557..3561, + ), + ( + CommandOption( + "-rd", + ), + 3562..3565, + ), + ( + Text( + "''", + ), + 3566..3568, + ), + ( + CommandOption( + "-a", + ), + 3569..3571, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 3573..3579, + ), + ( + Var( + ( + "result", + 3580..3586, + ), + ), + 3580..3586, + ), + ), + 3580..3586, + ), + ), + 3572..3587, + ), + ( + Text( + "<", + ), + 3588..3589, + ), + ( + Text( + "<", + ), + 3590..3591, + ), + ( + Text( + "(", + ), + 3591..3592, + ), + ( + Text( + "printf", + ), + 3592..3598, + ), + ( + Text( + "%", + ), + 3599..3600, + ), + ( + Text( + "s", + ), + 3600..3601, + ), + ( + Text( + "\"", + ), + 3602..3603, + ), + ( + Escape( + "$", + ), + 3603..3605, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 3606..3612, + ), + ( + Var( + ( + "text", + 3613..3617, + ), + ), + 3613..3617, + ), + ), + 3613..3617, + ), + ), + 3605..3618, + ), + ( + Text( + "\"", + ), + 3618..3619, + ), + ( + Text( + ")", + ), + 3619..3620, + ), + ( + Text( + "$", + ), + 3621..3622, + ), + ], + [], + ), + 3531..3622, + ), + ), + 3531..3622, + ), + ( + Return( + ( + "return", + 3627..3633, + ), + Some( + ( + Var( + ( + "result", + 3634..3640, + ), + ), + 3634..3640, + ), + ), + ), + 3627..3640, + ), + ], + ), + 3450..3642, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Splits a `text` into an array of substrings based on newline characters.", + ), + 3644..3721, + ), + ), + 3644..3721, + ), + ), + 3644..3721, + ), + ( + FunctionDefinition( + [], + ( + true, + 3721..3724, + ), + ( + "fun", + 3725..3728, + ), + ( + "split_lines", + 3729..3740, + ), + [ + ( + Typed( + ( + false, + 3741..3741, + ), + ( + "text", + 3741..3745, + ), + ( + Text, + 3747..3751, + ), + ), + 3741..3751, + ), + ], + Some( + ( + [Text], + 3754..3760, + ), + ), + [ + ( + Return( + ( + "return", + 3767..3773, + ), + Some( + ( + FunctionInvocation( + [], + ( + "split", + 3774..3779, + ), + [ + ( + Var( + ( + "text", + 3780..3784, + ), + ), + 3780..3784, + ), + ( + Text( + [ + ( + Escape( + ( + "n", + 3787..3789, + ), + ), + 3787..3789, + ), + ], + ), + 3786..3790, + ), + ], + [], + ), + 3774..3791, + ), + ), + ), + 3767..3791, + ), + ], + ), + 3721..3793, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Splits a `text` into an array of substrings based on space character.", + ), + 3795..3869, + ), + ), + 3795..3869, + ), + ), + 3795..3869, + ), + ( + FunctionDefinition( + [], + ( + true, + 3869..3872, + ), + ( + "fun", + 3873..3876, + ), + ( + "split_words", + 3877..3888, + ), + [ + ( + Typed( + ( + false, + 3889..3889, + ), + ( + "text", + 3889..3893, + ), + ( + Text, + 3895..3899, + ), + ), + 3889..3899, + ), + ], + Some( + ( + [Text], + 3902..3908, + ), + ), + [ + ( + Return( + ( + "return", + 3915..3921, + ), + Some( + ( + FunctionInvocation( + [], + ( + "split", + 3922..3927, + ), + [ + ( + Var( + ( + "text", + 3928..3932, + ), + ), + 3928..3932, + ), + ( + Text( + [], + ), + 3934..3937, + ), + ], + [], + ), + 3922..3938, + ), + ), + ), + 3915..3938, + ), + ], + ), + 3869..3940, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Merges text using the delimiter specified.", + ), + 3942..3989, + ), + ), + 3942..3989, + ), + ), + 3942..3989, + ), + ( + FunctionDefinition( + [], + ( + true, + 3989..3992, + ), + ( + "fun", + 3993..3996, + ), + ( + "join", + 3997..4001, + ), + [ + ( + Typed( + ( + false, + 4002..4002, + ), + ( + "list", + 4002..4006, + ), + ( + [Text], + 4008..4014, + ), + ), + 4002..4014, + ), + ( + Typed( + ( + false, + 4016..4015, + ), + ( + "delimiter", + 4016..4025, + ), + ( + Text, + 4027..4031, + ), + ), + 4016..4031, + ), + ], + Some( + ( + Text, + 4034..4038, + ), + ), + [ + ( + Return( + ( + "return", + 4045..4051, + ), + Some( + ( + Command( + [ + ( + Trust, + 4052..4057, + ), + ], + [ + ( + Text( + "$", + ), + 4058..4059, + ), + ( + Text( + "IFS", + ), + 4060..4063, + ), + ( + Text( + "=", + ), + 4063..4064, + ), + ( + Text( + "\"", + ), + 4064..4065, + ), + ( + Expression( + ( + Var( + ( + "delimiter", + 4066..4075, + ), + ), + 4066..4075, + ), + ), + 4065..4076, + ), + ( + Text( + "\"", + ), + 4076..4077, + ), + ( + Text( + ";", + ), + 4078..4079, + ), + ( + Text( + "echo", + ), + 4080..4084, + ), + ( + Text( + "\"", + ), + 4085..4086, + ), + ( + Escape( + "$", + ), + 4086..4088, + ), + ( + Escape( + "{", + ), + 4088..4090, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 4091..4097, + ), + ( + Var( + ( + "list", + 4098..4102, + ), + ), + 4098..4102, + ), + ), + 4098..4102, + ), + ), + 4090..4103, + ), + ( + Text( + "[", + ), + 4103..4104, + ), + ( + Text( + "*", + ), + 4104..4105, + ), + ( + Text( + "]", + ), + 4105..4106, + ), + ( + Text( + "}", + ), + 4106..4107, + ), + ( + Text( + "\"", + ), + 4107..4108, + ), + ( + Text( + "$", + ), + 4109..4110, + ), + ], + [], + ), + 4052..4110, + ), + ), + ), + 4045..4110, + ), + ], + ), + 3989..4112, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Trims the spaces at top of the text using `sed`.", + ), + 4114..4167, + ), + ), + 4114..4167, + ), + ), + 4114..4167, + ), + ( + FunctionDefinition( + [], + ( + true, + 4167..4170, + ), + ( + "fun", + 4171..4174, + ), + ( + "trim_left", + 4175..4184, + ), + [ + ( + Typed( + ( + false, + 4185..4185, + ), + ( + "text", + 4185..4189, + ), + ( + Text, + 4191..4195, + ), + ), + 4185..4195, + ), + ], + Some( + ( + Text, + 4198..4202, + ), + ), + [ + ( + Return( + ( + "return", + 4209..4215, + ), + Some( + ( + Command( + [ + ( + Trust, + 4216..4221, + ), + ], + [ + ( + Text( + "$", + ), + 4222..4223, + ), + ( + Text( + "echo", + ), + 4224..4228, + ), + ( + Text( + "\"", + ), + 4229..4230, + ), + ( + Expression( + ( + Var( + ( + "text", + 4231..4235, + ), + ), + 4231..4235, + ), + ), + 4230..4236, + ), + ( + Text( + "\"", + ), + 4236..4237, + ), + ( + Text( + "|", + ), + 4238..4239, + ), + ( + Text( + "sed", + ), + 4240..4243, + ), + ( + CommandOption( + "-e", + ), + 4244..4246, + ), + ( + Text( + "'s", + ), + 4247..4249, + ), + ( + Text( + "/", + ), + 4249..4250, + ), + ( + Text( + "^", + ), + 4250..4251, + ), + ( + Text( + "[", + ), + 4251..4252, + ), + ( + Text( + "[", + ), + 4252..4253, + ), + ( + Text( + ":", + ), + 4253..4254, + ), + ( + Text( + "space", + ), + 4254..4259, + ), + ( + Text( + ":", + ), + 4259..4260, + ), + ( + Text( + "]", + ), + 4260..4261, + ), + ( + Text( + "]", + ), + 4261..4262, + ), + ( + Text( + "*", + ), + 4262..4263, + ), + ( + Text( + "//", + ), + 4263..4265, + ), + ( + Text( + "'", + ), + 4265..4266, + ), + ( + Text( + "$", + ), + 4267..4268, + ), + ], + [], + ), + 4216..4268, + ), + ), + ), + 4209..4268, + ), + ], + ), + 4167..4270, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Trims the spaces at end of the text using `sed`.", + ), + 4272..4325, + ), + ), + 4272..4325, + ), + ), + 4272..4325, + ), + ( + FunctionDefinition( + [], + ( + true, + 4325..4328, + ), + ( + "fun", + 4329..4332, + ), + ( + "trim_right", + 4333..4343, + ), + [ + ( + Typed( + ( + false, + 4344..4344, + ), + ( + "text", + 4344..4348, + ), + ( + Text, + 4350..4354, + ), + ), + 4344..4354, + ), + ], + Some( + ( + Text, + 4357..4361, + ), + ), + [ + ( + Return( + ( + "return", + 4368..4374, + ), + Some( + ( + Command( + [ + ( + Trust, + 4375..4380, + ), + ], + [ + ( + Text( + "$", + ), + 4381..4382, + ), + ( + Text( + "echo", + ), + 4383..4387, + ), + ( + Text( + "\"", + ), + 4388..4389, + ), + ( + Expression( + ( + Var( + ( + "text", + 4390..4394, + ), + ), + 4390..4394, + ), + ), + 4389..4395, + ), + ( + Text( + "\"", + ), + 4395..4396, + ), + ( + Text( + "|", + ), + 4397..4398, + ), + ( + Text( + "sed", + ), + 4399..4402, + ), + ( + CommandOption( + "-e", + ), + 4403..4405, + ), + ( + Text( + "'s", + ), + 4406..4408, + ), + ( + Text( + "/", + ), + 4408..4409, + ), + ( + Text( + "[", + ), + 4409..4410, + ), + ( + Text( + "[", + ), + 4410..4411, + ), + ( + Text( + ":", + ), + 4411..4412, + ), + ( + Text( + "space", + ), + 4412..4417, + ), + ( + Text( + ":", + ), + 4417..4418, + ), + ( + Text( + "]", + ), + 4418..4419, + ), + ( + Text( + "]", + ), + 4419..4420, + ), + ( + Text( + "*", + ), + 4420..4421, + ), + ( + Escape( + "$", + ), + 4421..4423, + ), + ( + Text( + "//", + ), + 4423..4425, + ), + ( + Text( + "'", + ), + 4425..4426, + ), + ( + Text( + "$", + ), + 4427..4428, + ), + ], + [], + ), + 4375..4428, + ), + ), + ), + 4368..4428, + ), + ], + ), + 4325..4430, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Trims the spaces from the text input.", + ), + 4432..4474, + ), + ), + 4432..4474, + ), + ), + 4432..4474, + ), + ( + FunctionDefinition( + [], + ( + true, + 4474..4477, + ), + ( + "fun", + 4478..4481, + ), + ( + "trim", + 4482..4486, + ), + [ + ( + Typed( + ( + false, + 4487..4487, + ), + ( + "text", + 4487..4491, + ), + ( + Text, + 4493..4497, + ), + ), + 4487..4497, + ), + ], + Some( + ( + Text, + 4500..4504, + ), + ), + [ + ( + Return( + ( + "return", + 4511..4517, + ), + Some( + ( + FunctionInvocation( + [], + ( + "trim_left", + 4518..4527, + ), + [ + ( + FunctionInvocation( + [], + ( + "trim_right", + 4528..4538, + ), + [ + ( + Var( + ( + "text", + 4539..4543, + ), + ), + 4539..4543, + ), + ], + [], + ), + 4528..4544, + ), + ], + [], + ), + 4518..4545, + ), + ), + ), + 4511..4545, + ), + ], + ), + 4474..4547, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Makes the text input lowercase using `tr`.", + ), + 4549..4596, + ), + ), + 4549..4596, + ), + ), + 4549..4596, + ), + ( + FunctionDefinition( + [], + ( + true, + 4596..4599, + ), + ( + "fun", + 4600..4603, + ), + ( + "lowercase", + 4604..4613, + ), + [ + ( + Typed( + ( + false, + 4614..4614, + ), + ( + "text", + 4614..4618, + ), + ( + Text, + 4620..4624, + ), + ), + 4614..4624, + ), + ], + Some( + ( + Text, + 4627..4631, + ), + ), + [ + ( + Return( + ( + "return", + 4638..4644, + ), + Some( + ( + Command( + [ + ( + Trust, + 4645..4650, + ), + ], + [ + ( + Text( + "$", + ), + 4651..4652, + ), + ( + Text( + "echo", + ), + 4653..4657, + ), + ( + Text( + "\"", + ), + 4658..4659, + ), + ( + Expression( + ( + Var( + ( + "text", + 4660..4664, + ), + ), + 4660..4664, + ), + ), + 4659..4665, + ), + ( + Text( + "\"", + ), + 4665..4666, + ), + ( + Text( + "|", + ), + 4667..4668, + ), + ( + Text( + "tr", + ), + 4669..4671, + ), + ( + Text( + "'", + ), + 4672..4673, + ), + ( + Text( + "[", + ), + 4673..4674, + ), + ( + Text( + ":", + ), + 4674..4675, + ), + ( + Text( + "upper", + ), + 4675..4680, + ), + ( + Text( + ":", + ), + 4680..4681, + ), + ( + Text( + "]", + ), + 4681..4682, + ), + ( + Text( + "'", + ), + 4682..4683, + ), + ( + Text( + "'", + ), + 4684..4685, + ), + ( + Text( + "[", + ), + 4685..4686, + ), + ( + Text( + ":", + ), + 4686..4687, + ), + ( + Text( + "lower", + ), + 4687..4692, + ), + ( + Text( + ":", + ), + 4692..4693, + ), + ( + Text( + "]", + ), + 4693..4694, + ), + ( + Text( + "'", + ), + 4694..4695, + ), + ( + Text( + "$", + ), + 4696..4697, + ), + ], + [], + ), + 4645..4697, + ), + ), + ), + 4638..4697, + ), + ], + ), + 4596..4699, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Makes the text input uppercase using `tr`.", + ), + 4701..4748, + ), + ), + 4701..4748, + ), + ), + 4701..4748, + ), + ( + FunctionDefinition( + [], + ( + true, + 4748..4751, + ), + ( + "fun", + 4752..4755, + ), + ( + "uppercase", + 4756..4765, + ), + [ + ( + Typed( + ( + false, + 4766..4766, + ), + ( + "text", + 4766..4770, + ), + ( + Text, + 4772..4776, + ), + ), + 4766..4776, + ), + ], + Some( + ( + Text, + 4779..4783, + ), + ), + [ + ( + Return( + ( + "return", + 4790..4796, + ), + Some( + ( + Command( + [ + ( + Trust, + 4797..4802, + ), + ], + [ + ( + Text( + "$", + ), + 4803..4804, + ), + ( + Text( + "echo", + ), + 4805..4809, + ), + ( + Text( + "\"", + ), + 4810..4811, + ), + ( + Expression( + ( + Var( + ( + "text", + 4812..4816, + ), + ), + 4812..4816, + ), + ), + 4811..4817, + ), + ( + Text( + "\"", + ), + 4817..4818, + ), + ( + Text( + "|", + ), + 4819..4820, + ), + ( + Text( + "tr", + ), + 4821..4823, + ), + ( + Text( + "'", + ), + 4824..4825, + ), + ( + Text( + "[", + ), + 4825..4826, + ), + ( + Text( + ":", + ), + 4826..4827, + ), + ( + Text( + "lower", + ), + 4827..4832, + ), + ( + Text( + ":", + ), + 4832..4833, + ), + ( + Text( + "]", + ), + 4833..4834, + ), + ( + Text( + "'", + ), + 4834..4835, + ), + ( + Text( + "'", + ), + 4836..4837, + ), + ( + Text( + "[", + ), + 4837..4838, + ), + ( + Text( + ":", + ), + 4838..4839, + ), + ( + Text( + "upper", + ), + 4839..4844, + ), + ( + Text( + ":", + ), + 4844..4845, + ), + ( + Text( + "]", + ), + 4845..4846, + ), + ( + Text( + "'", + ), + 4846..4847, + ), + ( + Text( + "$", + ), + 4848..4849, + ), + ], + [], + ), + 4797..4849, + ), + ), + ), + 4790..4849, + ), + ], + ), + 4748..4851, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Attempts to parse a given text into a number, returning the parsed number or zero if parsing fails.", + ), + 4853..4957, + ), + ), + 4853..4957, + ), + ), + 4853..4957, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 4957..4977, + ), + ], + ( + true, + 4978..4981, + ), + ( + "fun", + 4982..4985, + ), + ( + "parse_number", + 4986..4998, + ), + [ + ( + Typed( + ( + false, + 4999..4999, + ), + ( + "text", + 4999..5003, + ), + ( + Text, + 5005..5009, + ), + ), + 4999..5009, + ), + ], + Some( + ( + Num?, + 5012..5016, + ), + ), + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 5023..5024, + ), + ( + Text( + "[", + ), + 5025..5026, + ), + ( + CommandOption( + "-n", + ), + 5027..5029, + ), + ( + Text( + "\"", + ), + 5030..5031, + ), + ( + Expression( + ( + Var( + ( + "text", + 5032..5036, + ), + ), + 5032..5036, + ), + ), + 5031..5037, + ), + ( + Text( + "\"", + ), + 5037..5038, + ), + ( + Text( + "]", + ), + 5039..5040, + ), + ( + Text( + "&&", + ), + 5041..5043, + ), + ( + Text( + "[", + ), + 5044..5045, + ), + ( + Text( + "\"", + ), + 5046..5047, + ), + ( + Expression( + ( + Var( + ( + "text", + 5048..5052, + ), + ), + 5048..5052, + ), + ), + 5047..5053, + ), + ( + Text( + "\"", + ), + 5053..5054, + ), + ( + CommandOption( + "-eq", + ), + 5055..5058, + ), + ( + Text( + "\"", + ), + 5059..5060, + ), + ( + Expression( + ( + Var( + ( + "text", + 5061..5065, + ), + ), + 5061..5065, + ), + ), + 5060..5066, + ), + ( + Text( + "\"", + ), + 5066..5067, + ), + ( + Text( + "]", + ), + 5068..5069, + ), + ( + Text( + "2", + ), + 5070..5071, + ), + ( + Text( + ">", + ), + 5071..5072, + ), + ( + Text( + "/", + ), + 5072..5073, + ), + ( + Text( + "dev", + ), + 5073..5076, + ), + ( + Text( + "/", + ), + 5076..5077, + ), + ( + Text( + "null", + ), + 5077..5081, + ), + ( + Text( + "$", + ), + 5082..5083, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5083..5084, + ), + ), + 5083..5084, + ), + ], + ), + 5023..5084, + ), + ), + 5023..5084, + ), + ( + Return( + ( + "return", + 5089..5095, + ), + Some( + ( + Cast( + ( + Var( + ( + "text", + 5096..5100, + ), + ), + 5096..5100, + ), + ( + "as", + 5101..5103, + ), + ( + Num, + 5104..5107, + ), + ), + 5096..5107, + ), + ), + ), + 5089..5107, + ), + ], + ), + 4957..5109, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Splits a text into an array of individual characters.", + ), + 5111..5169, + ), + ), + 5111..5169, + ), + ), + 5111..5169, + ), + ( + FunctionDefinition( + [], + ( + true, + 5169..5172, + ), + ( + "fun", + 5173..5176, + ), + ( + "split_chars", + 5177..5188, + ), + [ + ( + Typed( + ( + false, + 5189..5189, + ), + ( + "text", + 5189..5193, + ), + ( + Text, + 5195..5199, + ), + ), + 5189..5199, + ), + ], + Some( + ( + [Text], + 5202..5208, + ), + ), + [ + ( + VariableInit( + ( + "let", + 5215..5218, + ), + ( + "chars", + 5219..5224, + ), + ( + DataType( + ( + [Text], + 5227..5233, + ), + ), + 5227..5233, + ), + ), + 5215..5233, + ), + ( + Expression( + ( + Command( + [ + ( + Trust, + 5238..5243, + ), + ], + [ + ( + Text( + "$", + ), + 5244..5245, + ), + ( + Text( + "for", + ), + 5246..5249, + ), + ( + Text( + "(", + ), + 5250..5251, + ), + ( + Text( + "(", + ), + 5251..5252, + ), + ( + Text( + "i", + ), + 5252..5253, + ), + ( + Text( + "=", + ), + 5253..5254, + ), + ( + Text( + "0", + ), + 5254..5255, + ), + ( + Text( + ";", + ), + 5255..5256, + ), + ( + Text( + "i", + ), + 5257..5258, + ), + ( + Text( + "<", + ), + 5258..5259, + ), + ( + Escape( + "$", + ), + 5259..5261, + ), + ( + Escape( + "{", + ), + 5261..5263, + ), + ( + Text( + "#", + ), + 5263..5264, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 5265..5271, + ), + ( + Var( + ( + "text", + 5272..5276, + ), + ), + 5272..5276, + ), + ), + 5272..5276, + ), + ), + 5264..5277, + ), + ( + Text( + "}", + ), + 5277..5278, + ), + ( + Text( + ";", + ), + 5278..5279, + ), + ( + Text( + "i", + ), + 5280..5281, + ), + ( + Text( + "+", + ), + 5281..5282, + ), + ( + Text( + "+", + ), + 5282..5283, + ), + ( + Text( + ")", + ), + 5283..5284, + ), + ( + Text( + ")", + ), + 5284..5285, + ), + ( + Text( + ";", + ), + 5285..5286, + ), + ( + Text( + "do", + ), + 5287..5289, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 5299..5305, + ), + ( + Var( + ( + "chars", + 5306..5311, + ), + ), + 5306..5311, + ), + ), + 5306..5311, + ), + ), + 5298..5312, + ), + ( + Text( + "+=", + ), + 5312..5314, + ), + ( + Text( + "(", + ), + 5314..5315, + ), + ( + Text( + "\"", + ), + 5316..5317, + ), + ( + Escape( + "$", + ), + 5317..5319, + ), + ( + Escape( + "{", + ), + 5319..5321, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 5322..5328, + ), + ( + Var( + ( + "text", + 5329..5333, + ), + ), + 5329..5333, + ), + ), + 5329..5333, + ), + ), + 5321..5334, + ), + ( + Text( + ":", + ), + 5334..5335, + ), + ( + Escape( + "$", + ), + 5335..5337, + ), + ( + Text( + "i", + ), + 5337..5338, + ), + ( + Text( + ":", + ), + 5338..5339, + ), + ( + Text( + "1", + ), + 5339..5340, + ), + ( + Text( + "}", + ), + 5340..5341, + ), + ( + Text( + "\"", + ), + 5341..5342, + ), + ( + Text( + ")", + ), + 5343..5344, + ), + ( + Text( + ";", + ), + 5344..5345, + ), + ( + Text( + "done", + ), + 5350..5354, + ), + ( + Text( + "$", + ), + 5355..5356, + ), + ], + [], + ), + 5238..5356, + ), + ), + 5238..5356, + ), + ( + Return( + ( + "return", + 5361..5367, + ), + Some( + ( + Var( + ( + "chars", + 5368..5373, + ), + ), + 5368..5373, + ), + ), + ), + 5361..5373, + ), + ], + ), + 5169..5375, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if some text contains a value.", + ), + 5377..5419, + ), + ), + 5377..5419, + ), + ), + 5377..5419, + ), + ( + FunctionDefinition( + [], + ( + true, + 5419..5422, + ), + ( + "fun", + 5423..5426, + ), + ( + "text_contains", + 5427..5440, + ), + [ + ( + Typed( + ( + false, + 5441..5441, + ), + ( + "source", + 5441..5447, + ), + ( + Text, + 5449..5453, + ), + ), + 5441..5453, + ), + ( + Typed( + ( + false, + 5455..5454, + ), + ( + "search", + 5455..5461, + ), + ( + Text, + 5463..5467, + ), + ), + 5455..5467, + ), + ], + Some( + ( + Bool, + 5470..5474, + ), + ), + [ + ( + VariableInit( + ( + "let", + 5479..5482, + ), + ( + "result", + 5483..5489, + ), + ( + Expression( + ( + Command( + [ + ( + Trust, + 5492..5497, + ), + ], + [ + ( + Text( + "$", + ), + 5498..5499, + ), + ( + Text( + "if", + ), + 5500..5502, + ), + ( + Text( + "[", + ), + 5503..5504, + ), + ( + Text( + "[", + ), + 5504..5505, + ), + ( + Text( + "\"", + ), + 5506..5507, + ), + ( + Expression( + ( + Var( + ( + "source", + 5508..5514, + ), + ), + 5508..5514, + ), + ), + 5507..5515, + ), + ( + Text( + "\"", + ), + 5515..5516, + ), + ( + Text( + "==", + ), + 5517..5519, + ), + ( + Text( + "*", + ), + 5520..5521, + ), + ( + Text( + "\"", + ), + 5521..5522, + ), + ( + Expression( + ( + Var( + ( + "search", + 5523..5529, + ), + ), + 5523..5529, + ), + ), + 5522..5530, + ), + ( + Text( + "\"", + ), + 5530..5531, + ), + ( + Text( + "*", + ), + 5531..5532, + ), + ( + Text( + "]", + ), + 5533..5534, + ), + ( + Text( + "]", + ), + 5534..5535, + ), + ( + Text( + ";", + ), + 5535..5536, + ), + ( + Text( + "then", + ), + 5537..5541, + ), + ( + Text( + "echo", + ), + 5546..5550, + ), + ( + Text( + "1", + ), + 5551..5552, + ), + ( + Text( + "fi", + ), + 5555..5557, + ), + ( + Text( + "$", + ), + 5558..5559, + ), + ], + [], + ), + 5492..5559, + ), + ), + 5492..5559, + ), + ), + 5479..5559, + ), + ( + Return( + ( + "return", + 5563..5569, + ), + Some( + ( + Eq( + ( + Var( + ( + "result", + 5570..5576, + ), + ), + 5570..5576, + ), + ( + Text( + [ + ( + Text( + ( + "1", + 5581..5582, + ), + ), + 5581..5582, + ), + ], + ), + 5580..5583, + ), + ), + 5570..5583, + ), + ), + ), + 5563..5583, + ), + ], + ), + 5419..5585, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if an array value is in the text.", + ), + 5587..5632, + ), + ), + 5587..5632, + ), + ), + 5587..5632, + ), + ( + FunctionDefinition( + [], + ( + true, + 5632..5635, + ), + ( + "fun", + 5636..5639, + ), + ( + "text_contains_any", + 5640..5657, + ), + [ + ( + Typed( + ( + false, + 5658..5658, + ), + ( + "source", + 5658..5664, + ), + ( + Text, + 5666..5670, + ), + ), + 5658..5670, + ), + ( + Typed( + ( + false, + 5672..5671, + ), + ( + "searches", + 5672..5680, + ), + ( + [Text], + 5682..5688, + ), + ), + 5672..5688, + ), + ], + Some( + ( + Bool, + 5691..5695, + ), + ), + [ + ( + IterLoop( + ( + "for", + 5702..5705, + ), + ( + Single( + ( + "search", + 5706..5712, + ), + ), + 5706..5712, + ), + ( + "in", + 5713..5715, + ), + ( + Var( + ( + "searches", + 5716..5724, + ), + ), + 5716..5724, + ), + ( + Block( + [], + [ + ( + IfCondition( + ( + "if", + 5735..5737, + ), + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "text_contains", + 5738..5751, + ), + [ + ( + Var( + ( + "source", + 5752..5758, + ), + ), + 5752..5758, + ), + ( + Var( + ( + "search", + 5760..5766, + ), + ), + 5760..5766, + ), + ], + [], + ), + 5738..5767, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 5782..5788, + ), + Some( + ( + Boolean( + ( + true, + 5789..5793, + ), + ), + 5789..5793, + ), + ), + ), + 5782..5793, + ), + ], + ), + 5768..5803, + ), + ), + 5738..5803, + ), + [], + None, + ), + 5735..5803, + ), + ], + ), + 5725..5809, + ), + ), + 5702..5809, + ), + ( + Return( + ( + "return", + 5815..5821, + ), + Some( + ( + Boolean( + ( + false, + 5822..5827, + ), + ), + 5822..5827, + ), + ), + ), + 5815..5827, + ), + ], + ), + 5632..5829, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if all the arrays values are in the string", + ), + 5831..5885, + ), + ), + 5831..5885, + ), + ), + 5831..5885, + ), + ( + FunctionDefinition( + [], + ( + true, + 5885..5888, + ), + ( + "fun", + 5889..5892, + ), + ( + "text_contains_all", + 5893..5910, + ), + [ + ( + Typed( + ( + false, + 5911..5911, + ), + ( + "source", + 5911..5917, + ), + ( + Text, + 5919..5923, + ), + ), + 5911..5923, + ), + ( + Typed( + ( + false, + 5925..5924, + ), + ( + "searches", + 5925..5933, + ), + ( + [Text], + 5935..5941, + ), + ), + 5925..5941, + ), + ], + Some( + ( + Bool, + 5944..5948, + ), + ), + [ + ( + IterLoop( + ( + "for", + 5955..5958, + ), + ( + Single( + ( + "search", + 5959..5965, + ), + ), + 5959..5965, + ), + ( + "in", + 5966..5968, + ), + ( + Var( + ( + "searches", + 5969..5977, + ), + ), + 5969..5977, + ), + ( + Block( + [], + [ + ( + IfCondition( + ( + "if", + 5988..5990, + ), + ( + IfCondition( + ( + Not( + ( + "not", + 5991..5994, + ), + ( + FunctionInvocation( + [], + ( + "text_contains", + 5995..6008, + ), + [ + ( + Var( + ( + "source", + 6009..6015, + ), + ), + 6009..6015, + ), + ( + Var( + ( + "search", + 6017..6023, + ), + ), + 6017..6023, + ), + ], + [], + ), + 5995..6024, + ), + ), + 5995..6024, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 6039..6045, + ), + Some( + ( + Boolean( + ( + false, + 6046..6051, + ), + ), + 6046..6051, + ), + ), + ), + 6039..6051, + ), + ], + ), + 6025..6061, + ), + ), + 5991..6061, + ), + [], + None, + ), + 5988..6061, + ), + ], + ), + 5978..6067, + ), + ), + 5955..6067, + ), + ( + Return( + ( + "return", + 6073..6079, + ), + Some( + ( + Boolean( + ( + true, + 6080..6084, + ), + ), + 6080..6084, + ), + ), + ), + 6073..6084, + ), + ], + ), + 5885..6086, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Match all occurences of a regex pattern.", + ), + 6088..6133, + ), + ), + 6088..6133, + ), + ), + 6088..6133, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 6133..6137, + ), + ), + 6133..6137, + ), + ), + 6133..6137, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Function uses `sed`", + ), + 6137..6161, + ), + ), + 6137..6161, + ), + ), + 6137..6161, + ), + ( + FunctionDefinition( + [], + ( + true, + 6161..6164, + ), + ( + "fun", + 6165..6168, + ), + ( + "match_regex", + 6169..6180, + ), + [ + ( + Typed( + ( + false, + 6181..6181, + ), + ( + "source", + 6181..6187, + ), + ( + Text, + 6189..6193, + ), + ), + 6181..6193, + ), + ( + Typed( + ( + false, + 6195..6194, + ), + ( + "search", + 6195..6201, + ), + ( + Text, + 6203..6207, + ), + ), + 6195..6207, + ), + ( + Optional( + ( + false, + 6209..6208, + ), + ( + "extended", + 6209..6217, + ), + Some( + ( + Bool, + 6219..6223, + ), + ), + ( + Boolean( + ( + false, + 6226..6231, + ), + ), + 6226..6231, + ), + ), + 6209..6231, + ), + ], + Some( + ( + Bool, + 6234..6238, + ), + ), + [ + ( + Block( + ( + Block( + [ + ( + Trust, + 6245..6250, + ), + ], + [ + ( + ConstInit( + ( + "const", + 6261..6266, + ), + ( + "sed_version", + 6267..6278, + ), + ( + FunctionInvocation( + [], + ( + "sed_version", + 6281..6292, + ), + [], + [], + ), + 6281..6294, + ), + ), + 6261..6294, + ), + ( + VariableSet( + ( + "search", + 6303..6309, + ), + ( + FunctionInvocation( + [], + ( + "replace", + 6312..6319, + ), + [ + ( + Var( + ( + "search", + 6320..6326, + ), + ), + 6320..6326, + ), + ( + Text( + [ + ( + Text( + ( + "/", + 6329..6330, + ), + ), + 6329..6330, + ), + ], + ), + 6328..6331, + ), + ( + Text( + [ + ( + Escape( + ( + "/", + 6334..6336, + ), + ), + 6334..6336, + ), + ], + ), + 6333..6337, + ), + ], + [], + ), + 6312..6338, + ), + ), + 6303..6338, + ), + ( + VariableInit( + ( + "let", + 6347..6350, + ), + ( + "output", + 6351..6357, + ), + ( + Expression( + ( + Text( + [], + ), + 6360..6362, + ), + ), + 6360..6362, + ), + ), + 6347..6362, + ), + ( + IfCondition( + ( + "if", + 6371..6373, + ), + ( + IfCondition( + ( + Or( + ( + Eq( + ( + Var( + ( + "sed_version", + 6374..6385, + ), + ), + 6374..6385, + ), + ( + Var( + ( + "SED_VERSION_GNU", + 6389..6404, + ), + ), + 6389..6404, + ), + ), + 6374..6404, + ), + ( + "or", + 6405..6407, + ), + ( + Eq( + ( + Var( + ( + "sed_version", + 6408..6419, + ), + ), + 6408..6419, + ), + ( + Var( + ( + "SED_VERSION_BUSYBOX", + 6423..6442, + ), + ), + 6423..6442, + ), + ), + 6408..6442, + ), + ), + 6374..6442, + ), + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "'\\b' is supported but not in POSIX standards. Disable it", + ), + 6457..6517, + ), + ), + 6457..6517, + ), + ( + VariableSet( + ( + "search", + 6529..6535, + ), + ( + FunctionInvocation( + [], + ( + "replace", + 6538..6545, + ), + [ + ( + Var( + ( + "search", + 6546..6552, + ), + ), + 6546..6552, + ), + ( + Text( + [ + ( + Escape( + ( + "\\", + 6555..6557, + ), + ), + 6555..6557, + ), + ( + Text( + ( + "b", + 6557..6558, + ), + ), + 6557..6558, + ), + ], + ), + 6554..6559, + ), + ( + Text( + [ + ( + Escape( + ( + "\\", + 6562..6564, + ), + ), + 6562..6564, + ), + ( + Escape( + ( + "b", + 6564..6566, + ), + ), + 6564..6566, + ), + ], + ), + 6561..6567, + ), + ], + [], + ), + 6538..6568, + ), + ), + 6529..6568, + ), + ], + ), + 6443..6578, + ), + ), + 6374..6578, + ), + [], + None, + ), + 6371..6578, + ), + ( + IfCondition( + ( + "if", + 6587..6589, + ), + ( + IfCondition( + ( + Var( + ( + "extended", + 6590..6598, + ), + ), + 6590..6598, + ), + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "GNU sed versions 4.0 through 4.2 support extended regex syntax,", + ), + 6613..6680, + ), + ), + 6613..6680, + ), + ( + Comment( + ( + Comment( + "but only via the \"-r\" option", + ), + 6692..6724, + ), + ), + 6692..6724, + ), + ( + IfCondition( + ( + "if", + 6736..6738, + ), + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "sed_version", + 6739..6750, + ), + ), + 6739..6750, + ), + ( + Var( + ( + "SED_VERSION_GNU", + 6754..6769, + ), + ), + 6754..6769, + ), + ), + 6739..6769, + ), + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "'\\b' is not in POSIX standards. Disable it", + ), + 6788..6834, + ), + ), + 6788..6834, + ), + ( + VariableSet( + ( + "search", + 6850..6856, + ), + ( + FunctionInvocation( + [], + ( + "replace", + 6859..6866, + ), + [ + ( + Var( + ( + "search", + 6867..6873, + ), + ), + 6867..6873, + ), + ( + Text( + [ + ( + Escape( + ( + "b", + 6876..6878, + ), + ), + 6876..6878, + ), + ], + ), + 6875..6879, + ), + ( + Text( + [ + ( + Escape( + ( + "\\", + 6882..6884, + ), + ), + 6882..6884, + ), + ( + Text( + ( + "b", + 6884..6885, + ), + ), + 6884..6885, + ), + ], + ), + 6881..6886, + ), + ], + [], + ), + 6859..6887, + ), + ), + 6850..6887, + ), + ( + VariableSet( + ( + "output", + 6904..6910, + ), + ( + Command( + [], + [ + ( + Text( + "$", + ), + 6913..6914, + ), + ( + Text( + "echo", + ), + 6915..6919, + ), + ( + Text( + "\"", + ), + 6920..6921, + ), + ( + Expression( + ( + Var( + ( + "source", + 6922..6928, + ), + ), + 6922..6928, + ), + ), + 6921..6929, + ), + ( + Text( + "\"", + ), + 6929..6930, + ), + ( + Text( + "|", + ), + 6931..6932, + ), + ( + Text( + "sed", + ), + 6933..6936, + ), + ( + CommandOption( + "-r", + ), + 6937..6939, + ), + ( + CommandOption( + "-ne", + ), + 6940..6943, + ), + ( + Text( + "\"", + ), + 6944..6945, + ), + ( + Text( + "/", + ), + 6945..6946, + ), + ( + Expression( + ( + Var( + ( + "search", + 6947..6953, + ), + ), + 6947..6953, + ), + ), + 6946..6954, + ), + ( + Text( + "/", + ), + 6954..6955, + ), + ( + Text( + "p", + ), + 6955..6956, + ), + ( + Text( + "\"", + ), + 6956..6957, + ), + ( + Text( + "$", + ), + 6958..6959, + ), + ], + [], + ), + 6913..6959, + ), + ), + 6904..6959, + ), + ], + ), + 6770..6973, + ), + ), + 6739..6973, + ), + [], + Some( + ( + Else( + ( + "else", + 6974..6978, + ), + ( + Block( + [], + [ + ( + VariableSet( + ( + "output", + 6997..7003, + ), + ( + Command( + [], + [ + ( + Text( + "$", + ), + 7006..7007, + ), + ( + Text( + "echo", + ), + 7008..7012, + ), + ( + Text( + "\"", + ), + 7013..7014, + ), + ( + Expression( + ( + Var( + ( + "source", + 7015..7021, + ), + ), + 7015..7021, + ), + ), + 7014..7022, + ), + ( + Text( + "\"", + ), + 7022..7023, + ), + ( + Text( + "|", + ), + 7024..7025, + ), + ( + Text( + "sed", + ), + 7026..7029, + ), + ( + CommandOption( + "-E", + ), + 7030..7032, + ), + ( + CommandOption( + "-ne", + ), + 7033..7036, + ), + ( + Text( + "\"", + ), + 7037..7038, + ), + ( + Text( + "/", + ), + 7038..7039, + ), + ( + Expression( + ( + Var( + ( + "search", + 7040..7046, + ), + ), + 7040..7046, + ), + ), + 7039..7047, + ), + ( + Text( + "/", + ), + 7047..7048, + ), + ( + Text( + "p", + ), + 7048..7049, + ), + ( + Text( + "\"", + ), + 7049..7050, + ), + ( + Text( + "$", + ), + 7051..7052, + ), + ], + [], + ), + 7006..7052, + ), + ), + 6997..7052, + ), + ], + ), + 6979..7066, + ), + ), + 6974..7066, + ), + ), + ), + 6736..7066, + ), + ], + ), + 6599..7076, + ), + ), + 6590..7076, + ), + [], + Some( + ( + Else( + ( + "else", + 7077..7081, + ), + ( + Block( + [], + [ + ( + IfCondition( + ( + "if", + 7096..7098, + ), + ( + IfCondition( + ( + Or( + ( + Eq( + ( + Var( + ( + "sed_version", + 7099..7110, + ), + ), + 7099..7110, + ), + ( + Var( + ( + "SED_VERSION_GNU", + 7114..7129, + ), + ), + 7114..7129, + ), + ), + 7099..7129, + ), + ( + "or", + 7130..7132, + ), + ( + Eq( + ( + Var( + ( + "sed_version", + 7133..7144, + ), + ), + 7133..7144, + ), + ( + Var( + ( + "SED_VERSION_BUSYBOX", + 7148..7167, + ), + ), + 7148..7167, + ), + ), + 7133..7167, + ), + ), + 7099..7167, + ), + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "GNU Sed BRE handle \\| as a metacharacter, but it is not POSIX standands. Disable it", + ), + 7186..7273, + ), + ), + 7186..7273, + ), + ( + VariableSet( + ( + "search", + 7289..7295, + ), + ( + FunctionInvocation( + [], + ( + "replace", + 7298..7305, + ), + [ + ( + Var( + ( + "search", + 7306..7312, + ), + ), + 7306..7312, + ), + ( + Text( + [ + ( + Escape( + ( + "|", + 7315..7317, + ), + ), + 7315..7317, + ), + ], + ), + 7314..7318, + ), + ( + Text( + [ + ( + Text( + ( + "|", + 7321..7322, + ), + ), + 7321..7322, + ), + ], + ), + 7320..7323, + ), + ], + [], + ), + 7298..7324, + ), + ), + 7289..7324, + ), + ], + ), + 7168..7338, + ), + ), + 7099..7338, + ), + [], + None, + ), + 7096..7338, + ), + ( + VariableSet( + ( + "output", + 7351..7357, + ), + ( + Command( + [], + [ + ( + Text( + "$", + ), + 7360..7361, + ), + ( + Text( + "echo", + ), + 7362..7366, + ), + ( + Text( + "\"", + ), + 7367..7368, + ), + ( + Expression( + ( + Var( + ( + "source", + 7369..7375, + ), + ), + 7369..7375, + ), + ), + 7368..7376, + ), + ( + Text( + "\"", + ), + 7376..7377, + ), + ( + Text( + "|", + ), + 7378..7379, + ), + ( + Text( + "sed", + ), + 7380..7383, + ), + ( + CommandOption( + "-ne", + ), + 7384..7387, + ), + ( + Text( + "\"", + ), + 7388..7389, + ), + ( + Text( + "/", + ), + 7389..7390, + ), + ( + Expression( + ( + Var( + ( + "search", + 7391..7397, + ), + ), + 7391..7397, + ), + ), + 7390..7398, + ), + ( + Text( + "/", + ), + 7398..7399, + ), + ( + Text( + "p", + ), + 7399..7400, + ), + ( + Text( + "\"", + ), + 7400..7401, + ), + ( + Text( + "$", + ), + 7402..7403, + ), + ], + [], + ), + 7360..7403, + ), + ), + 7351..7403, + ), + ], + ), + 7082..7413, + ), + ), + 7077..7413, + ), + ), + ), + 6587..7413, + ), + ( + IfCondition( + ( + "if", + 7422..7424, + ), + ( + IfCondition( + ( + Neq( + ( + Var( + ( + "output", + 7425..7431, + ), + ), + 7425..7431, + ), + ( + Text( + [], + ), + 7435..7437, + ), + ), + 7425..7437, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 7452..7458, + ), + Some( + ( + Boolean( + ( + true, + 7459..7463, + ), + ), + 7459..7463, + ), + ), + ), + 7452..7463, + ), + ], + ), + 7438..7473, + ), + ), + 7425..7473, + ), + [], + None, + ), + 7422..7473, + ), + ], + ), + 6245..7479, + ), + ), + 6245..7479, + ), + ( + Return( + ( + "return", + 7484..7490, + ), + Some( + ( + Boolean( + ( + false, + 7491..7496, + ), + ), + 7491..7496, + ), + ), + ), + 7484..7496, + ), + ], + ), + 6161..7498, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if an array value (with regular expression) is in the text.", + ), + 7500..7571, + ), + ), + 7500..7571, + ), + ), + 7500..7571, + ), + ( + FunctionDefinition( + [], + ( + true, + 7571..7574, + ), + ( + "fun", + 7575..7578, + ), + ( + "match_regex_any", + 7579..7594, + ), + [ + ( + Typed( + ( + false, + 7595..7595, + ), + ( + "text", + 7595..7599, + ), + ( + Text, + 7601..7605, + ), + ), + 7595..7605, + ), + ( + Typed( + ( + false, + 7607..7606, + ), + ( + "terms", + 7607..7612, + ), + ( + [Text], + 7614..7620, + ), + ), + 7607..7620, + ), + ], + Some( + ( + Bool, + 7623..7627, + ), + ), + [ + ( + IterLoop( + ( + "for", + 7634..7637, + ), + ( + Single( + ( + "term", + 7638..7642, + ), + ), + 7638..7642, + ), + ( + "in", + 7643..7645, + ), + ( + Var( + ( + "terms", + 7646..7651, + ), + ), + 7646..7651, + ), + ( + Block( + [], + [ + ( + IfCondition( + ( + "if", + 7662..7664, + ), + ( + IfCondition( + ( + FunctionInvocation( + [], + ( + "match_regex", + 7665..7676, + ), + [ + ( + Var( + ( + "text", + 7677..7681, + ), + ), + 7677..7681, + ), + ( + Var( + ( + "term", + 7683..7687, + ), + ), + 7683..7687, + ), + ( + Boolean( + ( + false, + 7689..7694, + ), + ), + 7689..7694, + ), + ], + [], + ), + 7665..7695, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 7710..7716, + ), + Some( + ( + Boolean( + ( + true, + 7717..7721, + ), + ), + 7717..7721, + ), + ), + ), + 7710..7721, + ), + ], + ), + 7696..7731, + ), + ), + 7665..7731, + ), + [], + None, + ), + 7662..7731, + ), + ], + ), + 7652..7737, + ), + ), + 7634..7737, + ), + ( + Return( + ( + "return", + 7743..7749, + ), + Some( + ( + Boolean( + ( + false, + 7750..7755, + ), + ), + 7750..7755, + ), + ), + ), + 7743..7755, + ), + ], + ), + 7571..7757, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Reverses text using `rev`.", + ), + 7759..7790, + ), + ), + 7759..7790, + ), + ), + 7759..7790, + ), + ( + FunctionDefinition( + [], + ( + true, + 7790..7793, + ), + ( + "fun", + 7794..7797, + ), + ( + "reversed", + 7798..7806, + ), + [ + ( + Typed( + ( + false, + 7807..7807, + ), + ( + "text", + 7807..7811, + ), + ( + Text, + 7813..7817, + ), + ), + 7807..7817, + ), + ], + Some( + ( + Text, + 7820..7824, + ), + ), + [ + ( + Return( + ( + "return", + 7831..7837, + ), + Some( + ( + Command( + [ + ( + Trust, + 7838..7843, + ), + ], + [ + ( + Text( + "$", + ), + 7844..7845, + ), + ( + Text( + "echo", + ), + 7846..7850, + ), + ( + Text( + "\"", + ), + 7851..7852, + ), + ( + Expression( + ( + Var( + ( + "text", + 7853..7857, + ), + ), + 7853..7857, + ), + ), + 7852..7858, + ), + ( + Text( + "\"", + ), + 7858..7859, + ), + ( + Text( + "|", + ), + 7860..7861, + ), + ( + Text( + "rev", + ), + 7862..7865, + ), + ( + Text( + "$", + ), + 7866..7867, + ), + ], + [], + ), + 7838..7867, + ), + ), + ), + 7831..7867, + ), + ], + ), + 7790..7869, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if text starts with a value.", + ), + 7871..7911, + ), + ), + 7871..7911, + ), + ), + 7871..7911, + ), + ( + FunctionDefinition( + [], + ( + true, + 7911..7914, + ), + ( + "fun", + 7915..7918, + ), + ( + "starts_with", + 7919..7930, + ), + [ + ( + Typed( + ( + false, + 7931..7931, + ), + ( + "text", + 7931..7935, + ), + ( + Text, + 7937..7941, + ), + ), + 7931..7941, + ), + ( + Typed( + ( + false, + 7943..7942, + ), + ( + "prefix", + 7943..7949, + ), + ( + Text, + 7951..7955, + ), + ), + 7943..7955, + ), + ], + Some( + ( + Bool, + 7958..7962, + ), + ), + [ + ( + VariableInit( + ( + "let", + 7967..7970, + ), + ( + "result", + 7971..7977, + ), + ( + Expression( + ( + Command( + [ + ( + Trust, + 7980..7985, + ), + ], + [ + ( + Text( + "$", + ), + 7986..7987, + ), + ( + Text( + "if", + ), + 7988..7990, + ), + ( + Text( + "[", + ), + 7991..7992, + ), + ( + Text( + "[", + ), + 7992..7993, + ), + ( + Text( + "\"", + ), + 7994..7995, + ), + ( + Expression( + ( + Var( + ( + "text", + 7996..8000, + ), + ), + 7996..8000, + ), + ), + 7995..8001, + ), + ( + Text( + "\"", + ), + 8001..8002, + ), + ( + Text( + "==", + ), + 8003..8005, + ), + ( + Text( + "\"", + ), + 8006..8007, + ), + ( + Expression( + ( + Var( + ( + "prefix", + 8008..8014, + ), + ), + 8008..8014, + ), + ), + 8007..8015, + ), + ( + Text( + "\"", + ), + 8015..8016, + ), + ( + Text( + "*", + ), + 8016..8017, + ), + ( + Text( + "]", + ), + 8018..8019, + ), + ( + Text( + "]", + ), + 8019..8020, + ), + ( + Text( + ";", + ), + 8020..8021, + ), + ( + Text( + "then", + ), + 8022..8026, + ), + ( + Text( + "echo", + ), + 8031..8035, + ), + ( + Text( + "1", + ), + 8036..8037, + ), + ( + Text( + "fi", + ), + 8040..8042, + ), + ( + Text( + "$", + ), + 8043..8044, + ), + ], + [], + ), + 7980..8044, + ), + ), + 7980..8044, + ), + ), + 7967..8044, + ), + ( + Return( + ( + "return", + 8048..8054, + ), + Some( + ( + Eq( + ( + Var( + ( + "result", + 8055..8061, + ), + ), + 8055..8061, + ), + ( + Text( + [ + ( + Text( + ( + "1", + 8066..8067, + ), + ), + 8066..8067, + ), + ], + ), + 8065..8068, + ), + ), + 8055..8068, + ), + ), + ), + 8048..8068, + ), + ], + ), + 7911..8070, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Checks if text ends with a value.", + ), + 8072..8110, + ), + ), + 8072..8110, + ), + ), + 8072..8110, + ), + ( + FunctionDefinition( + [], + ( + true, + 8110..8113, + ), + ( + "fun", + 8114..8117, + ), + ( + "ends_with", + 8118..8127, + ), + [ + ( + Typed( + ( + false, + 8128..8128, + ), + ( + "text", + 8128..8132, + ), + ( + Text, + 8134..8138, + ), + ), + 8128..8138, + ), + ( + Typed( + ( + false, + 8140..8139, + ), + ( + "suffix", + 8140..8146, + ), + ( + Text, + 8148..8152, + ), + ), + 8140..8152, + ), + ], + Some( + ( + Bool, + 8155..8159, + ), + ), + [ + ( + VariableInit( + ( + "let", + 8164..8167, + ), + ( + "result", + 8168..8174, + ), + ( + Expression( + ( + Command( + [ + ( + Trust, + 8177..8182, + ), + ], + [ + ( + Text( + "$", + ), + 8183..8184, + ), + ( + Text( + "if", + ), + 8185..8187, + ), + ( + Text( + "[", + ), + 8188..8189, + ), + ( + Text( + "[", + ), + 8189..8190, + ), + ( + Text( + "\"", + ), + 8191..8192, + ), + ( + Expression( + ( + Var( + ( + "text", + 8193..8197, + ), + ), + 8193..8197, + ), + ), + 8192..8198, + ), + ( + Text( + "\"", + ), + 8198..8199, + ), + ( + Text( + "==", + ), + 8200..8202, + ), + ( + Text( + "*", + ), + 8203..8204, + ), + ( + Text( + "\"", + ), + 8204..8205, + ), + ( + Expression( + ( + Var( + ( + "suffix", + 8206..8212, + ), + ), + 8206..8212, + ), + ), + 8205..8213, + ), + ( + Text( + "\"", + ), + 8213..8214, + ), + ( + Text( + "]", + ), + 8215..8216, + ), + ( + Text( + "]", + ), + 8216..8217, + ), + ( + Text( + ";", + ), + 8217..8218, + ), + ( + Text( + "then", + ), + 8219..8223, + ), + ( + Text( + "echo", + ), + 8228..8232, + ), + ( + Text( + "1", + ), + 8233..8234, + ), + ( + Text( + "fi", + ), + 8237..8239, + ), + ( + Text( + "$", + ), + 8240..8241, + ), + ], + [], + ), + 8177..8241, + ), + ), + 8177..8241, + ), + ), + 8164..8241, + ), + ( + Return( + ( + "return", + 8245..8251, + ), + Some( + ( + Eq( + ( + Var( + ( + "result", + 8252..8258, + ), + ), + 8252..8258, + ), + ( + Text( + [ + ( + Text( + ( + "1", + 8263..8264, + ), + ), + 8263..8264, + ), + ], + ), + 8262..8265, + ), + ), + 8252..8265, + ), + ), + ), + 8245..8265, + ), + ], + ), + 8110..8267, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns a substring from `text` starting at the given `index` (0-based).", + ), + 8269..8346, + ), + ), + 8269..8346, + ), + ), + 8269..8346, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 8346..8350, + ), + ), + 8346..8350, + ), + ), + 8346..8350, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.", + ), + 8350..8462, + ), + ), + 8350..8462, + ), + ), + 8350..8462, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If `length` is provided, the substring will include `length` characters; otherwise, it slices to the end of `text`.", + ), + 8462..8582, + ), + ), + 8462..8582, + ), + ), + 8462..8582, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If `length` is negative, an empty string is returned.", + ), + 8582..8640, + ), + ), + 8582..8640, + ), + ), + 8582..8640, + ), + ( + FunctionDefinition( + [], + ( + true, + 8640..8643, + ), + ( + "fun", + 8644..8647, + ), + ( + "slice", + 8648..8653, + ), + [ + ( + Typed( + ( + false, + 8654..8654, + ), + ( + "text", + 8654..8658, + ), + ( + Text, + 8660..8664, + ), + ), + 8654..8664, + ), + ( + Typed( + ( + false, + 8666..8665, + ), + ( + "index", + 8666..8671, + ), + ( + Int, + 8673..8676, + ), + ), + 8666..8676, + ), + ( + Optional( + ( + false, + 8678..8677, + ), + ( + "length", + 8678..8684, + ), + Some( + ( + Int, + 8686..8689, + ), + ), + ( + Int( + ( + 0, + 8692..8693, + ), + ), + 8692..8693, + ), + ), + 8678..8693, + ), + ], + Some( + ( + Text, + 8696..8700, + ), + ), + [ + ( + IfCondition( + ( + "if", + 8707..8709, + ), + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "length", + 8710..8716, + ), + ), + 8710..8716, + ), + ( + Int( + ( + 0, + 8720..8721, + ), + ), + 8720..8721, + ), + ), + 8710..8721, + ), + ( + Singleline( + ( + VariableSet( + ( + "length", + 8723..8729, + ), + ( + Subtract( + ( + FunctionInvocation( + [], + ( + "len", + 8732..8735, + ), + [ + ( + Var( + ( + "text", + 8736..8740, + ), + ), + 8736..8740, + ), + ], + [], + ), + 8732..8741, + ), + ( + Var( + ( + "index", + 8744..8749, + ), + ), + 8744..8749, + ), + ), + 8732..8749, + ), + ), + 8723..8749, + ), + ), + 8721..8749, + ), + ), + 8710..8749, + ), + [], + None, + ), + 8707..8749, + ), + ( + IfCondition( + ( + "if", + 8754..8756, + ), + ( + IfCondition( + ( + Le( + ( + Var( + ( + "length", + 8757..8763, + ), + ), + 8757..8763, + ), + ( + Int( + ( + 0, + 8767..8768, + ), + ), + 8767..8768, + ), + ), + 8757..8768, + ), + ( + Singleline( + ( + Return( + ( + "return", + 8770..8776, + ), + Some( + ( + Text( + [], + ), + 8777..8779, + ), + ), + ), + 8770..8779, + ), + ), + 8768..8779, + ), + ), + 8757..8779, + ), + [], + None, + ), + 8754..8779, + ), + ( + Return( + ( + "return", + 8784..8790, + ), + Some( + ( + Command( + [ + ( + Trust, + 8791..8796, + ), + ], + [ + ( + Text( + "$", + ), + 8797..8798, + ), + ( + Text( + "printf", + ), + 8799..8805, + ), + ( + Text( + "\"", + ), + 8806..8807, + ), + ( + Text( + "%", + ), + 8807..8808, + ), + ( + Text( + ".", + ), + 8808..8809, + ), + ( + Expression( + ( + Var( + ( + "length", + 8810..8816, + ), + ), + 8810..8816, + ), + ), + 8809..8817, + ), + ( + Text( + "s", + ), + 8817..8818, + ), + ( + Text( + "\"", + ), + 8818..8819, + ), + ( + Text( + "\"", + ), + 8820..8821, + ), + ( + Escape( + "$", + ), + 8821..8823, + ), + ( + Escape( + "{", + ), + 8823..8825, + ), + ( + Text( + "text", + ), + 8825..8829, + ), + ( + Text( + ":", + ), + 8829..8830, + ), + ( + Expression( + ( + Var( + ( + "index", + 8831..8836, + ), + ), + 8831..8836, + ), + ), + 8830..8837, + ), + ( + Text( + "}", + ), + 8837..8838, + ), + ( + Text( + "\"", + ), + 8838..8839, + ), + ( + Text( + "$", + ), + 8840..8841, + ), + ], + [], + ), + 8791..8841, + ), + ), + ), + 8784..8841, + ), + ], + ), + 8640..8843, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns the character from `text` at the specified `index` (0-based).", + ), + 8845..8919, + ), + ), + 8845..8919, + ), + ), + 8845..8919, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "", + ), + 8919..8923, + ), + ), + 8919..8923, + ), + ), + 8919..8923, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.", + ), + 8923..9035, + ), + ), + 8923..9035, + ), + ), + 8923..9035, + ), + ( + FunctionDefinition( + [], + ( + true, + 9035..9038, + ), + ( + "fun", + 9039..9042, + ), + ( + "char_at", + 9043..9050, + ), + [ + ( + Typed( + ( + false, + 9051..9051, + ), + ( + "text", + 9051..9055, + ), + ( + Text, + 9057..9061, + ), + ), + 9051..9061, + ), + ( + Typed( + ( + false, + 9063..9062, + ), + ( + "index", + 9063..9068, + ), + ( + Int, + 9070..9073, + ), + ), + 9063..9073, + ), + ], + Some( + ( + Text, + 9076..9080, + ), + ), + [ + ( + Return( + ( + "return", + 9087..9093, + ), + Some( + ( + Command( + [ + ( + Trust, + 9094..9099, + ), + ], + [ + ( + Text( + "$", + ), + 9100..9101, + ), + ( + Text( + "printf", + ), + 9102..9108, + ), + ( + Text( + "\"", + ), + 9109..9110, + ), + ( + Text( + "%", + ), + 9110..9111, + ), + ( + Text( + ".", + ), + 9111..9112, + ), + ( + Text( + "1s", + ), + 9112..9114, + ), + ( + Text( + "\"", + ), + 9114..9115, + ), + ( + Text( + "\"", + ), + 9116..9117, + ), + ( + Escape( + "$", + ), + 9117..9119, + ), + ( + Escape( + "{", + ), + 9119..9121, + ), + ( + Text( + "text", + ), + 9121..9125, + ), + ( + Text( + ":", + ), + 9125..9126, + ), + ( + Expression( + ( + Var( + ( + "index", + 9127..9132, + ), + ), + 9127..9132, + ), + ), + 9126..9133, + ), + ( + Text( + "}", + ), + 9133..9134, + ), + ( + Text( + "\"", + ), + 9134..9135, + ), + ( + Text( + "$", + ), + 9136..9137, + ), + ], + [], + ), + 9094..9137, + ), + ), + ), + 9087..9137, + ), + ], + ), + 9035..9139, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Capitalize the first letter of the given `text`.", + ), + 9141..9194, + ), + ), + 9141..9194, + ), + ), + 9141..9194, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 9194..9214, + ), + ], + ( + true, + 9215..9218, + ), + ( + "fun", + 9219..9222, + ), + ( + "capitalized", + 9223..9234, + ), + [ + ( + Typed( + ( + false, + 9235..9235, + ), + ( + "text", + 9235..9239, + ), + ( + Text, + 9241..9245, + ), + ), + 9235..9245, + ), + ], + Some( + ( + Text, + 9248..9252, + ), + ), + [ + ( + Block( + ( + Block( + [ + ( + Trust, + 9259..9264, + ), + ], + [ + ( + IfCondition( + ( + "if", + 9275..9277, + ), + ( + IfCondition( + ( + Eq( + ( + FunctionInvocation( + [], + ( + "len", + 9278..9281, + ), + [ + ( + Var( + ( + "text", + 9282..9286, + ), + ), + 9282..9286, + ), + ], + [], + ), + 9278..9287, + ), + ( + Int( + ( + 0, + 9291..9292, + ), + ), + 9291..9292, + ), + ), + 9278..9292, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 9307..9313, + ), + Some( + ( + Var( + ( + "text", + 9314..9318, + ), + ), + 9314..9318, + ), + ), + ), + 9307..9318, + ), + ], + ), + 9293..9328, + ), + ), + 9278..9328, + ), + [], + None, + ), + 9275..9328, + ), + ( + IfCondition( + ( + "if", + 9337..9339, + ), + ( + IfCondition( + ( + Ge( + ( + FunctionInvocation( + [], + ( + "bash_version", + 9340..9352, + ), + [], + [], + ), + 9340..9354, + ), + ( + Array( + [ + ( + Int( + ( + 4, + 9359..9360, + ), + ), + 9359..9360, + ), + ], + ), + 9358..9361, + ), + ), + 9340..9361, + ), + ( + Block( + [], + [ + ( + Return( + ( + "return", + 9376..9382, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 9383..9384, + ), + ( + Text( + "echo", + ), + 9385..9389, + ), + ( + Escape( + "\"", + ), + 9390..9392, + ), + ( + Escape( + "$", + ), + 9392..9394, + ), + ( + Escape( + "{", + ), + 9394..9396, + ), + ( + Expression( + ( + Nameof( + ( + "nameof", + 9397..9403, + ), + ( + Var( + ( + "text", + 9404..9408, + ), + ), + 9404..9408, + ), + ), + 9404..9408, + ), + ), + 9396..9409, + ), + ( + Text( + "^", + ), + 9409..9410, + ), + ( + Text( + "}", + ), + 9410..9411, + ), + ( + Escape( + "\"", + ), + 9411..9413, + ), + ( + Text( + "$", + ), + 9414..9415, + ), + ], + [], + ), + 9383..9415, + ), + ), + ), + 9376..9415, + ), + ], + ), + 9362..9425, + ), + ), + 9340..9425, + ), + [], + None, + ), + 9337..9425, + ), + ( + IfCondition( + ( + "if", + 9434..9436, + ), + ( + IfCondition( + ( + Eq( + ( + FunctionInvocation( + [], + ( + "sed_version", + 9437..9448, + ), + [], + [], + ), + 9437..9450, + ), + ( + Var( + ( + "SED_VERSION_GNU", + 9454..9469, + ), + ), + 9454..9469, + ), + ), + 9437..9469, + ), + ( + Block( + [], + [ + ( + Comment( + ( + Comment( + "GNU sed supports \\U", + ), + 9484..9507, + ), + ), + 9484..9507, + ), + ( + Return( + ( + "return", + 9519..9525, + ), + Some( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 9526..9527, + ), + ( + Text( + "echo", + ), + 9528..9532, + ), + ( + Text( + "\"", + ), + 9533..9534, + ), + ( + Expression( + ( + Var( + ( + "text", + 9535..9539, + ), + ), + 9535..9539, + ), + ), + 9534..9540, + ), + ( + Text( + "\"", + ), + 9540..9541, + ), + ( + Text( + "|", + ), + 9542..9543, + ), + ( + Text( + "sed", + ), + 9544..9547, + ), + ( + Text( + "\"", + ), + 9548..9549, + ), + ( + Text( + "s", + ), + 9549..9550, + ), + ( + Text( + "/", + ), + 9550..9551, + ), + ( + Text( + "^", + ), + 9551..9552, + ), + ( + Escape( + "(", + ), + 9552..9554, + ), + ( + Text( + ".", + ), + 9554..9555, + ), + ( + Escape( + ")", + ), + 9555..9557, + ), + ( + Text( + "/", + ), + 9557..9558, + ), + ( + Escape( + "U", + ), + 9558..9560, + ), + ( + Escape( + "1", + ), + 9560..9562, + ), + ( + Text( + "/", + ), + 9562..9563, + ), + ( + Text( + "\"", + ), + 9563..9564, + ), + ( + Text( + "$", + ), + 9565..9566, + ), + ], + [], + ), + 9526..9566, + ), + ), + ), + 9519..9566, + ), + ], + ), + 9470..9576, + ), + ), + 9437..9576, + ), + [], + None, + ), + 9434..9576, + ), + ( + ConstInit( + ( + "const", + 9585..9590, + ), + ( + "first_letter", + 9591..9603, + ), + ( + FunctionInvocation( + [], + ( + "uppercase", + 9606..9615, + ), + [ + ( + FunctionInvocation( + [], + ( + "char_at", + 9616..9623, + ), + [ + ( + Var( + ( + "text", + 9624..9628, + ), + ), + 9624..9628, + ), + ( + Int( + ( + 0, + 9630..9631, + ), + ), + 9630..9631, + ), + ], + [], + ), + 9616..9632, + ), + ], + [], + ), + 9606..9633, + ), + ), + 9585..9633, + ), + ( + Return( + ( + "return", + 9642..9648, + ), + Some( + ( + Add( + ( + Var( + ( + "first_letter", + 9649..9661, + ), + ), + 9649..9661, + ), + ( + FunctionInvocation( + [], + ( + "slice", + 9664..9669, + ), + [ + ( + Var( + ( + "text", + 9670..9674, + ), + ), + 9670..9674, + ), + ( + Int( + ( + 1, + 9676..9677, + ), + ), + 9676..9677, + ), + ], + [], + ), + 9664..9678, + ), + ), + 9649..9678, + ), + ), + ), + 9642..9678, + ), + ], + ), + 9259..9684, + ), + ), + 9259..9684, + ), + ], + ), + 9194..9686, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Pads `text` with the specified `pad` character on left until it reaches the desired `length`.", + ), + 9688..9786, + ), + ), + 9688..9786, + ), + ), + 9688..9786, + ), + ( + FunctionDefinition( + [], + ( + true, + 9786..9789, + ), + ( + "fun", + 9790..9793, + ), + ( + "lpad", + 9794..9798, + ), + [ + ( + Typed( + ( + false, + 9799..9799, + ), + ( + "text", + 9799..9803, + ), + ( + Text, + 9805..9809, + ), + ), + 9799..9809, + ), + ( + Typed( + ( + false, + 9811..9810, + ), + ( + "pad", + 9811..9814, + ), + ( + Text, + 9816..9820, + ), + ), + 9811..9820, + ), + ( + Typed( + ( + false, + 9822..9821, + ), + ( + "length", + 9822..9828, + ), + ( + Num, + 9830..9833, + ), + ), + 9822..9833, + ), + ], + Some( + ( + Text, + 9836..9840, + ), + ), + [ + ( + IfCondition( + ( + "if", + 9847..9849, + ), + ( + IfCondition( + ( + Le( + ( + Var( + ( + "length", + 9850..9856, + ), + ), + 9850..9856, + ), + ( + FunctionInvocation( + [], + ( + "len", + 9860..9863, + ), + [ + ( + Var( + ( + "text", + 9864..9868, + ), + ), + 9864..9868, + ), + ], + [], + ), + 9860..9869, + ), + ), + 9850..9869, + ), + ( + Singleline( + ( + Return( + ( + "return", + 9871..9877, + ), + Some( + ( + Var( + ( + "text", + 9878..9882, + ), + ), + 9878..9882, + ), + ), + ), + 9871..9882, + ), + ), + 9869..9882, + ), + ), + 9850..9882, + ), + [], + None, + ), + 9847..9882, + ), + ( + VariableSet( + ( + "length", + 9887..9893, + ), + ( + Subtract( + ( + FunctionInvocation( + [], + ( + "len", + 9896..9899, + ), + [ + ( + Var( + ( + "text", + 9900..9904, + ), + ), + 9900..9904, + ), + ], + [], + ), + 9896..9905, + ), + ( + Var( + ( + "length", + 9908..9914, + ), + ), + 9908..9914, + ), + ), + 9896..9914, + ), + ), + 9887..9914, + ), + ( + VariableSet( + ( + "pad", + 9919..9922, + ), + ( + Command( + [ + ( + Trust, + 9925..9930, + ), + ], + [ + ( + Text( + "$", + ), + 9931..9932, + ), + ( + Text( + "printf", + ), + 9933..9939, + ), + ( + Text( + "\"", + ), + 9940..9941, + ), + ( + Text( + "%", + ), + 9941..9942, + ), + ( + Expression( + ( + Var( + ( + "length", + 9943..9949, + ), + ), + 9943..9949, + ), + ), + 9942..9950, + ), + ( + Text( + "s", + ), + 9950..9951, + ), + ( + Text( + "\"", + ), + 9951..9952, + ), + ( + Text( + "\"", + ), + 9953..9954, + ), + ( + Text( + "\"", + ), + 9954..9955, + ), + ( + Text( + "|", + ), + 9956..9957, + ), + ( + Text( + "tr", + ), + 9958..9960, + ), + ( + Text( + "\"", + ), + 9961..9962, + ), + ( + Text( + "\"", + ), + 9963..9964, + ), + ( + Text( + "\"", + ), + 9965..9966, + ), + ( + Expression( + ( + Var( + ( + "pad", + 9967..9970, + ), + ), + 9967..9970, + ), + ), + 9966..9971, + ), + ( + Text( + "\"", + ), + 9971..9972, + ), + ( + Text( + "$", + ), + 9973..9974, + ), + ], + [], + ), + 9925..9974, + ), + ), + 9919..9974, + ), + ( + Return( + ( + "return", + 9979..9985, + ), + Some( + ( + Add( + ( + Var( + ( + "pad", + 9986..9989, + ), + ), + 9986..9989, + ), + ( + Var( + ( + "text", + 9992..9996, + ), + ), + 9992..9996, + ), + ), + 9986..9996, + ), + ), + ), + 9979..9996, + ), + ], + ), + 9786..9998, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Pads `text` with the specified `pad` character on the right until it reaches the desired `length`.", + ), + 10000..10103, + ), + ), + 10000..10103, + ), + ), + 10000..10103, + ), + ( + FunctionDefinition( + [], + ( + true, + 10103..10106, + ), + ( + "fun", + 10107..10110, + ), + ( + "rpad", + 10111..10115, + ), + [ + ( + Typed( + ( + false, + 10116..10116, + ), + ( + "text", + 10116..10120, + ), + ( + Text, + 10122..10126, + ), + ), + 10116..10126, + ), + ( + Typed( + ( + false, + 10128..10127, + ), + ( + "pad", + 10128..10131, + ), + ( + Text, + 10133..10137, + ), + ), + 10128..10137, + ), + ( + Typed( + ( + false, + 10139..10138, + ), + ( + "length", + 10139..10145, + ), + ( + Num, + 10147..10150, + ), + ), + 10139..10150, + ), + ], + Some( + ( + Text, + 10153..10157, + ), + ), + [ + ( + IfCondition( + ( + "if", + 10164..10166, + ), + ( + IfCondition( + ( + Le( + ( + Var( + ( + "length", + 10167..10173, + ), + ), + 10167..10173, + ), + ( + FunctionInvocation( + [], + ( + "len", + 10177..10180, + ), + [ + ( + Var( + ( + "text", + 10181..10185, + ), + ), + 10181..10185, + ), + ], + [], + ), + 10177..10186, + ), + ), + 10167..10186, + ), + ( + Singleline( + ( + Return( + ( + "return", + 10188..10194, + ), + Some( + ( + Var( + ( + "text", + 10195..10199, + ), + ), + 10195..10199, + ), + ), + ), + 10188..10199, + ), + ), + 10186..10199, + ), + ), + 10167..10199, + ), + [], + None, + ), + 10164..10199, + ), + ( + VariableSet( + ( + "length", + 10204..10210, + ), + ( + Subtract( + ( + FunctionInvocation( + [], + ( + "len", + 10213..10216, + ), + [ + ( + Var( + ( + "text", + 10217..10221, + ), + ), + 10217..10221, + ), + ], + [], + ), + 10213..10222, + ), + ( + Var( + ( + "length", + 10225..10231, + ), + ), + 10225..10231, + ), + ), + 10213..10231, + ), + ), + 10204..10231, + ), + ( + VariableSet( + ( + "pad", + 10236..10239, + ), + ( + Command( + [ + ( + Trust, + 10242..10247, + ), + ], + [ + ( + Text( + "$", + ), + 10248..10249, + ), + ( + Text( + "printf", + ), + 10250..10256, + ), + ( + Text( + "\"", + ), + 10257..10258, + ), + ( + Text( + "%", + ), + 10258..10259, + ), + ( + Expression( + ( + Var( + ( + "length", + 10260..10266, + ), + ), + 10260..10266, + ), + ), + 10259..10267, + ), + ( + Text( + "s", + ), + 10267..10268, + ), + ( + Text( + "\"", + ), + 10268..10269, + ), + ( + Text( + "\"", + ), + 10270..10271, + ), + ( + Text( + "\"", + ), + 10271..10272, + ), + ( + Text( + "|", + ), + 10273..10274, + ), + ( + Text( + "tr", + ), + 10275..10277, + ), + ( + Text( + "\"", + ), + 10278..10279, + ), + ( + Text( + "\"", + ), + 10280..10281, + ), + ( + Text( + "\"", + ), + 10282..10283, + ), + ( + Expression( + ( + Var( + ( + "pad", + 10284..10287, + ), + ), + 10284..10287, + ), + ), + 10283..10288, + ), + ( + Text( + "\"", + ), + 10288..10289, + ), + ( + Text( + "$", + ), + 10290..10291, + ), + ], + [], + ), + 10242..10291, + ), + ), + 10236..10291, + ), + ( + Return( + ( + "return", + 10296..10302, + ), + Some( + ( + Add( + ( + Var( + ( + "text", + 10303..10307, + ), + ), + 10303..10307, + ), + ( + Var( + ( + "pad", + 10310..10313, + ), + ), + 10310..10313, + ), + ), + 10303..10313, + ), + ), + ), + 10296..10313, + ), + ], + ), + 10103..10315, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Pads `text` with zeros on the left until it reaches the desired `length`.", + ), + 10317..10395, + ), + ), + 10317..10395, + ), + ), + 10317..10395, + ), + ( + FunctionDefinition( + [], + ( + true, + 10395..10398, + ), + ( + "fun", + 10399..10402, + ), + ( + "zfill", + 10403..10408, + ), + [ + ( + Typed( + ( + false, + 10409..10409, + ), + ( + "text", + 10409..10413, + ), + ( + Text, + 10415..10419, + ), + ), + 10409..10419, + ), + ( + Typed( + ( + false, + 10421..10420, + ), + ( + "length", + 10421..10427, + ), + ( + Num, + 10429..10432, + ), + ), + 10421..10432, + ), + ], + Some( + ( + Text, + 10435..10439, + ), + ), + [ + ( + Return( + ( + "return", + 10446..10452, + ), + Some( + ( + FunctionInvocation( + [], + ( + "lpad", + 10453..10457, + ), + [ + ( + Var( + ( + "text", + 10458..10462, + ), + ), + 10458..10462, + ), + ( + Text( + [ + ( + Text( + ( + "0", + 10465..10466, + ), + ), + 10465..10466, + ), + ], + ), + 10464..10467, + ), + ( + Var( + ( + "length", + 10469..10475, + ), + ), + 10469..10475, + ), + ], + [], + ), + 10453..10476, + ), + ), + ), + 10446..10476, + ), + ], + ), + 10395..10478, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap new file mode 100644 index 0000000..254e485 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap @@ -0,0 +1,12336 @@ +--- +source: tests/grammar/alpha050.rs +expression: tokens +--- +[ + ( + Token( + "// We cannot import `bash_version` from `env.ab` because it imports `text.ab` making a circular dependency.\n", + ), + 0..108, + ), + ( + Token( + "// This is a workaround to avoid that issue and the import system should be improved in the future.\n", + ), + 108..208, + ), + ( + Token( + "#", + ), + 208..209, + ), + ( + Token( + "[", + ), + 209..210, + ), + ( + Token( + "allow_absurd_cast", + ), + 210..227, + ), + ( + Token( + "]", + ), + 227..228, + ), + ( + Token( + "fun", + ), + 229..232, + ), + ( + Token( + "bash_version", + ), + 233..245, + ), + ( + Token( + "(", + ), + 245..246, + ), + ( + Token( + ")", + ), + 246..247, + ), + ( + Token( + ":", + ), + 247..248, + ), + ( + Token( + "[", + ), + 249..250, + ), + ( + Token( + "Int", + ), + 250..253, + ), + ( + Token( + "]", + ), + 253..254, + ), + ( + Token( + "{", + ), + 255..256, + ), + ( + Token( + "let", + ), + 261..264, + ), + ( + Token( + "major", + ), + 265..270, + ), + ( + Token( + "=", + ), + 271..272, + ), + ( + Token( + "trust", + ), + 273..278, + ), + ( + Token( + "$", + ), + 279..280, + ), + ( + Token( + "echo", + ), + 281..285, + ), + ( + Token( + "\"", + ), + 286..287, + ), + ( + Token( + "\\", + ), + 287..288, + ), + ( + Token( + "$", + ), + 288..289, + ), + ( + Token( + "\\", + ), + 289..290, + ), + ( + Token( + "{", + ), + 290..291, + ), + ( + Token( + "BASH_VERSINFO", + ), + 291..304, + ), + ( + Token( + "[", + ), + 304..305, + ), + ( + Token( + "0", + ), + 305..306, + ), + ( + Token( + "]", + ), + 306..307, + ), + ( + Token( + "}", + ), + 307..308, + ), + ( + Token( + "\"", + ), + 308..309, + ), + ( + Token( + "$", + ), + 310..311, + ), + ( + Token( + "as", + ), + 312..314, + ), + ( + Token( + "Int", + ), + 315..318, + ), + ( + Token( + "let", + ), + 323..326, + ), + ( + Token( + "minor", + ), + 327..332, + ), + ( + Token( + "=", + ), + 333..334, + ), + ( + Token( + "trust", + ), + 335..340, + ), + ( + Token( + "$", + ), + 341..342, + ), + ( + Token( + "echo", + ), + 343..347, + ), + ( + Token( + "\"", + ), + 348..349, + ), + ( + Token( + "\\", + ), + 349..350, + ), + ( + Token( + "$", + ), + 350..351, + ), + ( + Token( + "\\", + ), + 351..352, + ), + ( + Token( + "{", + ), + 352..353, + ), + ( + Token( + "BASH_VERSINFO", + ), + 353..366, + ), + ( + Token( + "[", + ), + 366..367, + ), + ( + Token( + "1", + ), + 367..368, + ), + ( + Token( + "]", + ), + 368..369, + ), + ( + Token( + "}", + ), + 369..370, + ), + ( + Token( + "\"", + ), + 370..371, + ), + ( + Token( + "$", + ), + 372..373, + ), + ( + Token( + "as", + ), + 374..376, + ), + ( + Token( + "Int", + ), + 377..380, + ), + ( + Token( + "let", + ), + 385..388, + ), + ( + Token( + "patch", + ), + 389..394, + ), + ( + Token( + "=", + ), + 395..396, + ), + ( + Token( + "trust", + ), + 397..402, + ), + ( + Token( + "$", + ), + 403..404, + ), + ( + Token( + "echo", + ), + 405..409, + ), + ( + Token( + "\"", + ), + 410..411, + ), + ( + Token( + "\\", + ), + 411..412, + ), + ( + Token( + "$", + ), + 412..413, + ), + ( + Token( + "\\", + ), + 413..414, + ), + ( + Token( + "{", + ), + 414..415, + ), + ( + Token( + "BASH_VERSINFO", + ), + 415..428, + ), + ( + Token( + "[", + ), + 428..429, + ), + ( + Token( + "2", + ), + 429..430, + ), + ( + Token( + "]", + ), + 430..431, + ), + ( + Token( + "}", + ), + 431..432, + ), + ( + Token( + "\"", + ), + 432..433, + ), + ( + Token( + "$", + ), + 434..435, + ), + ( + Token( + "as", + ), + 436..438, + ), + ( + Token( + "Int", + ), + 439..442, + ), + ( + Token( + "return", + ), + 447..453, + ), + ( + Token( + "[", + ), + 454..455, + ), + ( + Token( + "major", + ), + 455..460, + ), + ( + Token( + ",", + ), + 460..461, + ), + ( + Token( + "minor", + ), + 462..467, + ), + ( + Token( + ",", + ), + 467..468, + ), + ( + Token( + "patch", + ), + 469..474, + ), + ( + Token( + "]", + ), + 474..475, + ), + ( + Token( + "}", + ), + 476..477, + ), + ( + Token( + "/// Replaces all occurrences of a pattern in the content with the provided replace text.\n", + ), + 479..568, + ), + ( + Token( + "pub", + ), + 568..571, + ), + ( + Token( + "fun", + ), + 572..575, + ), + ( + Token( + "replace", + ), + 576..583, + ), + ( + Token( + "(", + ), + 583..584, + ), + ( + Token( + "source", + ), + 584..590, + ), + ( + Token( + ",", + ), + 590..591, + ), + ( + Token( + "search", + ), + 592..598, + ), + ( + Token( + ",", + ), + 598..599, + ), + ( + Token( + "replace", + ), + 600..607, + ), + ( + Token( + ")", + ), + 607..608, + ), + ( + Token( + "{", + ), + 609..610, + ), + ( + Token( + "// Here we use a command to avoid #646\n", + ), + 615..654, + ), + ( + Token( + "let", + ), + 658..661, + ), + ( + Token( + "result", + ), + 662..668, + ), + ( + Token( + "=", + ), + 669..670, + ), + ( + Token( + "\"", + ), + 671..672, + ), + ( + Token( + "\"", + ), + 672..673, + ), + ( + Token( + "if", + ), + 678..680, + ), + ( + Token( + "bash_version", + ), + 681..693, + ), + ( + Token( + "(", + ), + 693..694, + ), + ( + Token( + ")", + ), + 694..695, + ), + ( + Token( + ">=", + ), + 696..698, + ), + ( + Token( + "[", + ), + 699..700, + ), + ( + Token( + "4", + ), + 700..701, + ), + ( + Token( + ",", + ), + 701..702, + ), + ( + Token( + "3", + ), + 702..703, + ), + ( + Token( + "]", + ), + 703..704, + ), + ( + Token( + "{", + ), + 705..706, + ), + ( + Token( + "trust", + ), + 715..720, + ), + ( + Token( + "$", + ), + 721..722, + ), + ( + Token( + "{", + ), + 723..724, + ), + ( + Token( + "nameof", + ), + 724..730, + ), + ( + Token( + "result", + ), + 731..737, + ), + ( + Token( + "}", + ), + 737..738, + ), + ( + Token( + "=", + ), + 738..739, + ), + ( + Token( + "\"", + ), + 739..740, + ), + ( + Token( + "\\", + ), + 740..741, + ), + ( + Token( + "$", + ), + 741..742, + ), + ( + Token( + "\\", + ), + 742..743, + ), + ( + Token( + "{", + ), + 743..744, + ), + ( + Token( + "{", + ), + 744..745, + ), + ( + Token( + "nameof", + ), + 745..751, + ), + ( + Token( + "source", + ), + 752..758, + ), + ( + Token( + "}", + ), + 758..759, + ), + ( + Token( + "//", + ), + 759..761, + ), + ( + Token( + "\\", + ), + 761..762, + ), + ( + Token( + "\"", + ), + 762..763, + ), + ( + Token( + "\\", + ), + 763..764, + ), + ( + Token( + "$", + ), + 764..765, + ), + ( + Token( + "\\", + ), + 765..766, + ), + ( + Token( + "{", + ), + 766..767, + ), + ( + Token( + "{", + ), + 767..768, + ), + ( + Token( + "nameof", + ), + 768..774, + ), + ( + Token( + "search", + ), + 775..781, + ), + ( + Token( + "}", + ), + 781..782, + ), + ( + Token( + "}", + ), + 782..783, + ), + ( + Token( + "\\", + ), + 783..784, + ), + ( + Token( + "\"", + ), + 784..785, + ), + ( + Token( + "/", + ), + 785..786, + ), + ( + Token( + "\\", + ), + 786..787, + ), + ( + Token( + "\"", + ), + 787..788, + ), + ( + Token( + "\\", + ), + 788..789, + ), + ( + Token( + "$", + ), + 789..790, + ), + ( + Token( + "\\", + ), + 790..791, + ), + ( + Token( + "{", + ), + 791..792, + ), + ( + Token( + "{", + ), + 792..793, + ), + ( + Token( + "nameof", + ), + 793..799, + ), + ( + Token( + "replace", + ), + 800..807, + ), + ( + Token( + "}", + ), + 807..808, + ), + ( + Token( + "}", + ), + 808..809, + ), + ( + Token( + "\\", + ), + 809..810, + ), + ( + Token( + "\"", + ), + 810..811, + ), + ( + Token( + "}", + ), + 811..812, + ), + ( + Token( + "\"", + ), + 812..813, + ), + ( + Token( + "$", + ), + 814..815, + ), + ( + Token( + "}", + ), + 820..821, + ), + ( + Token( + "else", + ), + 822..826, + ), + ( + Token( + "{", + ), + 827..828, + ), + ( + Token( + "trust", + ), + 837..842, + ), + ( + Token( + "$", + ), + 843..844, + ), + ( + Token( + "{", + ), + 845..846, + ), + ( + Token( + "nameof", + ), + 846..852, + ), + ( + Token( + "result", + ), + 853..859, + ), + ( + Token( + "}", + ), + 859..860, + ), + ( + Token( + "=", + ), + 860..861, + ), + ( + Token( + "\"", + ), + 861..862, + ), + ( + Token( + "\\", + ), + 862..863, + ), + ( + Token( + "$", + ), + 863..864, + ), + ( + Token( + "\\", + ), + 864..865, + ), + ( + Token( + "{", + ), + 865..866, + ), + ( + Token( + "{", + ), + 866..867, + ), + ( + Token( + "nameof", + ), + 867..873, + ), + ( + Token( + "source", + ), + 874..880, + ), + ( + Token( + "}", + ), + 880..881, + ), + ( + Token( + "//", + ), + 881..883, + ), + ( + Token( + "\\", + ), + 883..884, + ), + ( + Token( + "\"", + ), + 884..885, + ), + ( + Token( + "\\", + ), + 885..886, + ), + ( + Token( + "$", + ), + 886..887, + ), + ( + Token( + "\\", + ), + 887..888, + ), + ( + Token( + "{", + ), + 888..889, + ), + ( + Token( + "{", + ), + 889..890, + ), + ( + Token( + "nameof", + ), + 890..896, + ), + ( + Token( + "search", + ), + 897..903, + ), + ( + Token( + "}", + ), + 903..904, + ), + ( + Token( + "}", + ), + 904..905, + ), + ( + Token( + "\\", + ), + 905..906, + ), + ( + Token( + "\"", + ), + 906..907, + ), + ( + Token( + "/", + ), + 907..908, + ), + ( + Token( + "\\", + ), + 908..909, + ), + ( + Token( + "$", + ), + 909..910, + ), + ( + Token( + "\\", + ), + 910..911, + ), + ( + Token( + "{", + ), + 911..912, + ), + ( + Token( + "{", + ), + 912..913, + ), + ( + Token( + "nameof", + ), + 913..919, + ), + ( + Token( + "replace", + ), + 920..927, + ), + ( + Token( + "}", + ), + 927..928, + ), + ( + Token( + "}", + ), + 928..929, + ), + ( + Token( + "}", + ), + 929..930, + ), + ( + Token( + "\"", + ), + 930..931, + ), + ( + Token( + "$", + ), + 932..933, + ), + ( + Token( + "}", + ), + 938..939, + ), + ( + Token( + "return", + ), + 944..950, + ), + ( + Token( + "result", + ), + 951..957, + ), + ( + Token( + "}", + ), + 958..959, + ), + ( + Token( + "/// Replaces the first occurrence of a pattern in the content with the provided replace text.\n", + ), + 961..1055, + ), + ( + Token( + "pub", + ), + 1055..1058, + ), + ( + Token( + "fun", + ), + 1059..1062, + ), + ( + Token( + "replace_one", + ), + 1063..1074, + ), + ( + Token( + "(", + ), + 1074..1075, + ), + ( + Token( + "source", + ), + 1075..1081, + ), + ( + Token( + ",", + ), + 1081..1082, + ), + ( + Token( + "search", + ), + 1083..1089, + ), + ( + Token( + ",", + ), + 1089..1090, + ), + ( + Token( + "replace", + ), + 1091..1098, + ), + ( + Token( + ")", + ), + 1098..1099, + ), + ( + Token( + "{", + ), + 1100..1101, + ), + ( + Token( + "// Here we use a command to avoid #646\n", + ), + 1106..1145, + ), + ( + Token( + "let", + ), + 1149..1152, + ), + ( + Token( + "result", + ), + 1153..1159, + ), + ( + Token( + "=", + ), + 1160..1161, + ), + ( + Token( + "\"", + ), + 1162..1163, + ), + ( + Token( + "\"", + ), + 1163..1164, + ), + ( + Token( + "if", + ), + 1169..1171, + ), + ( + Token( + "bash_version", + ), + 1172..1184, + ), + ( + Token( + "(", + ), + 1184..1185, + ), + ( + Token( + ")", + ), + 1185..1186, + ), + ( + Token( + ">=", + ), + 1187..1189, + ), + ( + Token( + "[", + ), + 1190..1191, + ), + ( + Token( + "4", + ), + 1191..1192, + ), + ( + Token( + ",", + ), + 1192..1193, + ), + ( + Token( + "3", + ), + 1193..1194, + ), + ( + Token( + "]", + ), + 1194..1195, + ), + ( + Token( + "{", + ), + 1196..1197, + ), + ( + Token( + "trust", + ), + 1206..1211, + ), + ( + Token( + "$", + ), + 1212..1213, + ), + ( + Token( + "{", + ), + 1214..1215, + ), + ( + Token( + "nameof", + ), + 1215..1221, + ), + ( + Token( + "result", + ), + 1222..1228, + ), + ( + Token( + "}", + ), + 1228..1229, + ), + ( + Token( + "=", + ), + 1229..1230, + ), + ( + Token( + "\"", + ), + 1230..1231, + ), + ( + Token( + "\\", + ), + 1231..1232, + ), + ( + Token( + "$", + ), + 1232..1233, + ), + ( + Token( + "\\", + ), + 1233..1234, + ), + ( + Token( + "{", + ), + 1234..1235, + ), + ( + Token( + "{", + ), + 1235..1236, + ), + ( + Token( + "nameof", + ), + 1236..1242, + ), + ( + Token( + "source", + ), + 1243..1249, + ), + ( + Token( + "}", + ), + 1249..1250, + ), + ( + Token( + "/", + ), + 1250..1251, + ), + ( + Token( + "\\", + ), + 1251..1252, + ), + ( + Token( + "\"", + ), + 1252..1253, + ), + ( + Token( + "\\", + ), + 1253..1254, + ), + ( + Token( + "$", + ), + 1254..1255, + ), + ( + Token( + "\\", + ), + 1255..1256, + ), + ( + Token( + "{", + ), + 1256..1257, + ), + ( + Token( + "{", + ), + 1257..1258, + ), + ( + Token( + "nameof", + ), + 1258..1264, + ), + ( + Token( + "search", + ), + 1265..1271, + ), + ( + Token( + "}", + ), + 1271..1272, + ), + ( + Token( + "}", + ), + 1272..1273, + ), + ( + Token( + "\\", + ), + 1273..1274, + ), + ( + Token( + "\"", + ), + 1274..1275, + ), + ( + Token( + "/", + ), + 1275..1276, + ), + ( + Token( + "\\", + ), + 1276..1277, + ), + ( + Token( + "\"", + ), + 1277..1278, + ), + ( + Token( + "\\", + ), + 1278..1279, + ), + ( + Token( + "$", + ), + 1279..1280, + ), + ( + Token( + "\\", + ), + 1280..1281, + ), + ( + Token( + "{", + ), + 1281..1282, + ), + ( + Token( + "{", + ), + 1282..1283, + ), + ( + Token( + "nameof", + ), + 1283..1289, + ), + ( + Token( + "replace", + ), + 1290..1297, + ), + ( + Token( + "}", + ), + 1297..1298, + ), + ( + Token( + "}", + ), + 1298..1299, + ), + ( + Token( + "\\", + ), + 1299..1300, + ), + ( + Token( + "\"", + ), + 1300..1301, + ), + ( + Token( + "}", + ), + 1301..1302, + ), + ( + Token( + "\"", + ), + 1302..1303, + ), + ( + Token( + "$", + ), + 1304..1305, + ), + ( + Token( + "}", + ), + 1310..1311, + ), + ( + Token( + "else", + ), + 1312..1316, + ), + ( + Token( + "{", + ), + 1317..1318, + ), + ( + Token( + "trust", + ), + 1327..1332, + ), + ( + Token( + "$", + ), + 1333..1334, + ), + ( + Token( + "{", + ), + 1335..1336, + ), + ( + Token( + "nameof", + ), + 1336..1342, + ), + ( + Token( + "result", + ), + 1343..1349, + ), + ( + Token( + "}", + ), + 1349..1350, + ), + ( + Token( + "=", + ), + 1350..1351, + ), + ( + Token( + "\"", + ), + 1351..1352, + ), + ( + Token( + "\\", + ), + 1352..1353, + ), + ( + Token( + "$", + ), + 1353..1354, + ), + ( + Token( + "\\", + ), + 1354..1355, + ), + ( + Token( + "{", + ), + 1355..1356, + ), + ( + Token( + "{", + ), + 1356..1357, + ), + ( + Token( + "nameof", + ), + 1357..1363, + ), + ( + Token( + "source", + ), + 1364..1370, + ), + ( + Token( + "}", + ), + 1370..1371, + ), + ( + Token( + "/", + ), + 1371..1372, + ), + ( + Token( + "\\", + ), + 1372..1373, + ), + ( + Token( + "\"", + ), + 1373..1374, + ), + ( + Token( + "\\", + ), + 1374..1375, + ), + ( + Token( + "$", + ), + 1375..1376, + ), + ( + Token( + "\\", + ), + 1376..1377, + ), + ( + Token( + "{", + ), + 1377..1378, + ), + ( + Token( + "{", + ), + 1378..1379, + ), + ( + Token( + "nameof", + ), + 1379..1385, + ), + ( + Token( + "search", + ), + 1386..1392, + ), + ( + Token( + "}", + ), + 1392..1393, + ), + ( + Token( + "}", + ), + 1393..1394, + ), + ( + Token( + "\\", + ), + 1394..1395, + ), + ( + Token( + "\"", + ), + 1395..1396, + ), + ( + Token( + "/", + ), + 1396..1397, + ), + ( + Token( + "\\", + ), + 1397..1398, + ), + ( + Token( + "$", + ), + 1398..1399, + ), + ( + Token( + "\\", + ), + 1399..1400, + ), + ( + Token( + "{", + ), + 1400..1401, + ), + ( + Token( + "{", + ), + 1401..1402, + ), + ( + Token( + "nameof", + ), + 1402..1408, + ), + ( + Token( + "replace", + ), + 1409..1416, + ), + ( + Token( + "}", + ), + 1416..1417, + ), + ( + Token( + "}", + ), + 1417..1418, + ), + ( + Token( + "}", + ), + 1418..1419, + ), + ( + Token( + "\"", + ), + 1419..1420, + ), + ( + Token( + "$", + ), + 1421..1422, + ), + ( + Token( + "}", + ), + 1427..1428, + ), + ( + Token( + "return", + ), + 1433..1439, + ), + ( + Token( + "result", + ), + 1440..1446, + ), + ( + Token( + "}", + ), + 1447..1448, + ), + ( + Token( + "const", + ), + 1450..1455, + ), + ( + Token( + "SED_VERSION_UNKNOWN", + ), + 1456..1475, + ), + ( + Token( + "=", + ), + 1476..1477, + ), + ( + Token( + "0", + ), + 1478..1479, + ), + ( + Token( + "const", + ), + 1480..1485, + ), + ( + Token( + "SED_VERSION_GNU", + ), + 1486..1501, + ), + ( + Token( + "=", + ), + 1502..1503, + ), + ( + Token( + "1", + ), + 1504..1505, + ), + ( + Token( + "const", + ), + 1506..1511, + ), + ( + Token( + "SED_VERSION_BUSYBOX", + ), + 1512..1531, + ), + ( + Token( + "=", + ), + 1532..1533, + ), + ( + Token( + "2", + ), + 1534..1535, + ), + ( + Token( + "fun", + ), + 1537..1540, + ), + ( + Token( + "sed_version", + ), + 1541..1552, + ), + ( + Token( + "(", + ), + 1552..1553, + ), + ( + Token( + ")", + ), + 1553..1554, + ), + ( + Token( + ":", + ), + 1554..1555, + ), + ( + Token( + "Int", + ), + 1556..1559, + ), + ( + Token( + "{", + ), + 1560..1561, + ), + ( + Token( + "// We can't match against a word \"GNU\" because\n", + ), + 1566..1613, + ), + ( + Token( + "// alpine's busybox sed returns \"This is not GNU sed version\"\n", + ), + 1617..1679, + ), + ( + Token( + "trust", + ), + 1683..1688, + ), + ( + Token( + "$", + ), + 1689..1690, + ), + ( + Token( + "re", + ), + 1691..1693, + ), + ( + Token( + "=", + ), + 1693..1694, + ), + ( + Token( + "'", + ), + 1694..1695, + ), + ( + Token( + "\\", + ), + 1695..1696, + ), + ( + Token( + "bCopyright", + ), + 1696..1706, + ), + ( + Token( + "\\", + ), + 1706..1707, + ), + ( + Token( + "b", + ), + 1707..1708, + ), + ( + Token( + ".", + ), + 1708..1709, + ), + ( + Token( + "+", + ), + 1709..1710, + ), + ( + Token( + "\\", + ), + 1710..1711, + ), + ( + Token( + "bFree", + ), + 1711..1716, + ), + ( + Token( + "Software", + ), + 1717..1725, + ), + ( + Token( + "Foundation", + ), + 1726..1736, + ), + ( + Token( + "\\", + ), + 1736..1737, + ), + ( + Token( + "b'", + ), + 1737..1739, + ), + ( + Token( + ";", + ), + 1739..1740, + ), + ( + Token( + "[", + ), + 1741..1742, + ), + ( + Token( + "[", + ), + 1742..1743, + ), + ( + Token( + "\\", + ), + 1744..1745, + ), + ( + Token( + "$", + ), + 1745..1746, + ), + ( + Token( + "(", + ), + 1746..1747, + ), + ( + Token( + "sed", + ), + 1747..1750, + ), + ( + Token( + "-", + ), + 1751..1752, + ), + ( + Token( + "-", + ), + 1752..1753, + ), + ( + Token( + "version", + ), + 1753..1760, + ), + ( + Token( + "2", + ), + 1761..1762, + ), + ( + Token( + ">", + ), + 1762..1763, + ), + ( + Token( + "/", + ), + 1763..1764, + ), + ( + Token( + "dev", + ), + 1764..1767, + ), + ( + Token( + "/", + ), + 1767..1768, + ), + ( + Token( + "null", + ), + 1768..1772, + ), + ( + Token( + ")", + ), + 1772..1773, + ), + ( + Token( + "=", + ), + 1774..1775, + ), + ( + Token( + "~", + ), + 1775..1776, + ), + ( + Token( + "\\", + ), + 1777..1778, + ), + ( + Token( + "$", + ), + 1778..1779, + ), + ( + Token( + "re", + ), + 1779..1781, + ), + ( + Token( + "]", + ), + 1782..1783, + ), + ( + Token( + "]", + ), + 1783..1784, + ), + ( + Token( + "$", + ), + 1785..1786, + ), + ( + Token( + "if", + ), + 1791..1793, + ), + ( + Token( + "status", + ), + 1794..1800, + ), + ( + Token( + "==", + ), + 1801..1803, + ), + ( + Token( + "0", + ), + 1804..1805, + ), + ( + Token( + "{", + ), + 1806..1807, + ), + ( + Token( + "return", + ), + 1816..1822, + ), + ( + Token( + "SED_VERSION_GNU", + ), + 1823..1838, + ), + ( + Token( + "}", + ), + 1843..1844, + ), + ( + Token( + "trust", + ), + 1849..1854, + ), + ( + Token( + "$", + ), + 1855..1856, + ), + ( + Token( + "re", + ), + 1857..1859, + ), + ( + Token( + "=", + ), + 1859..1860, + ), + ( + Token( + "'", + ), + 1860..1861, + ), + ( + Token( + "\\", + ), + 1861..1862, + ), + ( + Token( + "bBusyBox", + ), + 1862..1870, + ), + ( + Token( + "\\", + ), + 1870..1871, + ), + ( + Token( + "b'", + ), + 1871..1873, + ), + ( + Token( + ";", + ), + 1873..1874, + ), + ( + Token( + "[", + ), + 1875..1876, + ), + ( + Token( + "[", + ), + 1876..1877, + ), + ( + Token( + "\\", + ), + 1878..1879, + ), + ( + Token( + "$", + ), + 1879..1880, + ), + ( + Token( + "(", + ), + 1880..1881, + ), + ( + Token( + "sed", + ), + 1881..1884, + ), + ( + Token( + "2", + ), + 1885..1886, + ), + ( + Token( + ">", + ), + 1886..1887, + ), + ( + Token( + "&1", + ), + 1887..1889, + ), + ( + Token( + ")", + ), + 1889..1890, + ), + ( + Token( + "=", + ), + 1891..1892, + ), + ( + Token( + "~", + ), + 1892..1893, + ), + ( + Token( + "\\", + ), + 1894..1895, + ), + ( + Token( + "$", + ), + 1895..1896, + ), + ( + Token( + "re", + ), + 1896..1898, + ), + ( + Token( + "]", + ), + 1899..1900, + ), + ( + Token( + "]", + ), + 1900..1901, + ), + ( + Token( + "$", + ), + 1902..1903, + ), + ( + Token( + "if", + ), + 1908..1910, + ), + ( + Token( + "status", + ), + 1911..1917, + ), + ( + Token( + "==", + ), + 1918..1920, + ), + ( + Token( + "0", + ), + 1921..1922, + ), + ( + Token( + "{", + ), + 1923..1924, + ), + ( + Token( + "return", + ), + 1933..1939, + ), + ( + Token( + "SED_VERSION_BUSYBOX", + ), + 1940..1959, + ), + ( + Token( + "}", + ), + 1964..1965, + ), + ( + Token( + "return", + ), + 1970..1976, + ), + ( + Token( + "SED_VERSION_UNKNOWN", + ), + 1977..1996, + ), + ( + Token( + "}", + ), + 1997..1998, + ), + ( + Token( + "/// Replaces all occurences of a regex pattern in the content with the provided replace text.\n", + ), + 2000..2094, + ), + ( + Token( + "///\n", + ), + 2094..2098, + ), + ( + Token( + "/// Function uses `sed`\n", + ), + 2098..2122, + ), + ( + Token( + "pub", + ), + 2122..2125, + ), + ( + Token( + "fun", + ), + 2126..2129, + ), + ( + Token( + "replace_regex", + ), + 2130..2143, + ), + ( + Token( + "(", + ), + 2143..2144, + ), + ( + Token( + "source", + ), + 2144..2150, + ), + ( + Token( + ":", + ), + 2150..2151, + ), + ( + Token( + "Text", + ), + 2152..2156, + ), + ( + Token( + ",", + ), + 2156..2157, + ), + ( + Token( + "search", + ), + 2158..2164, + ), + ( + Token( + ":", + ), + 2164..2165, + ), + ( + Token( + "Text", + ), + 2166..2170, + ), + ( + Token( + ",", + ), + 2170..2171, + ), + ( + Token( + "replace_text", + ), + 2172..2184, + ), + ( + Token( + ":", + ), + 2184..2185, + ), + ( + Token( + "Text", + ), + 2186..2190, + ), + ( + Token( + ",", + ), + 2190..2191, + ), + ( + Token( + "extended", + ), + 2192..2200, + ), + ( + Token( + ":", + ), + 2200..2201, + ), + ( + Token( + "Bool", + ), + 2202..2206, + ), + ( + Token( + "=", + ), + 2207..2208, + ), + ( + Token( + "false", + ), + 2209..2214, + ), + ( + Token( + ")", + ), + 2214..2215, + ), + ( + Token( + ":", + ), + 2215..2216, + ), + ( + Token( + "Text", + ), + 2217..2221, + ), + ( + Token( + "{", + ), + 2222..2223, + ), + ( + Token( + "trust", + ), + 2228..2233, + ), + ( + Token( + "{", + ), + 2234..2235, + ), + ( + Token( + "const", + ), + 2244..2249, + ), + ( + Token( + "sed_version", + ), + 2250..2261, + ), + ( + Token( + "=", + ), + 2262..2263, + ), + ( + Token( + "sed_version", + ), + 2264..2275, + ), + ( + Token( + "(", + ), + 2275..2276, + ), + ( + Token( + ")", + ), + 2276..2277, + ), + ( + Token( + "search", + ), + 2286..2292, + ), + ( + Token( + "=", + ), + 2293..2294, + ), + ( + Token( + "replace", + ), + 2295..2302, + ), + ( + Token( + "(", + ), + 2302..2303, + ), + ( + Token( + "search", + ), + 2303..2309, + ), + ( + Token( + ",", + ), + 2309..2310, + ), + ( + Token( + "\"", + ), + 2311..2312, + ), + ( + Token( + "/", + ), + 2312..2313, + ), + ( + Token( + "\"", + ), + 2313..2314, + ), + ( + Token( + ",", + ), + 2314..2315, + ), + ( + Token( + "\"", + ), + 2316..2317, + ), + ( + Token( + "\\", + ), + 2317..2318, + ), + ( + Token( + "/", + ), + 2318..2319, + ), + ( + Token( + "\"", + ), + 2319..2320, + ), + ( + Token( + ")", + ), + 2320..2321, + ), + ( + Token( + "replace_text", + ), + 2330..2342, + ), + ( + Token( + "=", + ), + 2343..2344, + ), + ( + Token( + "replace", + ), + 2345..2352, + ), + ( + Token( + "(", + ), + 2352..2353, + ), + ( + Token( + "replace_text", + ), + 2353..2365, + ), + ( + Token( + ",", + ), + 2365..2366, + ), + ( + Token( + "\"", + ), + 2367..2368, + ), + ( + Token( + "/", + ), + 2368..2369, + ), + ( + Token( + "\"", + ), + 2369..2370, + ), + ( + Token( + ",", + ), + 2370..2371, + ), + ( + Token( + "\"", + ), + 2372..2373, + ), + ( + Token( + "\\", + ), + 2373..2374, + ), + ( + Token( + "/", + ), + 2374..2375, + ), + ( + Token( + "\"", + ), + 2375..2376, + ), + ( + Token( + ")", + ), + 2376..2377, + ), + ( + Token( + "if", + ), + 2386..2388, + ), + ( + Token( + "sed_version", + ), + 2389..2400, + ), + ( + Token( + "==", + ), + 2401..2403, + ), + ( + Token( + "SED_VERSION_GNU", + ), + 2404..2419, + ), + ( + Token( + "or", + ), + 2420..2422, + ), + ( + Token( + "sed_version", + ), + 2423..2434, + ), + ( + Token( + "==", + ), + 2435..2437, + ), + ( + Token( + "SED_VERSION_BUSYBOX", + ), + 2438..2457, + ), + ( + Token( + "{", + ), + 2458..2459, + ), + ( + Token( + "// '\\b' is supported but not in POSIX standards. Disable it\n", + ), + 2472..2532, + ), + ( + Token( + "search", + ), + 2544..2550, + ), + ( + Token( + "=", + ), + 2551..2552, + ), + ( + Token( + "replace", + ), + 2553..2560, + ), + ( + Token( + "(", + ), + 2560..2561, + ), + ( + Token( + "search", + ), + 2561..2567, + ), + ( + Token( + ",", + ), + 2567..2568, + ), + ( + Token( + "\"", + ), + 2569..2570, + ), + ( + Token( + "\\", + ), + 2570..2571, + ), + ( + Token( + "\\", + ), + 2571..2572, + ), + ( + Token( + "b", + ), + 2572..2573, + ), + ( + Token( + "\"", + ), + 2573..2574, + ), + ( + Token( + ",", + ), + 2574..2575, + ), + ( + Token( + "\"", + ), + 2576..2577, + ), + ( + Token( + "\\", + ), + 2577..2578, + ), + ( + Token( + "\\", + ), + 2578..2579, + ), + ( + Token( + "\\", + ), + 2579..2580, + ), + ( + Token( + "b", + ), + 2580..2581, + ), + ( + Token( + "\"", + ), + 2581..2582, + ), + ( + Token( + ")", + ), + 2582..2583, + ), + ( + Token( + "}", + ), + 2592..2593, + ), + ( + Token( + "if", + ), + 2602..2604, + ), + ( + Token( + "extended", + ), + 2605..2613, + ), + ( + Token( + "{", + ), + 2614..2615, + ), + ( + Token( + "// GNU sed versions 4.0 through 4.2 support extended regex syntax,\n", + ), + 2628..2695, + ), + ( + Token( + "// but only via the \"-r\" option\n", + ), + 2707..2739, + ), + ( + Token( + "if", + ), + 2751..2753, + ), + ( + Token( + "sed_version", + ), + 2754..2765, + ), + ( + Token( + "==", + ), + 2766..2768, + ), + ( + Token( + "SED_VERSION_GNU", + ), + 2769..2784, + ), + ( + Token( + "{", + ), + 2785..2786, + ), + ( + Token( + "return", + ), + 2803..2809, + ), + ( + Token( + "$", + ), + 2810..2811, + ), + ( + Token( + "echo", + ), + 2812..2816, + ), + ( + Token( + "\"", + ), + 2817..2818, + ), + ( + Token( + "{", + ), + 2818..2819, + ), + ( + Token( + "source", + ), + 2819..2825, + ), + ( + Token( + "}", + ), + 2825..2826, + ), + ( + Token( + "\"", + ), + 2826..2827, + ), + ( + Token( + "|", + ), + 2828..2829, + ), + ( + Token( + "sed", + ), + 2830..2833, + ), + ( + Token( + "-", + ), + 2834..2835, + ), + ( + Token( + "r", + ), + 2835..2836, + ), + ( + Token( + "-", + ), + 2837..2838, + ), + ( + Token( + "e", + ), + 2838..2839, + ), + ( + Token( + "\"", + ), + 2840..2841, + ), + ( + Token( + "s", + ), + 2841..2842, + ), + ( + Token( + "/", + ), + 2842..2843, + ), + ( + Token( + "{", + ), + 2843..2844, + ), + ( + Token( + "search", + ), + 2844..2850, + ), + ( + Token( + "}", + ), + 2850..2851, + ), + ( + Token( + "/", + ), + 2851..2852, + ), + ( + Token( + "{", + ), + 2852..2853, + ), + ( + Token( + "replace_text", + ), + 2853..2865, + ), + ( + Token( + "}", + ), + 2865..2866, + ), + ( + Token( + "/", + ), + 2866..2867, + ), + ( + Token( + "g", + ), + 2867..2868, + ), + ( + Token( + "\"", + ), + 2868..2869, + ), + ( + Token( + "$", + ), + 2870..2871, + ), + ( + Token( + "}", + ), + 2884..2885, + ), + ( + Token( + "else", + ), + 2886..2890, + ), + ( + Token( + "{", + ), + 2891..2892, + ), + ( + Token( + "return", + ), + 2909..2915, + ), + ( + Token( + "$", + ), + 2916..2917, + ), + ( + Token( + "echo", + ), + 2918..2922, + ), + ( + Token( + "\"", + ), + 2923..2924, + ), + ( + Token( + "{", + ), + 2924..2925, + ), + ( + Token( + "source", + ), + 2925..2931, + ), + ( + Token( + "}", + ), + 2931..2932, + ), + ( + Token( + "\"", + ), + 2932..2933, + ), + ( + Token( + "|", + ), + 2934..2935, + ), + ( + Token( + "sed", + ), + 2936..2939, + ), + ( + Token( + "-", + ), + 2940..2941, + ), + ( + Token( + "E", + ), + 2941..2942, + ), + ( + Token( + "-", + ), + 2943..2944, + ), + ( + Token( + "e", + ), + 2944..2945, + ), + ( + Token( + "\"", + ), + 2946..2947, + ), + ( + Token( + "s", + ), + 2947..2948, + ), + ( + Token( + "/", + ), + 2948..2949, + ), + ( + Token( + "{", + ), + 2949..2950, + ), + ( + Token( + "search", + ), + 2950..2956, + ), + ( + Token( + "}", + ), + 2956..2957, + ), + ( + Token( + "/", + ), + 2957..2958, + ), + ( + Token( + "{", + ), + 2958..2959, + ), + ( + Token( + "replace_text", + ), + 2959..2971, + ), + ( + Token( + "}", + ), + 2971..2972, + ), + ( + Token( + "/", + ), + 2972..2973, + ), + ( + Token( + "g", + ), + 2973..2974, + ), + ( + Token( + "\"", + ), + 2974..2975, + ), + ( + Token( + "$", + ), + 2976..2977, + ), + ( + Token( + "}", + ), + 2990..2991, + ), + ( + Token( + "}", + ), + 3000..3001, + ), + ( + Token( + "else", + ), + 3002..3006, + ), + ( + Token( + "{", + ), + 3007..3008, + ), + ( + Token( + "if", + ), + 3021..3023, + ), + ( + Token( + "sed_version", + ), + 3024..3035, + ), + ( + Token( + "==", + ), + 3036..3038, + ), + ( + Token( + "SED_VERSION_GNU", + ), + 3039..3054, + ), + ( + Token( + "or", + ), + 3055..3057, + ), + ( + Token( + "sed_version", + ), + 3058..3069, + ), + ( + Token( + "==", + ), + 3070..3072, + ), + ( + Token( + "SED_VERSION_BUSYBOX", + ), + 3073..3092, + ), + ( + Token( + "{", + ), + 3093..3094, + ), + ( + Token( + "// GNU Sed BRE handle \\| as a metacharacter, but it is not POSIX standands. Disable it\n", + ), + 3111..3198, + ), + ( + Token( + "search", + ), + 3214..3220, + ), + ( + Token( + "=", + ), + 3221..3222, + ), + ( + Token( + "replace", + ), + 3223..3230, + ), + ( + Token( + "(", + ), + 3230..3231, + ), + ( + Token( + "search", + ), + 3231..3237, + ), + ( + Token( + ",", + ), + 3237..3238, + ), + ( + Token( + "\"", + ), + 3239..3240, + ), + ( + Token( + "\\", + ), + 3240..3241, + ), + ( + Token( + "|", + ), + 3241..3242, + ), + ( + Token( + "\"", + ), + 3242..3243, + ), + ( + Token( + ",", + ), + 3243..3244, + ), + ( + Token( + "\"", + ), + 3245..3246, + ), + ( + Token( + "|", + ), + 3246..3247, + ), + ( + Token( + "\"", + ), + 3247..3248, + ), + ( + Token( + ")", + ), + 3248..3249, + ), + ( + Token( + "}", + ), + 3262..3263, + ), + ( + Token( + "return", + ), + 3276..3282, + ), + ( + Token( + "$", + ), + 3283..3284, + ), + ( + Token( + "echo", + ), + 3285..3289, + ), + ( + Token( + "\"", + ), + 3290..3291, + ), + ( + Token( + "{", + ), + 3291..3292, + ), + ( + Token( + "source", + ), + 3292..3298, + ), + ( + Token( + "}", + ), + 3298..3299, + ), + ( + Token( + "\"", + ), + 3299..3300, + ), + ( + Token( + "|", + ), + 3301..3302, + ), + ( + Token( + "sed", + ), + 3303..3306, + ), + ( + Token( + "-", + ), + 3307..3308, + ), + ( + Token( + "e", + ), + 3308..3309, + ), + ( + Token( + "\"", + ), + 3310..3311, + ), + ( + Token( + "s", + ), + 3311..3312, + ), + ( + Token( + "/", + ), + 3312..3313, + ), + ( + Token( + "{", + ), + 3313..3314, + ), + ( + Token( + "search", + ), + 3314..3320, + ), + ( + Token( + "}", + ), + 3320..3321, + ), + ( + Token( + "/", + ), + 3321..3322, + ), + ( + Token( + "{", + ), + 3322..3323, + ), + ( + Token( + "replace_text", + ), + 3323..3335, + ), + ( + Token( + "}", + ), + 3335..3336, + ), + ( + Token( + "/", + ), + 3336..3337, + ), + ( + Token( + "g", + ), + 3337..3338, + ), + ( + Token( + "\"", + ), + 3338..3339, + ), + ( + Token( + "$", + ), + 3340..3341, + ), + ( + Token( + "}", + ), + 3350..3351, + ), + ( + Token( + "}", + ), + 3356..3357, + ), + ( + Token( + "}", + ), + 3358..3359, + ), + ( + Token( + "/// Splits the input `text` into an array of substrings using the specified `delimiter`.\n", + ), + 3361..3450, + ), + ( + Token( + "pub", + ), + 3450..3453, + ), + ( + Token( + "fun", + ), + 3454..3457, + ), + ( + Token( + "split", + ), + 3458..3463, + ), + ( + Token( + "(", + ), + 3463..3464, + ), + ( + Token( + "text", + ), + 3464..3468, + ), + ( + Token( + ":", + ), + 3468..3469, + ), + ( + Token( + "Text", + ), + 3470..3474, + ), + ( + Token( + ",", + ), + 3474..3475, + ), + ( + Token( + "delimiter", + ), + 3476..3485, + ), + ( + Token( + ":", + ), + 3485..3486, + ), + ( + Token( + "Text", + ), + 3487..3491, + ), + ( + Token( + ")", + ), + 3491..3492, + ), + ( + Token( + ":", + ), + 3492..3493, + ), + ( + Token( + "[", + ), + 3494..3495, + ), + ( + Token( + "Text", + ), + 3495..3499, + ), + ( + Token( + "]", + ), + 3499..3500, + ), + ( + Token( + "{", + ), + 3501..3502, + ), + ( + Token( + "let", + ), + 3507..3510, + ), + ( + Token( + "result", + ), + 3511..3517, + ), + ( + Token( + "=", + ), + 3518..3519, + ), + ( + Token( + "[", + ), + 3520..3521, + ), + ( + Token( + "Text", + ), + 3521..3525, + ), + ( + Token( + "]", + ), + 3525..3526, + ), + ( + Token( + "trust", + ), + 3531..3536, + ), + ( + Token( + "$", + ), + 3537..3538, + ), + ( + Token( + "IFS", + ), + 3539..3542, + ), + ( + Token( + "=", + ), + 3542..3543, + ), + ( + Token( + "\"", + ), + 3543..3544, + ), + ( + Token( + "{", + ), + 3544..3545, + ), + ( + Token( + "delimiter", + ), + 3545..3554, + ), + ( + Token( + "}", + ), + 3554..3555, + ), + ( + Token( + "\"", + ), + 3555..3556, + ), + ( + Token( + "read", + ), + 3557..3561, + ), + ( + Token( + "-", + ), + 3562..3563, + ), + ( + Token( + "rd", + ), + 3563..3565, + ), + ( + Token( + "''", + ), + 3566..3568, + ), + ( + Token( + "-", + ), + 3569..3570, + ), + ( + Token( + "a", + ), + 3570..3571, + ), + ( + Token( + "{", + ), + 3572..3573, + ), + ( + Token( + "nameof", + ), + 3573..3579, + ), + ( + Token( + "result", + ), + 3580..3586, + ), + ( + Token( + "}", + ), + 3586..3587, + ), + ( + Token( + "<", + ), + 3588..3589, + ), + ( + Token( + "<", + ), + 3590..3591, + ), + ( + Token( + "(", + ), + 3591..3592, + ), + ( + Token( + "printf", + ), + 3592..3598, + ), + ( + Token( + "%", + ), + 3599..3600, + ), + ( + Token( + "s", + ), + 3600..3601, + ), + ( + Token( + "\"", + ), + 3602..3603, + ), + ( + Token( + "\\", + ), + 3603..3604, + ), + ( + Token( + "$", + ), + 3604..3605, + ), + ( + Token( + "{", + ), + 3605..3606, + ), + ( + Token( + "nameof", + ), + 3606..3612, + ), + ( + Token( + "text", + ), + 3613..3617, + ), + ( + Token( + "}", + ), + 3617..3618, + ), + ( + Token( + "\"", + ), + 3618..3619, + ), + ( + Token( + ")", + ), + 3619..3620, + ), + ( + Token( + "$", + ), + 3621..3622, + ), + ( + Token( + "return", + ), + 3627..3633, + ), + ( + Token( + "result", + ), + 3634..3640, + ), + ( + Token( + "}", + ), + 3641..3642, + ), + ( + Token( + "/// Splits a `text` into an array of substrings based on newline characters.\n", + ), + 3644..3721, + ), + ( + Token( + "pub", + ), + 3721..3724, + ), + ( + Token( + "fun", + ), + 3725..3728, + ), + ( + Token( + "split_lines", + ), + 3729..3740, + ), + ( + Token( + "(", + ), + 3740..3741, + ), + ( + Token( + "text", + ), + 3741..3745, + ), + ( + Token( + ":", + ), + 3745..3746, + ), + ( + Token( + "Text", + ), + 3747..3751, + ), + ( + Token( + ")", + ), + 3751..3752, + ), + ( + Token( + ":", + ), + 3752..3753, + ), + ( + Token( + "[", + ), + 3754..3755, + ), + ( + Token( + "Text", + ), + 3755..3759, + ), + ( + Token( + "]", + ), + 3759..3760, + ), + ( + Token( + "{", + ), + 3761..3762, + ), + ( + Token( + "return", + ), + 3767..3773, + ), + ( + Token( + "split", + ), + 3774..3779, + ), + ( + Token( + "(", + ), + 3779..3780, + ), + ( + Token( + "text", + ), + 3780..3784, + ), + ( + Token( + ",", + ), + 3784..3785, + ), + ( + Token( + "\"", + ), + 3786..3787, + ), + ( + Token( + "\\", + ), + 3787..3788, + ), + ( + Token( + "n", + ), + 3788..3789, + ), + ( + Token( + "\"", + ), + 3789..3790, + ), + ( + Token( + ")", + ), + 3790..3791, + ), + ( + Token( + "}", + ), + 3792..3793, + ), + ( + Token( + "/// Splits a `text` into an array of substrings based on space character.\n", + ), + 3795..3869, + ), + ( + Token( + "pub", + ), + 3869..3872, + ), + ( + Token( + "fun", + ), + 3873..3876, + ), + ( + Token( + "split_words", + ), + 3877..3888, + ), + ( + Token( + "(", + ), + 3888..3889, + ), + ( + Token( + "text", + ), + 3889..3893, + ), + ( + Token( + ":", + ), + 3893..3894, + ), + ( + Token( + "Text", + ), + 3895..3899, + ), + ( + Token( + ")", + ), + 3899..3900, + ), + ( + Token( + ":", + ), + 3900..3901, + ), + ( + Token( + "[", + ), + 3902..3903, + ), + ( + Token( + "Text", + ), + 3903..3907, + ), + ( + Token( + "]", + ), + 3907..3908, + ), + ( + Token( + "{", + ), + 3909..3910, + ), + ( + Token( + "return", + ), + 3915..3921, + ), + ( + Token( + "split", + ), + 3922..3927, + ), + ( + Token( + "(", + ), + 3927..3928, + ), + ( + Token( + "text", + ), + 3928..3932, + ), + ( + Token( + ",", + ), + 3932..3933, + ), + ( + Token( + "\"", + ), + 3934..3935, + ), + ( + Token( + "\"", + ), + 3936..3937, + ), + ( + Token( + ")", + ), + 3937..3938, + ), + ( + Token( + "}", + ), + 3939..3940, + ), + ( + Token( + "/// Merges text using the delimiter specified.\n", + ), + 3942..3989, + ), + ( + Token( + "pub", + ), + 3989..3992, + ), + ( + Token( + "fun", + ), + 3993..3996, + ), + ( + Token( + "join", + ), + 3997..4001, + ), + ( + Token( + "(", + ), + 4001..4002, + ), + ( + Token( + "list", + ), + 4002..4006, + ), + ( + Token( + ":", + ), + 4006..4007, + ), + ( + Token( + "[", + ), + 4008..4009, + ), + ( + Token( + "Text", + ), + 4009..4013, + ), + ( + Token( + "]", + ), + 4013..4014, + ), + ( + Token( + ",", + ), + 4014..4015, + ), + ( + Token( + "delimiter", + ), + 4016..4025, + ), + ( + Token( + ":", + ), + 4025..4026, + ), + ( + Token( + "Text", + ), + 4027..4031, + ), + ( + Token( + ")", + ), + 4031..4032, + ), + ( + Token( + ":", + ), + 4032..4033, + ), + ( + Token( + "Text", + ), + 4034..4038, + ), + ( + Token( + "{", + ), + 4039..4040, + ), + ( + Token( + "return", + ), + 4045..4051, + ), + ( + Token( + "trust", + ), + 4052..4057, + ), + ( + Token( + "$", + ), + 4058..4059, + ), + ( + Token( + "IFS", + ), + 4060..4063, + ), + ( + Token( + "=", + ), + 4063..4064, + ), + ( + Token( + "\"", + ), + 4064..4065, + ), + ( + Token( + "{", + ), + 4065..4066, + ), + ( + Token( + "delimiter", + ), + 4066..4075, + ), + ( + Token( + "}", + ), + 4075..4076, + ), + ( + Token( + "\"", + ), + 4076..4077, + ), + ( + Token( + ";", + ), + 4078..4079, + ), + ( + Token( + "echo", + ), + 4080..4084, + ), + ( + Token( + "\"", + ), + 4085..4086, + ), + ( + Token( + "\\", + ), + 4086..4087, + ), + ( + Token( + "$", + ), + 4087..4088, + ), + ( + Token( + "\\", + ), + 4088..4089, + ), + ( + Token( + "{", + ), + 4089..4090, + ), + ( + Token( + "{", + ), + 4090..4091, + ), + ( + Token( + "nameof", + ), + 4091..4097, + ), + ( + Token( + "list", + ), + 4098..4102, + ), + ( + Token( + "}", + ), + 4102..4103, + ), + ( + Token( + "[", + ), + 4103..4104, + ), + ( + Token( + "*", + ), + 4104..4105, + ), + ( + Token( + "]", + ), + 4105..4106, + ), + ( + Token( + "}", + ), + 4106..4107, + ), + ( + Token( + "\"", + ), + 4107..4108, + ), + ( + Token( + "$", + ), + 4109..4110, + ), + ( + Token( + "}", + ), + 4111..4112, + ), + ( + Token( + "/// Trims the spaces at top of the text using `sed`.\n", + ), + 4114..4167, + ), + ( + Token( + "pub", + ), + 4167..4170, + ), + ( + Token( + "fun", + ), + 4171..4174, + ), + ( + Token( + "trim_left", + ), + 4175..4184, + ), + ( + Token( + "(", + ), + 4184..4185, + ), + ( + Token( + "text", + ), + 4185..4189, + ), + ( + Token( + ":", + ), + 4189..4190, + ), + ( + Token( + "Text", + ), + 4191..4195, + ), + ( + Token( + ")", + ), + 4195..4196, + ), + ( + Token( + ":", + ), + 4196..4197, + ), + ( + Token( + "Text", + ), + 4198..4202, + ), + ( + Token( + "{", + ), + 4203..4204, + ), + ( + Token( + "return", + ), + 4209..4215, + ), + ( + Token( + "trust", + ), + 4216..4221, + ), + ( + Token( + "$", + ), + 4222..4223, + ), + ( + Token( + "echo", + ), + 4224..4228, + ), + ( + Token( + "\"", + ), + 4229..4230, + ), + ( + Token( + "{", + ), + 4230..4231, + ), + ( + Token( + "text", + ), + 4231..4235, + ), + ( + Token( + "}", + ), + 4235..4236, + ), + ( + Token( + "\"", + ), + 4236..4237, + ), + ( + Token( + "|", + ), + 4238..4239, + ), + ( + Token( + "sed", + ), + 4240..4243, + ), + ( + Token( + "-", + ), + 4244..4245, + ), + ( + Token( + "e", + ), + 4245..4246, + ), + ( + Token( + "'s", + ), + 4247..4249, + ), + ( + Token( + "/", + ), + 4249..4250, + ), + ( + Token( + "^", + ), + 4250..4251, + ), + ( + Token( + "[", + ), + 4251..4252, + ), + ( + Token( + "[", + ), + 4252..4253, + ), + ( + Token( + ":", + ), + 4253..4254, + ), + ( + Token( + "space", + ), + 4254..4259, + ), + ( + Token( + ":", + ), + 4259..4260, + ), + ( + Token( + "]", + ), + 4260..4261, + ), + ( + Token( + "]", + ), + 4261..4262, + ), + ( + Token( + "*", + ), + 4262..4263, + ), + ( + Token( + "//", + ), + 4263..4265, + ), + ( + Token( + "'", + ), + 4265..4266, + ), + ( + Token( + "$", + ), + 4267..4268, + ), + ( + Token( + "}", + ), + 4269..4270, + ), + ( + Token( + "/// Trims the spaces at end of the text using `sed`.\n", + ), + 4272..4325, + ), + ( + Token( + "pub", + ), + 4325..4328, + ), + ( + Token( + "fun", + ), + 4329..4332, + ), + ( + Token( + "trim_right", + ), + 4333..4343, + ), + ( + Token( + "(", + ), + 4343..4344, + ), + ( + Token( + "text", + ), + 4344..4348, + ), + ( + Token( + ":", + ), + 4348..4349, + ), + ( + Token( + "Text", + ), + 4350..4354, + ), + ( + Token( + ")", + ), + 4354..4355, + ), + ( + Token( + ":", + ), + 4355..4356, + ), + ( + Token( + "Text", + ), + 4357..4361, + ), + ( + Token( + "{", + ), + 4362..4363, + ), + ( + Token( + "return", + ), + 4368..4374, + ), + ( + Token( + "trust", + ), + 4375..4380, + ), + ( + Token( + "$", + ), + 4381..4382, + ), + ( + Token( + "echo", + ), + 4383..4387, + ), + ( + Token( + "\"", + ), + 4388..4389, + ), + ( + Token( + "{", + ), + 4389..4390, + ), + ( + Token( + "text", + ), + 4390..4394, + ), + ( + Token( + "}", + ), + 4394..4395, + ), + ( + Token( + "\"", + ), + 4395..4396, + ), + ( + Token( + "|", + ), + 4397..4398, + ), + ( + Token( + "sed", + ), + 4399..4402, + ), + ( + Token( + "-", + ), + 4403..4404, + ), + ( + Token( + "e", + ), + 4404..4405, + ), + ( + Token( + "'s", + ), + 4406..4408, + ), + ( + Token( + "/", + ), + 4408..4409, + ), + ( + Token( + "[", + ), + 4409..4410, + ), + ( + Token( + "[", + ), + 4410..4411, + ), + ( + Token( + ":", + ), + 4411..4412, + ), + ( + Token( + "space", + ), + 4412..4417, + ), + ( + Token( + ":", + ), + 4417..4418, + ), + ( + Token( + "]", + ), + 4418..4419, + ), + ( + Token( + "]", + ), + 4419..4420, + ), + ( + Token( + "*", + ), + 4420..4421, + ), + ( + Token( + "\\", + ), + 4421..4422, + ), + ( + Token( + "$", + ), + 4422..4423, + ), + ( + Token( + "//", + ), + 4423..4425, + ), + ( + Token( + "'", + ), + 4425..4426, + ), + ( + Token( + "$", + ), + 4427..4428, + ), + ( + Token( + "}", + ), + 4429..4430, + ), + ( + Token( + "/// Trims the spaces from the text input.\n", + ), + 4432..4474, + ), + ( + Token( + "pub", + ), + 4474..4477, + ), + ( + Token( + "fun", + ), + 4478..4481, + ), + ( + Token( + "trim", + ), + 4482..4486, + ), + ( + Token( + "(", + ), + 4486..4487, + ), + ( + Token( + "text", + ), + 4487..4491, + ), + ( + Token( + ":", + ), + 4491..4492, + ), + ( + Token( + "Text", + ), + 4493..4497, + ), + ( + Token( + ")", + ), + 4497..4498, + ), + ( + Token( + ":", + ), + 4498..4499, + ), + ( + Token( + "Text", + ), + 4500..4504, + ), + ( + Token( + "{", + ), + 4505..4506, + ), + ( + Token( + "return", + ), + 4511..4517, + ), + ( + Token( + "trim_left", + ), + 4518..4527, + ), + ( + Token( + "(", + ), + 4527..4528, + ), + ( + Token( + "trim_right", + ), + 4528..4538, + ), + ( + Token( + "(", + ), + 4538..4539, + ), + ( + Token( + "text", + ), + 4539..4543, + ), + ( + Token( + ")", + ), + 4543..4544, + ), + ( + Token( + ")", + ), + 4544..4545, + ), + ( + Token( + "}", + ), + 4546..4547, + ), + ( + Token( + "/// Makes the text input lowercase using `tr`.\n", + ), + 4549..4596, + ), + ( + Token( + "pub", + ), + 4596..4599, + ), + ( + Token( + "fun", + ), + 4600..4603, + ), + ( + Token( + "lowercase", + ), + 4604..4613, + ), + ( + Token( + "(", + ), + 4613..4614, + ), + ( + Token( + "text", + ), + 4614..4618, + ), + ( + Token( + ":", + ), + 4618..4619, + ), + ( + Token( + "Text", + ), + 4620..4624, + ), + ( + Token( + ")", + ), + 4624..4625, + ), + ( + Token( + ":", + ), + 4625..4626, + ), + ( + Token( + "Text", + ), + 4627..4631, + ), + ( + Token( + "{", + ), + 4632..4633, + ), + ( + Token( + "return", + ), + 4638..4644, + ), + ( + Token( + "trust", + ), + 4645..4650, + ), + ( + Token( + "$", + ), + 4651..4652, + ), + ( + Token( + "echo", + ), + 4653..4657, + ), + ( + Token( + "\"", + ), + 4658..4659, + ), + ( + Token( + "{", + ), + 4659..4660, + ), + ( + Token( + "text", + ), + 4660..4664, + ), + ( + Token( + "}", + ), + 4664..4665, + ), + ( + Token( + "\"", + ), + 4665..4666, + ), + ( + Token( + "|", + ), + 4667..4668, + ), + ( + Token( + "tr", + ), + 4669..4671, + ), + ( + Token( + "'", + ), + 4672..4673, + ), + ( + Token( + "[", + ), + 4673..4674, + ), + ( + Token( + ":", + ), + 4674..4675, + ), + ( + Token( + "upper", + ), + 4675..4680, + ), + ( + Token( + ":", + ), + 4680..4681, + ), + ( + Token( + "]", + ), + 4681..4682, + ), + ( + Token( + "'", + ), + 4682..4683, + ), + ( + Token( + "'", + ), + 4684..4685, + ), + ( + Token( + "[", + ), + 4685..4686, + ), + ( + Token( + ":", + ), + 4686..4687, + ), + ( + Token( + "lower", + ), + 4687..4692, + ), + ( + Token( + ":", + ), + 4692..4693, + ), + ( + Token( + "]", + ), + 4693..4694, + ), + ( + Token( + "'", + ), + 4694..4695, + ), + ( + Token( + "$", + ), + 4696..4697, + ), + ( + Token( + "}", + ), + 4698..4699, + ), + ( + Token( + "/// Makes the text input uppercase using `tr`.\n", + ), + 4701..4748, + ), + ( + Token( + "pub", + ), + 4748..4751, + ), + ( + Token( + "fun", + ), + 4752..4755, + ), + ( + Token( + "uppercase", + ), + 4756..4765, + ), + ( + Token( + "(", + ), + 4765..4766, + ), + ( + Token( + "text", + ), + 4766..4770, + ), + ( + Token( + ":", + ), + 4770..4771, + ), + ( + Token( + "Text", + ), + 4772..4776, + ), + ( + Token( + ")", + ), + 4776..4777, + ), + ( + Token( + ":", + ), + 4777..4778, + ), + ( + Token( + "Text", + ), + 4779..4783, + ), + ( + Token( + "{", + ), + 4784..4785, + ), + ( + Token( + "return", + ), + 4790..4796, + ), + ( + Token( + "trust", + ), + 4797..4802, + ), + ( + Token( + "$", + ), + 4803..4804, + ), + ( + Token( + "echo", + ), + 4805..4809, + ), + ( + Token( + "\"", + ), + 4810..4811, + ), + ( + Token( + "{", + ), + 4811..4812, + ), + ( + Token( + "text", + ), + 4812..4816, + ), + ( + Token( + "}", + ), + 4816..4817, + ), + ( + Token( + "\"", + ), + 4817..4818, + ), + ( + Token( + "|", + ), + 4819..4820, + ), + ( + Token( + "tr", + ), + 4821..4823, + ), + ( + Token( + "'", + ), + 4824..4825, + ), + ( + Token( + "[", + ), + 4825..4826, + ), + ( + Token( + ":", + ), + 4826..4827, + ), + ( + Token( + "lower", + ), + 4827..4832, + ), + ( + Token( + ":", + ), + 4832..4833, + ), + ( + Token( + "]", + ), + 4833..4834, + ), + ( + Token( + "'", + ), + 4834..4835, + ), + ( + Token( + "'", + ), + 4836..4837, + ), + ( + Token( + "[", + ), + 4837..4838, + ), + ( + Token( + ":", + ), + 4838..4839, + ), + ( + Token( + "upper", + ), + 4839..4844, + ), + ( + Token( + ":", + ), + 4844..4845, + ), + ( + Token( + "]", + ), + 4845..4846, + ), + ( + Token( + "'", + ), + 4846..4847, + ), + ( + Token( + "$", + ), + 4848..4849, + ), + ( + Token( + "}", + ), + 4850..4851, + ), + ( + Token( + "/// Attempts to parse a given text into a number, returning the parsed number or zero if parsing fails.\n", + ), + 4853..4957, + ), + ( + Token( + "#", + ), + 4957..4958, + ), + ( + Token( + "[", + ), + 4958..4959, + ), + ( + Token( + "allow_absurd_cast", + ), + 4959..4976, + ), + ( + Token( + "]", + ), + 4976..4977, + ), + ( + Token( + "pub", + ), + 4978..4981, + ), + ( + Token( + "fun", + ), + 4982..4985, + ), + ( + Token( + "parse_number", + ), + 4986..4998, + ), + ( + Token( + "(", + ), + 4998..4999, + ), + ( + Token( + "text", + ), + 4999..5003, + ), + ( + Token( + ":", + ), + 5003..5004, + ), + ( + Token( + "Text", + ), + 5005..5009, + ), + ( + Token( + ")", + ), + 5009..5010, + ), + ( + Token( + ":", + ), + 5010..5011, + ), + ( + Token( + "Num", + ), + 5012..5015, + ), + ( + Token( + "?", + ), + 5015..5016, + ), + ( + Token( + "{", + ), + 5017..5018, + ), + ( + Token( + "$", + ), + 5023..5024, + ), + ( + Token( + "[", + ), + 5025..5026, + ), + ( + Token( + "-", + ), + 5027..5028, + ), + ( + Token( + "n", + ), + 5028..5029, + ), + ( + Token( + "\"", + ), + 5030..5031, + ), + ( + Token( + "{", + ), + 5031..5032, + ), + ( + Token( + "text", + ), + 5032..5036, + ), + ( + Token( + "}", + ), + 5036..5037, + ), + ( + Token( + "\"", + ), + 5037..5038, + ), + ( + Token( + "]", + ), + 5039..5040, + ), + ( + Token( + "&&", + ), + 5041..5043, + ), + ( + Token( + "[", + ), + 5044..5045, + ), + ( + Token( + "\"", + ), + 5046..5047, + ), + ( + Token( + "{", + ), + 5047..5048, + ), + ( + Token( + "text", + ), + 5048..5052, + ), + ( + Token( + "}", + ), + 5052..5053, + ), + ( + Token( + "\"", + ), + 5053..5054, + ), + ( + Token( + "-", + ), + 5055..5056, + ), + ( + Token( + "eq", + ), + 5056..5058, + ), + ( + Token( + "\"", + ), + 5059..5060, + ), + ( + Token( + "{", + ), + 5060..5061, + ), + ( + Token( + "text", + ), + 5061..5065, + ), + ( + Token( + "}", + ), + 5065..5066, + ), + ( + Token( + "\"", + ), + 5066..5067, + ), + ( + Token( + "]", + ), + 5068..5069, + ), + ( + Token( + "2", + ), + 5070..5071, + ), + ( + Token( + ">", + ), + 5071..5072, + ), + ( + Token( + "/", + ), + 5072..5073, + ), + ( + Token( + "dev", + ), + 5073..5076, + ), + ( + Token( + "/", + ), + 5076..5077, + ), + ( + Token( + "null", + ), + 5077..5081, + ), + ( + Token( + "$", + ), + 5082..5083, + ), + ( + Token( + "?", + ), + 5083..5084, + ), + ( + Token( + "return", + ), + 5089..5095, + ), + ( + Token( + "text", + ), + 5096..5100, + ), + ( + Token( + "as", + ), + 5101..5103, + ), + ( + Token( + "Num", + ), + 5104..5107, + ), + ( + Token( + "}", + ), + 5108..5109, + ), + ( + Token( + "/// Splits a text into an array of individual characters.\n", + ), + 5111..5169, + ), + ( + Token( + "pub", + ), + 5169..5172, + ), + ( + Token( + "fun", + ), + 5173..5176, + ), + ( + Token( + "split_chars", + ), + 5177..5188, + ), + ( + Token( + "(", + ), + 5188..5189, + ), + ( + Token( + "text", + ), + 5189..5193, + ), + ( + Token( + ":", + ), + 5193..5194, + ), + ( + Token( + "Text", + ), + 5195..5199, + ), + ( + Token( + ")", + ), + 5199..5200, + ), + ( + Token( + ":", + ), + 5200..5201, + ), + ( + Token( + "[", + ), + 5202..5203, + ), + ( + Token( + "Text", + ), + 5203..5207, + ), + ( + Token( + "]", + ), + 5207..5208, + ), + ( + Token( + "{", + ), + 5209..5210, + ), + ( + Token( + "let", + ), + 5215..5218, + ), + ( + Token( + "chars", + ), + 5219..5224, + ), + ( + Token( + "=", + ), + 5225..5226, + ), + ( + Token( + "[", + ), + 5227..5228, + ), + ( + Token( + "Text", + ), + 5228..5232, + ), + ( + Token( + "]", + ), + 5232..5233, + ), + ( + Token( + "trust", + ), + 5238..5243, + ), + ( + Token( + "$", + ), + 5244..5245, + ), + ( + Token( + "for", + ), + 5246..5249, + ), + ( + Token( + "(", + ), + 5250..5251, + ), + ( + Token( + "(", + ), + 5251..5252, + ), + ( + Token( + "i", + ), + 5252..5253, + ), + ( + Token( + "=", + ), + 5253..5254, + ), + ( + Token( + "0", + ), + 5254..5255, + ), + ( + Token( + ";", + ), + 5255..5256, + ), + ( + Token( + "i", + ), + 5257..5258, + ), + ( + Token( + "<", + ), + 5258..5259, + ), + ( + Token( + "\\", + ), + 5259..5260, + ), + ( + Token( + "$", + ), + 5260..5261, + ), + ( + Token( + "\\", + ), + 5261..5262, + ), + ( + Token( + "{", + ), + 5262..5263, + ), + ( + Token( + "#", + ), + 5263..5264, + ), + ( + Token( + "{", + ), + 5264..5265, + ), + ( + Token( + "nameof", + ), + 5265..5271, + ), + ( + Token( + "text", + ), + 5272..5276, + ), + ( + Token( + "}", + ), + 5276..5277, + ), + ( + Token( + "}", + ), + 5277..5278, + ), + ( + Token( + ";", + ), + 5278..5279, + ), + ( + Token( + "i", + ), + 5280..5281, + ), + ( + Token( + "+", + ), + 5281..5282, + ), + ( + Token( + "+", + ), + 5282..5283, + ), + ( + Token( + ")", + ), + 5283..5284, + ), + ( + Token( + ")", + ), + 5284..5285, + ), + ( + Token( + ";", + ), + 5285..5286, + ), + ( + Token( + "do", + ), + 5287..5289, + ), + ( + Token( + "{", + ), + 5298..5299, + ), + ( + Token( + "nameof", + ), + 5299..5305, + ), + ( + Token( + "chars", + ), + 5306..5311, + ), + ( + Token( + "}", + ), + 5311..5312, + ), + ( + Token( + "+=", + ), + 5312..5314, + ), + ( + Token( + "(", + ), + 5314..5315, + ), + ( + Token( + "\"", + ), + 5316..5317, + ), + ( + Token( + "\\", + ), + 5317..5318, + ), + ( + Token( + "$", + ), + 5318..5319, + ), + ( + Token( + "\\", + ), + 5319..5320, + ), + ( + Token( + "{", + ), + 5320..5321, + ), + ( + Token( + "{", + ), + 5321..5322, + ), + ( + Token( + "nameof", + ), + 5322..5328, + ), + ( + Token( + "text", + ), + 5329..5333, + ), + ( + Token( + "}", + ), + 5333..5334, + ), + ( + Token( + ":", + ), + 5334..5335, + ), + ( + Token( + "\\", + ), + 5335..5336, + ), + ( + Token( + "$", + ), + 5336..5337, + ), + ( + Token( + "i", + ), + 5337..5338, + ), + ( + Token( + ":", + ), + 5338..5339, + ), + ( + Token( + "1", + ), + 5339..5340, + ), + ( + Token( + "}", + ), + 5340..5341, + ), + ( + Token( + "\"", + ), + 5341..5342, + ), + ( + Token( + ")", + ), + 5343..5344, + ), + ( + Token( + ";", + ), + 5344..5345, + ), + ( + Token( + "done", + ), + 5350..5354, + ), + ( + Token( + "$", + ), + 5355..5356, + ), + ( + Token( + "return", + ), + 5361..5367, + ), + ( + Token( + "chars", + ), + 5368..5373, + ), + ( + Token( + "}", + ), + 5374..5375, + ), + ( + Token( + "/// Checks if some text contains a value.\n", + ), + 5377..5419, + ), + ( + Token( + "pub", + ), + 5419..5422, + ), + ( + Token( + "fun", + ), + 5423..5426, + ), + ( + Token( + "text_contains", + ), + 5427..5440, + ), + ( + Token( + "(", + ), + 5440..5441, + ), + ( + Token( + "source", + ), + 5441..5447, + ), + ( + Token( + ":", + ), + 5447..5448, + ), + ( + Token( + "Text", + ), + 5449..5453, + ), + ( + Token( + ",", + ), + 5453..5454, + ), + ( + Token( + "search", + ), + 5455..5461, + ), + ( + Token( + ":", + ), + 5461..5462, + ), + ( + Token( + "Text", + ), + 5463..5467, + ), + ( + Token( + ")", + ), + 5467..5468, + ), + ( + Token( + ":", + ), + 5468..5469, + ), + ( + Token( + "Bool", + ), + 5470..5474, + ), + ( + Token( + "{", + ), + 5475..5476, + ), + ( + Token( + "let", + ), + 5479..5482, + ), + ( + Token( + "result", + ), + 5483..5489, + ), + ( + Token( + "=", + ), + 5490..5491, + ), + ( + Token( + "trust", + ), + 5492..5497, + ), + ( + Token( + "$", + ), + 5498..5499, + ), + ( + Token( + "if", + ), + 5500..5502, + ), + ( + Token( + "[", + ), + 5503..5504, + ), + ( + Token( + "[", + ), + 5504..5505, + ), + ( + Token( + "\"", + ), + 5506..5507, + ), + ( + Token( + "{", + ), + 5507..5508, + ), + ( + Token( + "source", + ), + 5508..5514, + ), + ( + Token( + "}", + ), + 5514..5515, + ), + ( + Token( + "\"", + ), + 5515..5516, + ), + ( + Token( + "==", + ), + 5517..5519, + ), + ( + Token( + "*", + ), + 5520..5521, + ), + ( + Token( + "\"", + ), + 5521..5522, + ), + ( + Token( + "{", + ), + 5522..5523, + ), + ( + Token( + "search", + ), + 5523..5529, + ), + ( + Token( + "}", + ), + 5529..5530, + ), + ( + Token( + "\"", + ), + 5530..5531, + ), + ( + Token( + "*", + ), + 5531..5532, + ), + ( + Token( + "]", + ), + 5533..5534, + ), + ( + Token( + "]", + ), + 5534..5535, + ), + ( + Token( + ";", + ), + 5535..5536, + ), + ( + Token( + "then", + ), + 5537..5541, + ), + ( + Token( + "echo", + ), + 5546..5550, + ), + ( + Token( + "1", + ), + 5551..5552, + ), + ( + Token( + "fi", + ), + 5555..5557, + ), + ( + Token( + "$", + ), + 5558..5559, + ), + ( + Token( + "return", + ), + 5563..5569, + ), + ( + Token( + "result", + ), + 5570..5576, + ), + ( + Token( + "==", + ), + 5577..5579, + ), + ( + Token( + "\"", + ), + 5580..5581, + ), + ( + Token( + "1", + ), + 5581..5582, + ), + ( + Token( + "\"", + ), + 5582..5583, + ), + ( + Token( + "}", + ), + 5584..5585, + ), + ( + Token( + "/// Checks if an array value is in the text.\n", + ), + 5587..5632, + ), + ( + Token( + "pub", + ), + 5632..5635, + ), + ( + Token( + "fun", + ), + 5636..5639, + ), + ( + Token( + "text_contains_any", + ), + 5640..5657, + ), + ( + Token( + "(", + ), + 5657..5658, + ), + ( + Token( + "source", + ), + 5658..5664, + ), + ( + Token( + ":", + ), + 5664..5665, + ), + ( + Token( + "Text", + ), + 5666..5670, + ), + ( + Token( + ",", + ), + 5670..5671, + ), + ( + Token( + "searches", + ), + 5672..5680, + ), + ( + Token( + ":", + ), + 5680..5681, + ), + ( + Token( + "[", + ), + 5682..5683, + ), + ( + Token( + "Text", + ), + 5683..5687, + ), + ( + Token( + "]", + ), + 5687..5688, + ), + ( + Token( + ")", + ), + 5688..5689, + ), + ( + Token( + ":", + ), + 5689..5690, + ), + ( + Token( + "Bool", + ), + 5691..5695, + ), + ( + Token( + "{", + ), + 5696..5697, + ), + ( + Token( + "for", + ), + 5702..5705, + ), + ( + Token( + "search", + ), + 5706..5712, + ), + ( + Token( + "in", + ), + 5713..5715, + ), + ( + Token( + "searches", + ), + 5716..5724, + ), + ( + Token( + "{", + ), + 5725..5726, + ), + ( + Token( + "if", + ), + 5735..5737, + ), + ( + Token( + "text_contains", + ), + 5738..5751, + ), + ( + Token( + "(", + ), + 5751..5752, + ), + ( + Token( + "source", + ), + 5752..5758, + ), + ( + Token( + ",", + ), + 5758..5759, + ), + ( + Token( + "search", + ), + 5760..5766, + ), + ( + Token( + ")", + ), + 5766..5767, + ), + ( + Token( + "{", + ), + 5768..5769, + ), + ( + Token( + "return", + ), + 5782..5788, + ), + ( + Token( + "true", + ), + 5789..5793, + ), + ( + Token( + "}", + ), + 5802..5803, + ), + ( + Token( + "}", + ), + 5808..5809, + ), + ( + Token( + "return", + ), + 5815..5821, + ), + ( + Token( + "false", + ), + 5822..5827, + ), + ( + Token( + "}", + ), + 5828..5829, + ), + ( + Token( + "/// Checks if all the arrays values are in the string\n", + ), + 5831..5885, + ), + ( + Token( + "pub", + ), + 5885..5888, + ), + ( + Token( + "fun", + ), + 5889..5892, + ), + ( + Token( + "text_contains_all", + ), + 5893..5910, + ), + ( + Token( + "(", + ), + 5910..5911, + ), + ( + Token( + "source", + ), + 5911..5917, + ), + ( + Token( + ":", + ), + 5917..5918, + ), + ( + Token( + "Text", + ), + 5919..5923, + ), + ( + Token( + ",", + ), + 5923..5924, + ), + ( + Token( + "searches", + ), + 5925..5933, + ), + ( + Token( + ":", + ), + 5933..5934, + ), + ( + Token( + "[", + ), + 5935..5936, + ), + ( + Token( + "Text", + ), + 5936..5940, + ), + ( + Token( + "]", + ), + 5940..5941, + ), + ( + Token( + ")", + ), + 5941..5942, + ), + ( + Token( + ":", + ), + 5942..5943, + ), + ( + Token( + "Bool", + ), + 5944..5948, + ), + ( + Token( + "{", + ), + 5949..5950, + ), + ( + Token( + "for", + ), + 5955..5958, + ), + ( + Token( + "search", + ), + 5959..5965, + ), + ( + Token( + "in", + ), + 5966..5968, + ), + ( + Token( + "searches", + ), + 5969..5977, + ), + ( + Token( + "{", + ), + 5978..5979, + ), + ( + Token( + "if", + ), + 5988..5990, + ), + ( + Token( + "not", + ), + 5991..5994, + ), + ( + Token( + "text_contains", + ), + 5995..6008, + ), + ( + Token( + "(", + ), + 6008..6009, + ), + ( + Token( + "source", + ), + 6009..6015, + ), + ( + Token( + ",", + ), + 6015..6016, + ), + ( + Token( + "search", + ), + 6017..6023, + ), + ( + Token( + ")", + ), + 6023..6024, + ), + ( + Token( + "{", + ), + 6025..6026, + ), + ( + Token( + "return", + ), + 6039..6045, + ), + ( + Token( + "false", + ), + 6046..6051, + ), + ( + Token( + "}", + ), + 6060..6061, + ), + ( + Token( + "}", + ), + 6066..6067, + ), + ( + Token( + "return", + ), + 6073..6079, + ), + ( + Token( + "true", + ), + 6080..6084, + ), + ( + Token( + "}", + ), + 6085..6086, + ), + ( + Token( + "/// Match all occurences of a regex pattern.\n", + ), + 6088..6133, + ), + ( + Token( + "///\n", + ), + 6133..6137, + ), + ( + Token( + "/// Function uses `sed`\n", + ), + 6137..6161, + ), + ( + Token( + "pub", + ), + 6161..6164, + ), + ( + Token( + "fun", + ), + 6165..6168, + ), + ( + Token( + "match_regex", + ), + 6169..6180, + ), + ( + Token( + "(", + ), + 6180..6181, + ), + ( + Token( + "source", + ), + 6181..6187, + ), + ( + Token( + ":", + ), + 6187..6188, + ), + ( + Token( + "Text", + ), + 6189..6193, + ), + ( + Token( + ",", + ), + 6193..6194, + ), + ( + Token( + "search", + ), + 6195..6201, + ), + ( + Token( + ":", + ), + 6201..6202, + ), + ( + Token( + "Text", + ), + 6203..6207, + ), + ( + Token( + ",", + ), + 6207..6208, + ), + ( + Token( + "extended", + ), + 6209..6217, + ), + ( + Token( + ":", + ), + 6217..6218, + ), + ( + Token( + "Bool", + ), + 6219..6223, + ), + ( + Token( + "=", + ), + 6224..6225, + ), + ( + Token( + "false", + ), + 6226..6231, + ), + ( + Token( + ")", + ), + 6231..6232, + ), + ( + Token( + ":", + ), + 6232..6233, + ), + ( + Token( + "Bool", + ), + 6234..6238, + ), + ( + Token( + "{", + ), + 6239..6240, + ), + ( + Token( + "trust", + ), + 6245..6250, + ), + ( + Token( + "{", + ), + 6251..6252, + ), + ( + Token( + "const", + ), + 6261..6266, + ), + ( + Token( + "sed_version", + ), + 6267..6278, + ), + ( + Token( + "=", + ), + 6279..6280, + ), + ( + Token( + "sed_version", + ), + 6281..6292, + ), + ( + Token( + "(", + ), + 6292..6293, + ), + ( + Token( + ")", + ), + 6293..6294, + ), + ( + Token( + "search", + ), + 6303..6309, + ), + ( + Token( + "=", + ), + 6310..6311, + ), + ( + Token( + "replace", + ), + 6312..6319, + ), + ( + Token( + "(", + ), + 6319..6320, + ), + ( + Token( + "search", + ), + 6320..6326, + ), + ( + Token( + ",", + ), + 6326..6327, + ), + ( + Token( + "\"", + ), + 6328..6329, + ), + ( + Token( + "/", + ), + 6329..6330, + ), + ( + Token( + "\"", + ), + 6330..6331, + ), + ( + Token( + ",", + ), + 6331..6332, + ), + ( + Token( + "\"", + ), + 6333..6334, + ), + ( + Token( + "\\", + ), + 6334..6335, + ), + ( + Token( + "/", + ), + 6335..6336, + ), + ( + Token( + "\"", + ), + 6336..6337, + ), + ( + Token( + ")", + ), + 6337..6338, + ), + ( + Token( + "let", + ), + 6347..6350, + ), + ( + Token( + "output", + ), + 6351..6357, + ), + ( + Token( + "=", + ), + 6358..6359, + ), + ( + Token( + "\"", + ), + 6360..6361, + ), + ( + Token( + "\"", + ), + 6361..6362, + ), + ( + Token( + "if", + ), + 6371..6373, + ), + ( + Token( + "sed_version", + ), + 6374..6385, + ), + ( + Token( + "==", + ), + 6386..6388, + ), + ( + Token( + "SED_VERSION_GNU", + ), + 6389..6404, + ), + ( + Token( + "or", + ), + 6405..6407, + ), + ( + Token( + "sed_version", + ), + 6408..6419, + ), + ( + Token( + "==", + ), + 6420..6422, + ), + ( + Token( + "SED_VERSION_BUSYBOX", + ), + 6423..6442, + ), + ( + Token( + "{", + ), + 6443..6444, + ), + ( + Token( + "// '\\b' is supported but not in POSIX standards. Disable it\n", + ), + 6457..6517, + ), + ( + Token( + "search", + ), + 6529..6535, + ), + ( + Token( + "=", + ), + 6536..6537, + ), + ( + Token( + "replace", + ), + 6538..6545, + ), + ( + Token( + "(", + ), + 6545..6546, + ), + ( + Token( + "search", + ), + 6546..6552, + ), + ( + Token( + ",", + ), + 6552..6553, + ), + ( + Token( + "\"", + ), + 6554..6555, + ), + ( + Token( + "\\", + ), + 6555..6556, + ), + ( + Token( + "\\", + ), + 6556..6557, + ), + ( + Token( + "b", + ), + 6557..6558, + ), + ( + Token( + "\"", + ), + 6558..6559, + ), + ( + Token( + ",", + ), + 6559..6560, + ), + ( + Token( + "\"", + ), + 6561..6562, + ), + ( + Token( + "\\", + ), + 6562..6563, + ), + ( + Token( + "\\", + ), + 6563..6564, + ), + ( + Token( + "\\", + ), + 6564..6565, + ), + ( + Token( + "b", + ), + 6565..6566, + ), + ( + Token( + "\"", + ), + 6566..6567, + ), + ( + Token( + ")", + ), + 6567..6568, + ), + ( + Token( + "}", + ), + 6577..6578, + ), + ( + Token( + "if", + ), + 6587..6589, + ), + ( + Token( + "extended", + ), + 6590..6598, + ), + ( + Token( + "{", + ), + 6599..6600, + ), + ( + Token( + "// GNU sed versions 4.0 through 4.2 support extended regex syntax,\n", + ), + 6613..6680, + ), + ( + Token( + "// but only via the \"-r\" option\n", + ), + 6692..6724, + ), + ( + Token( + "if", + ), + 6736..6738, + ), + ( + Token( + "sed_version", + ), + 6739..6750, + ), + ( + Token( + "==", + ), + 6751..6753, + ), + ( + Token( + "SED_VERSION_GNU", + ), + 6754..6769, + ), + ( + Token( + "{", + ), + 6770..6771, + ), + ( + Token( + "// '\\b' is not in POSIX standards. Disable it\n", + ), + 6788..6834, + ), + ( + Token( + "search", + ), + 6850..6856, + ), + ( + Token( + "=", + ), + 6857..6858, + ), + ( + Token( + "replace", + ), + 6859..6866, + ), + ( + Token( + "(", + ), + 6866..6867, + ), + ( + Token( + "search", + ), + 6867..6873, + ), + ( + Token( + ",", + ), + 6873..6874, + ), + ( + Token( + "\"", + ), + 6875..6876, + ), + ( + Token( + "\\", + ), + 6876..6877, + ), + ( + Token( + "b", + ), + 6877..6878, + ), + ( + Token( + "\"", + ), + 6878..6879, + ), + ( + Token( + ",", + ), + 6879..6880, + ), + ( + Token( + "\"", + ), + 6881..6882, + ), + ( + Token( + "\\", + ), + 6882..6883, + ), + ( + Token( + "\\", + ), + 6883..6884, + ), + ( + Token( + "b", + ), + 6884..6885, + ), + ( + Token( + "\"", + ), + 6885..6886, + ), + ( + Token( + ")", + ), + 6886..6887, + ), + ( + Token( + "output", + ), + 6904..6910, + ), + ( + Token( + "=", + ), + 6911..6912, + ), + ( + Token( + "$", + ), + 6913..6914, + ), + ( + Token( + "echo", + ), + 6915..6919, + ), + ( + Token( + "\"", + ), + 6920..6921, + ), + ( + Token( + "{", + ), + 6921..6922, + ), + ( + Token( + "source", + ), + 6922..6928, + ), + ( + Token( + "}", + ), + 6928..6929, + ), + ( + Token( + "\"", + ), + 6929..6930, + ), + ( + Token( + "|", + ), + 6931..6932, + ), + ( + Token( + "sed", + ), + 6933..6936, + ), + ( + Token( + "-", + ), + 6937..6938, + ), + ( + Token( + "r", + ), + 6938..6939, + ), + ( + Token( + "-", + ), + 6940..6941, + ), + ( + Token( + "ne", + ), + 6941..6943, + ), + ( + Token( + "\"", + ), + 6944..6945, + ), + ( + Token( + "/", + ), + 6945..6946, + ), + ( + Token( + "{", + ), + 6946..6947, + ), + ( + Token( + "search", + ), + 6947..6953, + ), + ( + Token( + "}", + ), + 6953..6954, + ), + ( + Token( + "/", + ), + 6954..6955, + ), + ( + Token( + "p", + ), + 6955..6956, + ), + ( + Token( + "\"", + ), + 6956..6957, + ), + ( + Token( + "$", + ), + 6958..6959, + ), + ( + Token( + "}", + ), + 6972..6973, + ), + ( + Token( + "else", + ), + 6974..6978, + ), + ( + Token( + "{", + ), + 6979..6980, + ), + ( + Token( + "output", + ), + 6997..7003, + ), + ( + Token( + "=", + ), + 7004..7005, + ), + ( + Token( + "$", + ), + 7006..7007, + ), + ( + Token( + "echo", + ), + 7008..7012, + ), + ( + Token( + "\"", + ), + 7013..7014, + ), + ( + Token( + "{", + ), + 7014..7015, + ), + ( + Token( + "source", + ), + 7015..7021, + ), + ( + Token( + "}", + ), + 7021..7022, + ), + ( + Token( + "\"", + ), + 7022..7023, + ), + ( + Token( + "|", + ), + 7024..7025, + ), + ( + Token( + "sed", + ), + 7026..7029, + ), + ( + Token( + "-", + ), + 7030..7031, + ), + ( + Token( + "E", + ), + 7031..7032, + ), + ( + Token( + "-", + ), + 7033..7034, + ), + ( + Token( + "ne", + ), + 7034..7036, + ), + ( + Token( + "\"", + ), + 7037..7038, + ), + ( + Token( + "/", + ), + 7038..7039, + ), + ( + Token( + "{", + ), + 7039..7040, + ), + ( + Token( + "search", + ), + 7040..7046, + ), + ( + Token( + "}", + ), + 7046..7047, + ), + ( + Token( + "/", + ), + 7047..7048, + ), + ( + Token( + "p", + ), + 7048..7049, + ), + ( + Token( + "\"", + ), + 7049..7050, + ), + ( + Token( + "$", + ), + 7051..7052, + ), + ( + Token( + "}", + ), + 7065..7066, + ), + ( + Token( + "}", + ), + 7075..7076, + ), + ( + Token( + "else", + ), + 7077..7081, + ), + ( + Token( + "{", + ), + 7082..7083, + ), + ( + Token( + "if", + ), + 7096..7098, + ), + ( + Token( + "sed_version", + ), + 7099..7110, + ), + ( + Token( + "==", + ), + 7111..7113, + ), + ( + Token( + "SED_VERSION_GNU", + ), + 7114..7129, + ), + ( + Token( + "or", + ), + 7130..7132, + ), + ( + Token( + "sed_version", + ), + 7133..7144, + ), + ( + Token( + "==", + ), + 7145..7147, + ), + ( + Token( + "SED_VERSION_BUSYBOX", + ), + 7148..7167, + ), + ( + Token( + "{", + ), + 7168..7169, + ), + ( + Token( + "// GNU Sed BRE handle \\| as a metacharacter, but it is not POSIX standands. Disable it\n", + ), + 7186..7273, + ), + ( + Token( + "search", + ), + 7289..7295, + ), + ( + Token( + "=", + ), + 7296..7297, + ), + ( + Token( + "replace", + ), + 7298..7305, + ), + ( + Token( + "(", + ), + 7305..7306, + ), + ( + Token( + "search", + ), + 7306..7312, + ), + ( + Token( + ",", + ), + 7312..7313, + ), + ( + Token( + "\"", + ), + 7314..7315, + ), + ( + Token( + "\\", + ), + 7315..7316, + ), + ( + Token( + "|", + ), + 7316..7317, + ), + ( + Token( + "\"", + ), + 7317..7318, + ), + ( + Token( + ",", + ), + 7318..7319, + ), + ( + Token( + "\"", + ), + 7320..7321, + ), + ( + Token( + "|", + ), + 7321..7322, + ), + ( + Token( + "\"", + ), + 7322..7323, + ), + ( + Token( + ")", + ), + 7323..7324, + ), + ( + Token( + "}", + ), + 7337..7338, + ), + ( + Token( + "output", + ), + 7351..7357, + ), + ( + Token( + "=", + ), + 7358..7359, + ), + ( + Token( + "$", + ), + 7360..7361, + ), + ( + Token( + "echo", + ), + 7362..7366, + ), + ( + Token( + "\"", + ), + 7367..7368, + ), + ( + Token( + "{", + ), + 7368..7369, + ), + ( + Token( + "source", + ), + 7369..7375, + ), + ( + Token( + "}", + ), + 7375..7376, + ), + ( + Token( + "\"", + ), + 7376..7377, + ), + ( + Token( + "|", + ), + 7378..7379, + ), + ( + Token( + "sed", + ), + 7380..7383, + ), + ( + Token( + "-", + ), + 7384..7385, + ), + ( + Token( + "ne", + ), + 7385..7387, + ), + ( + Token( + "\"", + ), + 7388..7389, + ), + ( + Token( + "/", + ), + 7389..7390, + ), + ( + Token( + "{", + ), + 7390..7391, + ), + ( + Token( + "search", + ), + 7391..7397, + ), + ( + Token( + "}", + ), + 7397..7398, + ), + ( + Token( + "/", + ), + 7398..7399, + ), + ( + Token( + "p", + ), + 7399..7400, + ), + ( + Token( + "\"", + ), + 7400..7401, + ), + ( + Token( + "$", + ), + 7402..7403, + ), + ( + Token( + "}", + ), + 7412..7413, + ), + ( + Token( + "if", + ), + 7422..7424, + ), + ( + Token( + "output", + ), + 7425..7431, + ), + ( + Token( + "!=", + ), + 7432..7434, + ), + ( + Token( + "\"", + ), + 7435..7436, + ), + ( + Token( + "\"", + ), + 7436..7437, + ), + ( + Token( + "{", + ), + 7438..7439, + ), + ( + Token( + "return", + ), + 7452..7458, + ), + ( + Token( + "true", + ), + 7459..7463, + ), + ( + Token( + "}", + ), + 7472..7473, + ), + ( + Token( + "}", + ), + 7478..7479, + ), + ( + Token( + "return", + ), + 7484..7490, + ), + ( + Token( + "false", + ), + 7491..7496, + ), + ( + Token( + "}", + ), + 7497..7498, + ), + ( + Token( + "/// Checks if an array value (with regular expression) is in the text.\n", + ), + 7500..7571, + ), + ( + Token( + "pub", + ), + 7571..7574, + ), + ( + Token( + "fun", + ), + 7575..7578, + ), + ( + Token( + "match_regex_any", + ), + 7579..7594, + ), + ( + Token( + "(", + ), + 7594..7595, + ), + ( + Token( + "text", + ), + 7595..7599, + ), + ( + Token( + ":", + ), + 7599..7600, + ), + ( + Token( + "Text", + ), + 7601..7605, + ), + ( + Token( + ",", + ), + 7605..7606, + ), + ( + Token( + "terms", + ), + 7607..7612, + ), + ( + Token( + ":", + ), + 7612..7613, + ), + ( + Token( + "[", + ), + 7614..7615, + ), + ( + Token( + "Text", + ), + 7615..7619, + ), + ( + Token( + "]", + ), + 7619..7620, + ), + ( + Token( + ")", + ), + 7620..7621, + ), + ( + Token( + ":", + ), + 7621..7622, + ), + ( + Token( + "Bool", + ), + 7623..7627, + ), + ( + Token( + "{", + ), + 7628..7629, + ), + ( + Token( + "for", + ), + 7634..7637, + ), + ( + Token( + "term", + ), + 7638..7642, + ), + ( + Token( + "in", + ), + 7643..7645, + ), + ( + Token( + "terms", + ), + 7646..7651, + ), + ( + Token( + "{", + ), + 7652..7653, + ), + ( + Token( + "if", + ), + 7662..7664, + ), + ( + Token( + "match_regex", + ), + 7665..7676, + ), + ( + Token( + "(", + ), + 7676..7677, + ), + ( + Token( + "text", + ), + 7677..7681, + ), + ( + Token( + ",", + ), + 7681..7682, + ), + ( + Token( + "term", + ), + 7683..7687, + ), + ( + Token( + ",", + ), + 7687..7688, + ), + ( + Token( + "false", + ), + 7689..7694, + ), + ( + Token( + ")", + ), + 7694..7695, + ), + ( + Token( + "{", + ), + 7696..7697, + ), + ( + Token( + "return", + ), + 7710..7716, + ), + ( + Token( + "true", + ), + 7717..7721, + ), + ( + Token( + "}", + ), + 7730..7731, + ), + ( + Token( + "}", + ), + 7736..7737, + ), + ( + Token( + "return", + ), + 7743..7749, + ), + ( + Token( + "false", + ), + 7750..7755, + ), + ( + Token( + "}", + ), + 7756..7757, + ), + ( + Token( + "/// Reverses text using `rev`.\n", + ), + 7759..7790, + ), + ( + Token( + "pub", + ), + 7790..7793, + ), + ( + Token( + "fun", + ), + 7794..7797, + ), + ( + Token( + "reversed", + ), + 7798..7806, + ), + ( + Token( + "(", + ), + 7806..7807, + ), + ( + Token( + "text", + ), + 7807..7811, + ), + ( + Token( + ":", + ), + 7811..7812, + ), + ( + Token( + "Text", + ), + 7813..7817, + ), + ( + Token( + ")", + ), + 7817..7818, + ), + ( + Token( + ":", + ), + 7818..7819, + ), + ( + Token( + "Text", + ), + 7820..7824, + ), + ( + Token( + "{", + ), + 7825..7826, + ), + ( + Token( + "return", + ), + 7831..7837, + ), + ( + Token( + "trust", + ), + 7838..7843, + ), + ( + Token( + "$", + ), + 7844..7845, + ), + ( + Token( + "echo", + ), + 7846..7850, + ), + ( + Token( + "\"", + ), + 7851..7852, + ), + ( + Token( + "{", + ), + 7852..7853, + ), + ( + Token( + "text", + ), + 7853..7857, + ), + ( + Token( + "}", + ), + 7857..7858, + ), + ( + Token( + "\"", + ), + 7858..7859, + ), + ( + Token( + "|", + ), + 7860..7861, + ), + ( + Token( + "rev", + ), + 7862..7865, + ), + ( + Token( + "$", + ), + 7866..7867, + ), + ( + Token( + "}", + ), + 7868..7869, + ), + ( + Token( + "/// Checks if text starts with a value.\n", + ), + 7871..7911, + ), + ( + Token( + "pub", + ), + 7911..7914, + ), + ( + Token( + "fun", + ), + 7915..7918, + ), + ( + Token( + "starts_with", + ), + 7919..7930, + ), + ( + Token( + "(", + ), + 7930..7931, + ), + ( + Token( + "text", + ), + 7931..7935, + ), + ( + Token( + ":", + ), + 7935..7936, + ), + ( + Token( + "Text", + ), + 7937..7941, + ), + ( + Token( + ",", + ), + 7941..7942, + ), + ( + Token( + "prefix", + ), + 7943..7949, + ), + ( + Token( + ":", + ), + 7949..7950, + ), + ( + Token( + "Text", + ), + 7951..7955, + ), + ( + Token( + ")", + ), + 7955..7956, + ), + ( + Token( + ":", + ), + 7956..7957, + ), + ( + Token( + "Bool", + ), + 7958..7962, + ), + ( + Token( + "{", + ), + 7963..7964, + ), + ( + Token( + "let", + ), + 7967..7970, + ), + ( + Token( + "result", + ), + 7971..7977, + ), + ( + Token( + "=", + ), + 7978..7979, + ), + ( + Token( + "trust", + ), + 7980..7985, + ), + ( + Token( + "$", + ), + 7986..7987, + ), + ( + Token( + "if", + ), + 7988..7990, + ), + ( + Token( + "[", + ), + 7991..7992, + ), + ( + Token( + "[", + ), + 7992..7993, + ), + ( + Token( + "\"", + ), + 7994..7995, + ), + ( + Token( + "{", + ), + 7995..7996, + ), + ( + Token( + "text", + ), + 7996..8000, + ), + ( + Token( + "}", + ), + 8000..8001, + ), + ( + Token( + "\"", + ), + 8001..8002, + ), + ( + Token( + "==", + ), + 8003..8005, + ), + ( + Token( + "\"", + ), + 8006..8007, + ), + ( + Token( + "{", + ), + 8007..8008, + ), + ( + Token( + "prefix", + ), + 8008..8014, + ), + ( + Token( + "}", + ), + 8014..8015, + ), + ( + Token( + "\"", + ), + 8015..8016, + ), + ( + Token( + "*", + ), + 8016..8017, + ), + ( + Token( + "]", + ), + 8018..8019, + ), + ( + Token( + "]", + ), + 8019..8020, + ), + ( + Token( + ";", + ), + 8020..8021, + ), + ( + Token( + "then", + ), + 8022..8026, + ), + ( + Token( + "echo", + ), + 8031..8035, + ), + ( + Token( + "1", + ), + 8036..8037, + ), + ( + Token( + "fi", + ), + 8040..8042, + ), + ( + Token( + "$", + ), + 8043..8044, + ), + ( + Token( + "return", + ), + 8048..8054, + ), + ( + Token( + "result", + ), + 8055..8061, + ), + ( + Token( + "==", + ), + 8062..8064, + ), + ( + Token( + "\"", + ), + 8065..8066, + ), + ( + Token( + "1", + ), + 8066..8067, + ), + ( + Token( + "\"", + ), + 8067..8068, + ), + ( + Token( + "}", + ), + 8069..8070, + ), + ( + Token( + "/// Checks if text ends with a value.\n", + ), + 8072..8110, + ), + ( + Token( + "pub", + ), + 8110..8113, + ), + ( + Token( + "fun", + ), + 8114..8117, + ), + ( + Token( + "ends_with", + ), + 8118..8127, + ), + ( + Token( + "(", + ), + 8127..8128, + ), + ( + Token( + "text", + ), + 8128..8132, + ), + ( + Token( + ":", + ), + 8132..8133, + ), + ( + Token( + "Text", + ), + 8134..8138, + ), + ( + Token( + ",", + ), + 8138..8139, + ), + ( + Token( + "suffix", + ), + 8140..8146, + ), + ( + Token( + ":", + ), + 8146..8147, + ), + ( + Token( + "Text", + ), + 8148..8152, + ), + ( + Token( + ")", + ), + 8152..8153, + ), + ( + Token( + ":", + ), + 8153..8154, + ), + ( + Token( + "Bool", + ), + 8155..8159, + ), + ( + Token( + "{", + ), + 8160..8161, + ), + ( + Token( + "let", + ), + 8164..8167, + ), + ( + Token( + "result", + ), + 8168..8174, + ), + ( + Token( + "=", + ), + 8175..8176, + ), + ( + Token( + "trust", + ), + 8177..8182, + ), + ( + Token( + "$", + ), + 8183..8184, + ), + ( + Token( + "if", + ), + 8185..8187, + ), + ( + Token( + "[", + ), + 8188..8189, + ), + ( + Token( + "[", + ), + 8189..8190, + ), + ( + Token( + "\"", + ), + 8191..8192, + ), + ( + Token( + "{", + ), + 8192..8193, + ), + ( + Token( + "text", + ), + 8193..8197, + ), + ( + Token( + "}", + ), + 8197..8198, + ), + ( + Token( + "\"", + ), + 8198..8199, + ), + ( + Token( + "==", + ), + 8200..8202, + ), + ( + Token( + "*", + ), + 8203..8204, + ), + ( + Token( + "\"", + ), + 8204..8205, + ), + ( + Token( + "{", + ), + 8205..8206, + ), + ( + Token( + "suffix", + ), + 8206..8212, + ), + ( + Token( + "}", + ), + 8212..8213, + ), + ( + Token( + "\"", + ), + 8213..8214, + ), + ( + Token( + "]", + ), + 8215..8216, + ), + ( + Token( + "]", + ), + 8216..8217, + ), + ( + Token( + ";", + ), + 8217..8218, + ), + ( + Token( + "then", + ), + 8219..8223, + ), + ( + Token( + "echo", + ), + 8228..8232, + ), + ( + Token( + "1", + ), + 8233..8234, + ), + ( + Token( + "fi", + ), + 8237..8239, + ), + ( + Token( + "$", + ), + 8240..8241, + ), + ( + Token( + "return", + ), + 8245..8251, + ), + ( + Token( + "result", + ), + 8252..8258, + ), + ( + Token( + "==", + ), + 8259..8261, + ), + ( + Token( + "\"", + ), + 8262..8263, + ), + ( + Token( + "1", + ), + 8263..8264, + ), + ( + Token( + "\"", + ), + 8264..8265, + ), + ( + Token( + "}", + ), + 8266..8267, + ), + ( + Token( + "/// Returns a substring from `text` starting at the given `index` (0-based).\n", + ), + 8269..8346, + ), + ( + Token( + "///\n", + ), + 8346..8350, + ), + ( + Token( + "/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.\n", + ), + 8350..8462, + ), + ( + Token( + "/// If `length` is provided, the substring will include `length` characters; otherwise, it slices to the end of `text`.\n", + ), + 8462..8582, + ), + ( + Token( + "/// If `length` is negative, an empty string is returned.\n", + ), + 8582..8640, + ), + ( + Token( + "pub", + ), + 8640..8643, + ), + ( + Token( + "fun", + ), + 8644..8647, + ), + ( + Token( + "slice", + ), + 8648..8653, + ), + ( + Token( + "(", + ), + 8653..8654, + ), + ( + Token( + "text", + ), + 8654..8658, + ), + ( + Token( + ":", + ), + 8658..8659, + ), + ( + Token( + "Text", + ), + 8660..8664, + ), + ( + Token( + ",", + ), + 8664..8665, + ), + ( + Token( + "index", + ), + 8666..8671, + ), + ( + Token( + ":", + ), + 8671..8672, + ), + ( + Token( + "Int", + ), + 8673..8676, + ), + ( + Token( + ",", + ), + 8676..8677, + ), + ( + Token( + "length", + ), + 8678..8684, + ), + ( + Token( + ":", + ), + 8684..8685, + ), + ( + Token( + "Int", + ), + 8686..8689, + ), + ( + Token( + "=", + ), + 8690..8691, + ), + ( + Token( + "0", + ), + 8692..8693, + ), + ( + Token( + ")", + ), + 8693..8694, + ), + ( + Token( + ":", + ), + 8694..8695, + ), + ( + Token( + "Text", + ), + 8696..8700, + ), + ( + Token( + "{", + ), + 8701..8702, + ), + ( + Token( + "if", + ), + 8707..8709, + ), + ( + Token( + "length", + ), + 8710..8716, + ), + ( + Token( + "==", + ), + 8717..8719, + ), + ( + Token( + "0", + ), + 8720..8721, + ), + ( + Token( + ":", + ), + 8721..8722, + ), + ( + Token( + "length", + ), + 8723..8729, + ), + ( + Token( + "=", + ), + 8730..8731, + ), + ( + Token( + "len", + ), + 8732..8735, + ), + ( + Token( + "(", + ), + 8735..8736, + ), + ( + Token( + "text", + ), + 8736..8740, + ), + ( + Token( + ")", + ), + 8740..8741, + ), + ( + Token( + "-", + ), + 8742..8743, + ), + ( + Token( + "index", + ), + 8744..8749, + ), + ( + Token( + "if", + ), + 8754..8756, + ), + ( + Token( + "length", + ), + 8757..8763, + ), + ( + Token( + "<=", + ), + 8764..8766, + ), + ( + Token( + "0", + ), + 8767..8768, + ), + ( + Token( + ":", + ), + 8768..8769, + ), + ( + Token( + "return", + ), + 8770..8776, + ), + ( + Token( + "\"", + ), + 8777..8778, + ), + ( + Token( + "\"", + ), + 8778..8779, + ), + ( + Token( + "return", + ), + 8784..8790, + ), + ( + Token( + "trust", + ), + 8791..8796, + ), + ( + Token( + "$", + ), + 8797..8798, + ), + ( + Token( + "printf", + ), + 8799..8805, + ), + ( + Token( + "\"", + ), + 8806..8807, + ), + ( + Token( + "%", + ), + 8807..8808, + ), + ( + Token( + ".", + ), + 8808..8809, + ), + ( + Token( + "{", + ), + 8809..8810, + ), + ( + Token( + "length", + ), + 8810..8816, + ), + ( + Token( + "}", + ), + 8816..8817, + ), + ( + Token( + "s", + ), + 8817..8818, + ), + ( + Token( + "\"", + ), + 8818..8819, + ), + ( + Token( + "\"", + ), + 8820..8821, + ), + ( + Token( + "\\", + ), + 8821..8822, + ), + ( + Token( + "$", + ), + 8822..8823, + ), + ( + Token( + "\\", + ), + 8823..8824, + ), + ( + Token( + "{", + ), + 8824..8825, + ), + ( + Token( + "text", + ), + 8825..8829, + ), + ( + Token( + ":", + ), + 8829..8830, + ), + ( + Token( + "{", + ), + 8830..8831, + ), + ( + Token( + "index", + ), + 8831..8836, + ), + ( + Token( + "}", + ), + 8836..8837, + ), + ( + Token( + "}", + ), + 8837..8838, + ), + ( + Token( + "\"", + ), + 8838..8839, + ), + ( + Token( + "$", + ), + 8840..8841, + ), + ( + Token( + "}", + ), + 8842..8843, + ), + ( + Token( + "/// Returns the character from `text` at the specified `index` (0-based).\n", + ), + 8845..8919, + ), + ( + Token( + "///\n", + ), + 8919..8923, + ), + ( + Token( + "/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.\n", + ), + 8923..9035, + ), + ( + Token( + "pub", + ), + 9035..9038, + ), + ( + Token( + "fun", + ), + 9039..9042, + ), + ( + Token( + "char_at", + ), + 9043..9050, + ), + ( + Token( + "(", + ), + 9050..9051, + ), + ( + Token( + "text", + ), + 9051..9055, + ), + ( + Token( + ":", + ), + 9055..9056, + ), + ( + Token( + "Text", + ), + 9057..9061, + ), + ( + Token( + ",", + ), + 9061..9062, + ), + ( + Token( + "index", + ), + 9063..9068, + ), + ( + Token( + ":", + ), + 9068..9069, + ), + ( + Token( + "Int", + ), + 9070..9073, + ), + ( + Token( + ")", + ), + 9073..9074, + ), + ( + Token( + ":", + ), + 9074..9075, + ), + ( + Token( + "Text", + ), + 9076..9080, + ), + ( + Token( + "{", + ), + 9081..9082, + ), + ( + Token( + "return", + ), + 9087..9093, + ), + ( + Token( + "trust", + ), + 9094..9099, + ), + ( + Token( + "$", + ), + 9100..9101, + ), + ( + Token( + "printf", + ), + 9102..9108, + ), + ( + Token( + "\"", + ), + 9109..9110, + ), + ( + Token( + "%", + ), + 9110..9111, + ), + ( + Token( + ".", + ), + 9111..9112, + ), + ( + Token( + "1s", + ), + 9112..9114, + ), + ( + Token( + "\"", + ), + 9114..9115, + ), + ( + Token( + "\"", + ), + 9116..9117, + ), + ( + Token( + "\\", + ), + 9117..9118, + ), + ( + Token( + "$", + ), + 9118..9119, + ), + ( + Token( + "\\", + ), + 9119..9120, + ), + ( + Token( + "{", + ), + 9120..9121, + ), + ( + Token( + "text", + ), + 9121..9125, + ), + ( + Token( + ":", + ), + 9125..9126, + ), + ( + Token( + "{", + ), + 9126..9127, + ), + ( + Token( + "index", + ), + 9127..9132, + ), + ( + Token( + "}", + ), + 9132..9133, + ), + ( + Token( + "}", + ), + 9133..9134, + ), + ( + Token( + "\"", + ), + 9134..9135, + ), + ( + Token( + "$", + ), + 9136..9137, + ), + ( + Token( + "}", + ), + 9138..9139, + ), + ( + Token( + "/// Capitalize the first letter of the given `text`.\n", + ), + 9141..9194, + ), + ( + Token( + "#", + ), + 9194..9195, + ), + ( + Token( + "[", + ), + 9195..9196, + ), + ( + Token( + "allow_absurd_cast", + ), + 9196..9213, + ), + ( + Token( + "]", + ), + 9213..9214, + ), + ( + Token( + "pub", + ), + 9215..9218, + ), + ( + Token( + "fun", + ), + 9219..9222, + ), + ( + Token( + "capitalized", + ), + 9223..9234, + ), + ( + Token( + "(", + ), + 9234..9235, + ), + ( + Token( + "text", + ), + 9235..9239, + ), + ( + Token( + ":", + ), + 9239..9240, + ), + ( + Token( + "Text", + ), + 9241..9245, + ), + ( + Token( + ")", + ), + 9245..9246, + ), + ( + Token( + ":", + ), + 9246..9247, + ), + ( + Token( + "Text", + ), + 9248..9252, + ), + ( + Token( + "{", + ), + 9253..9254, + ), + ( + Token( + "trust", + ), + 9259..9264, + ), + ( + Token( + "{", + ), + 9265..9266, + ), + ( + Token( + "if", + ), + 9275..9277, + ), + ( + Token( + "len", + ), + 9278..9281, + ), + ( + Token( + "(", + ), + 9281..9282, + ), + ( + Token( + "text", + ), + 9282..9286, + ), + ( + Token( + ")", + ), + 9286..9287, + ), + ( + Token( + "==", + ), + 9288..9290, + ), + ( + Token( + "0", + ), + 9291..9292, + ), + ( + Token( + "{", + ), + 9293..9294, + ), + ( + Token( + "return", + ), + 9307..9313, + ), + ( + Token( + "text", + ), + 9314..9318, + ), + ( + Token( + "}", + ), + 9327..9328, + ), + ( + Token( + "if", + ), + 9337..9339, + ), + ( + Token( + "bash_version", + ), + 9340..9352, + ), + ( + Token( + "(", + ), + 9352..9353, + ), + ( + Token( + ")", + ), + 9353..9354, + ), + ( + Token( + ">=", + ), + 9355..9357, + ), + ( + Token( + "[", + ), + 9358..9359, + ), + ( + Token( + "4", + ), + 9359..9360, + ), + ( + Token( + "]", + ), + 9360..9361, + ), + ( + Token( + "{", + ), + 9362..9363, + ), + ( + Token( + "return", + ), + 9376..9382, + ), + ( + Token( + "$", + ), + 9383..9384, + ), + ( + Token( + "echo", + ), + 9385..9389, + ), + ( + Token( + "\\", + ), + 9390..9391, + ), + ( + Token( + "\"", + ), + 9391..9392, + ), + ( + Token( + "\\", + ), + 9392..9393, + ), + ( + Token( + "$", + ), + 9393..9394, + ), + ( + Token( + "\\", + ), + 9394..9395, + ), + ( + Token( + "{", + ), + 9395..9396, + ), + ( + Token( + "{", + ), + 9396..9397, + ), + ( + Token( + "nameof", + ), + 9397..9403, + ), + ( + Token( + "text", + ), + 9404..9408, + ), + ( + Token( + "}", + ), + 9408..9409, + ), + ( + Token( + "^", + ), + 9409..9410, + ), + ( + Token( + "}", + ), + 9410..9411, + ), + ( + Token( + "\\", + ), + 9411..9412, + ), + ( + Token( + "\"", + ), + 9412..9413, + ), + ( + Token( + "$", + ), + 9414..9415, + ), + ( + Token( + "}", + ), + 9424..9425, + ), + ( + Token( + "if", + ), + 9434..9436, + ), + ( + Token( + "sed_version", + ), + 9437..9448, + ), + ( + Token( + "(", + ), + 9448..9449, + ), + ( + Token( + ")", + ), + 9449..9450, + ), + ( + Token( + "==", + ), + 9451..9453, + ), + ( + Token( + "SED_VERSION_GNU", + ), + 9454..9469, + ), + ( + Token( + "{", + ), + 9470..9471, + ), + ( + Token( + "// GNU sed supports \\U\n", + ), + 9484..9507, + ), + ( + Token( + "return", + ), + 9519..9525, + ), + ( + Token( + "$", + ), + 9526..9527, + ), + ( + Token( + "echo", + ), + 9528..9532, + ), + ( + Token( + "\"", + ), + 9533..9534, + ), + ( + Token( + "{", + ), + 9534..9535, + ), + ( + Token( + "text", + ), + 9535..9539, + ), + ( + Token( + "}", + ), + 9539..9540, + ), + ( + Token( + "\"", + ), + 9540..9541, + ), + ( + Token( + "|", + ), + 9542..9543, + ), + ( + Token( + "sed", + ), + 9544..9547, + ), + ( + Token( + "\"", + ), + 9548..9549, + ), + ( + Token( + "s", + ), + 9549..9550, + ), + ( + Token( + "/", + ), + 9550..9551, + ), + ( + Token( + "^", + ), + 9551..9552, + ), + ( + Token( + "\\", + ), + 9552..9553, + ), + ( + Token( + "(", + ), + 9553..9554, + ), + ( + Token( + ".", + ), + 9554..9555, + ), + ( + Token( + "\\", + ), + 9555..9556, + ), + ( + Token( + ")", + ), + 9556..9557, + ), + ( + Token( + "/", + ), + 9557..9558, + ), + ( + Token( + "\\", + ), + 9558..9559, + ), + ( + Token( + "U", + ), + 9559..9560, + ), + ( + Token( + "\\", + ), + 9560..9561, + ), + ( + Token( + "1", + ), + 9561..9562, + ), + ( + Token( + "/", + ), + 9562..9563, + ), + ( + Token( + "\"", + ), + 9563..9564, + ), + ( + Token( + "$", + ), + 9565..9566, + ), + ( + Token( + "}", + ), + 9575..9576, + ), + ( + Token( + "const", + ), + 9585..9590, + ), + ( + Token( + "first_letter", + ), + 9591..9603, + ), + ( + Token( + "=", + ), + 9604..9605, + ), + ( + Token( + "uppercase", + ), + 9606..9615, + ), + ( + Token( + "(", + ), + 9615..9616, + ), + ( + Token( + "char_at", + ), + 9616..9623, + ), + ( + Token( + "(", + ), + 9623..9624, + ), + ( + Token( + "text", + ), + 9624..9628, + ), + ( + Token( + ",", + ), + 9628..9629, + ), + ( + Token( + "0", + ), + 9630..9631, + ), + ( + Token( + ")", + ), + 9631..9632, + ), + ( + Token( + ")", + ), + 9632..9633, + ), + ( + Token( + "return", + ), + 9642..9648, + ), + ( + Token( + "first_letter", + ), + 9649..9661, + ), + ( + Token( + "+", + ), + 9662..9663, + ), + ( + Token( + "slice", + ), + 9664..9669, + ), + ( + Token( + "(", + ), + 9669..9670, + ), + ( + Token( + "text", + ), + 9670..9674, + ), + ( + Token( + ",", + ), + 9674..9675, + ), + ( + Token( + "1", + ), + 9676..9677, + ), + ( + Token( + ")", + ), + 9677..9678, + ), + ( + Token( + "}", + ), + 9683..9684, + ), + ( + Token( + "}", + ), + 9685..9686, + ), + ( + Token( + "/// Pads `text` with the specified `pad` character on left until it reaches the desired `length`.\n", + ), + 9688..9786, + ), + ( + Token( + "pub", + ), + 9786..9789, + ), + ( + Token( + "fun", + ), + 9790..9793, + ), + ( + Token( + "lpad", + ), + 9794..9798, + ), + ( + Token( + "(", + ), + 9798..9799, + ), + ( + Token( + "text", + ), + 9799..9803, + ), + ( + Token( + ":", + ), + 9803..9804, + ), + ( + Token( + "Text", + ), + 9805..9809, + ), + ( + Token( + ",", + ), + 9809..9810, + ), + ( + Token( + "pad", + ), + 9811..9814, + ), + ( + Token( + ":", + ), + 9814..9815, + ), + ( + Token( + "Text", + ), + 9816..9820, + ), + ( + Token( + ",", + ), + 9820..9821, + ), + ( + Token( + "length", + ), + 9822..9828, + ), + ( + Token( + ":", + ), + 9828..9829, + ), + ( + Token( + "Num", + ), + 9830..9833, + ), + ( + Token( + ")", + ), + 9833..9834, + ), + ( + Token( + ":", + ), + 9834..9835, + ), + ( + Token( + "Text", + ), + 9836..9840, + ), + ( + Token( + "{", + ), + 9841..9842, + ), + ( + Token( + "if", + ), + 9847..9849, + ), + ( + Token( + "length", + ), + 9850..9856, + ), + ( + Token( + "<=", + ), + 9857..9859, + ), + ( + Token( + "len", + ), + 9860..9863, + ), + ( + Token( + "(", + ), + 9863..9864, + ), + ( + Token( + "text", + ), + 9864..9868, + ), + ( + Token( + ")", + ), + 9868..9869, + ), + ( + Token( + ":", + ), + 9869..9870, + ), + ( + Token( + "return", + ), + 9871..9877, + ), + ( + Token( + "text", + ), + 9878..9882, + ), + ( + Token( + "length", + ), + 9887..9893, + ), + ( + Token( + "=", + ), + 9894..9895, + ), + ( + Token( + "len", + ), + 9896..9899, + ), + ( + Token( + "(", + ), + 9899..9900, + ), + ( + Token( + "text", + ), + 9900..9904, + ), + ( + Token( + ")", + ), + 9904..9905, + ), + ( + Token( + "-", + ), + 9906..9907, + ), + ( + Token( + "length", + ), + 9908..9914, + ), + ( + Token( + "pad", + ), + 9919..9922, + ), + ( + Token( + "=", + ), + 9923..9924, + ), + ( + Token( + "trust", + ), + 9925..9930, + ), + ( + Token( + "$", + ), + 9931..9932, + ), + ( + Token( + "printf", + ), + 9933..9939, + ), + ( + Token( + "\"", + ), + 9940..9941, + ), + ( + Token( + "%", + ), + 9941..9942, + ), + ( + Token( + "{", + ), + 9942..9943, + ), + ( + Token( + "length", + ), + 9943..9949, + ), + ( + Token( + "}", + ), + 9949..9950, + ), + ( + Token( + "s", + ), + 9950..9951, + ), + ( + Token( + "\"", + ), + 9951..9952, + ), + ( + Token( + "\"", + ), + 9953..9954, + ), + ( + Token( + "\"", + ), + 9954..9955, + ), + ( + Token( + "|", + ), + 9956..9957, + ), + ( + Token( + "tr", + ), + 9958..9960, + ), + ( + Token( + "\"", + ), + 9961..9962, + ), + ( + Token( + "\"", + ), + 9963..9964, + ), + ( + Token( + "\"", + ), + 9965..9966, + ), + ( + Token( + "{", + ), + 9966..9967, + ), + ( + Token( + "pad", + ), + 9967..9970, + ), + ( + Token( + "}", + ), + 9970..9971, + ), + ( + Token( + "\"", + ), + 9971..9972, + ), + ( + Token( + "$", + ), + 9973..9974, + ), + ( + Token( + "return", + ), + 9979..9985, + ), + ( + Token( + "pad", + ), + 9986..9989, + ), + ( + Token( + "+", + ), + 9990..9991, + ), + ( + Token( + "text", + ), + 9992..9996, + ), + ( + Token( + "}", + ), + 9997..9998, + ), + ( + Token( + "/// Pads `text` with the specified `pad` character on the right until it reaches the desired `length`.\n", + ), + 10000..10103, + ), + ( + Token( + "pub", + ), + 10103..10106, + ), + ( + Token( + "fun", + ), + 10107..10110, + ), + ( + Token( + "rpad", + ), + 10111..10115, + ), + ( + Token( + "(", + ), + 10115..10116, + ), + ( + Token( + "text", + ), + 10116..10120, + ), + ( + Token( + ":", + ), + 10120..10121, + ), + ( + Token( + "Text", + ), + 10122..10126, + ), + ( + Token( + ",", + ), + 10126..10127, + ), + ( + Token( + "pad", + ), + 10128..10131, + ), + ( + Token( + ":", + ), + 10131..10132, + ), + ( + Token( + "Text", + ), + 10133..10137, + ), + ( + Token( + ",", + ), + 10137..10138, + ), + ( + Token( + "length", + ), + 10139..10145, + ), + ( + Token( + ":", + ), + 10145..10146, + ), + ( + Token( + "Num", + ), + 10147..10150, + ), + ( + Token( + ")", + ), + 10150..10151, + ), + ( + Token( + ":", + ), + 10151..10152, + ), + ( + Token( + "Text", + ), + 10153..10157, + ), + ( + Token( + "{", + ), + 10158..10159, + ), + ( + Token( + "if", + ), + 10164..10166, + ), + ( + Token( + "length", + ), + 10167..10173, + ), + ( + Token( + "<=", + ), + 10174..10176, + ), + ( + Token( + "len", + ), + 10177..10180, + ), + ( + Token( + "(", + ), + 10180..10181, + ), + ( + Token( + "text", + ), + 10181..10185, + ), + ( + Token( + ")", + ), + 10185..10186, + ), + ( + Token( + ":", + ), + 10186..10187, + ), + ( + Token( + "return", + ), + 10188..10194, + ), + ( + Token( + "text", + ), + 10195..10199, + ), + ( + Token( + "length", + ), + 10204..10210, + ), + ( + Token( + "=", + ), + 10211..10212, + ), + ( + Token( + "len", + ), + 10213..10216, + ), + ( + Token( + "(", + ), + 10216..10217, + ), + ( + Token( + "text", + ), + 10217..10221, + ), + ( + Token( + ")", + ), + 10221..10222, + ), + ( + Token( + "-", + ), + 10223..10224, + ), + ( + Token( + "length", + ), + 10225..10231, + ), + ( + Token( + "pad", + ), + 10236..10239, + ), + ( + Token( + "=", + ), + 10240..10241, + ), + ( + Token( + "trust", + ), + 10242..10247, + ), + ( + Token( + "$", + ), + 10248..10249, + ), + ( + Token( + "printf", + ), + 10250..10256, + ), + ( + Token( + "\"", + ), + 10257..10258, + ), + ( + Token( + "%", + ), + 10258..10259, + ), + ( + Token( + "{", + ), + 10259..10260, + ), + ( + Token( + "length", + ), + 10260..10266, + ), + ( + Token( + "}", + ), + 10266..10267, + ), + ( + Token( + "s", + ), + 10267..10268, + ), + ( + Token( + "\"", + ), + 10268..10269, + ), + ( + Token( + "\"", + ), + 10270..10271, + ), + ( + Token( + "\"", + ), + 10271..10272, + ), + ( + Token( + "|", + ), + 10273..10274, + ), + ( + Token( + "tr", + ), + 10275..10277, + ), + ( + Token( + "\"", + ), + 10278..10279, + ), + ( + Token( + "\"", + ), + 10280..10281, + ), + ( + Token( + "\"", + ), + 10282..10283, + ), + ( + Token( + "{", + ), + 10283..10284, + ), + ( + Token( + "pad", + ), + 10284..10287, + ), + ( + Token( + "}", + ), + 10287..10288, + ), + ( + Token( + "\"", + ), + 10288..10289, + ), + ( + Token( + "$", + ), + 10290..10291, + ), + ( + Token( + "return", + ), + 10296..10302, + ), + ( + Token( + "text", + ), + 10303..10307, + ), + ( + Token( + "+", + ), + 10308..10309, + ), + ( + Token( + "pad", + ), + 10310..10313, + ), + ( + Token( + "}", + ), + 10314..10315, + ), + ( + Token( + "/// Pads `text` with zeros on the left until it reaches the desired `length`.\n", + ), + 10317..10395, + ), + ( + Token( + "pub", + ), + 10395..10398, + ), + ( + Token( + "fun", + ), + 10399..10402, + ), + ( + Token( + "zfill", + ), + 10403..10408, + ), + ( + Token( + "(", + ), + 10408..10409, + ), + ( + Token( + "text", + ), + 10409..10413, + ), + ( + Token( + ":", + ), + 10413..10414, + ), + ( + Token( + "Text", + ), + 10415..10419, + ), + ( + Token( + ",", + ), + 10419..10420, + ), + ( + Token( + "length", + ), + 10421..10427, + ), + ( + Token( + ":", + ), + 10427..10428, + ), + ( + Token( + "Num", + ), + 10429..10432, + ), + ( + Token( + ")", + ), + 10432..10433, + ), + ( + Token( + ":", + ), + 10433..10434, + ), + ( + Token( + "Text", + ), + 10435..10439, + ), + ( + Token( + "{", + ), + 10440..10441, + ), + ( + Token( + "return", + ), + 10446..10452, + ), + ( + Token( + "lpad", + ), + 10453..10457, + ), + ( + Token( + "(", + ), + 10457..10458, + ), + ( + Token( + "text", + ), + 10458..10462, + ), + ( + Token( + ",", + ), + 10462..10463, + ), + ( + Token( + "\"", + ), + 10464..10465, + ), + ( + Token( + "0", + ), + 10465..10466, + ), + ( + Token( + "\"", + ), + 10466..10467, + ), + ( + Token( + ",", + ), + 10467..10468, + ), + ( + Token( + "length", + ), + 10469..10475, + ), + ( + Token( + ")", + ), + 10475..10476, + ), + ( + Token( + "}", + ), + 10477..10478, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call-2.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call-2.snap new file mode 100644 index 0000000..3bf4af5 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call-2.snap @@ -0,0 +1,474 @@ +--- +source: tests/grammar/alpha050.rs +expression: result +--- +( + Some( + [ + ( + Import( + ( + false, + 5..11, + ), + ( + "import", + 5..11, + ), + ( + ImportSpecific( + [ + ( + "array_contains", + 14..28, + ), + ], + ), + 12..30, + ), + ( + "from", + 31..35, + ), + ( + "std/array", + 36..47, + ), + ), + 5..47, + ), + ( + Statement( + ( + VariableInit( + ( + "let", + 53..56, + ), + ( + "x", + 57..58, + ), + ( + Expression( + ( + Array( + [ + ( + Int( + ( + 1, + 62..63, + ), + ), + 62..63, + ), + ( + Int( + ( + 2, + 65..66, + ), + ), + 65..66, + ), + ( + Int( + ( + 3, + 68..69, + ), + ), + 68..69, + ), + ], + ), + 61..70, + ), + ), + 61..70, + ), + ), + 53..70, + ), + ), + 53..70, + ), + ( + Statement( + ( + VariableInit( + ( + "let", + 75..78, + ), + ( + "y", + 79..80, + ), + ( + Expression( + ( + Int( + ( + 2, + 83..84, + ), + ), + 83..84, + ), + ), + 83..84, + ), + ), + 75..84, + ), + ), + 75..84, + ), + ( + Statement( + ( + Echo( + ( + "echo", + 90..94, + ), + ( + FunctionInvocation( + [], + ( + "array_contains", + 95..109, + ), + [ + ( + Var( + ( + "x", + 110..111, + ), + ), + 110..111, + ), + ( + Var( + ( + "y", + 113..114, + ), + ), + 113..114, + ), + ], + [], + ), + 95..115, + ), + ), + 90..115, + ), + ), + 90..115, + ), + ( + Statement( + ( + VariableInit( + ( + "let", + 121..124, + ), + ( + "line", + 125..129, + ), + ( + Expression( + ( + Int( + ( + 213, + 132..135, + ), + ), + 132..135, + ), + ), + 132..135, + ), + ), + 121..135, + ), + ), + 121..135, + ), + ( + Statement( + ( + IterLoop( + ( + "for", + 141..144, + ), + ( + WithIndex( + ( + "idx", + 145..148, + ), + ( + "line", + 150..154, + ), + ), + 145..154, + ), + ( + "in", + 155..157, + ), + ( + FunctionInvocation( + [], + ( + "lines", + 158..163, + ), + [ + ( + Text( + [ + ( + Text( + ( + "text", + 165..169, + ), + ), + 165..169, + ), + ( + Text( + ( + ".", + 169..170, + ), + ), + 169..170, + ), + ( + Text( + ( + "txt", + 170..173, + ), + ), + 170..173, + ), + ], + ), + 164..174, + ), + ], + [], + ), + 158..175, + ), + ( + Block( + [], + [ + ( + Echo( + ( + "echo", + 184..188, + ), + ( + Var( + ( + "line", + 189..193, + ), + ), + 189..193, + ), + ), + 184..193, + ), + ], + ), + 176..199, + ), + ), + 141..199, + ), + ), + 141..199, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "fun foo(x: Num, y: Text) {", + ), + 205..235, + ), + ), + 205..235, + ), + ), + 205..235, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "}", + ), + 240..245, + ), + ), + 240..245, + ), + ), + 240..245, + ), + ( + FunctionDefinition( + [], + ( + false, + 250..245, + ), + ( + "fun", + 250..253, + ), + ( + "foo", + 254..257, + ), + [ + ( + Typed( + ( + false, + 258..258, + ), + ( + "x", + 258..259, + ), + ( + Num, + 261..264, + ), + ), + 258..264, + ), + ( + Typed( + ( + false, + 266..265, + ), + ( + "y", + 266..267, + ), + ( + Text, + 269..273, + ), + ), + 266..273, + ), + ], + None, + [], + ), + 250..282, + ), + ( + Statement( + ( + Comment( + ( + Comment( + "fun abc() {}", + ), + 288..304, + ), + ), + 288..304, + ), + ), + 288..304, + ), + ( + Statement( + ( + Expression( + ( + FunctionInvocation( + [], + ( + "array_contains", + 309..323, + ), + [ + ( + Array( + [ + ( + Int( + ( + 1, + 325..326, + ), + ), + 325..326, + ), + ( + Int( + ( + 2, + 328..329, + ), + ), + 328..329, + ), + ( + Int( + ( + 3, + 331..332, + ), + ), + 331..332, + ), + ], + ), + 324..333, + ), + ], + [], + ), + 309..335, + ), + ), + 309..335, + ), + ), + 309..335, + ), + ], + ), + [], +) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call.snap new file mode 100644 index 0000000..e76b58b --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call.snap @@ -0,0 +1,480 @@ +--- +source: tests/grammar/alpha050.rs +expression: tokens +--- +[ + ( + Token( + "import", + ), + 5..11, + ), + ( + Token( + "{", + ), + 12..13, + ), + ( + Token( + "array_contains", + ), + 14..28, + ), + ( + Token( + "}", + ), + 29..30, + ), + ( + Token( + "from", + ), + 31..35, + ), + ( + Token( + "\"", + ), + 36..37, + ), + ( + Token( + "std", + ), + 37..40, + ), + ( + Token( + "/", + ), + 40..41, + ), + ( + Token( + "array", + ), + 41..46, + ), + ( + Token( + "\"", + ), + 46..47, + ), + ( + Token( + "let", + ), + 53..56, + ), + ( + Token( + "x", + ), + 57..58, + ), + ( + Token( + "=", + ), + 59..60, + ), + ( + Token( + "[", + ), + 61..62, + ), + ( + Token( + "1", + ), + 62..63, + ), + ( + Token( + ",", + ), + 63..64, + ), + ( + Token( + "2", + ), + 65..66, + ), + ( + Token( + ",", + ), + 66..67, + ), + ( + Token( + "3", + ), + 68..69, + ), + ( + Token( + "]", + ), + 69..70, + ), + ( + Token( + "let", + ), + 75..78, + ), + ( + Token( + "y", + ), + 79..80, + ), + ( + Token( + "=", + ), + 81..82, + ), + ( + Token( + "2", + ), + 83..84, + ), + ( + Token( + "echo", + ), + 90..94, + ), + ( + Token( + "array_contains", + ), + 95..109, + ), + ( + Token( + "(", + ), + 109..110, + ), + ( + Token( + "x", + ), + 110..111, + ), + ( + Token( + ",", + ), + 111..112, + ), + ( + Token( + "y", + ), + 113..114, + ), + ( + Token( + ")", + ), + 114..115, + ), + ( + Token( + "let", + ), + 121..124, + ), + ( + Token( + "line", + ), + 125..129, + ), + ( + Token( + "=", + ), + 130..131, + ), + ( + Token( + "213", + ), + 132..135, + ), + ( + Token( + "for", + ), + 141..144, + ), + ( + Token( + "idx", + ), + 145..148, + ), + ( + Token( + ",", + ), + 148..149, + ), + ( + Token( + "line", + ), + 150..154, + ), + ( + Token( + "in", + ), + 155..157, + ), + ( + Token( + "lines", + ), + 158..163, + ), + ( + Token( + "(", + ), + 163..164, + ), + ( + Token( + "\"", + ), + 164..165, + ), + ( + Token( + "text", + ), + 165..169, + ), + ( + Token( + ".", + ), + 169..170, + ), + ( + Token( + "txt", + ), + 170..173, + ), + ( + Token( + "\"", + ), + 173..174, + ), + ( + Token( + ")", + ), + 174..175, + ), + ( + Token( + "{", + ), + 176..177, + ), + ( + Token( + "echo", + ), + 184..188, + ), + ( + Token( + "line", + ), + 189..193, + ), + ( + Token( + "}", + ), + 198..199, + ), + ( + Token( + "// fun foo(x: Num, y: Text) {\n", + ), + 205..235, + ), + ( + Token( + "// }\n", + ), + 240..245, + ), + ( + Token( + "fun", + ), + 250..253, + ), + ( + Token( + "foo", + ), + 254..257, + ), + ( + Token( + "(", + ), + 257..258, + ), + ( + Token( + "x", + ), + 258..259, + ), + ( + Token( + ":", + ), + 259..260, + ), + ( + Token( + "Num", + ), + 261..264, + ), + ( + Token( + ",", + ), + 264..265, + ), + ( + Token( + "y", + ), + 266..267, + ), + ( + Token( + ":", + ), + 267..268, + ), + ( + Token( + "Text", + ), + 269..273, + ), + ( + Token( + ")", + ), + 273..274, + ), + ( + Token( + "{", + ), + 275..276, + ), + ( + Token( + "}", + ), + 281..282, + ), + ( + Token( + "// fun abc() {}\n", + ), + 288..304, + ), + ( + Token( + "array_contains", + ), + 309..323, + ), + ( + Token( + "(", + ), + 323..324, + ), + ( + Token( + "[", + ), + 324..325, + ), + ( + Token( + "1", + ), + 325..326, + ), + ( + Token( + ",", + ), + 326..327, + ), + ( + Token( + "2", + ), + 328..329, + ), + ( + Token( + ",", + ), + 329..330, + ), + ( + Token( + "3", + ), + 331..332, + ), + ( + Token( + "]", + ), + 332..333, + ), + ( + Token( + ",", + ), + 333..334, + ), + ( + Token( + ")", + ), + 334..335, + ), +] From fbc5637bd3f7b794fba98922aef87395b070e398 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Mon, 3 Nov 2025 17:00:52 +0100 Subject: [PATCH 03/19] Specified rustc version --- .github/workflows/quality-check.yml | 5 ----- Cargo.toml | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index 57a0fb1..6b4f495 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -15,8 +15,6 @@ jobs: - name: Set up Rust uses: actions-rs/toolchain@v1 with: - toolchain: stable - override: true components: rustfmt, clippy - name: Cargo check @@ -38,9 +36,6 @@ jobs: - name: Set up Rust uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - name: Install nextest uses: taiki-e/install-action@nextest diff --git a/Cargo.toml b/Cargo.toml index 06c8ab1..addb53b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ name = "amber-lsp" version = "0.1.10" edition = "2021" repository = "https://github.com/KrosFire/amber-lsp" +rust-version = "1.90" [dependencies] tokio = { version = "1.39.1", features = ["full"] } From 5945d6afabf00b18ed6b7c031f64ef5a3f6a0a7d Mon Sep 17 00:00:00 2001 From: KrosFire Date: Mon, 3 Nov 2025 17:06:47 +0100 Subject: [PATCH 04/19] Fixed pipeline --- .github/workflows/quality-check.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index 6b4f495..9422833 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -15,6 +15,7 @@ jobs: - name: Set up Rust uses: actions-rs/toolchain@v1 with: + toolchain: stable components: rustfmt, clippy - name: Cargo check @@ -36,6 +37,8 @@ jobs: - name: Set up Rust uses: actions-rs/toolchain@v1 + with: + toolchain: stable - name: Install nextest uses: taiki-e/install-action@nextest From eb6aebd506fc6074964dcf800a36886931a8a0f6 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Mon, 3 Nov 2025 17:14:09 +0100 Subject: [PATCH 05/19] Specified toolchain --- .github/workflows/quality-check.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index 9422833..5d64ec8 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Rust uses: actions-rs/toolchain@v1 with: - toolchain: stable + toolchain: "1.90.0" components: rustfmt, clippy - name: Cargo check @@ -38,7 +38,7 @@ jobs: - name: Set up Rust uses: actions-rs/toolchain@v1 with: - toolchain: stable + toolchain: "1.90.0" - name: Install nextest uses: taiki-e/install-action@nextest From 3eccd2759009a8d7e5bd753b3cf7a195333dd31d Mon Sep 17 00:00:00 2001 From: KrosFire Date: Wed, 5 Nov 2025 22:21:50 +0100 Subject: [PATCH 06/19] Improved analysis and added more tests --- resources/alpha050/std/array.ab | 38 +- resources/alpha050/std/date.ab | 22 +- resources/alpha050/std/env.ab | 4 +- resources/alpha050/std/fs.ab | 68 +- resources/alpha050/std/http.ab | 8 +- resources/alpha050/std/math.ab | 22 +- resources/alpha050/std/text.ab | 43 +- src/analysis/alpha050/exp.rs | 204 +- src/stdlib.rs | 2 +- tests/analysis/alpha050.rs | 265 + tests/analysis/mod.rs | 1 + ...a050__comparison_with_array_literal-2.snap | 9 + ...a050__comparison_with_array_literal-3.snap | 14 + ...pha050__comparison_with_array_literal.snap | 64 + ...ha050__comparison_with_text_literal-2.snap | 9 + ...ha050__comparison_with_text_literal-3.snap | 14 + ...lpha050__comparison_with_text_literal.snap | 64 + ...analysis__alpha050__number_compared-2.snap | 11 + ...analysis__alpha050__number_compared-3.snap | 14 + ...__analysis__alpha050__number_compared.snap | 102 + ...analysis__alpha050__simple_function-2.snap | 11 + ...analysis__alpha050__simple_function-3.snap | 14 + ...__analysis__alpha050__simple_function.snap | 105 + ...is__alpha050__two_generics_compared-2.snap | 13 + ...is__alpha050__two_generics_compared-3.snap | 14 + ...ysis__alpha050__two_generics_compared.snap | 143 + ...#mod__grammar__alpha050__stdlib_array.snap | 1237 +++-- ...r#mod__grammar__alpha050__stdlib_date.snap | 1464 ++--- .../r#mod__grammar__alpha050__stdlib_env.snap | 8 +- .../r#mod__grammar__alpha050__stdlib_fs.snap | 3046 +++++----- ...r#mod__grammar__alpha050__stdlib_http.snap | 242 +- ...r#mod__grammar__alpha050__stdlib_math.snap | 747 +-- ...mod__grammar__alpha050__stdlib_text-2.snap | 4914 +++++++++-------- ...r#mod__grammar__alpha050__stdlib_text.snap | 4564 ++++++++------- 34 files changed, 9928 insertions(+), 7572 deletions(-) create mode 100644 tests/analysis/alpha050.rs create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal-2.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal-3.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal-2.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal-3.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared-2.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared-3.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function-2.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function-3.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared-2.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared-3.snap create mode 100644 tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared.snap diff --git a/resources/alpha050/std/array.ab b/resources/alpha050/std/array.ab index 492f1a5..3ef932b 100644 --- a/resources/alpha050/std/array.ab +++ b/resources/alpha050/std/array.ab @@ -27,14 +27,16 @@ pub fun array_contains(array, value) { return result >= 0 } -/// Returns the first element in the array; if the array is empty, the return -/// value is undefined. +/// Returns the first element in the array; if the array is empty, the function +/// fails. pub fun array_first(array) { + if len(array) == 0: + fail 1 return array[0] } -/// Returns the last element in the array; if the array is empty, the return -/// value is undefined. +/// Returns the last element in the array; if the array is empty, the function +/// fails. pub fun array_last(array) { let index = len(array) - 1 if index < 0: @@ -43,15 +45,15 @@ pub fun array_last(array) { } /// Removes an element at the index from the array; if the index is negative -/// or beyond the end, the return value is undefined, but the array will be -/// unchanged. +/// or beyond the end, the array will be unchanged. pub fun array_remove_at(ref array: [], index: Int): Null { let offset = index + 1 let length = len(array) array = array[0..index] + array[offset..length] } -/// Removes an element at the index from the array, and returns it +/// Removes an element at the index from the array, and returns it; if the +/// index is negative or beyond the end, the function fails. pub fun array_extract_at(ref array: [], index: Int) { if index < 0 or index >= len(array): fail 1 @@ -63,8 +65,8 @@ pub fun array_extract_at(ref array: [], index: Int) { } /// Removes the last element from the array, and returns it; if the array -/// is empty, the return value is undefined, but the array will be unchanged. -pub fun array_pop(ref array: []) { +/// is empty, the function fails, and the array will be unchanged. +pub fun array_pop(ref array) { let length = len(array) let index = length - 1 if index < 0: @@ -75,10 +77,24 @@ pub fun array_pop(ref array: []) { } /// Removes the first element from the array, and returns it; if the array -/// is empty, the return value is undefined, but the array will be unchanged. -pub fun array_shift(ref array: []) { +/// is empty, the function fails, and the array will be unchanged. +pub fun array_shift(ref array) { let length = len(array) + if length == 0: + fail 1 let element = array[0] array = array[1..length] return element } + +/// Returns an array of length `size` with each element set to `value`; if `size` +/// is less than zero or not of type `Int`, an empty array is returned +pub fun array_filled(size, value = 0) { + let array = [value] + array = array[0..0] + if not (size is Int): + return array + for _ in 0..(size as Int >= 0 then size else 0): + array += [value] + return array +} diff --git a/resources/alpha050/std/date.ab b/resources/alpha050/std/date.ab index 5914ffc..ccfeabd 100644 --- a/resources/alpha050/std/date.ab +++ b/resources/alpha050/std/date.ab @@ -1,4 +1,4 @@ -/// All dates are internally stored as miliseconds since the Epoch (1970-01-01 00:00 UTC). +/// All dates are internally stored as milliseconds since the Epoch (1970-01-01 00:00 UTC). /// Transform date from unix epoch to a human-readable format described by a posix format string. /// If no format is specified, "%F %T" is used. @@ -21,7 +21,7 @@ /// - `%p` - locale's equivalent of either AM or PM; blank if unknown /// - `%T` - time; same as %H:%M:%S /// - `%Y` - year -pub fun date_format_posix(date: Num, format: Text = "%F %T", utc: Bool = false): Text? { +pub fun date_format_posix(date: Int, format: Text = "%F %T", utc: Bool = false): Text? { let utc_flag = utc then "-u" else "" // Case if this is a GNU date command return $ date {utc_flag} -d "@{date}" +"{format}" 2>/dev/null $ failed { @@ -34,22 +34,22 @@ pub fun date_format_posix(date: Num, format: Text = "%F %T", utc: Bool = false): /// If no format is specified, "%F %T" format is used. /// For more info about format type "man date" on your shell or go to . #[allow_absurd_cast] -pub fun date_from_posix(date: Text, format: Text = "%F %T", utc: Bool = false): Num? { +pub fun date_from_posix(date: Text, format: Text = "%F %T", utc: Bool = false): Int? { let utc_flag = utc then "-u" else "" // Case if this is a GNU date command return $ date {utc_flag} -d "\$(date -d "{date}" +"{format}" 2>/dev/null)" +%s 2>/dev/null $ failed { // Case if this is a BSD date command - return $ date {utc_flag} -j -f "{format}" "{date}" +%s $? as Num - } as Num + return $ date {utc_flag} -j -f "{format}" "{date}" +%s $? as Int + } as Int } /// Returns the current timestamp (seconds since the Epoch (1970-01-01 00:00 UTC)). #[allow_absurd_cast] -pub fun date_now(): Num { - return trust $ date +%s $ as Num +pub fun date_now(): Int { + return trust $ date +%s $ as Int } -/// Adds a value to a date passed in the unix epoch format in miliseconds. +/// Adds a value to a date passed in the unix epoch format in milliseconds. /// Example : `date_add(date, 3, "days")` /// /// Available units: @@ -59,7 +59,7 @@ pub fun date_now(): Num { /// - hours /// - minutes /// - seconds -pub fun date_add(date: Num, amount: Num, unit: Text): Num? { +pub fun date_add(date: Int, amount: Int, unit: Text): Int? { if { unit == "years": return date + amount * 365 * 24 * 60 * 60 unit == "months": return date + amount * 30 * 24 * 60 * 60 @@ -71,7 +71,7 @@ pub fun date_add(date: Num, amount: Num, unit: Text): Num? { } } -/// Subtracts a value from a date passed in the unix epoch format in miliseconds. +/// Subtracts a value from a date passed in the unix epoch format in milliseconds. /// Example : `date_sub(date, 5, "hours")` /// /// Available units: @@ -81,7 +81,7 @@ pub fun date_add(date: Num, amount: Num, unit: Text): Num? { /// - hours /// - minutes /// - seconds -pub fun date_sub(date: Num, amount: Num, unit: Text): Num? { +pub fun date_sub(date: Int, amount: Int, unit: Text): Int? { if { unit == "years": return date - amount * 365 * 24 * 60 * 60 unit == "months": return date - amount * 30 * 24 * 60 * 60 diff --git a/resources/alpha050/std/env.ab b/resources/alpha050/std/env.ab index 7cb1634..396cd0f 100644 --- a/resources/alpha050/std/env.ab +++ b/resources/alpha050/std/env.ab @@ -118,7 +118,7 @@ pub fun escaped(text: Text): Text { } /// Prepares a text with formatting options for `printf`. -pub fun styled(message: Text, style: Num, fg: Num, bg: Num): Text { +pub fun styled(message: Text, style: Int, fg: Int, bg: Int): Text { return "\x1b[{style};{fg};{bg}m{escaped(message)}\x1b[0m" } @@ -138,7 +138,7 @@ pub fun underlined(message: Text): Text { } /// Prints a text with a specified color. -pub fun echo_colored(message: Text, color: Num): Null { +pub fun echo_colored(message: Text, color: Int): Null { printf("\x1b[{color as Text}m%s\x1b[0m\n", [message]) } diff --git a/resources/alpha050/std/fs.ab b/resources/alpha050/std/fs.ab index 5abf06a..2fda134 100644 --- a/resources/alpha050/std/fs.ab +++ b/resources/alpha050/std/fs.ab @@ -1,56 +1,52 @@ import { match_regex, join, replace_regex, split, trim } from "std/text" /// Checks if a directory exists. -pub fun dir_exists(path) { - $ [ -d "{path}" ] $ failed { - return false - } - return true +pub fun dir_exists(path: Text): Bool { + trust $ [ -d "{path}" ] $ + return status == 0 } /// Checks if a file exists. -pub fun file_exists(path) { - $ [ -f "{path}" ] $ failed { - return false - } - return true +pub fun file_exists(path: Text): Bool { + trust $ [ -f "{path}" ] $ + return status == 0 } /// Gets file contents from a path. -pub fun file_read(path) { +pub fun file_read(path: Text): Text? { return $ < "{path}" $? } /// Writes content to a file. /// Doesn't check if the file exist -pub fun file_write(path, content) { +pub fun file_write(path: Text, content: Text): Text? { return $ echo "{content}" > "{path}" $? } /// Appends content to a file. /// /// Doesn't check if the file exists. -pub fun file_append(path, content) { +pub fun file_append(path: Text, content: Text): Text? { return $ echo "{content}" >> "{path}" $? } /// Creates a symbolic link. /// -/// If the file doesn't exist, it returns a boolean and prints a message. -pub fun symlink_create(origin: Text, destination: Text): Bool { +/// If the file doesn't exist, it fails and prints a message. +pub fun symlink_create(origin: Text, destination: Text): Null? { if file_exists(origin) { - trust $ ln -s "{origin}" "{destination}" $ - return true + $ ln -s "{origin}" "{destination}" $? + return null } echo "The file {origin} doesn't exist!" - return false + fail 1 } /// Creates a directory with all parent directories as required. -pub fun dir_create(path: Text): Null { +pub fun dir_create(path: Text): Null? { if not dir_exists(path) { - trust $ mkdir -p "{path}" $ + $ mkdir -p "{path}" $? } } @@ -66,10 +62,10 @@ fun is_mac_os_mktemp(): Bool { /// Create a temporary directory and return the path. /// Please note this does not respect _CS_DARWIN_USER_TEMP_DIR environment variable. pub fun temp_dir_create( - template: Text = "tmp.XXXXXXXXXX", - auto_delete: Bool = false, - force_delete: Bool = false - ): Text? { + template: Text = "tmp.XXXXXXXXXX", + auto_delete: Bool = false, + force_delete: Bool = false +): Text? { if trim(template) == "" { echo "The template cannot be an empty string!" fail 1 @@ -103,28 +99,28 @@ pub fun temp_dir_create( /// Changes the permission bits of a file. /// -/// If the file doesn't exist, it returns `false` and prints a message. -pub fun file_chmod(path: Text, mode: Text): Bool { +/// If the file doesn't exist, it fails and prints a message. +pub fun file_chmod(path: Text, mode: Text): Null? { if file_exists(path) { - trust $ chmod "{mode}" "{path}" $ - return true + $ chmod "{mode}" "{path}" $? + return null } echo "The file {path} doesn't exist!" - return false + fail 1 } /// Changes the owner of a file. /// -/// If the file doesn't exist, it returns `false` and prints a message. -pub fun file_chown(path: Text, user: Text): Bool { +/// If the file doesn't exist, it fails and prints a message. +pub fun file_chown(path: Text, user: Text): Null? { if file_exists(path) or dir_exists(path) { - trust $ chown -R "{user}" "{path}" $ - return true + $ chown -R "{user}" "{path}" $? + return null } echo "The file {path} doesn't exist!" - return false + fail 1 } /// Escapes all characters in the passed-in glob except "*", "?" and "/", @@ -135,7 +131,7 @@ fun escape_non_glob_chars(path: Text): Text { /// Finds all files or directories matching multiple file globs. When /// we have union types, this functionality can be merged into the main -/// `glob` function. +/// `file_glob` function. pub fun file_glob_all(paths: [Text]): [Text]? { let combined = "" if len(paths) == 1 { @@ -148,7 +144,7 @@ pub fun file_glob_all(paths: [Text]): [Text]? { } combined = join(items, " ") } - let files = $ eval "for file in {combined}; do [ -e \\\"\\\$file\\\" ] && echo \\\"\\\$file\\\"; done" $? + let files = $ eval "for file in {combined}; do [ -e \\"\\\$file\\" ] && echo \\"\\\$file\\"; done" $? return split(files, "\n") } diff --git a/resources/alpha050/std/http.ab b/resources/alpha050/std/http.ab index 31894bd..ee0ae16 100644 --- a/resources/alpha050/std/http.ab +++ b/resources/alpha050/std/http.ab @@ -3,8 +3,8 @@ import * from "std/env" /// Downloads a file from a given URL and saves it to a specified path using available command-line tools. /// /// It checks for the availability of common command-line tools (`curl`, `wget`, and `aria2c`, in order) and uses the first available tool to perform the download. -/// If none of the tools are available, the function returns `false`. -pub fun file_download(url: Text, path: Text): Bool { +/// If none of the tools are available, the function fails. +pub fun file_download(url: Text, path: Text): Null? { if { is_command("curl") { silent trust $ curl -L -o "{path}" "{url}" $ @@ -16,9 +16,7 @@ pub fun file_download(url: Text, path: Text): Bool { silent trust $ aria2c "{url}" -d "{path}" $ } else { - return false + fail 1 } } - - return true } diff --git a/resources/alpha050/std/math.ab b/resources/alpha050/std/math.ab index a2d8ec5..e24a6b6 100644 --- a/resources/alpha050/std/math.ab +++ b/resources/alpha050/std/math.ab @@ -1,34 +1,36 @@ /// Sums an array's contents #[allow_absurd_cast] -pub fun math_sum(list: [Num]): Num { - return trust $ echo "{list}" | awk '\{s=0; for (i=1; i<=NF; i++) s+=\$i; print s}' $ as Num +pub fun math_sum(list) { + let sum = 0 + for item in list: sum += item + return sum } /// Returns a number, rounded to the nearest integer #[allow_absurd_cast] -pub fun math_round(number: Num): Num { +pub fun math_round(number: Num): Int { if number > 0 { - return trust $ echo "({number}+0.5)/1" | bc $ as Num + return trust $ echo "({number}+0.5)/1" | bc $ as Int } - return trust $ echo "({number}-0.5)/1" | bc $ as Num + return trust $ echo "({number}-0.5)/1" | bc $ as Int } /// Returns the largest integer less than or equal to a number #[allow_absurd_cast] -pub fun math_floor(number: Num): Num { - return trust $ echo "{number}" | awk '\{printf "%d", (\$1 < 0 ? int(\$1) - 1 : int(\$1))}' $ as Num +pub fun math_floor(number: Num): Int { + return trust $ echo "{number}" | awk '\{printf "%d", (\$1 < 0 ? int(\$1) - 1 : int(\$1))}' $ as Int } /// Returns the smallest integer greater than or equal to a number #[allow_absurd_cast] -pub fun math_ceil(number: Num): Num { - return math_floor(number) + 1.0 +pub fun math_ceil(number: Num): Int { + return math_floor(number) + 1 } /// Returns the absolute value of a number #[allow_absurd_cast] -pub fun math_abs(number: Num): Num { +pub fun math_abs(number) { if number < 0: return -number return number } diff --git a/resources/alpha050/std/text.ab b/resources/alpha050/std/text.ab index d91a39c..ad4efd1 100644 --- a/resources/alpha050/std/text.ab +++ b/resources/alpha050/std/text.ab @@ -13,9 +13,9 @@ pub fun replace(source, search, replace) { // Here we use a command to avoid #646 let result = "" if bash_version() >= [4,3] { - trust $ {nameof result}="\$\{{nameof source}//\"\$\{{nameof search}}\"/\"\$\{{nameof replace}}\"}" $ + trust $ {nameof result}="\$\{{nameof source}//"\$\{{nameof search}}"/"\$\{{nameof replace}}"}" $ } else { - trust $ {nameof result}="\$\{{nameof source}//\"\$\{{nameof search}}\"/\$\{{nameof replace}}}" $ + trust $ {nameof result}="\$\{{nameof source}//"\$\{{nameof search}}"/\$\{{nameof replace}}}" $ } return result } @@ -25,9 +25,9 @@ pub fun replace_one(source, search, replace) { // Here we use a command to avoid #646 let result = "" if bash_version() >= [4,3] { - trust $ {nameof result}="\$\{{nameof source}/\"\$\{{nameof search}}\"/\"\$\{{nameof replace}}\"}" $ + trust $ {nameof result}="\$\{{nameof source}/"\$\{{nameof search}}"/"\$\{{nameof replace}}"}" $ } else { - trust $ {nameof result}="\$\{{nameof source}/\"\$\{{nameof search}}\"/\$\{{nameof replace}}}" $ + trust $ {nameof result}="\$\{{nameof source}/"\$\{{nameof search}}"/\$\{{nameof replace}}}" $ } return result } @@ -50,14 +50,14 @@ fun sed_version(): Int { return SED_VERSION_UNKNOWN } -/// Replaces all occurences of a regex pattern in the content with the provided replace text. +/// Replaces all occurrences of a regex pattern in the content with the provided replace text. /// /// Function uses `sed` pub fun replace_regex(source: Text, search: Text, replace_text: Text, extended: Bool = false): Text { trust { const sed_version = sed_version() - search = replace(search, "/", "\/") - replace_text = replace(replace_text, "/", "\/") + search = replace(search, "/", "\\/") + replace_text = replace(replace_text, "/", "\\/") if sed_version == SED_VERSION_GNU or sed_version == SED_VERSION_BUSYBOX { // '\b' is supported but not in POSIX standards. Disable it search = replace(search, "\\b", "\\\b") @@ -127,10 +127,20 @@ pub fun uppercase(text: Text): Text { return trust $ echo "{text}" | tr '[:lower:]' '[:upper:]' $ } -/// Attempts to parse a given text into a number, returning the parsed number or zero if parsing fails. +/// Attempts to parse a given text into an `Int` number. #[allow_absurd_cast] -pub fun parse_number(text: Text): Num? { +pub fun parse_int(text: Text): Int? { $ [ -n "{text}" ] && [ "{text}" -eq "{text}" ] 2>/dev/null $? + return text as Int +} + +/// Attempts to parse a given text into a `Num` number. +#[allow_absurd_cast] +pub fun parse_num(text: Text): Num? { + let re_int="^-?[0-9]+$" + let re_float="^-?[0-9]*\.[0-9]+$" + + $ [[ {text} =~ {re_int} ]] || [[ {text} =~ {re_float} ]] $? return text as Num } @@ -170,11 +180,10 @@ pub fun text_contains_all(source: Text, searches: [Text]): Bool { return false } } - return true } -/// Match all occurences of a regex pattern. +/// Match all occurrences of a regex pattern. /// /// Function uses `sed` pub fun match_regex(source: Text, search: Text, extended: Bool = false): Bool { @@ -252,14 +261,14 @@ pub fun ends_with(text: Text, suffix: Text): Bool { pub fun slice(text: Text, index: Int, length: Int = 0): Text { if length == 0: length = len(text) - index if length <= 0: return "" - return trust $ printf "%.{length}s" "\$\{text:{index}}" $ + return trust $ printf "%.{length}s" "\$\{text: {index}}" $ } /// Returns the character from `text` at the specified `index` (0-based). /// /// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`. pub fun char_at(text: Text, index: Int): Text { - return trust $ printf "%.1s" "\$\{text:{index}}" $ + return trust $ printf "%.1s" "\$\{text: {index}}" $ } /// Capitalize the first letter of the given `text`. @@ -270,7 +279,7 @@ pub fun capitalized(text: Text): Text { return text } if bash_version() >= [4] { - return $ echo \"\$\{{nameof text}^}\" $ + return $ echo "\$\{{nameof text}^}" $ } if sed_version() == SED_VERSION_GNU { // GNU sed supports \U @@ -282,7 +291,7 @@ pub fun capitalized(text: Text): Text { } /// Pads `text` with the specified `pad` character on left until it reaches the desired `length`. -pub fun lpad(text: Text, pad: Text, length: Num): Text { +pub fun lpad(text: Text, pad: Text, length: Int): Text { if length <= len(text): return text length = len(text) - length pad = trust $ printf "%{length}s" "" | tr " " "{pad}" $ @@ -290,7 +299,7 @@ pub fun lpad(text: Text, pad: Text, length: Num): Text { } /// Pads `text` with the specified `pad` character on the right until it reaches the desired `length`. -pub fun rpad(text: Text, pad: Text, length: Num): Text { +pub fun rpad(text: Text, pad: Text, length: Int): Text { if length <= len(text): return text length = len(text) - length pad = trust $ printf "%{length}s" "" | tr " " "{pad}" $ @@ -298,6 +307,6 @@ pub fun rpad(text: Text, pad: Text, length: Num): Text { } /// Pads `text` with zeros on the left until it reaches the desired `length`. -pub fun zfill(text: Text, length: Num): Text { +pub fun zfill(text: Text, length: Int): Text { return lpad(text, "0", length) } diff --git a/src/analysis/alpha050/exp.rs b/src/analysis/alpha050/exp.rs index 2acbfa2..9ac4261 100644 --- a/src/analysis/alpha050/exp.rs +++ b/src/analysis/alpha050/exp.rs @@ -645,7 +645,7 @@ pub fn analyze_exp( let ExpAnalysisResult { return_ty: return1, is_propagating_failure: prop1, - .. + exp_ty: left_hand_ty, } = analyze_exp( file_id, file_version, @@ -665,30 +665,49 @@ pub fn analyze_exp( scoped_generic_types, contexts, ); + + let mut left_constrain_ty = + get_constrain_ty_for_compare(left_hand_ty.clone(), scoped_generic_types); + let ExpAnalysisResult { return_ty: return2, is_propagating_failure: prop2, - .. + exp_ty: right_hand_ty, } = analyze_exp( file_id, file_version, exp2, - DataType::Union( - [ - DataType::Number, - DataType::Int, - DataType::Text, - DataType::Array(Box::new(DataType::Union( - [DataType::Number, DataType::Int, DataType::Text].to_vec(), - ))), - ] - .to_vec(), - ), + left_constrain_ty.clone(), files, scoped_generic_types, contexts, ); + let right_constrain_ty = + get_constrain_ty_for_compare(right_hand_ty, scoped_generic_types); + + if let DataType::Generic(id) = left_hand_ty { + scoped_generic_types.constrain_generic_type(id, right_constrain_ty.clone()); + left_constrain_ty = + get_constrain_ty_for_compare(left_hand_ty.clone(), scoped_generic_types); + } + + if !matches_type( + &right_constrain_ty, + &left_constrain_ty, + scoped_generic_types, + ) { + files.report_error( + &file, + &format!( + "Expected type {}, found type {}", + right_constrain_ty.to_string(scoped_generic_types), + left_constrain_ty.to_string(scoped_generic_types), + ), + exp1.1, + ); + } + is_propagating_failure |= prop1 || prop2; return_types.extend(return1); return_types.extend(return2); @@ -699,7 +718,7 @@ pub fn analyze_exp( let ExpAnalysisResult { return_ty: return1, is_propagating_failure: prop1, - .. + exp_ty: left_hand_ty, } = analyze_exp( file_id, file_version, @@ -719,30 +738,49 @@ pub fn analyze_exp( scoped_generic_types, contexts, ); + + let mut left_constrain_ty = + get_constrain_ty_for_compare(left_hand_ty.clone(), scoped_generic_types); + let ExpAnalysisResult { return_ty: return2, is_propagating_failure: prop2, - .. + exp_ty: right_hand_ty, } = analyze_exp( file_id, file_version, exp2, - DataType::Union( - [ - DataType::Number, - DataType::Int, - DataType::Text, - DataType::Array(Box::new(DataType::Union( - [DataType::Number, DataType::Int, DataType::Text].to_vec(), - ))), - ] - .to_vec(), - ), + left_constrain_ty.clone(), files, scoped_generic_types, contexts, ); + let right_constrain_ty = + get_constrain_ty_for_compare(right_hand_ty, scoped_generic_types); + + if let DataType::Generic(id) = left_hand_ty { + scoped_generic_types.constrain_generic_type(id, right_constrain_ty.clone()); + left_constrain_ty = + get_constrain_ty_for_compare(left_hand_ty.clone(), scoped_generic_types); + } + + if !matches_type( + &right_constrain_ty, + &left_constrain_ty, + scoped_generic_types, + ) { + files.report_error( + &file, + &format!( + "Expected type {}, found type {}", + right_constrain_ty.to_string(scoped_generic_types), + left_constrain_ty.to_string(scoped_generic_types), + ), + exp1.1, + ); + } + is_propagating_failure |= prop1 || prop2; return_types.extend(return1); return_types.extend(return2); @@ -773,7 +811,7 @@ pub fn analyze_exp( let ExpAnalysisResult { return_ty: return1, is_propagating_failure: prop1, - .. + exp_ty: left_hand_ty, } = analyze_exp( file_id, file_version, @@ -793,30 +831,49 @@ pub fn analyze_exp( scoped_generic_types, contexts, ); + + let mut left_constrain_ty = + get_constrain_ty_for_compare(left_hand_ty.clone(), scoped_generic_types); + let ExpAnalysisResult { return_ty: return2, is_propagating_failure: prop2, - .. + exp_ty: right_hand_ty, } = analyze_exp( file_id, file_version, exp2, - DataType::Union( - [ - DataType::Number, - DataType::Int, - DataType::Text, - DataType::Array(Box::new(DataType::Union( - [DataType::Number, DataType::Int, DataType::Text].to_vec(), - ))), - ] - .to_vec(), - ), + left_constrain_ty.clone(), files, scoped_generic_types, contexts, ); + let right_constrain_ty = + get_constrain_ty_for_compare(right_hand_ty, scoped_generic_types); + + if let DataType::Generic(id) = left_hand_ty { + scoped_generic_types.constrain_generic_type(id, right_constrain_ty.clone()); + left_constrain_ty = + get_constrain_ty_for_compare(left_hand_ty.clone(), scoped_generic_types); + } + + if !matches_type( + &right_constrain_ty, + &left_constrain_ty, + scoped_generic_types, + ) { + files.report_error( + &file, + &format!( + "Expected type {}, found type {}", + right_constrain_ty.to_string(scoped_generic_types), + left_constrain_ty.to_string(scoped_generic_types), + ), + exp1.1, + ); + } + is_propagating_failure |= prop1 || prop2; return_types.extend(return1); return_types.extend(return2); @@ -827,7 +884,7 @@ pub fn analyze_exp( let ExpAnalysisResult { return_ty: return1, is_propagating_failure: prop1, - .. + exp_ty: left_hand_ty, } = analyze_exp( file_id, file_version, @@ -847,30 +904,49 @@ pub fn analyze_exp( scoped_generic_types, contexts, ); + + let mut left_constrain_ty = + get_constrain_ty_for_compare(left_hand_ty.clone(), scoped_generic_types); + let ExpAnalysisResult { return_ty: return2, is_propagating_failure: prop2, - .. + exp_ty: right_hand_ty, } = analyze_exp( file_id, file_version, exp2, - DataType::Union( - [ - DataType::Number, - DataType::Int, - DataType::Text, - DataType::Array(Box::new(DataType::Union( - [DataType::Number, DataType::Int, DataType::Text].to_vec(), - ))), - ] - .to_vec(), - ), + left_constrain_ty.clone(), files, scoped_generic_types, contexts, ); + let right_constrain_ty = + get_constrain_ty_for_compare(right_hand_ty, scoped_generic_types); + + if let DataType::Generic(id) = left_hand_ty { + scoped_generic_types.constrain_generic_type(id, right_constrain_ty.clone()); + left_constrain_ty = + get_constrain_ty_for_compare(left_hand_ty.clone(), scoped_generic_types); + } + + if !matches_type( + &right_constrain_ty, + &left_constrain_ty, + scoped_generic_types, + ) { + files.report_error( + &file, + &format!( + "Expected type {}, found type {}", + right_constrain_ty.to_string(scoped_generic_types), + left_constrain_ty.to_string(scoped_generic_types), + ), + exp1.1, + ); + } + is_propagating_failure |= prop1 || prop2; return_types.extend(return1); return_types.extend(return2); @@ -1302,3 +1378,27 @@ pub fn analyze_exp( }, } } + +fn get_constrain_ty_for_compare( + constrain: DataType, + scoped_generic_types: &GenericsMap, +) -> DataType { + match constrain.clone() { + DataType::Generic(id) => { + get_constrain_ty_for_compare(scoped_generic_types.get(id), scoped_generic_types) + } + DataType::Int => DataType::Union(vec![DataType::Int, DataType::Number]), + DataType::Number => DataType::Union(vec![DataType::Int, DataType::Number]), + DataType::Array(ty) => DataType::Array(Box::new(get_constrain_ty_for_compare( + *ty, + scoped_generic_types, + ))), + DataType::Union(types) => DataType::Union( + types + .iter() + .map(|ty| get_constrain_ty_for_compare(ty.clone(), scoped_generic_types)) + .collect(), + ), + ty => ty, + } +} diff --git a/src/stdlib.rs b/src/stdlib.rs index 0f2d7a6..4914585 100644 --- a/src/stdlib.rs +++ b/src/stdlib.rs @@ -49,7 +49,7 @@ pub fn is_builtin_file(uri: &Uri, amber_version: AmberVersion) -> bool { }; if builtin_file_path.is_err() || file_path.is_err() { - return false; + return true; // For local testing } file_path.unwrap() == builtin_file_path.unwrap() diff --git a/tests/analysis/alpha050.rs b/tests/analysis/alpha050.rs new file mode 100644 index 0000000..004293c --- /dev/null +++ b/tests/analysis/alpha050.rs @@ -0,0 +1,265 @@ +use std::{path::Path, sync::Arc}; + +use amber_lsp::{ + backend::{AmberVersion, Backend}, + fs::MemoryFS, +}; +use insta::assert_debug_snapshot; +use tokio::test; +use tower_lsp_server::{lsp_types::Uri, UriExt}; + +#[test] +async fn test_simple_function() { + let (service, _) = tower_lsp_server::LspService::new(|client| { + Backend::new( + client, + AmberVersion::Alpha050, + Some(Arc::new(MemoryFS::new())), + ) + }); + + let backend = service.inner(); + let vfs = &backend.files.fs; + + let file = { + #[cfg(windows)] + { + Path::new("C:\\main.ab") + } + #[cfg(unix)] + { + Path::new("/main.ab") + } + }; + let uri = Uri::from_file_path(file).unwrap(); + + vfs.write( + &uri.to_file_path().unwrap(), + " +fun add(a, b) { + return a + b +} +", + ) + .await + .unwrap(); + + let file_id = backend.open_document(&uri).await.unwrap(); + + let symbol_table = backend.files.symbol_table.get(&file_id).unwrap(); + let generic_types = backend.files.generic_types.clone(); + + assert_debug_snapshot!(symbol_table.symbols); + assert_debug_snapshot!(symbol_table + .symbols + .iter() + .map(|(_, symbol_info)| symbol_info.to_string(&generic_types)) + .collect::>()); + assert_debug_snapshot!(backend.files.errors); +} + +#[test] +async fn test_comparison_with_text_literal() { + let (service, _) = tower_lsp_server::LspService::new(|client| { + Backend::new( + client, + AmberVersion::Alpha050, + Some(Arc::new(MemoryFS::new())), + ) + }); + + let backend = service.inner(); + let vfs = &backend.files.fs; + + let file = { + #[cfg(windows)] + { + Path::new("C:\\main.ab") + } + #[cfg(unix)] + { + Path::new("/main.ab") + } + }; + let uri = Uri::from_file_path(file).unwrap(); + + vfs.write( + &uri.to_file_path().unwrap(), + " +fun starts_with_a(word) { + return word < \"b\" +} +", + ) + .await + .unwrap(); + + let file_id = backend.open_document(&uri).await.unwrap(); + + let symbol_table = backend.files.symbol_table.get(&file_id).unwrap(); + let generic_types = backend.files.generic_types.clone(); + + // The parameter 'word' should be constrained to Text due to comparison with "b" (Text) + assert_debug_snapshot!(symbol_table.symbols); + assert_debug_snapshot!(symbol_table + .symbols + .iter() + .map(|(_, symbol_info)| symbol_info.to_string(&generic_types)) + .collect::>()); + assert_debug_snapshot!(backend.files.errors); +} + +#[test] +async fn test_comparison_with_array_literal() { + let (service, _) = tower_lsp_server::LspService::new(|client| { + Backend::new( + client, + AmberVersion::Alpha050, + Some(Arc::new(MemoryFS::new())), + ) + }); + + let backend = service.inner(); + let vfs = &backend.files.fs; + + let file = { + #[cfg(windows)] + { + Path::new("C:\\main.ab") + } + #[cfg(unix)] + { + Path::new("/main.ab") + } + }; + let uri = Uri::from_file_path(file).unwrap(); + + vfs.write( + &uri.to_file_path().unwrap(), + " +fun compare_arrays(arr) { + return arr > [1, 2, 3] +} +", + ) + .await + .unwrap(); + + let file_id = backend.open_document(&uri).await.unwrap(); + + let symbol_table = backend.files.symbol_table.get(&file_id).unwrap(); + let generic_types = backend.files.generic_types.clone(); + + // The parameter 'arr' should be constrained to [Int | Num] due to comparison with [1, 2, 3] + assert_debug_snapshot!(symbol_table.symbols); + assert_debug_snapshot!(symbol_table + .symbols + .iter() + .map(|(_, symbol_info)| symbol_info.to_string(&generic_types)) + .collect::>()); + assert_debug_snapshot!(backend.files.errors); +} + +#[test] +async fn test_two_generics_compared() { + let (service, _) = tower_lsp_server::LspService::new(|client| { + Backend::new( + client, + AmberVersion::Alpha050, + Some(Arc::new(MemoryFS::new())), + ) + }); + + let backend = service.inner(); + let vfs = &backend.files.fs; + + let file = { + #[cfg(windows)] + { + Path::new("C:\\main.ab") + } + #[cfg(unix)] + { + Path::new("/main.ab") + } + }; + let uri = Uri::from_file_path(file).unwrap(); + + vfs.write( + &uri.to_file_path().unwrap(), + " +fun max_value(a, b) { + if a > b: return a + return b +} +", + ) + .await + .unwrap(); + + let file_id = backend.open_document(&uri).await.unwrap(); + + let symbol_table = backend.files.symbol_table.get(&file_id).unwrap(); + let generic_types = backend.files.generic_types.clone(); + + // When both operands are unknown generics, they should get the broad constraint + assert_debug_snapshot!(symbol_table.symbols); + assert_debug_snapshot!(symbol_table + .symbols + .iter() + .map(|(_, symbol_info)| symbol_info.to_string(&generic_types)) + .collect::>()); + assert_debug_snapshot!(backend.files.errors); +} + +#[test] +async fn test_number_compared() { + let (service, _) = tower_lsp_server::LspService::new(|client| { + Backend::new( + client, + AmberVersion::Alpha050, + Some(Arc::new(MemoryFS::new())), + ) + }); + + let backend = service.inner(); + let vfs = &backend.files.fs; + + let file = { + #[cfg(windows)] + { + Path::new("C:\\main.ab") + } + #[cfg(unix)] + { + Path::new("/main.ab") + } + }; + let uri = Uri::from_file_path(file).unwrap(); + + vfs.write( + &uri.to_file_path().unwrap(), + " +fun math_abs(num) { + if num < 0: return -num + return num +} +", + ) + .await + .unwrap(); + + let file_id = backend.open_document(&uri).await.unwrap(); + + let symbol_table = backend.files.symbol_table.get(&file_id).unwrap(); + let generic_types = backend.files.generic_types.clone(); + + // When both operands are unknown generics, they should get the broad constraint + assert_debug_snapshot!(symbol_table.symbols); + assert_debug_snapshot!(symbol_table + .symbols + .iter() + .map(|(_, symbol_info)| symbol_info.to_string(&generic_types)) + .collect::>()); + assert_debug_snapshot!(backend.files.errors); +} diff --git a/tests/analysis/mod.rs b/tests/analysis/mod.rs index 1b60bee..e0aed89 100644 --- a/tests/analysis/mod.rs +++ b/tests/analysis/mod.rs @@ -1 +1,2 @@ pub mod alpha034; +pub mod alpha050; diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal-2.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal-2.snap new file mode 100644 index 0000000..b714e21 --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal-2.snap @@ -0,0 +1,9 @@ +--- +source: tests/analysis/alpha050.rs +expression: "symbol_table.symbols.iter().map(|(_, symbol_info)|\nsymbol_info.to_string(&generic_types)).collect::>()" +--- +[ + "fun compare_arrays(arr: [Int | Num]): Bool", + "arr: [Int | Num]", + "arr: [Int | Num]", +] diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal-3.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal-3.snap new file mode 100644 index 0000000..2e005cc --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal-3.snap @@ -0,0 +1,14 @@ +--- +source: tests/analysis/alpha050.rs +expression: backend.files.errors +--- +{ + ( + FileId( + 0, + ), + FileVersion( + 1, + ), + ): [], +} diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal.snap new file mode 100644 index 0000000..27cd877 --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_array_literal.snap @@ -0,0 +1,64 @@ +--- +source: tests/analysis/alpha050.rs +expression: symbol_table.symbols +--- +{ + 5..=19: SymbolInfo { + name: "compare_arrays", + symbol_type: Function( + FunctionSymbol { + arguments: [ + ( + FunctionArgument { + name: "arr", + data_type: Any, + is_optional: false, + is_ref: false, + }, + 20..23, + ), + ], + is_public: false, + compiler_flags: [], + docs: None, + }, + ), + data_type: Bool, + is_definition: true, + undefined: false, + span: 5..19, + contexts: [], + }, + 20..=23: SymbolInfo { + name: "arr", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 20..23, + contexts: [], + }, + 38..=41: SymbolInfo { + name: "arr", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 38..41, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, +} diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal-2.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal-2.snap new file mode 100644 index 0000000..03c795e --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal-2.snap @@ -0,0 +1,9 @@ +--- +source: tests/analysis/alpha050.rs +expression: "symbol_table.symbols.iter().map(|(_, symbol_info)|\nsymbol_info.to_string(&generic_types)).collect::>()" +--- +[ + "fun starts_with_a(word: Text): Bool", + "word: Text", + "word: Text", +] diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal-3.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal-3.snap new file mode 100644 index 0000000..2e005cc --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal-3.snap @@ -0,0 +1,14 @@ +--- +source: tests/analysis/alpha050.rs +expression: backend.files.errors +--- +{ + ( + FileId( + 0, + ), + FileVersion( + 1, + ), + ): [], +} diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal.snap new file mode 100644 index 0000000..0ae52ca --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__comparison_with_text_literal.snap @@ -0,0 +1,64 @@ +--- +source: tests/analysis/alpha050.rs +expression: symbol_table.symbols +--- +{ + 5..=18: SymbolInfo { + name: "starts_with_a", + symbol_type: Function( + FunctionSymbol { + arguments: [ + ( + FunctionArgument { + name: "word", + data_type: Any, + is_optional: false, + is_ref: false, + }, + 19..23, + ), + ], + is_public: false, + compiler_flags: [], + docs: None, + }, + ), + data_type: Bool, + is_definition: true, + undefined: false, + span: 5..18, + contexts: [], + }, + 19..=23: SymbolInfo { + name: "word", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 19..23, + contexts: [], + }, + 38..=42: SymbolInfo { + name: "word", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 38..42, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, +} diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared-2.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared-2.snap new file mode 100644 index 0000000..29d58da --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared-2.snap @@ -0,0 +1,11 @@ +--- +source: tests/analysis/alpha050.rs +expression: "symbol_table.symbols.iter().map(|(_, symbol_info)|\nsymbol_info.to_string(&generic_types)).collect::>()" +--- +[ + "fun math_abs(num: Num | Int): Num | Int", + "num: Num | Int", + "num: Num | Int", + "num: Num | Int", + "num: Num | Int", +] diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared-3.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared-3.snap new file mode 100644 index 0000000..2e005cc --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared-3.snap @@ -0,0 +1,14 @@ +--- +source: tests/analysis/alpha050.rs +expression: backend.files.errors +--- +{ + ( + FileId( + 0, + ), + FileVersion( + 1, + ), + ): [], +} diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared.snap new file mode 100644 index 0000000..91f8023 --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__number_compared.snap @@ -0,0 +1,102 @@ +--- +source: tests/analysis/alpha050.rs +expression: symbol_table.symbols +--- +{ + 5..=13: SymbolInfo { + name: "math_abs", + symbol_type: Function( + FunctionSymbol { + arguments: [ + ( + FunctionArgument { + name: "num", + data_type: Any, + is_optional: false, + is_ref: false, + }, + 14..17, + ), + ], + is_public: false, + compiler_flags: [], + docs: None, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 5..13, + contexts: [], + }, + 14..=17: SymbolInfo { + name: "num", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 14..17, + contexts: [], + }, + 28..=31: SymbolInfo { + name: "num", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 28..31, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, + 45..=48: SymbolInfo { + name: "num", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 45..48, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, + 60..=63: SymbolInfo { + name: "num", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 60..63, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, +} diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function-2.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function-2.snap new file mode 100644 index 0000000..0908a04 --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function-2.snap @@ -0,0 +1,11 @@ +--- +source: tests/analysis/alpha050.rs +expression: "symbol_table.symbols.iter().map(|(_, symbol_info)|\nsymbol_info.to_string(&generic_types)).collect::>()" +--- +[ + "fun add(a: Num | Int | Text | [Num | Int | Text], b: Num | Int | Text | [Num | Int | Text]): Num | Int | Text | [Num | Int | Text]", + "a: Num | Int | Text | [Num | Int | Text]", + "b: Num | Int | Text | [Num | Int | Text]", + "a: Num | Int | Text | [Num | Int | Text]", + "b: Num | Int | Text | [Num | Int | Text]", +] diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function-3.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function-3.snap new file mode 100644 index 0000000..2e005cc --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function-3.snap @@ -0,0 +1,14 @@ +--- +source: tests/analysis/alpha050.rs +expression: backend.files.errors +--- +{ + ( + FileId( + 0, + ), + FileVersion( + 1, + ), + ): [], +} diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function.snap new file mode 100644 index 0000000..0351cb5 --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__simple_function.snap @@ -0,0 +1,105 @@ +--- +source: tests/analysis/alpha050.rs +expression: symbol_table.symbols +--- +{ + 5..=8: SymbolInfo { + name: "add", + symbol_type: Function( + FunctionSymbol { + arguments: [ + ( + FunctionArgument { + name: "a", + data_type: Any, + is_optional: false, + is_ref: false, + }, + 9..10, + ), + ( + FunctionArgument { + name: "b", + data_type: Any, + is_optional: false, + is_ref: false, + }, + 12..13, + ), + ], + is_public: false, + compiler_flags: [], + docs: None, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 5..8, + contexts: [], + }, + 9..=10: SymbolInfo { + name: "a", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 9..10, + contexts: [], + }, + 12..=13: SymbolInfo { + name: "b", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 12..13, + contexts: [], + }, + 28..=29: SymbolInfo { + name: "a", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 28..29, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, + 32..=33: SymbolInfo { + name: "b", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 32..33, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, +} diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared-2.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared-2.snap new file mode 100644 index 0000000..358ae04 --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared-2.snap @@ -0,0 +1,13 @@ +--- +source: tests/analysis/alpha050.rs +expression: "symbol_table.symbols.iter().map(|(_, symbol_info)|\nsymbol_info.to_string(&generic_types)).collect::>()" +--- +[ + "fun max_value(a: Int | Num | Text | [Int | Num | Text], b: Int | Num | Text | [Int | Num | Text]): Int | Num | Text | [Int | Num | Text]", + "a: Int | Num | Text | [Int | Num | Text]", + "b: Int | Num | Text | [Int | Num | Text]", + "a: Int | Num | Text | [Int | Num | Text]", + "b: Int | Num | Text | [Int | Num | Text]", + "a: Int | Num | Text | [Int | Num | Text]", + "b: Int | Num | Text | [Int | Num | Text]", +] diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared-3.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared-3.snap new file mode 100644 index 0000000..2e005cc --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared-3.snap @@ -0,0 +1,14 @@ +--- +source: tests/analysis/alpha050.rs +expression: backend.files.errors +--- +{ + ( + FileId( + 0, + ), + FileVersion( + 1, + ), + ): [], +} diff --git a/tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared.snap b/tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared.snap new file mode 100644 index 0000000..55eb84e --- /dev/null +++ b/tests/analysis/snapshots/r#mod__analysis__alpha050__two_generics_compared.snap @@ -0,0 +1,143 @@ +--- +source: tests/analysis/alpha050.rs +expression: symbol_table.symbols +--- +{ + 5..=14: SymbolInfo { + name: "max_value", + symbol_type: Function( + FunctionSymbol { + arguments: [ + ( + FunctionArgument { + name: "a", + data_type: Any, + is_optional: false, + is_ref: false, + }, + 15..16, + ), + ( + FunctionArgument { + name: "b", + data_type: Any, + is_optional: false, + is_ref: false, + }, + 18..19, + ), + ], + is_public: false, + compiler_flags: [], + docs: None, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 5..14, + contexts: [], + }, + 15..=16: SymbolInfo { + name: "a", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 15..16, + contexts: [], + }, + 18..=19: SymbolInfo { + name: "b", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: true, + undefined: false, + span: 18..19, + contexts: [], + }, + 30..=31: SymbolInfo { + name: "a", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 30..31, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, + 34..=35: SymbolInfo { + name: "b", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 34..35, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, + 44..=45: SymbolInfo { + name: "a", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 44..45, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, + 57..=58: SymbolInfo { + name: "b", + symbol_type: Variable( + VariableSymbol { + is_const: false, + }, + ), + data_type: Any, + is_definition: false, + undefined: false, + span: 57..58, + contexts: [ + Function( + FunctionContext { + compiler_flags: [], + }, + ), + ], + }, +} diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap index 3e618b2..2301fd6 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap @@ -677,15 +677,15 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "Returns the first element in the array; if the array is empty, the return", + "Returns the first element in the array; if the array is empty, the function", ), - 762..840, + 762..842, ), ), - 762..840, + 762..842, ), ), - 762..840, + 762..842, ), ( Statement( @@ -693,53 +693,130 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "value is undefined.", + "fails.", ), - 840..864, + 842..853, ), ), - 840..864, + 842..853, ), ), - 840..864, + 842..853, ), ( FunctionDefinition( [], ( true, - 864..867, + 853..856, ), ( "fun", - 868..871, + 857..860, ), ( "array_first", - 872..883, + 861..872, ), [ ( Generic( ( false, - 884..884, + 873..873, ), ( "array", - 884..889, + 873..878, ), ), - 884..889, + 873..878, ), ], None, [ + ( + IfCondition( + ( + "if", + 886..888, + ), + ( + IfCondition( + ( + Eq( + ( + FunctionInvocation( + [], + ( + "len", + 889..892, + ), + [ + ( + Var( + ( + "array", + 893..898, + ), + ), + 893..898, + ), + ], + [], + ), + 889..899, + ), + ( + Int( + ( + 0, + 903..904, + ), + ), + 903..904, + ), + ), + 889..904, + ), + ( + Singleline( + ( + Fail( + ( + "fail", + 914..918, + ), + Some( + ( + Int( + ( + 1, + 919..920, + ), + ), + 919..920, + ), + ), + ), + 914..920, + ), + ), + 904..920, + ), + ), + 889..920, + ), + [], + None, + ), + 886..920, + ), ( Return( ( "return", - 897..903, + 925..931, ), Some( ( @@ -748,30 +825,30 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 904..909, + 932..937, ), ), - 904..909, + 932..937, ), ( Int( ( 0, - 910..911, + 938..939, ), ), - 910..911, + 938..939, ), ), - 904..911, + 932..939, ), ), ), - 897..912, + 925..940, ), ], ), - 864..914, + 853..942, ), ( Statement( @@ -779,15 +856,15 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "Returns the last element in the array; if the array is empty, the return", + "Returns the last element in the array; if the array is empty, the function", ), - 916..993, + 944..1023, ), ), - 916..993, + 944..1023, ), ), - 916..993, + 944..1023, ), ( Statement( @@ -795,44 +872,44 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "value is undefined.", + "fails.", ), - 993..1017, + 1023..1034, ), ), - 993..1017, + 1023..1034, ), ), - 993..1017, + 1023..1034, ), ( FunctionDefinition( [], ( true, - 1017..1020, + 1034..1037, ), ( "fun", - 1021..1024, + 1038..1041, ), ( "array_last", - 1025..1035, + 1042..1052, ), [ ( Generic( ( false, - 1036..1036, + 1053..1053, ), ( "array", - 1036..1041, + 1053..1058, ), ), - 1036..1041, + 1053..1058, ), ], None, @@ -841,11 +918,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 1049..1052, + 1066..1069, ), ( "index", - 1053..1058, + 1070..1075, ), ( Expression( @@ -856,46 +933,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "len", - 1061..1064, + 1078..1081, ), [ ( Var( ( "array", - 1065..1070, + 1082..1087, ), ), - 1065..1070, + 1082..1087, ), ], [], ), - 1061..1071, + 1078..1088, ), ( Int( ( 1, - 1074..1075, + 1091..1092, ), ), - 1074..1075, + 1091..1092, ), ), - 1061..1075, + 1078..1092, ), ), - 1061..1075, + 1078..1092, ), ), - 1049..1075, + 1066..1092, ), ( IfCondition( ( "if", - 1080..1082, + 1097..1099, ), ( IfCondition( @@ -905,22 +982,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "index", - 1083..1088, + 1100..1105, ), ), - 1083..1088, + 1100..1105, ), ( Int( ( 0, - 1091..1092, + 1108..1109, ), ), - 1091..1092, + 1108..1109, ), ), - 1083..1092, + 1100..1109, ), ( Singleline( @@ -928,38 +1005,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) Fail( ( "fail", - 1102..1106, + 1119..1123, ), Some( ( Int( ( 1, - 1107..1108, + 1124..1125, ), ), - 1107..1108, + 1124..1125, ), ), ), - 1102..1108, + 1119..1125, ), ), - 1092..1108, + 1109..1125, ), ), - 1083..1108, + 1100..1125, ), [], None, ), - 1080..1108, + 1097..1125, ), ( Return( ( "return", - 1113..1119, + 1130..1136, ), Some( ( @@ -968,30 +1045,30 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 1120..1125, + 1137..1142, ), ), - 1120..1125, + 1137..1142, ), ( Var( ( "index", - 1126..1131, + 1143..1148, ), ), - 1126..1131, + 1143..1148, ), ), - 1120..1131, + 1137..1148, ), ), ), - 1113..1132, + 1130..1149, ), ], ), - 1017..1134, + 1034..1151, ), ( Statement( @@ -1001,13 +1078,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Removes an element at the index from the array; if the index is negative", ), - 1136..1213, + 1153..1230, ), ), - 1136..1213, + 1153..1230, ), ), - 1136..1213, + 1153..1230, ), ( Statement( @@ -1015,87 +1092,71 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "or beyond the end, the return value is undefined, but the array will be", + "or beyond the end, the array will be unchanged.", ), - 1213..1289, + 1230..1282, ), ), - 1213..1289, + 1230..1282, ), ), - 1213..1289, - ), - ( - Statement( - ( - Comment( - ( - DocString( - "unchanged.", - ), - 1289..1304, - ), - ), - 1289..1304, - ), - ), - 1289..1304, + 1230..1282, ), ( FunctionDefinition( [], ( true, - 1304..1307, + 1282..1285, ), ( "fun", - 1308..1311, + 1286..1289, ), ( "array_remove_at", - 1312..1327, + 1290..1305, ), [ ( Typed( ( true, - 1328..1331, + 1306..1309, ), ( "array", - 1332..1337, + 1310..1315, ), ( [Any], - 1339..1341, + 1317..1319, ), ), - 1328..1341, + 1306..1319, ), ( Typed( ( false, - 1343..1342, + 1321..1320, ), ( "index", - 1343..1348, + 1321..1326, ), ( Int, - 1350..1353, + 1328..1331, ), ), - 1343..1353, + 1321..1331, ), ], Some( ( Null, - 1356..1360, + 1334..1338, ), ), [ @@ -1103,11 +1164,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 1367..1370, + 1345..1348, ), ( "offset", - 1371..1377, + 1349..1355, ), ( Expression( @@ -1117,38 +1178,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "index", - 1380..1385, + 1358..1363, ), ), - 1380..1385, + 1358..1363, ), ( Int( ( 1, - 1388..1389, + 1366..1367, ), ), - 1388..1389, + 1366..1367, ), ), - 1380..1389, + 1358..1367, ), ), - 1380..1389, + 1358..1367, ), ), - 1367..1389, + 1345..1367, ), ( VariableInit( ( "let", - 1394..1397, + 1372..1375, ), ( "length", - 1398..1404, + 1376..1382, ), ( Expression( @@ -1157,34 +1218,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "len", - 1407..1410, + 1385..1388, ), [ ( Var( ( "array", - 1411..1416, + 1389..1394, ), ), - 1411..1416, + 1389..1394, ), ], [], ), - 1407..1417, + 1385..1395, ), ), - 1407..1417, + 1385..1395, ), ), - 1394..1417, + 1372..1395, ), ( VariableSet( ( "array", - 1422..1427, + 1400..1405, ), ( Add( @@ -1194,10 +1255,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 1430..1435, + 1408..1413, ), ), - 1430..1435, + 1408..1413, ), ( Range( @@ -1205,25 +1266,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Int( ( 0, - 1436..1437, + 1414..1415, ), ), - 1436..1437, + 1414..1415, ), ( Var( ( "index", - 1439..1444, + 1417..1422, ), ), - 1439..1444, + 1417..1422, ), ), - 1436..1444, + 1414..1422, ), ), - 1430..1444, + 1408..1422, ), ( ArrayIndex( @@ -1231,10 +1292,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 1448..1453, + 1426..1431, ), ), - 1448..1453, + 1426..1431, ), ( Range( @@ -1242,35 +1303,51 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "offset", - 1454..1460, + 1432..1438, ), ), - 1454..1460, + 1432..1438, ), ( Var( ( "length", - 1462..1468, + 1440..1446, ), ), - 1462..1468, + 1440..1446, ), ), - 1454..1468, + 1432..1446, ), ), - 1448..1468, + 1426..1446, ), ), - 1430..1468, + 1408..1446, ), ), - 1422..1469, + 1400..1447, ), ], ), - 1304..1471, + 1282..1449, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Removes an element at the index from the array, and returns it; if the", + ), + 1451..1526, + ), + ), + 1451..1526, + ), + ), + 1451..1526, ), ( Statement( @@ -1278,65 +1355,65 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "Removes an element at the index from the array, and returns it", + "index is negative or beyond the end, the function fails.", ), - 1473..1540, + 1526..1587, ), ), - 1473..1540, + 1526..1587, ), ), - 1473..1540, + 1526..1587, ), ( FunctionDefinition( [], ( true, - 1540..1543, + 1587..1590, ), ( "fun", - 1544..1547, + 1591..1594, ), ( "array_extract_at", - 1548..1564, + 1595..1611, ), [ ( Typed( ( true, - 1565..1568, + 1612..1615, ), ( "array", - 1569..1574, + 1616..1621, ), ( [Any], - 1576..1578, + 1623..1625, ), ), - 1565..1578, + 1612..1625, ), ( Typed( ( false, - 1580..1579, + 1627..1626, ), ( "index", - 1580..1585, + 1627..1632, ), ( Int, - 1587..1590, + 1634..1637, ), ), - 1580..1590, + 1627..1637, ), ], None, @@ -1345,7 +1422,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfCondition( ( "if", - 1598..1600, + 1645..1647, ), ( IfCondition( @@ -1357,26 +1434,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "index", - 1601..1606, + 1648..1653, ), ), - 1601..1606, + 1648..1653, ), ( Int( ( 0, - 1609..1610, + 1656..1657, ), ), - 1609..1610, + 1656..1657, ), ), - 1601..1610, + 1648..1657, ), ( "or", - 1611..1613, + 1658..1660, ), ( Ge( @@ -1384,38 +1461,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "index", - 1614..1619, + 1661..1666, ), ), - 1614..1619, + 1661..1666, ), ( FunctionInvocation( [], ( "len", - 1623..1626, + 1670..1673, ), [ ( Var( ( "array", - 1627..1632, + 1674..1679, ), ), - 1627..1632, + 1674..1679, ), ], [], ), - 1623..1633, + 1670..1680, ), ), - 1614..1633, + 1661..1680, ), ), - 1601..1633, + 1648..1680, ), ( Singleline( @@ -1423,42 +1500,42 @@ expression: parse_unwrap(&tokenize(&stdlib)) Fail( ( "fail", - 1643..1647, + 1690..1694, ), Some( ( Int( ( 1, - 1648..1649, + 1695..1696, ), ), - 1648..1649, + 1695..1696, ), ), ), - 1643..1649, + 1690..1696, ), ), - 1633..1649, + 1680..1696, ), ), - 1601..1649, + 1648..1696, ), [], None, ), - 1598..1649, + 1645..1696, ), ( VariableInit( ( "let", - 1654..1657, + 1701..1704, ), ( "element", - 1658..1665, + 1705..1712, ), ( Expression( @@ -1468,38 +1545,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 1668..1673, + 1715..1720, ), ), - 1668..1673, + 1715..1720, ), ( Var( ( "index", - 1674..1679, + 1721..1726, ), ), - 1674..1679, + 1721..1726, ), ), - 1668..1679, + 1715..1726, ), ), - 1668..1680, + 1715..1727, ), ), - 1654..1680, + 1701..1727, ), ( VariableInit( ( "let", - 1685..1688, + 1732..1735, ), ( "offset", - 1689..1695, + 1736..1742, ), ( Expression( @@ -1509,38 +1586,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "index", - 1698..1703, + 1745..1750, ), ), - 1698..1703, + 1745..1750, ), ( Int( ( 1, - 1706..1707, + 1753..1754, ), ), - 1706..1707, + 1753..1754, ), ), - 1698..1707, + 1745..1754, ), ), - 1698..1707, + 1745..1754, ), ), - 1685..1707, + 1732..1754, ), ( VariableInit( ( "let", - 1712..1715, + 1759..1762, ), ( "length", - 1716..1722, + 1763..1769, ), ( Expression( @@ -1549,34 +1626,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "len", - 1725..1728, + 1772..1775, ), [ ( Var( ( "array", - 1729..1734, + 1776..1781, ), ), - 1729..1734, + 1776..1781, ), ], [], ), - 1725..1735, + 1772..1782, ), ), - 1725..1735, + 1772..1782, ), ), - 1712..1735, + 1759..1782, ), ( VariableSet( ( "array", - 1740..1745, + 1787..1792, ), ( Add( @@ -1586,10 +1663,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 1748..1753, + 1795..1800, ), ), - 1748..1753, + 1795..1800, ), ( Range( @@ -1597,25 +1674,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Int( ( 0, - 1754..1755, + 1801..1802, ), ), - 1754..1755, + 1801..1802, ), ( Var( ( "index", - 1757..1762, + 1804..1809, ), ), - 1757..1762, + 1804..1809, ), ), - 1754..1762, + 1801..1809, ), ), - 1748..1762, + 1795..1809, ), ( ArrayIndex( @@ -1623,10 +1700,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 1766..1771, + 1813..1818, ), ), - 1766..1771, + 1813..1818, ), ( Range( @@ -1634,55 +1711,55 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "offset", - 1772..1778, + 1819..1825, ), ), - 1772..1778, + 1819..1825, ), ( Var( ( "length", - 1780..1786, + 1827..1833, ), ), - 1780..1786, + 1827..1833, ), ), - 1772..1786, + 1819..1833, ), ), - 1766..1786, + 1813..1833, ), ), - 1748..1786, + 1795..1833, ), ), - 1740..1787, + 1787..1834, ), ( Return( ( "return", - 1792..1798, + 1839..1845, ), Some( ( Var( ( "element", - 1799..1806, + 1846..1853, ), ), - 1799..1806, + 1846..1853, ), ), ), - 1792..1806, + 1839..1853, ), ], ), - 1540..1808, + 1587..1855, ), ( Statement( @@ -1692,13 +1769,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Removes the last element from the array, and returns it; if the array", ), - 1810..1884, + 1857..1931, ), ), - 1810..1884, + 1857..1931, ), ), - 1810..1884, + 1857..1931, ), ( Statement( @@ -1706,48 +1783,44 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "is empty, the return value is undefined, but the array will be unchanged.", + "is empty, the function fails, and the array will be unchanged.", ), - 1884..1962, + 1931..1998, ), ), - 1884..1962, + 1931..1998, ), ), - 1884..1962, + 1931..1998, ), ( FunctionDefinition( [], ( true, - 1962..1965, + 1998..2001, ), ( "fun", - 1966..1969, + 2002..2005, ), ( "array_pop", - 1970..1979, + 2006..2015, ), [ ( - Typed( + Generic( ( true, - 1980..1983, + 2016..2019, ), ( "array", - 1984..1989, - ), - ( - [Any], - 1991..1993, + 2016..2025, ), ), - 1980..1993, + 2016..2025, ), ], None, @@ -1756,11 +1829,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 2001..2004, + 2033..2036, ), ( "length", - 2005..2011, + 2037..2043, ), ( Expression( @@ -1769,38 +1842,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "len", - 2014..2017, + 2046..2049, ), [ ( Var( ( "array", - 2018..2023, + 2050..2055, ), ), - 2018..2023, + 2050..2055, ), ], [], ), - 2014..2024, + 2046..2056, ), ), - 2014..2024, + 2046..2056, ), ), - 2001..2024, + 2033..2056, ), ( VariableInit( ( "let", - 2029..2032, + 2061..2064, ), ( "index", - 2033..2038, + 2065..2070, ), ( Expression( @@ -1810,34 +1883,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "length", - 2041..2047, + 2073..2079, ), ), - 2041..2047, + 2073..2079, ), ( Int( ( 1, - 2050..2051, + 2082..2083, ), ), - 2050..2051, + 2082..2083, ), ), - 2041..2051, + 2073..2083, ), ), - 2041..2051, + 2073..2083, ), ), - 2029..2051, + 2061..2083, ), ( IfCondition( ( "if", - 2056..2058, + 2088..2090, ), ( IfCondition( @@ -1847,22 +1920,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "index", - 2059..2064, + 2091..2096, ), ), - 2059..2064, + 2091..2096, ), ( Int( ( 0, - 2067..2068, + 2099..2100, ), ), - 2067..2068, + 2099..2100, ), ), - 2059..2068, + 2091..2100, ), ( Singleline( @@ -1870,42 +1943,42 @@ expression: parse_unwrap(&tokenize(&stdlib)) Fail( ( "fail", - 2078..2082, + 2110..2114, ), Some( ( Int( ( 1, - 2083..2084, + 2115..2116, ), ), - 2083..2084, + 2115..2116, ), ), ), - 2078..2084, + 2110..2116, ), ), - 2068..2084, + 2100..2116, ), ), - 2059..2084, + 2091..2116, ), [], None, ), - 2056..2084, + 2088..2116, ), ( VariableInit( ( "let", - 2089..2092, + 2121..2124, ), ( "element", - 2093..2100, + 2125..2132, ), ( Expression( @@ -1915,34 +1988,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 2103..2108, + 2135..2140, ), ), - 2103..2108, + 2135..2140, ), ( Var( ( "index", - 2109..2114, + 2141..2146, ), ), - 2109..2114, + 2141..2146, ), ), - 2103..2114, + 2135..2146, ), ), - 2103..2115, + 2135..2147, ), ), - 2089..2115, + 2121..2147, ), ( VariableSet( ( "array", - 2120..2125, + 2152..2157, ), ( ArrayIndex( @@ -1950,10 +2023,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 2128..2133, + 2160..2165, ), ), - 2128..2133, + 2160..2165, ), ( Range( @@ -1961,52 +2034,52 @@ expression: parse_unwrap(&tokenize(&stdlib)) Int( ( 0, - 2134..2135, + 2166..2167, ), ), - 2134..2135, + 2166..2167, ), ( Var( ( "index", - 2137..2142, + 2169..2174, ), ), - 2137..2142, + 2169..2174, ), ), - 2134..2142, + 2166..2174, ), ), - 2128..2142, + 2160..2174, ), ), - 2120..2143, + 2152..2175, ), ( Return( ( "return", - 2148..2154, + 2180..2186, ), Some( ( Var( ( "element", - 2155..2162, + 2187..2194, ), ), - 2155..2162, + 2187..2194, ), ), ), - 2148..2162, + 2180..2194, ), ], ), - 1962..2164, + 1998..2196, ), ( Statement( @@ -2016,13 +2089,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Removes the first element from the array, and returns it; if the array", ), - 2166..2241, + 2198..2273, ), ), - 2166..2241, + 2198..2273, ), ), - 2166..2241, + 2198..2273, ), ( Statement( @@ -2030,48 +2103,44 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "is empty, the return value is undefined, but the array will be unchanged.", + "is empty, the function fails, and the array will be unchanged.", ), - 2241..2319, + 2273..2340, ), ), - 2241..2319, + 2273..2340, ), ), - 2241..2319, + 2273..2340, ), ( FunctionDefinition( [], ( true, - 2319..2322, + 2340..2343, ), ( "fun", - 2323..2326, + 2344..2347, ), ( "array_shift", - 2327..2338, + 2348..2359, ), [ ( - Typed( + Generic( ( true, - 2339..2342, + 2360..2363, ), ( "array", - 2343..2348, - ), - ( - [Any], - 2350..2352, + 2360..2369, ), ), - 2339..2352, + 2360..2369, ), ], None, @@ -2080,11 +2149,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 2360..2363, + 2377..2380, ), ( "length", - 2364..2370, + 2381..2387, ), ( Expression( @@ -2093,38 +2162,102 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "len", - 2373..2376, + 2390..2393, ), [ ( Var( ( "array", - 2377..2382, + 2394..2399, ), ), - 2377..2382, + 2394..2399, ), ], [], ), - 2373..2383, + 2390..2400, + ), + ), + 2390..2400, + ), + ), + 2377..2400, + ), + ( + IfCondition( + ( + "if", + 2405..2407, + ), + ( + IfCondition( + ( + Eq( + ( + Var( + ( + "length", + 2408..2414, + ), + ), + 2408..2414, + ), + ( + Int( + ( + 0, + 2418..2419, + ), + ), + 2418..2419, + ), + ), + 2408..2419, + ), + ( + Singleline( + ( + Fail( + ( + "fail", + 2429..2433, + ), + Some( + ( + Int( + ( + 1, + 2434..2435, + ), + ), + 2434..2435, + ), + ), + ), + 2429..2435, + ), + ), + 2419..2435, ), ), - 2373..2383, + 2408..2435, ), + [], + None, ), - 2360..2383, + 2405..2435, ), ( VariableInit( ( "let", - 2388..2391, + 2440..2443, ), ( "element", - 2392..2399, + 2444..2451, ), ( Expression( @@ -2134,34 +2267,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 2402..2407, + 2454..2459, ), ), - 2402..2407, + 2454..2459, ), ( Int( ( 0, - 2408..2409, + 2460..2461, ), ), - 2408..2409, + 2460..2461, ), ), - 2402..2409, + 2454..2461, ), ), - 2402..2410, + 2454..2462, ), ), - 2388..2410, + 2440..2462, ), ( VariableSet( ( "array", - 2415..2420, + 2467..2472, ), ( ArrayIndex( @@ -2169,10 +2302,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 2423..2428, + 2475..2480, ), ), - 2423..2428, + 2475..2480, ), ( Range( @@ -2180,51 +2313,457 @@ expression: parse_unwrap(&tokenize(&stdlib)) Int( ( 1, - 2429..2430, + 2481..2482, ), ), - 2429..2430, + 2481..2482, ), ( Var( ( "length", - 2432..2438, + 2484..2490, ), ), - 2432..2438, + 2484..2490, ), ), - 2429..2438, + 2481..2490, ), ), - 2423..2438, + 2475..2490, ), ), - 2415..2439, + 2467..2491, ), ( Return( ( "return", - 2444..2450, + 2496..2502, ), Some( ( Var( ( "element", - 2451..2458, + 2503..2510, + ), + ), + 2503..2510, + ), + ), + ), + 2496..2510, + ), + ], + ), + 2340..2512, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Returns an array of length `size` with each element set to `value`; if `size`", + ), + 2514..2596, + ), + ), + 2514..2596, + ), + ), + 2514..2596, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "is less than zero or not of type `Int`, an empty array is returned", + ), + 2596..2667, + ), + ), + 2596..2667, + ), + ), + 2596..2667, + ), + ( + FunctionDefinition( + [], + ( + true, + 2667..2670, + ), + ( + "fun", + 2671..2674, + ), + ( + "array_filled", + 2675..2687, + ), + [ + ( + Generic( + ( + false, + 2688..2688, + ), + ( + "size", + 2688..2692, + ), + ), + 2688..2692, + ), + ( + Optional( + ( + false, + 2694..2693, + ), + ( + "value", + 2694..2699, + ), + None, + ( + Int( + ( + 0, + 2702..2703, + ), + ), + 2702..2703, + ), + ), + 2694..2703, + ), + ], + None, + [ + ( + VariableInit( + ( + "let", + 2711..2714, + ), + ( + "array", + 2715..2720, + ), + ( + Expression( + ( + Array( + [ + ( + Var( + ( + "value", + 2724..2729, + ), + ), + 2724..2729, + ), + ], + ), + 2723..2730, + ), + ), + 2723..2730, + ), + ), + 2711..2730, + ), + ( + VariableSet( + ( + "array", + 2735..2740, + ), + ( + ArrayIndex( + ( + Var( + ( + "array", + 2743..2748, + ), + ), + 2743..2748, + ), + ( + Range( + ( + Int( + ( + 0, + 2749..2750, + ), + ), + 2749..2750, + ), + ( + Int( + ( + 0, + 2752..2753, + ), + ), + 2752..2753, + ), + ), + 2749..2753, + ), + ), + 2743..2753, + ), + ), + 2735..2754, + ), + ( + IfCondition( + ( + "if", + 2759..2761, + ), + ( + IfCondition( + ( + Not( + ( + "not", + 2762..2765, + ), + ( + Parentheses( + ( + Is( + ( + Var( + ( + "size", + 2767..2771, + ), + ), + 2767..2771, + ), + ( + "is", + 2772..2774, + ), + ( + Int, + 2775..2778, + ), + ), + 2767..2778, + ), + ), + 2766..2779, + ), + ), + 2766..2779, + ), + ( + Singleline( + ( + Return( + ( + "return", + 2789..2795, + ), + Some( + ( + Var( + ( + "array", + 2796..2801, + ), + ), + 2796..2801, + ), + ), + ), + 2789..2801, + ), + ), + 2779..2801, + ), + ), + 2762..2801, + ), + [], + None, + ), + 2759..2801, + ), + ( + IterLoop( + ( + "for", + 2806..2809, + ), + ( + Single( + ( + "_", + 2810..2811, + ), + ), + 2810..2811, + ), + ( + "in", + 2812..2814, + ), + ( + Range( + ( + Int( + ( + 0, + 2815..2816, + ), + ), + 2815..2816, + ), + ( + Parentheses( + ( + Ternary( + ( + Ge( + ( + Cast( + ( + Var( + ( + "size", + 2819..2823, + ), + ), + 2819..2823, + ), + ( + "as", + 2824..2826, + ), + ( + Int, + 2827..2830, + ), + ), + 2819..2830, + ), + ( + Int( + ( + 0, + 2834..2835, + ), + ), + 2834..2835, + ), + ), + 2819..2835, + ), + ( + "then", + 2836..2840, + ), + ( + Var( + ( + "size", + 2841..2845, + ), + ), + 2841..2845, + ), + ( + "else", + 2846..2850, + ), + ( + Int( + ( + 0, + 2851..2852, + ), + ), + 2851..2852, + ), + ), + 2819..2852, + ), + ), + 2818..2853, + ), + ), + 2815..2853, + ), + ( + Singleline( + ( + ShorthandAdd( + ( + "array", + 2863..2868, + ), + ( + Array( + [ + ( + Var( + ( + "value", + 2873..2878, + ), + ), + 2873..2878, + ), + ], + ), + 2872..2879, + ), + ), + 2863..2879, + ), + ), + 2853..2879, + ), + ), + 2806..2879, + ), + ( + Return( + ( + "return", + 2884..2890, + ), + Some( + ( + Var( + ( + "array", + 2891..2896, ), ), - 2451..2458, + 2891..2896, ), ), ), - 2444..2458, + 2884..2896, ), ], ), - 2319..2460, + 2667..2898, ), ] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap index de65a4c..01fe922 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap @@ -9,15 +9,15 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "All dates are internally stored as miliseconds since the Epoch (1970-01-01 00:00 UTC).", + "All dates are internally stored as milliseconds since the Epoch (1970-01-01 00:00 UTC).", ), - 0..91, + 0..92, ), ), - 0..91, + 0..92, ), ), - 0..91, + 0..92, ), ( Statement( @@ -27,13 +27,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Transform date from unix epoch to a human-readable format described by a posix format string.", ), - 92..190, + 93..191, ), ), - 92..190, + 93..191, ), ), - 92..190, + 93..191, ), ( Statement( @@ -43,13 +43,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "If no format is specified, \"%F %T\" is used.", ), - 190..238, + 191..239, ), ), - 190..238, + 191..239, ), ), - 190..238, + 191..239, ), ( Statement( @@ -59,13 +59,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "For more info about format type \"man date\" in your shell or see .", ), - 238..353, + 239..354, ), ), - 238..353, + 239..354, ), ), - 238..353, + 239..354, ), ( Statement( @@ -75,13 +75,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "", ), - 353..357, + 354..358, ), ), - 353..357, + 354..358, ), ), - 353..357, + 354..358, ), ( Statement( @@ -91,13 +91,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Format includes the following patterns:", ), - 357..401, + 358..402, ), ), - 357..401, + 358..402, ), ), - 357..401, + 358..402, ), ( Statement( @@ -107,13 +107,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%%` - a literal %", ), - 401..426, + 402..427, ), ), - 401..426, + 402..427, ), ), - 401..426, + 402..427, ), ( Statement( @@ -123,13 +123,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%a` - locale's abbreviated weekday name (e.g., Sun)", ), - 426..485, + 427..486, ), ), - 426..485, + 427..486, ), ), - 426..485, + 427..486, ), ( Statement( @@ -139,13 +139,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%A` - locale's full weekday name (e.g., Sunday)", ), - 485..540, + 486..541, ), ), - 485..540, + 486..541, ), ), - 485..540, + 486..541, ), ( Statement( @@ -155,13 +155,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%b` - locale's abbreviated month name (e.g., Jan)", ), - 540..597, + 541..598, ), ), - 540..597, + 541..598, ), ), - 540..597, + 541..598, ), ( Statement( @@ -171,13 +171,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%B` - locale's full month name (e.g., January)", ), - 597..651, + 598..652, ), ), - 597..651, + 598..652, ), ), - 597..651, + 598..652, ), ( Statement( @@ -187,13 +187,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%d` - day of month (e.g., 01)", ), - 651..688, + 652..689, ), ), - 651..688, + 652..689, ), ), - 651..688, + 652..689, ), ( Statement( @@ -203,13 +203,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%D` - date; same as %m/%d/%y", ), - 688..724, + 689..725, ), ), - 688..724, + 689..725, ), ), - 688..724, + 689..725, ), ( Statement( @@ -219,13 +219,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%F` - full date; like %+4Y-%m-%d", ), - 724..764, + 725..765, ), ), - 724..764, + 725..765, ), ), - 724..764, + 725..765, ), ( Statement( @@ -235,13 +235,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%H` - hour (00..23)", ), - 764..791, + 765..792, ), ), - 764..791, + 765..792, ), ), - 764..791, + 765..792, ), ( Statement( @@ -251,13 +251,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%I` - hour (01..12)", ), - 791..818, + 792..819, ), ), - 791..818, + 792..819, ), ), - 791..818, + 792..819, ), ( Statement( @@ -267,13 +267,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%m` - month (01..12)", ), - 818..846, + 819..847, ), ), - 818..846, + 819..847, ), ), - 818..846, + 819..847, ), ( Statement( @@ -283,13 +283,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%M` - minute (00..59)", ), - 846..875, + 847..876, ), ), - 846..875, + 847..876, ), ), - 846..875, + 847..876, ), ( Statement( @@ -299,13 +299,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%N` - nanoseconds (000000000..999999999)", ), - 875..923, + 876..924, ), ), - 875..923, + 876..924, ), ), - 875..923, + 876..924, ), ( Statement( @@ -315,13 +315,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%p` - locale's equivalent of either AM or PM; blank if unknown", ), - 923..993, + 924..994, ), ), - 923..993, + 924..994, ), ), - 923..993, + 924..994, ), ( Statement( @@ -331,13 +331,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%T` - time; same as %H:%M:%S", ), - 993..1029, + 994..1030, ), ), - 993..1029, + 994..1030, ), ), - 993..1029, + 994..1030, ), ( Statement( @@ -347,61 +347,61 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- `%Y` - year", ), - 1029..1047, + 1030..1048, ), ), - 1029..1047, + 1030..1048, ), ), - 1029..1047, + 1030..1048, ), ( FunctionDefinition( [], ( true, - 1047..1050, + 1048..1051, ), ( "fun", - 1051..1054, + 1052..1055, ), ( "date_format_posix", - 1055..1072, + 1056..1073, ), [ ( Typed( ( false, - 1073..1073, + 1074..1074, ), ( "date", - 1073..1077, + 1074..1078, ), ( - Num, - 1079..1082, + Int, + 1080..1083, ), ), - 1073..1082, + 1074..1083, ), ( Optional( ( false, - 1084..1083, + 1085..1084, ), ( "format", - 1084..1090, + 1085..1091, ), Some( ( Text, - 1092..1096, + 1093..1097, ), ), ( @@ -411,78 +411,78 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "%", - 1100..1101, + 1101..1102, ), ), - 1100..1101, + 1101..1102, ), ( Text( ( "F", - 1101..1102, + 1102..1103, ), ), - 1101..1102, + 1102..1103, ), ( Text( ( "%", - 1103..1104, + 1104..1105, ), ), - 1103..1104, + 1104..1105, ), ( Text( ( "T", - 1104..1105, + 1105..1106, ), ), - 1104..1105, + 1105..1106, ), ], ), - 1099..1106, + 1100..1107, ), ), - 1084..1106, + 1085..1107, ), ( Optional( ( false, - 1108..1107, + 1109..1108, ), ( "utc", - 1108..1111, + 1109..1112, ), Some( ( Bool, - 1113..1117, + 1114..1118, ), ), ( Boolean( ( false, - 1120..1125, + 1121..1126, ), ), - 1120..1125, + 1121..1126, ), ), - 1108..1125, + 1109..1126, ), ], Some( ( Text?, - 1128..1133, + 1129..1134, ), ), [ @@ -490,11 +490,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 1140..1143, + 1141..1144, ), ( "utc_flag", - 1144..1152, + 1145..1153, ), ( Expression( @@ -504,14 +504,14 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "utc", - 1155..1158, + 1156..1159, ), ), - 1155..1158, + 1156..1159, ), ( "then", - 1159..1163, + 1160..1164, ), ( Text( @@ -520,42 +520,42 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "-", - 1165..1166, + 1166..1167, ), ), - 1165..1166, + 1166..1167, ), ( Text( ( "u", - 1166..1167, + 1167..1168, ), ), - 1166..1167, + 1167..1168, ), ], ), - 1164..1168, + 1165..1169, ), ( "else", - 1169..1173, + 1170..1174, ), ( Text( [], ), - 1174..1176, + 1175..1177, ), ), - 1155..1176, + 1156..1177, ), ), - 1155..1176, + 1156..1177, ), ), - 1140..1176, + 1141..1177, ), ( Comment( @@ -563,16 +563,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( "Case if this is a GNU date command", ), - 1181..1219, + 1182..1220, ), ), - 1181..1219, + 1182..1220, ), ( Return( ( "return", - 1223..1229, + 1224..1230, ), Some( ( @@ -583,13 +583,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 1230..1231, + 1231..1232, ), ( Text( "date", ), - 1232..1236, + 1233..1237, ), ( Expression( @@ -597,31 +597,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "utc_flag", - 1238..1246, + 1239..1247, ), ), - 1238..1246, + 1239..1247, ), ), - 1237..1247, + 1238..1248, ), ( CommandOption( "-d", ), - 1248..1250, + 1249..1251, ), ( Text( "\"", ), - 1251..1252, + 1252..1253, ), ( Text( "@", ), - 1252..1253, + 1253..1254, ), ( Expression( @@ -629,31 +629,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 1254..1258, + 1255..1259, ), ), - 1254..1258, + 1255..1259, ), ), - 1253..1259, + 1254..1260, ), ( Text( "\"", ), - 1259..1260, + 1260..1261, ), ( Text( "+", ), - 1261..1262, + 1262..1263, ), ( Text( "\"", ), - 1262..1263, + 1263..1264, ), ( Expression( @@ -661,61 +661,61 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "format", - 1264..1270, + 1265..1271, ), ), - 1264..1270, + 1265..1271, ), ), - 1263..1271, + 1264..1272, ), ( Text( "\"", ), - 1271..1272, + 1272..1273, ), ( Text( "2", ), - 1273..1274, + 1274..1275, ), ( Text( ">", ), - 1274..1275, + 1275..1276, ), ( Text( "/", ), - 1275..1276, + 1276..1277, ), ( Text( "dev", ), - 1276..1279, + 1277..1280, ), ( Text( "/", ), - 1279..1280, + 1280..1281, ), ( Text( "null", ), - 1280..1284, + 1281..1285, ), ( Text( "$", ), - 1285..1286, + 1286..1287, ), ], [ @@ -725,7 +725,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Handle( ( "failed", - 1287..1293, + 1288..1294, ), None, ( @@ -738,16 +738,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( "Case if this is a BSD date command", ), - 1304..1342, + 1305..1343, ), ), - 1304..1342, + 1305..1343, ), ( Return( ( "return", - 1350..1356, + 1351..1357, ), Some( ( @@ -758,13 +758,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 1357..1358, + 1358..1359, ), ( Text( "date", ), - 1359..1363, + 1360..1364, ), ( Expression( @@ -772,31 +772,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "utc_flag", - 1365..1373, + 1366..1374, ), ), - 1365..1373, + 1366..1374, ), ), - 1364..1374, + 1365..1375, ), ( CommandOption( "-j", ), - 1375..1377, + 1376..1378, ), ( CommandOption( "-r", ), - 1378..1380, + 1379..1381, ), ( Text( "\"", ), - 1381..1382, + 1382..1383, ), ( Expression( @@ -804,31 +804,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 1383..1387, + 1384..1388, ), ), - 1383..1387, + 1384..1388, ), ), - 1382..1388, + 1383..1389, ), ( Text( "\"", ), - 1388..1389, + 1389..1390, ), ( Text( "+", ), - 1390..1391, + 1391..1392, ), ( Text( "\"", ), - 1391..1392, + 1392..1393, ), ( Expression( @@ -836,25 +836,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "format", - 1393..1399, + 1394..1400, ), ), - 1393..1399, + 1394..1400, ), ), - 1392..1400, + 1393..1401, ), ( Text( "\"", ), - 1400..1401, + 1401..1402, ), ( Text( "$", ), - 1402..1403, + 1403..1404, ), ], [ @@ -862,40 +862,40 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 1403..1404, + 1404..1405, ), ), - 1403..1404, + 1404..1405, ), ], ), - 1357..1404, + 1358..1405, ), ), ), - 1350..1404, + 1351..1405, ), ], ), - 1294..1410, + 1295..1411, ), ), - 1287..1410, + 1288..1411, ), ), - 1287..1410, + 1288..1411, ), ], ), - 1230..1410, + 1231..1411, ), ), ), - 1223..1410, + 1224..1411, ), ], ), - 1047..1412, + 1048..1413, ), ( Statement( @@ -905,13 +905,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Transforms date from a format described by a posix format string to a unix epoch format (seconds since the Epoch (1970-01-01 00:00 UTC)).", ), - 1414..1556, + 1415..1557, ), ), - 1414..1556, + 1415..1557, ), ), - 1414..1556, + 1415..1557, ), ( Statement( @@ -921,13 +921,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "If no format is specified, \"%F %T\" format is used.", ), - 1556..1611, + 1557..1612, ), ), - 1556..1611, + 1557..1612, ), ), - 1556..1611, + 1557..1612, ), ( Statement( @@ -937,66 +937,66 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "For more info about format type \"man date\" on your shell or go to .", ), - 1611..1728, + 1612..1729, ), ), - 1611..1728, + 1612..1729, ), ), - 1611..1728, + 1612..1729, ), ( FunctionDefinition( [ ( AllowAbsurdCast, - 1728..1748, + 1729..1749, ), ], ( true, - 1749..1752, + 1750..1753, ), ( "fun", - 1753..1756, + 1754..1757, ), ( "date_from_posix", - 1757..1772, + 1758..1773, ), [ ( Typed( ( false, - 1773..1773, + 1774..1774, ), ( "date", - 1773..1777, + 1774..1778, ), ( Text, - 1779..1783, + 1780..1784, ), ), - 1773..1783, + 1774..1784, ), ( Optional( ( false, - 1785..1784, + 1786..1785, ), ( "format", - 1785..1791, + 1786..1792, ), Some( ( Text, - 1793..1797, + 1794..1798, ), ), ( @@ -1006,78 +1006,78 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "%", - 1801..1802, + 1802..1803, ), ), - 1801..1802, + 1802..1803, ), ( Text( ( "F", - 1802..1803, + 1803..1804, ), ), - 1802..1803, + 1803..1804, ), ( Text( ( "%", - 1804..1805, + 1805..1806, ), ), - 1804..1805, + 1805..1806, ), ( Text( ( "T", - 1805..1806, + 1806..1807, ), ), - 1805..1806, + 1806..1807, ), ], ), - 1800..1807, + 1801..1808, ), ), - 1785..1807, + 1786..1808, ), ( Optional( ( false, - 1809..1808, + 1810..1809, ), ( "utc", - 1809..1812, + 1810..1813, ), Some( ( Bool, - 1814..1818, + 1815..1819, ), ), ( Boolean( ( false, - 1821..1826, + 1822..1827, ), ), - 1821..1826, + 1822..1827, ), ), - 1809..1826, + 1810..1827, ), ], Some( ( - Num?, - 1829..1833, + Int?, + 1830..1834, ), ), [ @@ -1085,11 +1085,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 1840..1843, + 1841..1844, ), ( "utc_flag", - 1844..1852, + 1845..1853, ), ( Expression( @@ -1099,14 +1099,14 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "utc", - 1855..1858, + 1856..1859, ), ), - 1855..1858, + 1856..1859, ), ( "then", - 1859..1863, + 1860..1864, ), ( Text( @@ -1115,42 +1115,42 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "-", - 1865..1866, + 1866..1867, ), ), - 1865..1866, + 1866..1867, ), ( Text( ( "u", - 1866..1867, + 1867..1868, ), ), - 1866..1867, + 1867..1868, ), ], ), - 1864..1868, + 1865..1869, ), ( "else", - 1869..1873, + 1870..1874, ), ( Text( [], ), - 1874..1876, + 1875..1877, ), ), - 1855..1876, + 1856..1877, ), ), - 1855..1876, + 1856..1877, ), ), - 1840..1876, + 1841..1877, ), ( Comment( @@ -1158,16 +1158,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( "Case if this is a GNU date command", ), - 1881..1919, + 1882..1920, ), ), - 1881..1919, + 1882..1920, ), ( Return( ( "return", - 1923..1929, + 1924..1930, ), Some( ( @@ -1180,13 +1180,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 1930..1931, + 1931..1932, ), ( Text( "date", ), - 1932..1936, + 1933..1937, ), ( Expression( @@ -1194,55 +1194,55 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "utc_flag", - 1938..1946, + 1939..1947, ), ), - 1938..1946, + 1939..1947, ), ), - 1937..1947, + 1938..1948, ), ( CommandOption( "-d", ), - 1948..1950, + 1949..1951, ), ( Text( "\"", ), - 1951..1952, + 1952..1953, ), ( Escape( "$", ), - 1952..1954, + 1953..1955, ), ( Text( "(", ), - 1954..1955, + 1955..1956, ), ( Text( "date", ), - 1955..1959, + 1956..1960, ), ( CommandOption( "-d", ), - 1960..1962, + 1961..1963, ), ( Text( "\"", ), - 1963..1964, + 1964..1965, ), ( Expression( @@ -1250,31 +1250,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 1965..1969, + 1966..1970, ), ), - 1965..1969, + 1966..1970, ), ), - 1964..1970, + 1965..1971, ), ( Text( "\"", ), - 1970..1971, + 1971..1972, ), ( Text( "+", ), - 1972..1973, + 1973..1974, ), ( Text( "\"", ), - 1973..1974, + 1974..1975, ), ( Expression( @@ -1282,127 +1282,127 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "format", - 1975..1981, + 1976..1982, ), ), - 1975..1981, + 1976..1982, ), ), - 1974..1982, + 1975..1983, ), ( Text( "\"", ), - 1982..1983, + 1983..1984, ), ( Text( "2", ), - 1984..1985, + 1985..1986, ), ( Text( ">", ), - 1985..1986, + 1986..1987, ), ( Text( "/", ), - 1986..1987, + 1987..1988, ), ( Text( "dev", ), - 1987..1990, + 1988..1991, ), ( Text( "/", ), - 1990..1991, + 1991..1992, ), ( Text( "null", ), - 1991..1995, + 1992..1996, ), ( Text( ")", ), - 1995..1996, + 1996..1997, ), ( Text( "\"", ), - 1996..1997, + 1997..1998, ), ( Text( "+", ), - 1998..1999, + 1999..2000, ), ( Text( "%", ), - 1999..2000, + 2000..2001, ), ( Text( "s", ), - 2000..2001, + 2001..2002, ), ( Text( "2", ), - 2002..2003, + 2003..2004, ), ( Text( ">", ), - 2003..2004, + 2004..2005, ), ( Text( "/", ), - 2004..2005, + 2005..2006, ), ( Text( "dev", ), - 2005..2008, + 2006..2009, ), ( Text( "/", ), - 2008..2009, + 2009..2010, ), ( Text( "null", ), - 2009..2013, + 2010..2014, ), ( Text( "$", ), - 2014..2015, + 2015..2016, ), ], [ @@ -1412,7 +1412,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Handle( ( "failed", - 2016..2022, + 2017..2023, ), None, ( @@ -1425,16 +1425,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( "Case if this is a BSD date command", ), - 2033..2071, + 2034..2072, ), ), - 2033..2071, + 2034..2072, ), ( Return( ( "return", - 2079..2085, + 2080..2086, ), Some( ( @@ -1447,13 +1447,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 2086..2087, + 2087..2088, ), ( Text( "date", ), - 2088..2092, + 2089..2093, ), ( Expression( @@ -1461,31 +1461,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "utc_flag", - 2094..2102, + 2095..2103, ), ), - 2094..2102, + 2095..2103, ), ), - 2093..2103, + 2094..2104, ), ( CommandOption( "-j", ), - 2104..2106, + 2105..2107, ), ( CommandOption( "-f", ), - 2107..2109, + 2108..2110, ), ( Text( "\"", ), - 2110..2111, + 2111..2112, ), ( Expression( @@ -1493,25 +1493,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "format", - 2112..2118, + 2113..2119, ), ), - 2112..2118, + 2113..2119, ), ), - 2111..2119, + 2112..2120, ), ( Text( "\"", ), - 2119..2120, + 2120..2121, ), ( Text( "\"", ), - 2121..2122, + 2122..2123, ), ( Expression( @@ -1519,43 +1519,43 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 2123..2127, + 2124..2128, ), ), - 2123..2127, + 2124..2128, ), ), - 2122..2128, + 2123..2129, ), ( Text( "\"", ), - 2128..2129, + 2129..2130, ), ( Text( "+", ), - 2130..2131, + 2131..2132, ), ( Text( "%", ), - 2131..2132, + 2132..2133, ), ( Text( "s", ), - 2132..2133, + 2133..2134, ), ( Text( "$", ), - 2134..2135, + 2135..2136, ), ], [ @@ -1563,62 +1563,62 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 2135..2136, + 2136..2137, ), ), - 2135..2136, + 2136..2137, ), ], ), - 2086..2136, + 2087..2137, ), ( "as", - 2137..2139, + 2138..2140, ), ( - Num, - 2140..2143, + Int, + 2141..2144, ), ), - 2086..2143, + 2087..2144, ), ), ), - 2079..2143, + 2080..2144, ), ], ), - 2023..2149, + 2024..2150, ), ), - 2016..2149, + 2017..2150, ), ), - 2016..2149, + 2017..2150, ), ], ), - 1930..2149, + 1931..2150, ), ( "as", - 2150..2152, + 2151..2153, ), ( - Num, - 2153..2156, + Int, + 2154..2157, ), ), - 1930..2156, + 1931..2157, ), ), ), - 1923..2156, + 1924..2157, ), ], ), - 1728..2158, + 1729..2159, ), ( Statement( @@ -1628,39 +1628,39 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Returns the current timestamp (seconds since the Epoch (1970-01-01 00:00 UTC)).", ), - 2160..2244, + 2161..2245, ), ), - 2160..2244, + 2161..2245, ), ), - 2160..2244, + 2161..2245, ), ( FunctionDefinition( [ ( AllowAbsurdCast, - 2244..2264, + 2245..2265, ), ], ( true, - 2265..2268, + 2266..2269, ), ( "fun", - 2269..2272, + 2270..2273, ), ( "date_now", - 2273..2281, + 2274..2282, ), [], Some( ( - Num, - 2285..2288, + Int, + 2286..2289, ), ), [ @@ -1668,7 +1668,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 2295..2301, + 2296..2302, ), Some( ( @@ -1678,7 +1678,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) [ ( Trust, - 2302..2307, + 2303..2308, ), ], [ @@ -1686,61 +1686,61 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 2308..2309, + 2309..2310, ), ( Text( "date", ), - 2310..2314, + 2311..2315, ), ( Text( "+", ), - 2315..2316, + 2316..2317, ), ( Text( "%", ), - 2316..2317, + 2317..2318, ), ( Text( "s", ), - 2317..2318, + 2318..2319, ), ( Text( "$", ), - 2319..2320, + 2320..2321, ), ], [], ), - 2302..2320, + 2303..2321, ), ( "as", - 2321..2323, + 2322..2324, ), ( - Num, - 2324..2327, + Int, + 2325..2328, ), ), - 2302..2327, + 2303..2328, ), ), ), - 2295..2327, + 2296..2328, ), ], ), - 2244..2329, + 2245..2330, ), ( Statement( @@ -1748,15 +1748,15 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "Adds a value to a date passed in the unix epoch format in miliseconds.", + "Adds a value to a date passed in the unix epoch format in milliseconds.", ), - 2331..2406, + 2332..2408, ), ), - 2331..2406, + 2332..2408, ), ), - 2331..2406, + 2332..2408, ), ( Statement( @@ -1766,13 +1766,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Example : `date_add(date, 3, \"days\")`", ), - 2406..2448, + 2408..2450, ), ), - 2406..2448, + 2408..2450, ), ), - 2406..2448, + 2408..2450, ), ( Statement( @@ -1782,13 +1782,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "", ), - 2448..2452, + 2450..2454, ), ), - 2448..2452, + 2450..2454, ), ), - 2448..2452, + 2450..2454, ), ( Statement( @@ -1798,13 +1798,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Available units:", ), - 2452..2473, + 2454..2475, ), ), - 2452..2473, + 2454..2475, ), ), - 2452..2473, + 2454..2475, ), ( Statement( @@ -1814,13 +1814,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- years", ), - 2473..2485, + 2475..2487, ), ), - 2473..2485, + 2475..2487, ), ), - 2473..2485, + 2475..2487, ), ( Statement( @@ -1830,13 +1830,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- months", ), - 2485..2498, + 2487..2500, ), ), - 2485..2498, + 2487..2500, ), ), - 2485..2498, + 2487..2500, ), ( Statement( @@ -1846,13 +1846,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- days", ), - 2498..2509, + 2500..2511, ), ), - 2498..2509, + 2500..2511, ), ), - 2498..2509, + 2500..2511, ), ( Statement( @@ -1862,13 +1862,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- hours", ), - 2509..2521, + 2511..2523, ), ), - 2509..2521, + 2511..2523, ), ), - 2509..2521, + 2511..2523, ), ( Statement( @@ -1878,13 +1878,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- minutes", ), - 2521..2535, + 2523..2537, ), ), - 2521..2535, + 2523..2537, ), ), - 2521..2535, + 2523..2537, ), ( Statement( @@ -1894,86 +1894,86 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- seconds", ), - 2535..2549, + 2537..2551, ), ), - 2535..2549, + 2537..2551, ), ), - 2535..2549, + 2537..2551, ), ( FunctionDefinition( [], ( true, - 2549..2552, + 2551..2554, ), ( "fun", - 2553..2556, + 2555..2558, ), ( "date_add", - 2557..2565, + 2559..2567, ), [ ( Typed( ( false, - 2566..2566, + 2568..2568, ), ( "date", - 2566..2570, + 2568..2572, ), ( - Num, - 2572..2575, + Int, + 2574..2577, ), ), - 2566..2575, + 2568..2577, ), ( Typed( ( false, - 2577..2576, + 2579..2578, ), ( "amount", - 2577..2583, + 2579..2585, ), ( - Num, - 2585..2588, + Int, + 2587..2590, ), ), - 2577..2588, + 2579..2590, ), ( Typed( ( false, - 2590..2589, + 2592..2591, ), ( "unit", - 2590..2594, + 2592..2596, ), ( Text, - 2596..2600, + 2598..2602, ), ), - 2590..2600, + 2592..2602, ), ], Some( ( - Num?, - 2603..2607, + Int?, + 2605..2609, ), ), [ @@ -1981,7 +1981,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfChain( ( "if", - 2614..2616, + 2616..2618, ), [ ( @@ -1994,10 +1994,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 2627..2631, + 2629..2633, ), ), - 2627..2631, + 2629..2633, ), ( Text( @@ -2006,17 +2006,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "years", - 2636..2641, + 2638..2643, ), ), - 2636..2641, + 2638..2643, ), ], ), - 2635..2642, + 2637..2644, ), ), - 2627..2642, + 2629..2644, ), ( Singleline( @@ -2024,7 +2024,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 2644..2650, + 2646..2652, ), Some( ( @@ -2033,10 +2033,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 2651..2655, + 2653..2657, ), ), - 2651..2655, + 2653..2657, ), ( Multiply( @@ -2050,74 +2050,74 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 2658..2664, + 2660..2666, ), ), - 2658..2664, + 2660..2666, ), ( Int( ( 365, - 2667..2670, + 2669..2672, ), ), - 2667..2670, + 2669..2672, ), ), - 2658..2670, + 2660..2672, ), ( Int( ( 24, - 2673..2675, + 2675..2677, ), ), - 2673..2675, + 2675..2677, ), ), - 2658..2675, + 2660..2677, ), ( Int( ( 60, - 2678..2680, + 2680..2682, ), ), - 2678..2680, + 2680..2682, ), ), - 2658..2680, + 2660..2682, ), ( Int( ( 60, - 2683..2685, + 2685..2687, ), ), - 2683..2685, + 2685..2687, ), ), - 2658..2685, + 2660..2687, ), ), - 2651..2685, + 2653..2687, ), ), ), - 2644..2685, + 2646..2687, ), ), - 2642..2685, + 2644..2687, ), ), - 2627..2685, + 2629..2687, ), ), - 2627..2685, + 2629..2687, ), ( IfCondition( @@ -2129,10 +2129,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 2694..2698, + 2696..2700, ), ), - 2694..2698, + 2696..2700, ), ( Text( @@ -2141,17 +2141,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "months", - 2703..2709, + 2705..2711, ), ), - 2703..2709, + 2705..2711, ), ], ), - 2702..2710, + 2704..2712, ), ), - 2694..2710, + 2696..2712, ), ( Singleline( @@ -2159,7 +2159,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 2712..2718, + 2714..2720, ), Some( ( @@ -2168,10 +2168,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 2719..2723, + 2721..2725, ), ), - 2719..2723, + 2721..2725, ), ( Multiply( @@ -2185,74 +2185,74 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 2726..2732, + 2728..2734, ), ), - 2726..2732, + 2728..2734, ), ( Int( ( 30, - 2735..2737, + 2737..2739, ), ), - 2735..2737, + 2737..2739, ), ), - 2726..2737, + 2728..2739, ), ( Int( ( 24, - 2740..2742, + 2742..2744, ), ), - 2740..2742, + 2742..2744, ), ), - 2726..2742, + 2728..2744, ), ( Int( ( 60, - 2745..2747, + 2747..2749, ), ), - 2745..2747, + 2747..2749, ), ), - 2726..2747, + 2728..2749, ), ( Int( ( 60, - 2750..2752, + 2752..2754, ), ), - 2750..2752, + 2752..2754, ), ), - 2726..2752, + 2728..2754, ), ), - 2719..2752, + 2721..2754, ), ), ), - 2712..2752, + 2714..2754, ), ), - 2710..2752, + 2712..2754, ), ), - 2694..2752, + 2696..2754, ), ), - 2694..2752, + 2696..2754, ), ( IfCondition( @@ -2264,10 +2264,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 2761..2765, + 2763..2767, ), ), - 2761..2765, + 2763..2767, ), ( Text( @@ -2276,17 +2276,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "days", - 2770..2774, + 2772..2776, ), ), - 2770..2774, + 2772..2776, ), ], ), - 2769..2775, + 2771..2777, ), ), - 2761..2775, + 2763..2777, ), ( Singleline( @@ -2294,7 +2294,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 2777..2783, + 2779..2785, ), Some( ( @@ -2303,10 +2303,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 2784..2788, + 2786..2790, ), ), - 2784..2788, + 2786..2790, ), ( Multiply( @@ -2318,62 +2318,62 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 2791..2797, + 2793..2799, ), ), - 2791..2797, + 2793..2799, ), ( Int( ( 24, - 2800..2802, + 2802..2804, ), ), - 2800..2802, + 2802..2804, ), ), - 2791..2802, + 2793..2804, ), ( Int( ( 60, - 2805..2807, + 2807..2809, ), ), - 2805..2807, + 2807..2809, ), ), - 2791..2807, + 2793..2809, ), ( Int( ( 60, - 2810..2812, + 2812..2814, ), ), - 2810..2812, + 2812..2814, ), ), - 2791..2812, + 2793..2814, ), ), - 2784..2812, + 2786..2814, ), ), ), - 2777..2812, + 2779..2814, ), ), - 2775..2812, + 2777..2814, ), ), - 2761..2812, + 2763..2814, ), ), - 2761..2812, + 2763..2814, ), ( IfCondition( @@ -2385,10 +2385,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 2821..2825, + 2823..2827, ), ), - 2821..2825, + 2823..2827, ), ( Text( @@ -2397,17 +2397,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "hours", - 2830..2835, + 2832..2837, ), ), - 2830..2835, + 2832..2837, ), ], ), - 2829..2836, + 2831..2838, ), ), - 2821..2836, + 2823..2838, ), ( Singleline( @@ -2415,7 +2415,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 2838..2844, + 2840..2846, ), Some( ( @@ -2424,10 +2424,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 2845..2849, + 2847..2851, ), ), - 2845..2849, + 2847..2851, ), ( Multiply( @@ -2437,50 +2437,50 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 2852..2858, + 2854..2860, ), ), - 2852..2858, + 2854..2860, ), ( Int( ( 60, - 2861..2863, + 2863..2865, ), ), - 2861..2863, + 2863..2865, ), ), - 2852..2863, + 2854..2865, ), ( Int( ( 60, - 2866..2868, + 2868..2870, ), ), - 2866..2868, + 2868..2870, ), ), - 2852..2868, + 2854..2870, ), ), - 2845..2868, + 2847..2870, ), ), ), - 2838..2868, + 2840..2870, ), ), - 2836..2868, + 2838..2870, ), ), - 2821..2868, + 2823..2870, ), ), - 2821..2868, + 2823..2870, ), ( IfCondition( @@ -2492,10 +2492,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 2877..2881, + 2879..2883, ), ), - 2877..2881, + 2879..2883, ), ( Text( @@ -2504,17 +2504,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "minutes", - 2886..2893, + 2888..2895, ), ), - 2886..2893, + 2888..2895, ), ], ), - 2885..2894, + 2887..2896, ), ), - 2877..2894, + 2879..2896, ), ( Singleline( @@ -2522,7 +2522,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 2896..2902, + 2898..2904, ), Some( ( @@ -2531,10 +2531,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 2903..2907, + 2905..2909, ), ), - 2903..2907, + 2905..2909, ), ( Multiply( @@ -2542,38 +2542,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 2910..2916, + 2912..2918, ), ), - 2910..2916, + 2912..2918, ), ( Int( ( 60, - 2919..2921, + 2921..2923, ), ), - 2919..2921, + 2921..2923, ), ), - 2910..2921, + 2912..2923, ), ), - 2903..2921, + 2905..2923, ), ), ), - 2896..2921, + 2898..2923, ), ), - 2894..2921, + 2896..2923, ), ), - 2877..2921, + 2879..2923, ), ), - 2877..2921, + 2879..2923, ), ( IfCondition( @@ -2585,10 +2585,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 2930..2934, + 2932..2936, ), ), - 2930..2934, + 2932..2936, ), ( Text( @@ -2597,17 +2597,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "seconds", - 2939..2946, + 2941..2948, ), ), - 2939..2946, + 2941..2948, ), ], ), - 2938..2947, + 2940..2949, ), ), - 2930..2947, + 2932..2949, ), ( Singleline( @@ -2615,7 +2615,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 2949..2955, + 2951..2957, ), Some( ( @@ -2624,35 +2624,35 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 2956..2960, + 2958..2962, ), ), - 2956..2960, + 2958..2962, ), ( Var( ( "amount", - 2963..2969, + 2965..2971, ), ), - 2963..2969, + 2965..2971, ), ), - 2956..2969, + 2958..2971, ), ), ), - 2949..2969, + 2951..2971, ), ), - 2947..2969, + 2949..2971, ), ), - 2930..2969, + 2932..2971, ), ), - 2930..2969, + 2932..2971, ), ( Else( @@ -2660,7 +2660,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Else( ( "else", - 2978..2982, + 2980..2984, ), ( Singleline( @@ -2668,38 +2668,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) Fail( ( "fail", - 2984..2988, + 2986..2990, ), Some( ( Int( ( 1, - 2989..2990, + 2991..2992, ), ), - 2989..2990, + 2991..2992, ), ), ), - 2984..2990, + 2986..2992, ), ), - 2982..2990, + 2984..2992, ), ), - 2978..2990, + 2980..2992, ), ), - 2978..2990, + 2980..2992, ), ], ), - 2614..2996, + 2616..2998, ), ], ), - 2549..2998, + 2551..3000, ), ( Statement( @@ -2707,15 +2707,15 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "Subtracts a value from a date passed in the unix epoch format in miliseconds.", + "Subtracts a value from a date passed in the unix epoch format in milliseconds.", ), - 3000..3082, + 3002..3085, ), ), - 3000..3082, + 3002..3085, ), ), - 3000..3082, + 3002..3085, ), ( Statement( @@ -2725,13 +2725,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Example : `date_sub(date, 5, \"hours\")`", ), - 3082..3125, + 3085..3128, ), ), - 3082..3125, + 3085..3128, ), ), - 3082..3125, + 3085..3128, ), ( Statement( @@ -2741,13 +2741,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "", ), - 3125..3129, + 3128..3132, ), ), - 3125..3129, + 3128..3132, ), ), - 3125..3129, + 3128..3132, ), ( Statement( @@ -2757,13 +2757,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Available units:", ), - 3129..3150, + 3132..3153, ), ), - 3129..3150, + 3132..3153, ), ), - 3129..3150, + 3132..3153, ), ( Statement( @@ -2773,13 +2773,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- years", ), - 3150..3162, + 3153..3165, ), ), - 3150..3162, + 3153..3165, ), ), - 3150..3162, + 3153..3165, ), ( Statement( @@ -2789,13 +2789,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- months", ), - 3162..3175, + 3165..3178, ), ), - 3162..3175, + 3165..3178, ), ), - 3162..3175, + 3165..3178, ), ( Statement( @@ -2805,13 +2805,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- days", ), - 3175..3186, + 3178..3189, ), ), - 3175..3186, + 3178..3189, ), ), - 3175..3186, + 3178..3189, ), ( Statement( @@ -2821,13 +2821,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- hours", ), - 3186..3198, + 3189..3201, ), ), - 3186..3198, + 3189..3201, ), ), - 3186..3198, + 3189..3201, ), ( Statement( @@ -2837,13 +2837,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- minutes", ), - 3198..3212, + 3201..3215, ), ), - 3198..3212, + 3201..3215, ), ), - 3198..3212, + 3201..3215, ), ( Statement( @@ -2853,86 +2853,86 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "- seconds", ), - 3212..3226, + 3215..3229, ), ), - 3212..3226, + 3215..3229, ), ), - 3212..3226, + 3215..3229, ), ( FunctionDefinition( [], ( true, - 3226..3229, + 3229..3232, ), ( "fun", - 3230..3233, + 3233..3236, ), ( "date_sub", - 3234..3242, + 3237..3245, ), [ ( Typed( ( false, - 3243..3243, + 3246..3246, ), ( "date", - 3243..3247, + 3246..3250, ), ( - Num, - 3249..3252, + Int, + 3252..3255, ), ), - 3243..3252, + 3246..3255, ), ( Typed( ( false, - 3254..3253, + 3257..3256, ), ( "amount", - 3254..3260, + 3257..3263, ), ( - Num, - 3262..3265, + Int, + 3265..3268, ), ), - 3254..3265, + 3257..3268, ), ( Typed( ( false, - 3267..3266, + 3270..3269, ), ( "unit", - 3267..3271, + 3270..3274, ), ( Text, - 3273..3277, + 3276..3280, ), ), - 3267..3277, + 3270..3280, ), ], Some( ( - Num?, - 3280..3284, + Int?, + 3283..3287, ), ), [ @@ -2940,7 +2940,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfChain( ( "if", - 3291..3293, + 3294..3296, ), [ ( @@ -2953,10 +2953,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 3304..3308, + 3307..3311, ), ), - 3304..3308, + 3307..3311, ), ( Text( @@ -2965,17 +2965,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "years", - 3313..3318, + 3316..3321, ), ), - 3313..3318, + 3316..3321, ), ], ), - 3312..3319, + 3315..3322, ), ), - 3304..3319, + 3307..3322, ), ( Singleline( @@ -2983,7 +2983,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 3321..3327, + 3324..3330, ), Some( ( @@ -2992,10 +2992,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 3328..3332, + 3331..3335, ), ), - 3328..3332, + 3331..3335, ), ( Multiply( @@ -3009,74 +3009,74 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 3335..3341, + 3338..3344, ), ), - 3335..3341, + 3338..3344, ), ( Int( ( 365, - 3344..3347, + 3347..3350, ), ), - 3344..3347, + 3347..3350, ), ), - 3335..3347, + 3338..3350, ), ( Int( ( 24, - 3350..3352, + 3353..3355, ), ), - 3350..3352, + 3353..3355, ), ), - 3335..3352, + 3338..3355, ), ( Int( ( 60, - 3355..3357, + 3358..3360, ), ), - 3355..3357, + 3358..3360, ), ), - 3335..3357, + 3338..3360, ), ( Int( ( 60, - 3360..3362, + 3363..3365, ), ), - 3360..3362, + 3363..3365, ), ), - 3335..3362, + 3338..3365, ), ), - 3328..3362, + 3331..3365, ), ), ), - 3321..3362, + 3324..3365, ), ), - 3319..3362, + 3322..3365, ), ), - 3304..3362, + 3307..3365, ), ), - 3304..3362, + 3307..3365, ), ( IfCondition( @@ -3088,10 +3088,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 3371..3375, + 3374..3378, ), ), - 3371..3375, + 3374..3378, ), ( Text( @@ -3100,17 +3100,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "months", - 3380..3386, + 3383..3389, ), ), - 3380..3386, + 3383..3389, ), ], ), - 3379..3387, + 3382..3390, ), ), - 3371..3387, + 3374..3390, ), ( Singleline( @@ -3118,7 +3118,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 3389..3395, + 3392..3398, ), Some( ( @@ -3127,10 +3127,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 3396..3400, + 3399..3403, ), ), - 3396..3400, + 3399..3403, ), ( Multiply( @@ -3144,74 +3144,74 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 3403..3409, + 3406..3412, ), ), - 3403..3409, + 3406..3412, ), ( Int( ( 30, - 3412..3414, + 3415..3417, ), ), - 3412..3414, + 3415..3417, ), ), - 3403..3414, + 3406..3417, ), ( Int( ( 24, - 3417..3419, + 3420..3422, ), ), - 3417..3419, + 3420..3422, ), ), - 3403..3419, + 3406..3422, ), ( Int( ( 60, - 3422..3424, + 3425..3427, ), ), - 3422..3424, + 3425..3427, ), ), - 3403..3424, + 3406..3427, ), ( Int( ( 60, - 3427..3429, + 3430..3432, ), ), - 3427..3429, + 3430..3432, ), ), - 3403..3429, + 3406..3432, ), ), - 3396..3429, + 3399..3432, ), ), ), - 3389..3429, + 3392..3432, ), ), - 3387..3429, + 3390..3432, ), ), - 3371..3429, + 3374..3432, ), ), - 3371..3429, + 3374..3432, ), ( IfCondition( @@ -3223,10 +3223,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 3438..3442, + 3441..3445, ), ), - 3438..3442, + 3441..3445, ), ( Text( @@ -3235,17 +3235,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "days", - 3447..3451, + 3450..3454, ), ), - 3447..3451, + 3450..3454, ), ], ), - 3446..3452, + 3449..3455, ), ), - 3438..3452, + 3441..3455, ), ( Singleline( @@ -3253,7 +3253,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 3454..3460, + 3457..3463, ), Some( ( @@ -3262,10 +3262,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 3461..3465, + 3464..3468, ), ), - 3461..3465, + 3464..3468, ), ( Multiply( @@ -3277,62 +3277,62 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 3468..3474, + 3471..3477, ), ), - 3468..3474, + 3471..3477, ), ( Int( ( 24, - 3477..3479, + 3480..3482, ), ), - 3477..3479, + 3480..3482, ), ), - 3468..3479, + 3471..3482, ), ( Int( ( 60, - 3482..3484, + 3485..3487, ), ), - 3482..3484, + 3485..3487, ), ), - 3468..3484, + 3471..3487, ), ( Int( ( 60, - 3487..3489, + 3490..3492, ), ), - 3487..3489, + 3490..3492, ), ), - 3468..3489, + 3471..3492, ), ), - 3461..3489, + 3464..3492, ), ), ), - 3454..3489, + 3457..3492, ), ), - 3452..3489, + 3455..3492, ), ), - 3438..3489, + 3441..3492, ), ), - 3438..3489, + 3441..3492, ), ( IfCondition( @@ -3344,10 +3344,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 3498..3502, + 3501..3505, ), ), - 3498..3502, + 3501..3505, ), ( Text( @@ -3356,17 +3356,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "hours", - 3507..3512, + 3510..3515, ), ), - 3507..3512, + 3510..3515, ), ], ), - 3506..3513, + 3509..3516, ), ), - 3498..3513, + 3501..3516, ), ( Singleline( @@ -3374,7 +3374,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 3515..3521, + 3518..3524, ), Some( ( @@ -3383,10 +3383,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 3522..3526, + 3525..3529, ), ), - 3522..3526, + 3525..3529, ), ( Multiply( @@ -3396,50 +3396,50 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 3529..3535, + 3532..3538, ), ), - 3529..3535, + 3532..3538, ), ( Int( ( 60, - 3538..3540, + 3541..3543, ), ), - 3538..3540, + 3541..3543, ), ), - 3529..3540, + 3532..3543, ), ( Int( ( 60, - 3543..3545, + 3546..3548, ), ), - 3543..3545, + 3546..3548, ), ), - 3529..3545, + 3532..3548, ), ), - 3522..3545, + 3525..3548, ), ), ), - 3515..3545, + 3518..3548, ), ), - 3513..3545, + 3516..3548, ), ), - 3498..3545, + 3501..3548, ), ), - 3498..3545, + 3501..3548, ), ( IfCondition( @@ -3451,10 +3451,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 3554..3558, + 3557..3561, ), ), - 3554..3558, + 3557..3561, ), ( Text( @@ -3463,17 +3463,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "minutes", - 3563..3570, + 3566..3573, ), ), - 3563..3570, + 3566..3573, ), ], ), - 3562..3571, + 3565..3574, ), ), - 3554..3571, + 3557..3574, ), ( Singleline( @@ -3481,7 +3481,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 3573..3579, + 3576..3582, ), Some( ( @@ -3490,10 +3490,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 3580..3584, + 3583..3587, ), ), - 3580..3584, + 3583..3587, ), ( Multiply( @@ -3501,38 +3501,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "amount", - 3587..3593, + 3590..3596, ), ), - 3587..3593, + 3590..3596, ), ( Int( ( 60, - 3596..3598, + 3599..3601, ), ), - 3596..3598, + 3599..3601, ), ), - 3587..3598, + 3590..3601, ), ), - 3580..3598, + 3583..3601, ), ), ), - 3573..3598, + 3576..3601, ), ), - 3571..3598, + 3574..3601, ), ), - 3554..3598, + 3557..3601, ), ), - 3554..3598, + 3557..3601, ), ( IfCondition( @@ -3544,10 +3544,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "unit", - 3607..3611, + 3610..3614, ), ), - 3607..3611, + 3610..3614, ), ( Text( @@ -3556,17 +3556,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "seconds", - 3616..3623, + 3619..3626, ), ), - 3616..3623, + 3619..3626, ), ], ), - 3615..3624, + 3618..3627, ), ), - 3607..3624, + 3610..3627, ), ( Singleline( @@ -3574,7 +3574,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 3626..3632, + 3629..3635, ), Some( ( @@ -3583,35 +3583,35 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "date", - 3633..3637, + 3636..3640, ), ), - 3633..3637, + 3636..3640, ), ( Var( ( "amount", - 3640..3646, + 3643..3649, ), ), - 3640..3646, + 3643..3649, ), ), - 3633..3646, + 3636..3649, ), ), ), - 3626..3646, + 3629..3649, ), ), - 3624..3646, + 3627..3649, ), ), - 3607..3646, + 3610..3649, ), ), - 3607..3646, + 3610..3649, ), ( Else( @@ -3619,7 +3619,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Else( ( "else", - 3655..3659, + 3658..3662, ), ( Singleline( @@ -3627,37 +3627,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Fail( ( "fail", - 3661..3665, + 3664..3668, ), Some( ( Int( ( 1, - 3666..3667, + 3669..3670, ), ), - 3666..3667, + 3669..3670, ), ), ), - 3661..3667, + 3664..3670, ), ), - 3659..3667, + 3662..3670, ), ), - 3655..3667, + 3658..3670, ), ), - 3655..3667, + 3658..3670, ), ], ), - 3291..3673, + 3294..3676, ), ], ), - 3226..3675, + 3229..3678, ), ] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap index fa54f2c..cbc8e8a 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap @@ -4380,7 +4380,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3456..3461, ), ( - Num, + Int, 3463..3466, ), ), @@ -4397,7 +4397,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3468..3470, ), ( - Num, + Int, 3472..3475, ), ), @@ -4414,7 +4414,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3477..3479, ), ( - Num, + Int, 3481..3484, ), ), @@ -5131,7 +5131,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3992..3997, ), ( - Num, + Int, 3999..4002, ), ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap index 2b46bfa..f21ad0f 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap @@ -84,7 +84,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), [ ( - Generic( + Typed( ( false, 127..127, @@ -93,41 +93,55 @@ expression: parse_unwrap(&tokenize(&stdlib)) "path", 127..131, ), + ( + Text, + 133..137, + ), ), - 127..131, + 127..137, ), ], - None, + Some( + ( + Bool, + 140..144, + ), + ), [ ( Expression( ( Command( - [], + [ + ( + Trust, + 151..156, + ), + ], [ ( Text( "$", ), - 139..140, + 157..158, ), ( Text( "[", ), - 141..142, + 159..160, ), ( CommandOption( "-d", ), - 143..145, + 161..163, ), ( Text( "\"", ), - 146..147, + 164..165, ), ( Expression( @@ -135,107 +149,72 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 148..152, + 166..170, ), ), - 148..152, + 166..170, ), ), - 147..153, + 165..171, ), ( Text( "\"", ), - 153..154, + 171..172, ), ( Text( "]", ), - 155..156, + 173..174, ), ( Text( "$", ), - 157..158, - ), - ], - [ - ( - Failure( - ( - Handle( - ( - "failed", - 159..165, - ), - None, - ( - Block( - [], - [ - ( - Return( - ( - "return", - 176..182, - ), - Some( - ( - Boolean( - ( - false, - 183..188, - ), - ), - 183..188, - ), - ), - ), - 176..188, - ), - ], - ), - 166..194, - ), - ), - 159..194, - ), - ), - 159..194, + 175..176, ), ], + [], ), - 139..194, + 151..176, ), ), - 139..194, + 151..176, ), ( Return( ( "return", - 199..205, + 181..187, ), Some( ( - Boolean( + Eq( ( - true, - 206..210, + Status, + 188..194, + ), + ( + Int( + ( + 0, + 198..199, + ), + ), + 198..199, ), ), - 206..210, + 188..199, ), ), ), - 199..210, + 181..199, ), ], ), - 108..212, + 108..201, ), ( Statement( @@ -245,75 +224,89 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Checks if a file exists.", ), - 214..243, + 203..232, ), ), - 214..243, + 203..232, ), ), - 214..243, + 203..232, ), ( FunctionDefinition( [], ( true, - 243..246, + 232..235, ), ( "fun", - 247..250, + 236..239, ), ( "file_exists", - 251..262, + 240..251, ), [ ( - Generic( + Typed( ( false, - 263..263, + 252..252, ), ( "path", - 263..267, + 252..256, + ), + ( + Text, + 258..262, ), ), - 263..267, + 252..262, ), ], - None, + Some( + ( + Bool, + 265..269, + ), + ), [ ( Expression( ( Command( - [], + [ + ( + Trust, + 276..281, + ), + ], [ ( Text( "$", ), - 275..276, + 282..283, ), ( Text( "[", ), - 277..278, + 284..285, ), ( CommandOption( "-f", ), - 279..281, + 286..288, ), ( Text( "\"", ), - 282..283, + 289..290, ), ( Expression( @@ -321,107 +314,72 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 284..288, + 291..295, ), ), - 284..288, + 291..295, ), ), - 283..289, + 290..296, ), ( Text( "\"", ), - 289..290, + 296..297, ), ( Text( "]", ), - 291..292, + 298..299, ), ( Text( "$", ), - 293..294, - ), - ], - [ - ( - Failure( - ( - Handle( - ( - "failed", - 295..301, - ), - None, - ( - Block( - [], - [ - ( - Return( - ( - "return", - 312..318, - ), - Some( - ( - Boolean( - ( - false, - 319..324, - ), - ), - 319..324, - ), - ), - ), - 312..324, - ), - ], - ), - 302..330, - ), - ), - 295..330, - ), - ), - 295..330, + 300..301, ), ], + [], ), - 275..330, + 276..301, ), ), - 275..330, + 276..301, ), ( Return( ( "return", - 335..341, + 306..312, ), Some( ( - Boolean( + Eq( + ( + Status, + 313..319, + ), ( - true, - 342..346, + Int( + ( + 0, + 323..324, + ), + ), + 323..324, ), ), - 342..346, + 313..324, ), ), ), - 335..346, + 306..324, ), ], ), - 243..348, + 232..326, ), ( Statement( @@ -431,51 +389,60 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Gets file contents from a path.", ), - 350..386, + 328..364, ), ), - 350..386, + 328..364, ), ), - 350..386, + 328..364, ), ( FunctionDefinition( [], ( true, - 386..389, + 364..367, ), ( "fun", - 390..393, + 368..371, ), ( "file_read", - 394..403, + 372..381, ), [ ( - Generic( + Typed( ( false, - 404..404, + 382..382, ), ( "path", - 404..408, + 382..386, + ), + ( + Text, + 388..392, ), ), - 404..408, + 382..392, ), ], - None, + Some( + ( + Text?, + 395..400, + ), + ), [ ( Return( ( "return", - 416..422, + 407..413, ), Some( ( @@ -486,19 +453,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 423..424, + 414..415, ), ( Text( "<", ), - 425..426, + 416..417, ), ( Text( "\"", ), - 427..428, + 418..419, ), ( Expression( @@ -506,25 +473,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 429..433, + 420..424, ), ), - 429..433, + 420..424, ), ), - 428..434, + 419..425, ), ( Text( "\"", ), - 434..435, + 425..426, ), ( Text( "$", ), - 436..437, + 427..428, ), ], [ @@ -532,22 +499,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 437..438, + 428..429, ), ), - 437..438, + 428..429, ), ], ), - 423..438, + 414..429, ), ), ), - 416..438, + 407..429, ), ], ), - 386..440, + 364..431, ), ( Statement( @@ -557,13 +524,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Writes content to a file.", ), - 442..472, + 433..463, ), ), - 442..472, + 433..463, ), ), - 442..472, + 433..463, ), ( Statement( @@ -573,64 +540,77 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Doesn't check if the file exist", ), - 472..508, + 463..499, ), ), - 472..508, + 463..499, ), ), - 472..508, + 463..499, ), ( FunctionDefinition( [], ( true, - 508..511, + 499..502, ), ( "fun", - 512..515, + 503..506, ), ( "file_write", - 516..526, + 507..517, ), [ ( - Generic( + Typed( ( false, - 527..527, + 518..518, ), ( "path", - 527..531, + 518..522, + ), + ( + Text, + 524..528, ), ), - 527..531, + 518..528, ), ( - Generic( + Typed( ( false, - 533..532, + 530..529, ), ( "content", - 533..540, + 530..537, + ), + ( + Text, + 539..543, ), ), - 533..540, + 530..543, ), ], - None, + Some( + ( + Text?, + 546..551, + ), + ), [ ( Return( ( "return", - 548..554, + 558..564, ), Some( ( @@ -641,19 +621,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 555..556, + 565..566, ), ( Text( "echo", ), - 557..561, + 567..571, ), ( Text( "\"", ), - 562..563, + 572..573, ), ( Expression( @@ -661,31 +641,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "content", - 564..571, + 574..581, ), ), - 564..571, + 574..581, ), ), - 563..572, + 573..582, ), ( Text( "\"", ), - 572..573, + 582..583, ), ( Text( ">", ), - 574..575, + 584..585, ), ( Text( "\"", ), - 576..577, + 586..587, ), ( Expression( @@ -693,25 +673,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 578..582, + 588..592, ), ), - 578..582, + 588..592, ), ), - 577..583, + 587..593, ), ( Text( "\"", ), - 583..584, + 593..594, ), ( Text( "$", ), - 585..586, + 595..596, ), ], [ @@ -719,22 +699,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 586..587, + 596..597, ), ), - 586..587, + 596..597, ), ], ), - 555..587, + 565..597, ), ), ), - 548..587, + 558..597, ), ], ), - 508..589, + 499..599, ), ( Statement( @@ -744,13 +724,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Appends content to a file.", ), - 591..622, + 601..632, ), ), - 591..622, + 601..632, ), ), - 591..622, + 601..632, ), ( Statement( @@ -760,13 +740,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "", ), - 622..626, + 632..636, ), ), - 622..626, + 632..636, ), ), - 622..626, + 632..636, ), ( Statement( @@ -776,64 +756,77 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Doesn't check if the file exists.", ), - 626..664, + 636..674, ), ), - 626..664, + 636..674, ), ), - 626..664, + 636..674, ), ( FunctionDefinition( [], ( true, - 664..667, + 674..677, ), ( "fun", - 668..671, + 678..681, ), ( "file_append", - 672..683, + 682..693, ), [ ( - Generic( + Typed( ( false, - 684..684, + 694..694, ), ( "path", - 684..688, + 694..698, + ), + ( + Text, + 700..704, ), ), - 684..688, + 694..704, ), ( - Generic( + Typed( ( false, - 690..689, + 706..705, ), ( "content", - 690..697, + 706..713, + ), + ( + Text, + 715..719, ), ), - 690..697, + 706..719, ), ], - None, + Some( + ( + Text?, + 722..727, + ), + ), [ ( Return( ( "return", - 705..711, + 734..740, ), Some( ( @@ -844,19 +837,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 712..713, + 741..742, ), ( Text( "echo", ), - 714..718, + 743..747, ), ( Text( "\"", ), - 719..720, + 748..749, ), ( Expression( @@ -864,37 +857,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "content", - 721..728, + 750..757, ), ), - 721..728, + 750..757, ), ), - 720..729, + 749..758, ), ( Text( "\"", ), - 729..730, + 758..759, ), ( Text( ">", ), - 731..732, + 760..761, ), ( Text( ">", ), - 732..733, + 761..762, ), ( Text( "\"", ), - 734..735, + 763..764, ), ( Expression( @@ -902,25 +895,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 736..740, + 765..769, ), ), - 736..740, + 765..769, ), ), - 735..741, + 764..770, ), ( Text( "\"", ), - 741..742, + 770..771, ), ( Text( "$", ), - 743..744, + 772..773, ), ], [ @@ -928,22 +921,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 744..745, + 773..774, ), ), - 744..745, + 773..774, ), ], ), - 712..745, + 741..774, ), ), ), - 705..745, + 734..774, ), ], ), - 664..747, + 674..776, ), ( Statement( @@ -953,13 +946,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Creates a symbolic link.", ), - 749..778, + 778..807, ), ), - 749..778, + 778..807, ), ), - 749..778, + 778..807, ), ( Statement( @@ -969,13 +962,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "", ), - 778..782, + 807..811, ), ), - 778..782, + 807..811, ), ), - 778..782, + 807..811, ), ( Statement( @@ -983,71 +976,71 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "If the file doesn't exist, it returns a boolean and prints a message.", + "If the file doesn't exist, it fails and prints a message.", ), - 782..856, + 811..873, ), ), - 782..856, + 811..873, ), ), - 782..856, + 811..873, ), ( FunctionDefinition( [], ( true, - 856..859, + 873..876, ), ( "fun", - 860..863, + 877..880, ), ( "symlink_create", - 864..878, + 881..895, ), [ ( Typed( ( false, - 879..879, + 896..896, ), ( "origin", - 879..885, + 896..902, ), ( Text, - 887..891, + 904..908, ), ), - 879..891, + 896..908, ), ( Typed( ( false, - 893..892, + 910..909, ), ( "destination", - 893..904, + 910..921, ), ( Text, - 906..910, + 923..927, ), ), - 893..910, + 910..927, ), ], Some( ( - Bool, - 913..917, + Null?, + 930..935, ), ), [ @@ -1055,7 +1048,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfCondition( ( "if", - 924..926, + 942..944, ), ( IfCondition( @@ -1064,22 +1057,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "file_exists", - 927..938, + 945..956, ), [ ( Var( ( "origin", - 939..945, + 957..963, ), ), - 939..945, + 957..963, ), ], [], ), - 927..946, + 945..964, ), ( Block( @@ -1089,36 +1082,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Expression( ( Command( - [ - ( - Trust, - 957..962, - ), - ], + [], [ ( Text( "$", ), - 963..964, + 975..976, ), ( Text( "ln", ), - 965..967, + 977..979, ), ( CommandOption( "-s", ), - 968..970, + 980..982, ), ( Text( "\"", ), - 971..972, + 983..984, ), ( Expression( @@ -1126,25 +1114,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "origin", - 973..979, + 985..991, ), ), - 973..979, + 985..991, ), ), - 972..980, + 984..992, ), ( Text( "\"", ), - 980..981, + 992..993, ), ( Text( "\"", ), - 982..983, + 994..995, ), ( Expression( @@ -1152,71 +1140,76 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "destination", - 984..995, + 996..1007, ), ), - 984..995, + 996..1007, ), ), - 983..996, + 995..1008, ), ( Text( "\"", ), - 996..997, + 1008..1009, ), ( Text( "$", ), - 998..999, + 1010..1011, + ), + ], + [ + ( + Failure( + ( + Propagate, + 1011..1012, + ), + ), + 1011..1012, ), ], - [], ), - 957..999, + 975..1012, ), ), - 957..999, + 975..1012, ), ( Return( ( "return", - 1008..1014, + 1021..1027, ), Some( ( - Boolean( - ( - true, - 1015..1019, - ), - ), - 1015..1019, + Null, + 1028..1032, ), ), ), - 1008..1019, + 1021..1032, ), ], ), - 947..1025, + 965..1038, ), ), - 927..1025, + 945..1038, ), [], None, ), - 924..1025, + 942..1038, ), ( Echo( ( "echo", - 1031..1035, + 1044..1048, ), ( Text( @@ -1225,19 +1218,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "The", - 1037..1040, + 1050..1053, ), ), - 1037..1040, + 1050..1053, ), ( Text( ( "file", - 1041..1045, + 1054..1058, ), ), - 1041..1045, + 1054..1058, ), ( Expression( @@ -1245,71 +1238,71 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "origin", - 1047..1053, + 1060..1066, ), ), - 1047..1053, + 1060..1066, ), ), - 1046..1054, + 1059..1067, ), ( Text( ( "doesn't", - 1055..1062, + 1068..1075, ), ), - 1055..1062, + 1068..1075, ), ( Text( ( "exist", - 1063..1068, + 1076..1081, ), ), - 1063..1068, + 1076..1081, ), ( Text( ( "!", - 1068..1069, + 1081..1082, ), ), - 1068..1069, + 1081..1082, ), ], ), - 1036..1070, + 1049..1083, ), ), - 1031..1070, + 1044..1083, ), ( - Return( + Fail( ( - "return", - 1075..1081, + "fail", + 1088..1092, ), Some( ( - Boolean( + Int( ( - false, - 1082..1087, + 1, + 1093..1094, ), ), - 1082..1087, + 1093..1094, ), ), ), - 1075..1087, + 1088..1094, ), ], ), - 856..1089, + 873..1096, ), ( Statement( @@ -1319,52 +1312,52 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Creates a directory with all parent directories as required.", ), - 1091..1156, + 1098..1163, ), ), - 1091..1156, + 1098..1163, ), ), - 1091..1156, + 1098..1163, ), ( FunctionDefinition( [], ( true, - 1156..1159, + 1163..1166, ), ( "fun", - 1160..1163, + 1167..1170, ), ( "dir_create", - 1164..1174, + 1171..1181, ), [ ( Typed( ( false, - 1175..1175, + 1182..1182, ), ( "path", - 1175..1179, + 1182..1186, ), ( Text, - 1181..1185, + 1188..1192, ), ), - 1175..1185, + 1182..1192, ), ], Some( ( - Null, - 1188..1192, + Null?, + 1195..1200, ), ), [ @@ -1372,7 +1365,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfCondition( ( "if", - 1199..1201, + 1207..1209, ), ( IfCondition( @@ -1380,32 +1373,32 @@ expression: parse_unwrap(&tokenize(&stdlib)) Not( ( "not", - 1202..1205, + 1210..1213, ), ( FunctionInvocation( [], ( "dir_exists", - 1206..1216, + 1214..1224, ), [ ( Var( ( "path", - 1217..1221, + 1225..1229, ), ), - 1217..1221, + 1225..1229, ), ], [], ), - 1206..1222, + 1214..1230, ), ), - 1206..1222, + 1214..1230, ), ( Block( @@ -1415,36 +1408,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Expression( ( Command( - [ - ( - Trust, - 1233..1238, - ), - ], + [], [ ( Text( "$", ), - 1239..1240, + 1241..1242, ), ( Text( "mkdir", ), - 1241..1246, + 1243..1248, ), ( CommandOption( "-p", ), - 1247..1249, + 1249..1251, ), ( Text( "\"", ), - 1250..1251, + 1252..1253, ), ( Expression( @@ -1452,49 +1440,59 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 1252..1256, + 1254..1258, ), ), - 1252..1256, + 1254..1258, ), ), - 1251..1257, + 1253..1259, ), ( Text( "\"", ), - 1257..1258, + 1259..1260, ), ( Text( "$", ), - 1259..1260, + 1261..1262, + ), + ], + [ + ( + Failure( + ( + Propagate, + 1262..1263, + ), + ), + 1262..1263, ), ], - [], ), - 1233..1260, + 1241..1263, ), ), - 1233..1260, + 1241..1263, ), ], ), - 1223..1266, + 1231..1269, ), ), - 1202..1266, + 1210..1269, ), [], None, ), - 1199..1266, + 1207..1269, ), ], ), - 1156..1268, + 1163..1271, ), ( Statement( @@ -1504,34 +1502,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Determine whether mktemp is macOS's.", ), - 1270..1311, + 1273..1314, ), ), - 1270..1311, + 1273..1314, ), ), - 1270..1311, + 1273..1314, ), ( FunctionDefinition( [], ( false, - 1311..1311, + 1314..1314, ), ( "fun", - 1311..1314, + 1314..1317, ), ( "is_mac_os_mktemp", - 1315..1331, + 1318..1334, ), [], Some( ( Bool, - 1335..1339, + 1338..1342, ), ), [ @@ -1541,10 +1539,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( "macOS's mktemp does not have --version", ), - 1346..1388, + 1349..1391, ), ), - 1346..1388, + 1349..1391, ), ( Expression( @@ -1553,7 +1551,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) [ ( Silent, - 1392..1398, + 1395..1401, ), ], [ @@ -1561,25 +1559,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 1399..1400, + 1402..1403, ), ( Text( "mktemp", ), - 1401..1407, + 1404..1410, ), ( CommandOption( "--version", ), - 1408..1417, + 1411..1420, ), ( Text( "$", ), - 1418..1419, + 1421..1422, ), ], [ @@ -1589,7 +1587,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Handle( ( "failed", - 1420..1426, + 1423..1429, ), None, ( @@ -1600,62 +1598,62 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 1437..1443, + 1440..1446, ), Some( ( Boolean( ( true, - 1444..1448, + 1447..1451, ), ), - 1444..1448, + 1447..1451, ), ), ), - 1437..1448, + 1440..1451, ), ], ), - 1427..1454, + 1430..1457, ), ), - 1420..1454, + 1423..1457, ), ), - 1420..1454, + 1423..1457, ), ], ), - 1392..1454, + 1395..1457, ), ), - 1392..1454, + 1395..1457, ), ( Return( ( "return", - 1459..1465, + 1462..1468, ), Some( ( Boolean( ( false, - 1466..1471, + 1469..1474, ), ), - 1466..1471, + 1469..1474, ), ), ), - 1459..1471, + 1462..1474, ), ], ), - 1311..1473, + 1314..1476, ), ( Statement( @@ -1665,13 +1663,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Create a temporary directory and return the path.", ), - 1475..1529, + 1478..1532, ), ), - 1475..1529, + 1478..1532, ), ), - 1475..1529, + 1478..1532, ), ( Statement( @@ -1681,44 +1679,44 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Please note this does not respect _CS_DARWIN_USER_TEMP_DIR environment variable.", ), - 1529..1614, + 1532..1617, ), ), - 1529..1614, + 1532..1617, ), ), - 1529..1614, + 1532..1617, ), ( FunctionDefinition( [], ( true, - 1614..1617, + 1617..1620, ), ( "fun", - 1618..1621, + 1621..1624, ), ( "temp_dir_create", - 1622..1637, + 1625..1640, ), [ ( Optional( ( false, - 1647..1638, + 1646..1641, ), ( "template", - 1647..1655, + 1646..1654, ), Some( ( Text, - 1657..1661, + 1656..1660, ), ), ( @@ -1728,97 +1726,97 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "tmp", - 1665..1668, + 1664..1667, ), ), - 1665..1668, + 1664..1667, ), ( Text( ( ".", - 1668..1669, + 1667..1668, ), ), - 1668..1669, + 1667..1668, ), ( Text( ( "XXXXXXXXXX", - 1669..1679, + 1668..1678, ), ), - 1669..1679, + 1668..1678, ), ], ), - 1664..1680, + 1663..1679, ), ), - 1647..1680, + 1646..1679, ), ( Optional( ( false, - 1690..1681, + 1685..1680, ), ( "auto_delete", - 1690..1701, + 1685..1696, ), Some( ( Bool, - 1703..1707, + 1698..1702, ), ), ( Boolean( ( false, - 1710..1715, + 1705..1710, ), ), - 1710..1715, + 1705..1710, ), ), - 1690..1715, + 1685..1710, ), ( Optional( ( false, - 1725..1716, + 1716..1711, ), ( "force_delete", - 1725..1737, + 1716..1728, ), Some( ( Bool, - 1739..1743, + 1730..1734, ), ), ( Boolean( ( false, - 1746..1751, + 1737..1742, ), ), - 1746..1751, + 1737..1742, ), ), - 1725..1751, + 1716..1742, ), ], Some( ( Text?, - 1759..1764, + 1746..1751, ), ), [ @@ -1826,7 +1824,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfCondition( ( "if", - 1771..1773, + 1758..1760, ), ( IfCondition( @@ -1837,31 +1835,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "trim", - 1774..1778, + 1761..1765, ), [ ( Var( ( "template", - 1779..1787, + 1766..1774, ), ), - 1779..1787, + 1766..1774, ), ], [], ), - 1774..1788, + 1761..1775, ), ( Text( [], ), - 1792..1794, + 1779..1781, ), ), - 1774..1794, + 1761..1781, ), ( Block( @@ -1871,7 +1869,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Echo( ( "echo", - 1805..1809, + 1792..1796, ), ( Text( @@ -1880,122 +1878,122 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "The", - 1811..1814, + 1798..1801, ), ), - 1811..1814, + 1798..1801, ), ( Text( ( "template", - 1815..1823, + 1802..1810, ), ), - 1815..1823, + 1802..1810, ), ( Text( ( "cannot", - 1824..1830, + 1811..1817, ), ), - 1824..1830, + 1811..1817, ), ( Text( ( "be", - 1831..1833, + 1818..1820, ), ), - 1831..1833, + 1818..1820, ), ( Text( ( "an", - 1834..1836, + 1821..1823, ), ), - 1834..1836, + 1821..1823, ), ( Text( ( "empty", - 1837..1842, + 1824..1829, ), ), - 1837..1842, + 1824..1829, ), ( Text( ( "string", - 1843..1849, + 1830..1836, ), ), - 1843..1849, + 1830..1836, ), ( Text( ( "!", - 1849..1850, + 1836..1837, ), ), - 1849..1850, + 1836..1837, ), ], ), - 1810..1851, + 1797..1838, ), ), - 1805..1851, + 1792..1838, ), ( Fail( ( "fail", - 1860..1864, + 1847..1851, ), Some( ( Int( ( 1, - 1865..1866, + 1852..1853, ), ), - 1865..1866, + 1852..1853, ), ), ), - 1860..1866, + 1847..1853, ), ], ), - 1795..1872, + 1782..1859, ), ), - 1774..1872, + 1761..1859, ), [], None, ), - 1771..1872, + 1758..1859, ), ( VariableInit( ( "let", - 1878..1881, + 1865..1868, ), ( "filename", - 1882..1890, + 1869..1877, ), ( Expression( @@ -2003,19 +2001,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [], ), - 1893..1895, + 1880..1882, ), ), - 1893..1895, + 1880..1882, ), ), - 1878..1895, + 1865..1882, ), ( IfCondition( ( "if", - 1900..1902, + 1887..1889, ), ( IfCondition( @@ -2024,12 +2022,12 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "is_mac_os_mktemp", - 1903..1919, + 1890..1906, ), [], [], ), - 1903..1921, + 1890..1908, ), ( Block( @@ -2041,10 +2039,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( "usage: mktemp [-d] [-p tmpdir] [-q] [-t prefix] [-u] template ...", ), - 1932..2001, + 1919..1988, ), ), - 1932..2001, + 1919..1988, ), ( Comment( @@ -2052,16 +2050,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( "mktemp [-d] [-p tmpdir] [-q] [-u] -t prefix", ), - 2009..2063, + 1996..2050, ), ), - 2009..2063, + 1996..2050, ), ( VariableSet( ( "filename", - 2071..2079, + 2058..2066, ), ( Command( @@ -2071,55 +2069,55 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 2082..2083, + 2069..2070, ), ( Text( "mktemp", ), - 2084..2090, + 2071..2077, ), ( CommandOption( "-d", ), - 2091..2093, + 2078..2080, ), ( CommandOption( "-p", ), - 2094..2096, + 2081..2083, ), ( Text( "\"", ), - 2097..2098, + 2084..2085, ), ( Escape( "$", ), - 2098..2100, + 2085..2087, ), ( Text( "TMPDIR", ), - 2100..2106, + 2087..2093, ), ( Text( "\"", ), - 2106..2107, + 2093..2094, ), ( Text( "\"", ), - 2108..2109, + 2095..2096, ), ( Expression( @@ -2127,25 +2125,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "template", - 2110..2118, + 2097..2105, ), ), - 2110..2118, + 2097..2105, ), ), - 2109..2119, + 2096..2106, ), ( Text( "\"", ), - 2119..2120, + 2106..2107, ), ( Text( "$", ), - 2121..2122, + 2108..2109, ), ], [ @@ -2153,24 +2151,24 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 2122..2123, + 2109..2110, ), ), - 2122..2123, + 2109..2110, ), ], ), - 2082..2123, + 2069..2110, ), ), - 2071..2123, + 2058..2110, ), ], ), - 1922..2129, + 1909..2116, ), ), - 1903..2129, + 1890..2116, ), [], Some( @@ -2178,7 +2176,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Else( ( "else", - 2130..2134, + 2117..2121, ), ( Block( @@ -2188,7 +2186,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableSet( ( "filename", - 2145..2153, + 2132..2140, ), ( Command( @@ -2198,61 +2196,61 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 2156..2157, + 2143..2144, ), ( Text( "mktemp", ), - 2158..2164, + 2145..2151, ), ( CommandOption( "-d", ), - 2165..2167, + 2152..2154, ), ( CommandOption( "-p", ), - 2168..2170, + 2155..2157, ), ( Text( "\"", ), - 2171..2172, + 2158..2159, ), ( Escape( "$", ), - 2172..2174, + 2159..2161, ), ( Text( "TMPDIR", ), - 2174..2180, + 2161..2167, ), ( Text( "\"", ), - 2180..2181, + 2167..2168, ), ( CommandOption( "-t", ), - 2182..2184, + 2169..2171, ), ( Text( "\"", ), - 2185..2186, + 2172..2173, ), ( Expression( @@ -2260,25 +2258,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "template", - 2187..2195, + 2174..2182, ), ), - 2187..2195, + 2174..2182, ), ), - 2186..2196, + 2173..2183, ), ( Text( "\"", ), - 2196..2197, + 2183..2184, ), ( Text( "$", ), - 2198..2199, + 2185..2186, ), ], [ @@ -2286,34 +2284,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 2199..2200, + 2186..2187, ), ), - 2199..2200, + 2186..2187, ), ], ), - 2156..2200, + 2143..2187, ), ), - 2145..2200, + 2132..2187, ), ], ), - 2135..2206, + 2122..2193, ), ), - 2130..2206, + 2117..2193, ), ), ), - 1900..2206, + 1887..2193, ), ( IfCondition( ( "if", - 2211..2213, + 2198..2200, ), ( IfCondition( @@ -2323,19 +2321,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "filename", - 2214..2222, + 2201..2209, ), ), - 2214..2222, + 2201..2209, ), ( Text( [], ), - 2226..2228, + 2213..2215, ), ), - 2214..2228, + 2201..2215, ), ( Block( @@ -2345,7 +2343,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Echo( ( "echo", - 2239..2243, + 2226..2230, ), ( Text( @@ -2354,100 +2352,100 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "Failed", - 2245..2251, + 2232..2238, ), ), - 2245..2251, + 2232..2238, ), ( Text( ( "to", - 2252..2254, + 2239..2241, ), ), - 2252..2254, + 2239..2241, ), ( Text( ( "make", - 2255..2259, + 2242..2246, ), ), - 2255..2259, + 2242..2246, ), ( Text( ( "a", - 2260..2261, + 2247..2248, ), ), - 2260..2261, + 2247..2248, ), ( Text( ( "temporary", - 2262..2271, + 2249..2258, ), ), - 2262..2271, + 2249..2258, ), ( Text( ( "directory", - 2272..2281, + 2259..2268, ), ), - 2272..2281, + 2259..2268, ), ], ), - 2244..2282, + 2231..2269, ), ), - 2239..2282, + 2226..2269, ), ( Fail( ( "fail", - 2291..2295, + 2278..2282, ), Some( ( Int( ( 1, - 2296..2297, + 2283..2284, ), ), - 2296..2297, + 2283..2284, ), ), ), - 2291..2297, + 2278..2284, ), ], ), - 2229..2303, + 2216..2290, ), ), - 2214..2303, + 2201..2290, ), [], None, ), - 2211..2303, + 2198..2290, ), ( IfCondition( ( "if", - 2308..2310, + 2295..2297, ), ( IfCondition( @@ -2455,10 +2453,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "auto_delete", - 2311..2322, + 2298..2309, ), ), - 2311..2322, + 2298..2309, ), ( Block( @@ -2468,7 +2466,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfCondition( ( "if", - 2333..2335, + 2320..2322, ), ( IfCondition( @@ -2476,10 +2474,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "force_delete", - 2336..2348, + 2323..2335, ), ), - 2336..2348, + 2323..2335, ), ( Block( @@ -2495,25 +2493,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 2363..2364, + 2350..2351, ), ( Text( "trap", ), - 2365..2369, + 2352..2356, ), ( Text( "'rm", ), - 2370..2373, + 2357..2360, ), ( CommandOption( "-rf", ), - 2374..2377, + 2361..2364, ), ( Expression( @@ -2521,31 +2519,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "filename", - 2379..2387, + 2366..2374, ), ), - 2379..2387, + 2366..2374, ), ), - 2378..2388, + 2365..2375, ), ( Text( "'", ), - 2388..2389, + 2375..2376, ), ( Text( "EXIT", ), - 2390..2394, + 2377..2381, ), ( Text( "$", ), - 2395..2396, + 2382..2383, ), ], [ @@ -2555,7 +2553,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Handle( ( "failed", - 2397..2403, + 2384..2390, ), None, ( @@ -2566,7 +2564,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Echo( ( "echo", - 2422..2426, + 2409..2413, ), ( Text( @@ -2575,91 +2573,91 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "Setting", - 2428..2435, + 2415..2422, ), ), - 2428..2435, + 2415..2422, ), ( Text( ( "auto", - 2436..2440, + 2423..2427, ), ), - 2436..2440, + 2423..2427, ), ( Text( ( "deletion", - 2441..2449, + 2428..2436, ), ), - 2441..2449, + 2428..2436, ), ( Text( ( "fails", - 2450..2455, + 2437..2442, ), ), - 2450..2455, + 2437..2442, ), ( Text( ( ".", - 2455..2456, + 2442..2443, ), ), - 2455..2456, + 2442..2443, ), ( Text( ( "You", - 2457..2460, + 2444..2447, ), ), - 2457..2460, + 2444..2447, ), ( Text( ( "must", - 2461..2465, + 2448..2452, ), ), - 2461..2465, + 2448..2452, ), ( Text( ( "delete", - 2466..2472, + 2453..2459, ), ), - 2466..2472, + 2453..2459, ), ( Text( ( "temporary", - 2473..2482, + 2460..2469, ), ), - 2473..2482, + 2460..2469, ), ( Text( ( "dir", - 2483..2486, + 2470..2473, ), ), - 2483..2486, + 2470..2473, ), ( Expression( @@ -2667,53 +2665,53 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "filename", - 2488..2496, + 2475..2483, ), ), - 2488..2496, + 2475..2483, ), ), - 2487..2497, + 2474..2484, ), ( Text( ( ".", - 2497..2498, + 2484..2485, ), ), - 2497..2498, + 2484..2485, ), ], ), - 2427..2499, + 2414..2486, ), ), - 2422..2499, + 2409..2486, ), ], ), - 2404..2513, + 2391..2500, ), ), - 2397..2513, + 2384..2500, ), ), - 2397..2513, + 2384..2500, ), ], ), - 2363..2513, + 2350..2500, ), ), - 2363..2513, + 2350..2500, ), ], ), - 2349..2523, + 2336..2510, ), ), - 2336..2523, + 2323..2510, ), [], Some( @@ -2721,7 +2719,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Else( ( "else", - 2524..2528, + 2511..2515, ), ( Block( @@ -2737,19 +2735,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 2543..2544, + 2530..2531, ), ( Text( "trap", ), - 2545..2549, + 2532..2536, ), ( Text( "'rmdir", ), - 2550..2556, + 2537..2543, ), ( Expression( @@ -2757,31 +2755,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "filename", - 2558..2566, + 2545..2553, ), ), - 2558..2566, + 2545..2553, ), ), - 2557..2567, + 2544..2554, ), ( Text( "'", ), - 2567..2568, + 2554..2555, ), ( Text( "EXIT", ), - 2569..2573, + 2556..2560, ), ( Text( "$", ), - 2574..2575, + 2561..2562, ), ], [ @@ -2791,7 +2789,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Handle( ( "failed", - 2576..2582, + 2563..2569, ), None, ( @@ -2802,7 +2800,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Echo( ( "echo", - 2601..2605, + 2588..2592, ), ( Text( @@ -2811,91 +2809,91 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "Setting", - 2607..2614, + 2594..2601, ), ), - 2607..2614, + 2594..2601, ), ( Text( ( "auto", - 2615..2619, + 2602..2606, ), ), - 2615..2619, + 2602..2606, ), ( Text( ( "deletion", - 2620..2628, + 2607..2615, ), ), - 2620..2628, + 2607..2615, ), ( Text( ( "fails", - 2629..2634, + 2616..2621, ), ), - 2629..2634, + 2616..2621, ), ( Text( ( ".", - 2634..2635, + 2621..2622, ), ), - 2634..2635, + 2621..2622, ), ( Text( ( "You", - 2636..2639, + 2623..2626, ), ), - 2636..2639, + 2623..2626, ), ( Text( ( "must", - 2640..2644, + 2627..2631, ), ), - 2640..2644, + 2627..2631, ), ( Text( ( "delete", - 2645..2651, + 2632..2638, ), ), - 2645..2651, + 2632..2638, ), ( Text( ( "temporary", - 2652..2661, + 2639..2648, ), ), - 2652..2661, + 2639..2648, ), ( Text( ( "dir", - 2662..2665, + 2649..2652, ), ), - 2662..2665, + 2649..2652, ), ( Expression( @@ -2903,93 +2901,93 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "filename", - 2667..2675, + 2654..2662, ), ), - 2667..2675, + 2654..2662, ), ), - 2666..2676, + 2653..2663, ), ( Text( ( ".", - 2676..2677, + 2663..2664, ), ), - 2676..2677, + 2663..2664, ), ], ), - 2606..2678, + 2593..2665, ), ), - 2601..2678, + 2588..2665, ), ], ), - 2583..2692, + 2570..2679, ), ), - 2576..2692, + 2563..2679, ), ), - 2576..2692, + 2563..2679, ), ], ), - 2543..2692, + 2530..2679, ), ), - 2543..2692, + 2530..2679, ), ], ), - 2529..2702, + 2516..2689, ), ), - 2524..2702, + 2511..2689, ), ), ), - 2333..2702, + 2320..2689, ), ], ), - 2323..2708, + 2310..2695, ), ), - 2311..2708, + 2298..2695, ), [], None, ), - 2308..2708, + 2295..2695, ), ( Return( ( "return", - 2713..2719, + 2700..2706, ), Some( ( Var( ( "filename", - 2720..2728, + 2707..2715, ), ), - 2720..2728, + 2707..2715, ), ), ), - 2713..2728, + 2700..2715, ), ], ), - 1614..2730, + 1617..2717, ), ( Statement( @@ -2999,13 +2997,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Changes the permission bits of a file.", ), - 2732..2775, + 2719..2762, ), ), - 2732..2775, + 2719..2762, ), ), - 2732..2775, + 2719..2762, ), ( Statement( @@ -3015,13 +3013,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "", ), - 2775..2779, + 2762..2766, ), ), - 2775..2779, + 2762..2766, ), ), - 2775..2779, + 2762..2766, ), ( Statement( @@ -3029,71 +3027,71 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "If the file doesn't exist, it returns `false` and prints a message.", + "If the file doesn't exist, it fails and prints a message.", ), - 2779..2851, + 2766..2828, ), ), - 2779..2851, + 2766..2828, ), ), - 2779..2851, + 2766..2828, ), ( FunctionDefinition( [], ( true, - 2851..2854, + 2828..2831, ), ( "fun", - 2855..2858, + 2832..2835, ), ( "file_chmod", - 2859..2869, + 2836..2846, ), [ ( Typed( ( false, - 2870..2870, + 2847..2847, ), ( "path", - 2870..2874, + 2847..2851, ), ( Text, - 2876..2880, + 2853..2857, ), ), - 2870..2880, + 2847..2857, ), ( Typed( ( false, - 2882..2881, + 2859..2858, ), ( "mode", - 2882..2886, + 2859..2863, ), ( Text, - 2888..2892, + 2865..2869, ), ), - 2882..2892, + 2859..2869, ), ], Some( ( - Bool, - 2895..2899, + Null?, + 2872..2877, ), ), [ @@ -3101,7 +3099,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfCondition( ( "if", - 2906..2908, + 2884..2886, ), ( IfCondition( @@ -3110,22 +3108,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "file_exists", - 2909..2920, + 2887..2898, ), [ ( Var( ( "path", - 2921..2925, + 2899..2903, ), ), - 2921..2925, + 2899..2903, ), ], [], ), - 2909..2926, + 2887..2904, ), ( Block( @@ -3135,30 +3133,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Expression( ( Command( - [ - ( - Trust, - 2937..2942, - ), - ], + [], [ ( Text( "$", ), - 2943..2944, + 2915..2916, ), ( Text( "chmod", ), - 2945..2950, + 2917..2922, ), ( Text( "\"", ), - 2951..2952, + 2923..2924, ), ( Expression( @@ -3166,25 +3159,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "mode", - 2953..2957, + 2925..2929, ), ), - 2953..2957, + 2925..2929, ), ), - 2952..2958, + 2924..2930, ), ( Text( "\"", ), - 2958..2959, + 2930..2931, ), ( Text( "\"", ), - 2960..2961, + 2932..2933, ), ( Expression( @@ -3192,71 +3185,76 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 2962..2966, + 2934..2938, ), ), - 2962..2966, + 2934..2938, ), ), - 2961..2967, + 2933..2939, ), ( Text( "\"", ), - 2967..2968, + 2939..2940, ), ( Text( "$", ), - 2969..2970, + 2941..2942, + ), + ], + [ + ( + Failure( + ( + Propagate, + 2942..2943, + ), + ), + 2942..2943, ), ], - [], ), - 2937..2970, + 2915..2943, ), ), - 2937..2970, + 2915..2943, ), ( Return( ( "return", - 2979..2985, + 2952..2958, ), Some( ( - Boolean( - ( - true, - 2986..2990, - ), - ), - 2986..2990, + Null, + 2959..2963, ), ), ), - 2979..2990, + 2952..2963, ), ], ), - 2927..2996, + 2905..2969, ), ), - 2909..2996, + 2887..2969, ), [], None, ), - 2906..2996, + 2884..2969, ), ( Echo( ( "echo", - 3002..3006, + 2975..2979, ), ( Text( @@ -3265,19 +3263,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "The", - 3008..3011, + 2981..2984, ), ), - 3008..3011, + 2981..2984, ), ( Text( ( "file", - 3012..3016, + 2985..2989, ), ), - 3012..3016, + 2985..2989, ), ( Expression( @@ -3285,71 +3283,71 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 3018..3022, + 2991..2995, ), ), - 3018..3022, + 2991..2995, ), ), - 3017..3023, + 2990..2996, ), ( Text( ( "doesn't", - 3024..3031, + 2997..3004, ), ), - 3024..3031, + 2997..3004, ), ( Text( ( "exist", - 3032..3037, + 3005..3010, ), ), - 3032..3037, + 3005..3010, ), ( Text( ( "!", - 3037..3038, + 3010..3011, ), ), - 3037..3038, + 3010..3011, ), ], ), - 3007..3039, + 2980..3012, ), ), - 3002..3039, + 2975..3012, ), ( - Return( + Fail( ( - "return", - 3044..3050, + "fail", + 3017..3021, ), Some( ( - Boolean( + Int( ( - false, - 3051..3056, + 1, + 3022..3023, ), ), - 3051..3056, + 3022..3023, ), ), ), - 3044..3056, + 3017..3023, ), ], ), - 2851..3058, + 2828..3025, ), ( Statement( @@ -3359,13 +3357,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Changes the owner of a file.", ), - 3060..3093, + 3027..3060, ), ), - 3060..3093, + 3027..3060, ), ), - 3060..3093, + 3027..3060, ), ( Statement( @@ -3375,13 +3373,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "", ), - 3093..3097, + 3060..3064, ), ), - 3093..3097, + 3060..3064, ), ), - 3093..3097, + 3060..3064, ), ( Statement( @@ -3389,71 +3387,71 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "If the file doesn't exist, it returns `false` and prints a message.", + "If the file doesn't exist, it fails and prints a message.", ), - 3097..3169, + 3064..3126, ), ), - 3097..3169, + 3064..3126, ), ), - 3097..3169, + 3064..3126, ), ( FunctionDefinition( [], ( true, - 3169..3172, + 3126..3129, ), ( "fun", - 3173..3176, + 3130..3133, ), ( "file_chown", - 3177..3187, + 3134..3144, ), [ ( Typed( ( false, - 3188..3188, + 3145..3145, ), ( "path", - 3188..3192, + 3145..3149, ), ( Text, - 3194..3198, + 3151..3155, ), ), - 3188..3198, + 3145..3155, ), ( Typed( ( false, - 3200..3199, + 3157..3156, ), ( "user", - 3200..3204, + 3157..3161, ), ( Text, - 3206..3210, + 3163..3167, ), ), - 3200..3210, + 3157..3167, ), ], Some( ( - Bool, - 3213..3217, + Null?, + 3170..3175, ), ), [ @@ -3461,7 +3459,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfCondition( ( "if", - 3224..3226, + 3182..3184, ), ( IfCondition( @@ -3472,51 +3470,51 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "file_exists", - 3227..3238, + 3185..3196, ), [ ( Var( ( "path", - 3239..3243, + 3197..3201, ), ), - 3239..3243, + 3197..3201, ), ], [], ), - 3227..3244, + 3185..3202, ), ( "or", - 3245..3247, + 3203..3205, ), ( FunctionInvocation( [], ( "dir_exists", - 3248..3258, + 3206..3216, ), [ ( Var( ( "path", - 3259..3263, + 3217..3221, ), ), - 3259..3263, + 3217..3221, ), ], [], ), - 3248..3264, + 3206..3222, ), ), - 3227..3264, + 3185..3222, ), ( Block( @@ -3526,36 +3524,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Expression( ( Command( - [ - ( - Trust, - 3275..3280, - ), - ], + [], [ ( Text( "$", ), - 3281..3282, + 3233..3234, ), ( Text( "chown", ), - 3283..3288, + 3235..3240, ), ( CommandOption( "-R", ), - 3289..3291, + 3241..3243, ), ( Text( "\"", ), - 3292..3293, + 3244..3245, ), ( Expression( @@ -3563,25 +3556,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "user", - 3294..3298, + 3246..3250, ), ), - 3294..3298, + 3246..3250, ), ), - 3293..3299, + 3245..3251, ), ( Text( "\"", ), - 3299..3300, + 3251..3252, ), ( Text( "\"", ), - 3301..3302, + 3253..3254, ), ( Expression( @@ -3589,71 +3582,76 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 3303..3307, + 3255..3259, ), ), - 3303..3307, + 3255..3259, ), ), - 3302..3308, + 3254..3260, ), ( Text( "\"", ), - 3308..3309, + 3260..3261, ), ( Text( "$", ), - 3310..3311, + 3262..3263, + ), + ], + [ + ( + Failure( + ( + Propagate, + 3263..3264, + ), + ), + 3263..3264, ), ], - [], ), - 3275..3311, + 3233..3264, ), ), - 3275..3311, + 3233..3264, ), ( Return( ( "return", - 3320..3326, + 3273..3279, ), Some( ( - Boolean( - ( - true, - 3327..3331, - ), - ), - 3327..3331, + Null, + 3280..3284, ), ), ), - 3320..3331, + 3273..3284, ), ], ), - 3265..3337, + 3223..3290, ), ), - 3227..3337, + 3185..3290, ), [], None, ), - 3224..3337, + 3182..3290, ), ( Echo( ( "echo", - 3343..3347, + 3296..3300, ), ( Text( @@ -3662,19 +3660,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "The", - 3349..3352, + 3302..3305, ), ), - 3349..3352, + 3302..3305, ), ( Text( ( "file", - 3353..3357, + 3306..3310, ), ), - 3353..3357, + 3306..3310, ), ( Expression( @@ -3682,71 +3680,71 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 3359..3363, + 3312..3316, ), ), - 3359..3363, + 3312..3316, ), ), - 3358..3364, + 3311..3317, ), ( Text( ( "doesn't", - 3365..3372, + 3318..3325, ), ), - 3365..3372, + 3318..3325, ), ( Text( ( "exist", - 3373..3378, + 3326..3331, ), ), - 3373..3378, + 3326..3331, ), ( Text( ( "!", - 3378..3379, + 3331..3332, ), ), - 3378..3379, + 3331..3332, ), ], ), - 3348..3380, + 3301..3333, ), ), - 3343..3380, + 3296..3333, ), ( - Return( + Fail( ( - "return", - 3385..3391, + "fail", + 3338..3342, ), Some( ( - Boolean( + Int( ( - false, - 3392..3397, + 1, + 3343..3344, ), ), - 3392..3397, + 3343..3344, ), ), ), - 3385..3397, + 3338..3344, ), ], ), - 3169..3399, + 3126..3346, ), ( Statement( @@ -3756,13 +3754,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Escapes all characters in the passed-in glob except \"*\", \"?\" and \"/\",", ), - 3401..3475, + 3348..3422, ), ), - 3401..3475, + 3348..3422, ), ), - 3401..3475, + 3348..3422, ), ( Statement( @@ -3772,52 +3770,52 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "to prevent injection attacks.", ), - 3475..3509, + 3422..3456, ), ), - 3475..3509, + 3422..3456, ), ), - 3475..3509, + 3422..3456, ), ( FunctionDefinition( [], ( false, - 3509..3509, + 3456..3456, ), ( "fun", - 3509..3512, + 3456..3459, ), ( "escape_non_glob_chars", - 3513..3534, + 3460..3481, ), [ ( Typed( ( false, - 3535..3535, + 3482..3482, ), ( "path", - 3535..3539, + 3482..3486, ), ( Text, - 3541..3545, + 3488..3492, ), ), - 3535..3545, + 3482..3492, ), ], Some( ( Text, - 3548..3552, + 3495..3499, ), ), [ @@ -3825,7 +3823,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 3559..3565, + 3506..3512, ), Some( ( @@ -3833,17 +3831,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "replace_regex", - 3566..3579, + 3513..3526, ), [ ( Var( ( "path", - 3580..3584, + 3527..3531, ), ), - 3580..3584, + 3527..3531, ), ( Text( @@ -3852,77 +3850,77 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( "(", - 3587..3589, + 3534..3536, ), ), - 3587..3589, + 3534..3536, ), ( Text( ( "[", - 3589..3590, + 3536..3537, ), ), - 3589..3590, + 3536..3537, ), ( Text( ( "^", - 3590..3591, + 3537..3538, ), ), - 3590..3591, + 3537..3538, ), ( Text( ( "*", - 3591..3592, + 3538..3539, ), ), - 3591..3592, + 3538..3539, ), ( Text( ( "?", - 3592..3593, + 3539..3540, ), ), - 3592..3593, + 3539..3540, ), ( Text( ( "/", - 3593..3594, + 3540..3541, ), ), - 3593..3594, + 3540..3541, ), ( Text( ( "]", - 3594..3595, + 3541..3542, ), ), - 3594..3595, + 3541..3542, ), ( Escape( ( ")", - 3595..3597, + 3542..3544, ), ), - 3595..3597, + 3542..3544, ), ], ), - 3586..3598, + 3533..3545, ), ( Text( @@ -3931,45 +3929,45 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( "\\", - 3601..3603, + 3548..3550, ), ), - 3601..3603, + 3548..3550, ), ( Escape( ( "\\", - 3603..3605, + 3550..3552, ), ), - 3603..3605, + 3550..3552, ), ( Escape( ( "1", - 3605..3607, + 3552..3554, ), ), - 3605..3607, + 3552..3554, ), ], ), - 3600..3608, + 3547..3555, ), ], [], ), - 3566..3609, + 3513..3556, ), ), ), - 3559..3609, + 3506..3556, ), ], ), - 3509..3611, + 3456..3558, ), ( Statement( @@ -3979,13 +3977,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Finds all files or directories matching multiple file globs. When", ), - 3613..3683, + 3560..3630, ), ), - 3613..3683, + 3560..3630, ), ), - 3613..3683, + 3560..3630, ), ( Statement( @@ -3995,13 +3993,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "we have union types, this functionality can be merged into the main", ), - 3683..3755, + 3630..3702, ), ), - 3683..3755, + 3630..3702, ), ), - 3683..3755, + 3630..3702, ), ( Statement( @@ -4009,54 +4007,54 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "`glob` function.", + "`file_glob` function.", ), - 3755..3776, + 3702..3728, ), ), - 3755..3776, + 3702..3728, ), ), - 3755..3776, + 3702..3728, ), ( FunctionDefinition( [], ( true, - 3776..3779, + 3728..3731, ), ( "fun", - 3780..3783, + 3732..3735, ), ( "file_glob_all", - 3784..3797, + 3736..3749, ), [ ( Typed( ( false, - 3798..3798, + 3750..3750, ), ( "paths", - 3798..3803, + 3750..3755, ), ( [Text], - 3805..3811, + 3757..3763, ), ), - 3798..3811, + 3750..3763, ), ], Some( ( [Text]?, - 3814..3821, + 3766..3773, ), ), [ @@ -4064,11 +4062,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 3828..3831, + 3780..3783, ), ( "combined", - 3832..3840, + 3784..3792, ), ( Expression( @@ -4076,19 +4074,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [], ), - 3843..3845, + 3795..3797, ), ), - 3843..3845, + 3795..3797, ), ), - 3828..3845, + 3780..3797, ), ( IfCondition( ( "if", - 3850..3852, + 3802..3804, ), ( IfCondition( @@ -4099,34 +4097,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "len", - 3853..3856, + 3805..3808, ), [ ( Var( ( "paths", - 3857..3862, + 3809..3814, ), ), - 3857..3862, + 3809..3814, ), ], [], ), - 3853..3863, + 3805..3815, ), ( Int( ( 1, - 3867..3868, + 3819..3820, ), ), - 3867..3868, + 3819..3820, ), ), - 3853..3868, + 3805..3820, ), ( Block( @@ -4136,14 +4134,14 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableSet( ( "combined", - 3879..3887, + 3831..3839, ), ( FunctionInvocation( [], ( "escape_non_glob_chars", - 3890..3911, + 3842..3863, ), [ ( @@ -4152,37 +4150,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "paths", - 3912..3917, + 3864..3869, ), ), - 3912..3917, + 3864..3869, ), ( Int( ( 0, - 3918..3919, + 3870..3871, ), ), - 3918..3919, + 3870..3871, ), ), - 3912..3919, + 3864..3871, ), ], [], ), - 3890..3921, + 3842..3873, ), ), - 3879..3921, + 3831..3873, ), ], ), - 3869..3927, + 3821..3879, ), ), - 3853..3927, + 3805..3879, ), [], Some( @@ -4190,7 +4188,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Else( ( "else", - 3928..3932, + 3880..3884, ), ( Block( @@ -4200,51 +4198,51 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 3943..3946, + 3895..3898, ), ( "items", - 3947..3952, + 3899..3904, ), ( DataType( ( [Text], - 3955..3961, + 3907..3913, ), ), - 3955..3961, + 3907..3913, ), ), - 3943..3961, + 3895..3913, ), ( IterLoop( ( "for", - 3970..3973, + 3922..3925, ), ( Single( ( "item", - 3974..3978, + 3926..3930, ), ), - 3974..3978, + 3926..3930, ), ( "in", - 3979..3981, + 3931..3933, ), ( Var( ( "paths", - 3982..3987, + 3934..3939, ), ), - 3982..3987, + 3934..3939, ), ( Block( @@ -4254,38 +4252,38 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableSet( ( "item", - 4002..4006, + 3954..3958, ), ( FunctionInvocation( [], ( "escape_non_glob_chars", - 4009..4030, + 3961..3982, ), [ ( Var( ( "item", - 4031..4035, + 3983..3987, ), ), - 4031..4035, + 3983..3987, ), ], [], ), - 4009..4036, + 3961..3988, ), ), - 4002..4036, + 3954..3988, ), ( ShorthandAdd( ( "items", - 4049..4054, + 4001..4006, ), ( Array( @@ -4294,82 +4292,82 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "item", - 4059..4063, + 4011..4015, ), ), - 4059..4063, + 4011..4015, ), ], ), - 4058..4064, + 4010..4016, ), ), - 4049..4064, + 4001..4016, ), ], ), - 3988..4074, + 3940..4026, ), ), - 3970..4074, + 3922..4026, ), ( VariableSet( ( "combined", - 4083..4091, + 4035..4043, ), ( FunctionInvocation( [], ( "join", - 4094..4098, + 4046..4050, ), [ ( Var( ( "items", - 4099..4104, + 4051..4056, ), ), - 4099..4104, + 4051..4056, ), ( Text( [], ), - 4106..4109, + 4058..4061, ), ], [], ), - 4094..4110, + 4046..4062, ), ), - 4083..4110, + 4035..4062, ), ], ), - 3933..4116, + 3885..4068, ), ), - 3928..4116, + 3880..4068, ), ), ), - 3850..4116, + 3802..4068, ), ( VariableInit( ( "let", - 4121..4124, + 4073..4076, ), ( "files", - 4125..4130, + 4077..4082, ), ( Expression( @@ -4381,37 +4379,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 4133..4134, + 4085..4086, ), ( Text( "eval", ), - 4135..4139, + 4087..4091, ), ( Text( "\"", ), - 4140..4141, + 4092..4093, ), ( Text( "for", ), - 4141..4144, + 4093..4096, ), ( Text( "file", ), - 4145..4149, + 4097..4101, ), ( Text( "in", ), - 4150..4152, + 4102..4104, ), ( Expression( @@ -4419,163 +4417,163 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "combined", - 4154..4162, + 4106..4114, ), ), - 4154..4162, + 4106..4114, ), ), - 4153..4163, + 4105..4115, ), ( Text( ";", ), - 4163..4164, + 4115..4116, ), ( Text( "do", ), - 4165..4167, + 4117..4119, ), ( Text( "[", ), - 4168..4169, + 4120..4121, ), ( CommandOption( "-e", ), - 4170..4172, + 4122..4124, ), ( Escape( "\\", ), - 4173..4175, + 4125..4127, ), ( - Escape( + Text( "\"", ), - 4175..4177, + 4127..4128, ), ( Escape( "\\", ), - 4177..4179, + 4128..4130, ), ( Escape( "$", ), - 4179..4181, + 4130..4132, ), ( Text( "file", ), - 4181..4185, + 4132..4136, ), ( Escape( "\\", ), - 4185..4187, + 4136..4138, ), ( - Escape( + Text( "\"", ), - 4187..4189, + 4138..4139, ), ( Text( "]", ), - 4190..4191, + 4140..4141, ), ( Text( "&&", ), - 4192..4194, + 4142..4144, ), ( Text( "echo", ), - 4195..4199, + 4145..4149, ), ( Escape( "\\", ), - 4200..4202, + 4150..4152, ), ( - Escape( + Text( "\"", ), - 4202..4204, + 4152..4153, ), ( Escape( "\\", ), - 4204..4206, + 4153..4155, ), ( Escape( "$", ), - 4206..4208, + 4155..4157, ), ( Text( "file", ), - 4208..4212, + 4157..4161, ), ( Escape( "\\", ), - 4212..4214, + 4161..4163, ), ( - Escape( + Text( "\"", ), - 4214..4216, + 4163..4164, ), ( Text( ";", ), - 4216..4217, + 4164..4165, ), ( Text( "done", ), - 4218..4222, + 4166..4170, ), ( Text( "\"", ), - 4222..4223, + 4170..4171, ), ( Text( "$", ), - 4224..4225, + 4172..4173, ), ], [ @@ -4583,26 +4581,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 4225..4226, + 4173..4174, ), ), - 4225..4226, + 4173..4174, ), ], ), - 4133..4226, + 4085..4174, ), ), - 4133..4226, + 4085..4174, ), ), - 4121..4226, + 4073..4174, ), ( Return( ( "return", - 4231..4237, + 4179..4185, ), Some( ( @@ -4610,17 +4608,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "split", - 4238..4243, + 4186..4191, ), [ ( Var( ( "files", - 4244..4249, + 4192..4197, ), ), - 4244..4249, + 4192..4197, ), ( Text( @@ -4629,27 +4627,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( "n", - 4252..4254, + 4200..4202, ), ), - 4252..4254, + 4200..4202, ), ], ), - 4251..4255, + 4199..4203, ), ], [], ), - 4238..4256, + 4186..4204, ), ), ), - 4231..4256, + 4179..4204, ), ], ), - 3776..4258, + 3728..4206, ), ( Statement( @@ -4659,52 +4657,52 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Finds all files or directories matching a file glob.", ), - 4260..4317, + 4208..4265, ), ), - 4260..4317, + 4208..4265, ), ), - 4260..4317, + 4208..4265, ), ( FunctionDefinition( [], ( true, - 4317..4320, + 4265..4268, ), ( "fun", - 4321..4324, + 4269..4272, ), ( "file_glob", - 4325..4334, + 4273..4282, ), [ ( Typed( ( false, - 4335..4335, + 4283..4283, ), ( "path", - 4335..4339, + 4283..4287, ), ( Text, - 4341..4345, + 4289..4293, ), ), - 4335..4345, + 4283..4293, ), ], Some( ( [Text]?, - 4348..4355, + 4296..4303, ), ), [ @@ -4712,7 +4710,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 4362..4368, + 4310..4316, ), Some( ( @@ -4720,7 +4718,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "file_glob_all", - 4369..4382, + 4317..4330, ), [ ( @@ -4730,14 +4728,14 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 4384..4388, + 4332..4336, ), ), - 4384..4388, + 4332..4336, ), ], ), - 4383..4389, + 4331..4337, ), ], [ @@ -4745,22 +4743,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 4390..4391, + 4338..4339, ), ), - 4390..4391, + 4338..4339, ), ], ), - 4369..4391, + 4317..4339, ), ), ), - 4362..4391, + 4310..4339, ), ], ), - 4317..4393, + 4265..4341, ), ( Statement( @@ -4770,13 +4768,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Extract the file detecting from the filename the extension", ), - 4395..4458, + 4343..4406, ), ), - 4395..4458, + 4343..4406, ), ), - 4395..4458, + 4343..4406, ), ( Statement( @@ -4786,13 +4784,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Supports: bz2, gz, xz, bz2, deb, rar, rpm, tar(gz/xz/bz), zip(war/jar), 7z", ), - 4458..4537, + 4406..4485, ), ), - 4458..4537, + 4406..4485, ), ), - 4458..4537, + 4406..4485, ), ( Statement( @@ -4802,69 +4800,69 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Note: Not all the commands supports the output folder path", ), - 4537..4600, + 4485..4548, ), ), - 4537..4600, + 4485..4548, ), ), - 4537..4600, + 4485..4548, ), ( FunctionDefinition( [], ( true, - 4600..4603, + 4548..4551, ), ( "fun", - 4604..4607, + 4552..4555, ), ( "file_extract", - 4608..4620, + 4556..4568, ), [ ( Typed( ( false, - 4621..4621, + 4569..4569, ), ( "path", - 4621..4625, + 4569..4573, ), ( Text, - 4627..4631, + 4575..4579, ), ), - 4621..4631, + 4569..4579, ), ( Typed( ( false, - 4633..4632, + 4581..4580, ), ( "target", - 4633..4639, + 4581..4587, ), ( Text, - 4641..4645, + 4589..4593, ), ), - 4633..4645, + 4581..4593, ), ], Some( ( Null?, - 4648..4653, + 4596..4601, ), ), [ @@ -4872,7 +4870,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfCondition( ( "if", - 4660..4662, + 4608..4610, ), ( IfCondition( @@ -4881,22 +4879,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "file_exists", - 4663..4674, + 4611..4622, ), [ ( Var( ( "path", - 4675..4679, + 4623..4627, ), ), - 4675..4679, + 4623..4627, ), ], [], ), - 4663..4680, + 4611..4628, ), ( Block( @@ -4906,7 +4904,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfChain( ( "if", - 4691..4693, + 4639..4641, ), [ ( @@ -4918,17 +4916,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 4708..4719, + 4656..4667, ), [ ( Var( ( "path", - 4720..4724, + 4668..4672, ), ), - 4720..4724, + 4668..4672, ), ( Text( @@ -4937,82 +4935,82 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 4727..4729, + 4675..4677, ), ), - 4727..4729, + 4675..4677, ), ( Text( ( "(", - 4729..4730, + 4677..4678, ), ), - 4729..4730, + 4677..4678, ), ( Text( ( "tar", - 4730..4733, + 4678..4681, ), ), - 4730..4733, + 4678..4681, ), ( Escape( ( ".", - 4733..4735, + 4681..4683, ), ), - 4733..4735, + 4681..4683, ), ( Text( ( "bz2|tbz|tbz2", - 4735..4747, + 4683..4695, ), ), - 4735..4747, + 4683..4695, ), ( Text( ( ")", - 4747..4748, + 4695..4696, ), ), - 4747..4748, + 4695..4696, ), ( Text( ( "$", - 4748..4749, + 4696..4697, ), ), - 4748..4749, + 4696..4697, ), ], ), - 4726..4750, + 4674..4698, ), ( Boolean( ( true, - 4752..4756, + 4700..4704, ), ), - 4752..4756, + 4700..4704, ), ], [], ), - 4708..4757, + 4656..4705, ), ( Singleline( @@ -5026,25 +5024,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 4759..4760, + 4707..4708, ), ( Text( "tar", ), - 4761..4764, + 4709..4712, ), ( Text( "xvjf", ), - 4765..4769, + 4713..4717, ), ( Text( "\"", ), - 4770..4771, + 4718..4719, ), ( Expression( @@ -5052,31 +5050,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 4772..4776, + 4720..4724, ), ), - 4772..4776, + 4720..4724, ), ), - 4771..4777, + 4719..4725, ), ( Text( "\"", ), - 4777..4778, + 4725..4726, ), ( CommandOption( "-C", ), - 4779..4781, + 4727..4729, ), ( Text( "\"", ), - 4782..4783, + 4730..4731, ), ( Expression( @@ -5084,25 +5082,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "target", - 4784..4790, + 4732..4738, ), ), - 4784..4790, + 4732..4738, ), ), - 4783..4791, + 4731..4739, ), ( Text( "\"", ), - 4791..4792, + 4739..4740, ), ( Text( "$", ), - 4793..4794, + 4741..4742, ), ], [ @@ -5110,26 +5108,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 4794..4795, + 4742..4743, ), ), - 4794..4795, + 4742..4743, ), ], ), - 4759..4795, + 4707..4743, ), ), - 4759..4795, + 4707..4743, ), ), - 4757..4795, + 4705..4743, ), ), - 4708..4795, + 4656..4743, ), ), - 4708..4795, + 4656..4743, ), ( IfCondition( @@ -5140,17 +5138,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 4808..4819, + 4756..4767, ), [ ( Var( ( "path", - 4820..4824, + 4768..4772, ), ), - 4820..4824, + 4768..4772, ), ( Text( @@ -5159,82 +5157,82 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 4827..4829, + 4775..4777, ), ), - 4827..4829, + 4775..4777, ), ( Text( ( "(", - 4829..4830, + 4777..4778, ), ), - 4829..4830, + 4777..4778, ), ( Text( ( "tar", - 4830..4833, + 4778..4781, ), ), - 4830..4833, + 4778..4781, ), ( Escape( ( ".", - 4833..4835, + 4781..4783, ), ), - 4833..4835, + 4781..4783, ), ( Text( ( "gz|tgz", - 4835..4841, + 4783..4789, ), ), - 4835..4841, + 4783..4789, ), ( Text( ( ")", - 4841..4842, + 4789..4790, ), ), - 4841..4842, + 4789..4790, ), ( Text( ( "$", - 4842..4843, + 4790..4791, ), ), - 4842..4843, + 4790..4791, ), ], ), - 4826..4844, + 4774..4792, ), ( Boolean( ( true, - 4846..4850, + 4794..4798, ), ), - 4846..4850, + 4794..4798, ), ], [], ), - 4808..4851, + 4756..4799, ), ( Singleline( @@ -5248,25 +5246,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 4853..4854, + 4801..4802, ), ( Text( "tar", ), - 4855..4858, + 4803..4806, ), ( Text( "xzf", ), - 4859..4862, + 4807..4810, ), ( Text( "\"", ), - 4863..4864, + 4811..4812, ), ( Expression( @@ -5274,31 +5272,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 4865..4869, + 4813..4817, ), ), - 4865..4869, + 4813..4817, ), ), - 4864..4870, + 4812..4818, ), ( Text( "\"", ), - 4870..4871, + 4818..4819, ), ( CommandOption( "-C", ), - 4872..4874, + 4820..4822, ), ( Text( "\"", ), - 4875..4876, + 4823..4824, ), ( Expression( @@ -5306,25 +5304,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "target", - 4877..4883, + 4825..4831, ), ), - 4877..4883, + 4825..4831, ), ), - 4876..4884, + 4824..4832, ), ( Text( "\"", ), - 4884..4885, + 4832..4833, ), ( Text( "$", ), - 4886..4887, + 4834..4835, ), ], [ @@ -5332,26 +5330,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 4887..4888, + 4835..4836, ), ), - 4887..4888, + 4835..4836, ), ], ), - 4853..4888, + 4801..4836, ), ), - 4853..4888, + 4801..4836, ), ), - 4851..4888, + 4799..4836, ), ), - 4808..4888, + 4756..4836, ), ), - 4808..4888, + 4756..4836, ), ( IfCondition( @@ -5362,17 +5360,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 4901..4912, + 4849..4860, ), [ ( Var( ( "path", - 4913..4917, + 4861..4865, ), ), - 4913..4917, + 4861..4865, ), ( Text( @@ -5381,82 +5379,82 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 4920..4922, + 4868..4870, ), ), - 4920..4922, + 4868..4870, ), ( Text( ( "(", - 4922..4923, + 4870..4871, ), ), - 4922..4923, + 4870..4871, ), ( Text( ( "tar", - 4923..4926, + 4871..4874, ), ), - 4923..4926, + 4871..4874, ), ( Escape( ( ".", - 4926..4928, + 4874..4876, ), ), - 4926..4928, + 4874..4876, ), ( Text( ( "xz|txz", - 4928..4934, + 4876..4882, ), ), - 4928..4934, + 4876..4882, ), ( Text( ( ")", - 4934..4935, + 4882..4883, ), ), - 4934..4935, + 4882..4883, ), ( Text( ( "$", - 4935..4936, + 4883..4884, ), ), - 4935..4936, + 4883..4884, ), ], ), - 4919..4937, + 4867..4885, ), ( Boolean( ( true, - 4939..4943, + 4887..4891, ), ), - 4939..4943, + 4887..4891, ), ], [], ), - 4901..4944, + 4849..4892, ), ( Singleline( @@ -5470,25 +5468,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 4946..4947, + 4894..4895, ), ( Text( "tar", ), - 4948..4951, + 4896..4899, ), ( Text( "xJf", ), - 4952..4955, + 4900..4903, ), ( Text( "\"", ), - 4956..4957, + 4904..4905, ), ( Expression( @@ -5496,31 +5494,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 4958..4962, + 4906..4910, ), ), - 4958..4962, + 4906..4910, ), ), - 4957..4963, + 4905..4911, ), ( Text( "\"", ), - 4963..4964, + 4911..4912, ), ( CommandOption( "-C", ), - 4965..4967, + 4913..4915, ), ( Text( "\"", ), - 4968..4969, + 4916..4917, ), ( Expression( @@ -5528,25 +5526,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "target", - 4970..4976, + 4918..4924, ), ), - 4970..4976, + 4918..4924, ), ), - 4969..4977, + 4917..4925, ), ( Text( "\"", ), - 4977..4978, + 4925..4926, ), ( Text( "$", ), - 4979..4980, + 4927..4928, ), ], [ @@ -5554,26 +5552,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 4980..4981, + 4928..4929, ), ), - 4980..4981, + 4928..4929, ), ], ), - 4946..4981, + 4894..4929, ), ), - 4946..4981, + 4894..4929, ), ), - 4944..4981, + 4892..4929, ), ), - 4901..4981, + 4849..4929, ), ), - 4901..4981, + 4849..4929, ), ( IfCondition( @@ -5584,17 +5582,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 4994..5005, + 4942..4953, ), [ ( Var( ( "path", - 5006..5010, + 4954..4958, ), ), - 5006..5010, + 4954..4958, ), ( Text( @@ -5603,37 +5601,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 5013..5015, + 4961..4963, ), ), - 5013..5015, + 4961..4963, ), ( Text( ( "bz2", - 5015..5018, + 4963..4966, ), ), - 5015..5018, + 4963..4966, ), ( Text( ( "$", - 5018..5019, + 4966..4967, ), ), - 5018..5019, + 4966..4967, ), ], ), - 5012..5020, + 4960..4968, ), ], [], ), - 4994..5021, + 4942..4969, ), ( Singleline( @@ -5647,19 +5645,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 5023..5024, + 4971..4972, ), ( Text( "bunzip2", ), - 5025..5032, + 4973..4980, ), ( Text( "\"", ), - 5033..5034, + 4981..4982, ), ( Expression( @@ -5667,25 +5665,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 5035..5039, + 4983..4987, ), ), - 5035..5039, + 4983..4987, ), ), - 5034..5040, + 4982..4988, ), ( Text( "\"", ), - 5040..5041, + 4988..4989, ), ( Text( "$", ), - 5042..5043, + 4990..4991, ), ], [ @@ -5693,26 +5691,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 5043..5044, + 4991..4992, ), ), - 5043..5044, + 4991..4992, ), ], ), - 5023..5044, + 4971..4992, ), ), - 5023..5044, + 4971..4992, ), ), - 5021..5044, + 4969..4992, ), ), - 4994..5044, + 4942..4992, ), ), - 4994..5044, + 4942..4992, ), ( IfCondition( @@ -5723,17 +5721,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 5057..5068, + 5005..5016, ), [ ( Var( ( "path", - 5069..5073, + 5017..5021, ), ), - 5069..5073, + 5017..5021, ), ( Text( @@ -5742,37 +5740,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 5076..5078, + 5024..5026, ), ), - 5076..5078, + 5024..5026, ), ( Text( ( "deb", - 5078..5081, + 5026..5029, ), ), - 5078..5081, + 5026..5029, ), ( Text( ( "$", - 5081..5082, + 5029..5030, ), ), - 5081..5082, + 5029..5030, ), ], ), - 5075..5083, + 5023..5031, ), ], [], ), - 5057..5084, + 5005..5032, ), ( Singleline( @@ -5786,31 +5784,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 5086..5087, + 5034..5035, ), ( Text( "dpkg", ), - 5088..5092, + 5036..5040, ), ( CommandOption( "-deb", ), - 5092..5096, + 5040..5044, ), ( CommandOption( "-xv", ), - 5097..5100, + 5045..5048, ), ( Text( "\"", ), - 5101..5102, + 5049..5050, ), ( Expression( @@ -5818,25 +5816,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 5103..5107, + 5051..5055, ), ), - 5103..5107, + 5051..5055, ), ), - 5102..5108, + 5050..5056, ), ( Text( "\"", ), - 5108..5109, + 5056..5057, ), ( Text( "\"", ), - 5110..5111, + 5058..5059, ), ( Expression( @@ -5844,25 +5842,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "target", - 5112..5118, + 5060..5066, ), ), - 5112..5118, + 5060..5066, ), ), - 5111..5119, + 5059..5067, ), ( Text( "\"", ), - 5119..5120, + 5067..5068, ), ( Text( "$", ), - 5121..5122, + 5069..5070, ), ], [ @@ -5870,26 +5868,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 5122..5123, + 5070..5071, ), ), - 5122..5123, + 5070..5071, ), ], ), - 5086..5123, + 5034..5071, ), ), - 5086..5123, + 5034..5071, ), ), - 5084..5123, + 5032..5071, ), ), - 5057..5123, + 5005..5071, ), ), - 5057..5123, + 5005..5071, ), ( IfCondition( @@ -5900,17 +5898,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 5136..5147, + 5084..5095, ), [ ( Var( ( "path", - 5148..5152, + 5096..5100, ), ), - 5148..5152, + 5096..5100, ), ( Text( @@ -5919,37 +5917,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 5155..5157, + 5103..5105, ), ), - 5155..5157, + 5103..5105, ), ( Text( ( "gz", - 5157..5159, + 5105..5107, ), ), - 5157..5159, + 5105..5107, ), ( Text( ( "$", - 5159..5160, + 5107..5108, ), ), - 5159..5160, + 5107..5108, ), ], ), - 5154..5161, + 5102..5109, ), ], [], ), - 5136..5162, + 5084..5110, ), ( Singleline( @@ -5963,19 +5961,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 5164..5165, + 5112..5113, ), ( Text( "gunzip", ), - 5166..5172, + 5114..5120, ), ( Text( "\"", ), - 5173..5174, + 5121..5122, ), ( Expression( @@ -5983,25 +5981,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 5175..5179, + 5123..5127, ), ), - 5175..5179, + 5123..5127, ), ), - 5174..5180, + 5122..5128, ), ( Text( "\"", ), - 5180..5181, + 5128..5129, ), ( Text( "$", ), - 5182..5183, + 5130..5131, ), ], [ @@ -6009,26 +6007,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 5183..5184, + 5131..5132, ), ), - 5183..5184, + 5131..5132, ), ], ), - 5164..5184, + 5112..5132, ), ), - 5164..5184, + 5112..5132, ), ), - 5162..5184, + 5110..5132, ), ), - 5136..5184, + 5084..5132, ), ), - 5136..5184, + 5084..5132, ), ( IfCondition( @@ -6039,17 +6037,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 5197..5208, + 5145..5156, ), [ ( Var( ( "path", - 5209..5213, + 5157..5161, ), ), - 5209..5213, + 5157..5161, ), ( Text( @@ -6058,37 +6056,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 5216..5218, + 5164..5166, ), ), - 5216..5218, + 5164..5166, ), ( Text( ( "rar", - 5218..5221, + 5166..5169, ), ), - 5218..5221, + 5166..5169, ), ( Text( ( "$", - 5221..5222, + 5169..5170, ), ), - 5221..5222, + 5169..5170, ), ], ), - 5215..5223, + 5163..5171, ), ], [], ), - 5197..5224, + 5145..5172, ), ( Singleline( @@ -6102,25 +6100,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 5226..5227, + 5174..5175, ), ( Text( "unrar", ), - 5228..5233, + 5176..5181, ), ( Text( "x", ), - 5234..5235, + 5182..5183, ), ( Text( "\"", ), - 5236..5237, + 5184..5185, ), ( Expression( @@ -6128,25 +6126,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 5238..5242, + 5186..5190, ), ), - 5238..5242, + 5186..5190, ), ), - 5237..5243, + 5185..5191, ), ( Text( "\"", ), - 5243..5244, + 5191..5192, ), ( Text( "\"", ), - 5245..5246, + 5193..5194, ), ( Expression( @@ -6154,25 +6152,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "target", - 5247..5253, + 5195..5201, ), ), - 5247..5253, + 5195..5201, ), ), - 5246..5254, + 5194..5202, ), ( Text( "\"", ), - 5254..5255, + 5202..5203, ), ( Text( "$", ), - 5256..5257, + 5204..5205, ), ], [ @@ -6180,26 +6178,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 5257..5258, + 5205..5206, ), ), - 5257..5258, + 5205..5206, ), ], ), - 5226..5258, + 5174..5206, ), ), - 5226..5258, + 5174..5206, ), ), - 5224..5258, + 5172..5206, ), ), - 5197..5258, + 5145..5206, ), ), - 5197..5258, + 5145..5206, ), ( IfCondition( @@ -6210,17 +6208,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 5271..5282, + 5219..5230, ), [ ( Var( ( "path", - 5283..5287, + 5231..5235, ), ), - 5283..5287, + 5231..5235, ), ( Text( @@ -6229,37 +6227,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 5290..5292, + 5238..5240, ), ), - 5290..5292, + 5238..5240, ), ( Text( ( "rpm", - 5292..5295, + 5240..5243, ), ), - 5292..5295, + 5240..5243, ), ( Text( ( "$", - 5295..5296, + 5243..5244, ), ), - 5295..5296, + 5243..5244, ), ], ), - 5289..5297, + 5237..5245, ), ], [], ), - 5271..5298, + 5219..5246, ), ( Singleline( @@ -6273,19 +6271,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 5300..5301, + 5248..5249, ), ( Text( "rpm2cpio", ), - 5302..5310, + 5250..5258, ), ( Text( "\"", ), - 5311..5312, + 5259..5260, ), ( Expression( @@ -6293,43 +6291,43 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 5313..5317, + 5261..5265, ), ), - 5313..5317, + 5261..5265, ), ), - 5312..5318, + 5260..5266, ), ( Text( "\"", ), - 5318..5319, + 5266..5267, ), ( Text( "|", ), - 5320..5321, + 5268..5269, ), ( Text( "cpio", ), - 5322..5326, + 5270..5274, ), ( CommandOption( "-idm", ), - 5327..5331, + 5275..5279, ), ( Text( "$", ), - 5332..5333, + 5280..5281, ), ], [ @@ -6337,26 +6335,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 5333..5334, + 5281..5282, ), ), - 5333..5334, + 5281..5282, ), ], ), - 5300..5334, + 5248..5282, ), ), - 5300..5334, + 5248..5282, ), ), - 5298..5334, + 5246..5282, ), ), - 5271..5334, + 5219..5282, ), ), - 5271..5334, + 5219..5282, ), ( IfCondition( @@ -6367,17 +6365,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 5347..5358, + 5295..5306, ), [ ( Var( ( "path", - 5359..5363, + 5307..5311, ), ), - 5359..5363, + 5307..5311, ), ( Text( @@ -6386,37 +6384,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 5366..5368, + 5314..5316, ), ), - 5366..5368, + 5314..5316, ), ( Text( ( "tar", - 5368..5371, + 5316..5319, ), ), - 5368..5371, + 5316..5319, ), ( Text( ( "$", - 5371..5372, + 5319..5320, ), ), - 5371..5372, + 5319..5320, ), ], ), - 5365..5373, + 5313..5321, ), ], [], ), - 5347..5374, + 5295..5322, ), ( Singleline( @@ -6430,25 +6428,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 5376..5377, + 5324..5325, ), ( Text( "tar", ), - 5378..5381, + 5326..5329, ), ( Text( "xf", ), - 5382..5384, + 5330..5332, ), ( Text( "\"", ), - 5385..5386, + 5333..5334, ), ( Expression( @@ -6456,31 +6454,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 5387..5391, + 5335..5339, ), ), - 5387..5391, + 5335..5339, ), ), - 5386..5392, + 5334..5340, ), ( Text( "\"", ), - 5392..5393, + 5340..5341, ), ( CommandOption( "-C", ), - 5394..5396, + 5342..5344, ), ( Text( "\"", ), - 5397..5398, + 5345..5346, ), ( Expression( @@ -6488,25 +6486,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "target", - 5399..5405, + 5347..5353, ), ), - 5399..5405, + 5347..5353, ), ), - 5398..5406, + 5346..5354, ), ( Text( "\"", ), - 5406..5407, + 5354..5355, ), ( Text( "$", ), - 5408..5409, + 5356..5357, ), ], [ @@ -6514,26 +6512,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 5409..5410, + 5357..5358, ), ), - 5409..5410, + 5357..5358, ), ], ), - 5376..5410, + 5324..5358, ), ), - 5376..5410, + 5324..5358, ), ), - 5374..5410, + 5322..5358, ), ), - 5347..5410, + 5295..5358, ), ), - 5347..5410, + 5295..5358, ), ( IfCondition( @@ -6544,17 +6542,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 5423..5434, + 5371..5382, ), [ ( Var( ( "path", - 5435..5439, + 5383..5387, ), ), - 5435..5439, + 5383..5387, ), ( Text( @@ -6563,37 +6561,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 5442..5444, + 5390..5392, ), ), - 5442..5444, + 5390..5392, ), ( Text( ( "xz", - 5444..5446, + 5392..5394, ), ), - 5444..5446, + 5392..5394, ), ( Text( ( "$", - 5446..5447, + 5394..5395, ), ), - 5446..5447, + 5394..5395, ), ], ), - 5441..5448, + 5389..5396, ), ], [], ), - 5423..5449, + 5371..5397, ), ( Singleline( @@ -6607,25 +6605,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 5451..5452, + 5399..5400, ), ( Text( "xz", ), - 5453..5455, + 5401..5403, ), ( CommandOption( "--decompress", ), - 5456..5468, + 5404..5416, ), ( Text( "\"", ), - 5469..5470, + 5417..5418, ), ( Expression( @@ -6633,25 +6631,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 5471..5475, + 5419..5423, ), ), - 5471..5475, + 5419..5423, ), ), - 5470..5476, + 5418..5424, ), ( Text( "\"", ), - 5476..5477, + 5424..5425, ), ( Text( "$", ), - 5478..5479, + 5426..5427, ), ], [ @@ -6659,26 +6657,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 5479..5480, + 5427..5428, ), ), - 5479..5480, + 5427..5428, ), ], ), - 5451..5480, + 5399..5428, ), ), - 5451..5480, + 5399..5428, ), ), - 5449..5480, + 5397..5428, ), ), - 5423..5480, + 5371..5428, ), ), - 5423..5480, + 5371..5428, ), ( IfCondition( @@ -6689,17 +6687,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 5493..5504, + 5441..5452, ), [ ( Var( ( "path", - 5505..5509, + 5453..5457, ), ), - 5505..5509, + 5453..5457, ), ( Text( @@ -6708,37 +6706,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 5512..5514, + 5460..5462, ), ), - 5512..5514, + 5460..5462, ), ( Text( ( "7z", - 5514..5516, + 5462..5464, ), ), - 5514..5516, + 5462..5464, ), ( Text( ( "$", - 5516..5517, + 5464..5465, ), ), - 5516..5517, + 5464..5465, ), ], ), - 5511..5518, + 5459..5466, ), ], [], ), - 5493..5519, + 5441..5467, ), ( Singleline( @@ -6752,25 +6750,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 5521..5522, + 5469..5470, ), ( Text( "7z", ), - 5523..5525, + 5471..5473, ), ( CommandOption( "-y", ), - 5526..5528, + 5474..5476, ), ( Text( "\"", ), - 5529..5530, + 5477..5478, ), ( Expression( @@ -6778,31 +6776,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 5531..5535, + 5479..5483, ), ), - 5531..5535, + 5479..5483, ), ), - 5530..5536, + 5478..5484, ), ( Text( "\"", ), - 5536..5537, + 5484..5485, ), ( CommandOption( "-o", ), - 5538..5540, + 5486..5488, ), ( Text( "\"", ), - 5541..5542, + 5489..5490, ), ( Expression( @@ -6810,25 +6808,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "target", - 5543..5549, + 5491..5497, ), ), - 5543..5549, + 5491..5497, ), ), - 5542..5550, + 5490..5498, ), ( Text( "\"", ), - 5550..5551, + 5498..5499, ), ( Text( "$", ), - 5552..5553, + 5500..5501, ), ], [ @@ -6836,26 +6834,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 5553..5554, + 5501..5502, ), ), - 5553..5554, + 5501..5502, ), ], ), - 5521..5554, + 5469..5502, ), ), - 5521..5554, + 5469..5502, ), ), - 5519..5554, + 5467..5502, ), ), - 5493..5554, + 5441..5502, ), ), - 5493..5554, + 5441..5502, ), ( IfCondition( @@ -6866,17 +6864,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "match_regex", - 5567..5578, + 5515..5526, ), [ ( Var( ( "path", - 5579..5583, + 5527..5531, ), ), - 5579..5583, + 5527..5531, ), ( Text( @@ -6885,73 +6883,73 @@ expression: parse_unwrap(&tokenize(&stdlib)) Escape( ( ".", - 5586..5588, + 5534..5536, ), ), - 5586..5588, + 5534..5536, ), ( Escape( ( "(", - 5588..5590, + 5536..5538, ), ), - 5588..5590, + 5536..5538, ), ( Text( ( "zip", - 5590..5593, + 5538..5541, ), ), - 5590..5593, + 5538..5541, ), ( Escape( ( "|war", - 5593..5598, + 5541..5546, ), ), - 5593..5598, + 5541..5546, ), ( Escape( ( "|jar", - 5598..5603, + 5546..5551, ), ), - 5598..5603, + 5546..5551, ), ( Escape( ( ")", - 5603..5605, + 5551..5553, ), ), - 5603..5605, + 5551..5553, ), ( Text( ( "$", - 5605..5606, + 5553..5554, ), ), - 5605..5606, + 5553..5554, ), ], ), - 5585..5607, + 5533..5555, ), ], [], ), - 5567..5608, + 5515..5556, ), ( Singleline( @@ -6965,19 +6963,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 5610..5611, + 5558..5559, ), ( Text( "unzip", ), - 5612..5617, + 5560..5565, ), ( Text( "\"", ), - 5618..5619, + 5566..5567, ), ( Expression( @@ -6985,31 +6983,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 5620..5624, + 5568..5572, ), ), - 5620..5624, + 5568..5572, ), ), - 5619..5625, + 5567..5573, ), ( Text( "\"", ), - 5625..5626, + 5573..5574, ), ( CommandOption( "-d", ), - 5627..5629, + 5575..5577, ), ( Text( "\"", ), - 5630..5631, + 5578..5579, ), ( Expression( @@ -7017,25 +7015,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "target", - 5632..5638, + 5580..5586, ), ), - 5632..5638, + 5580..5586, ), ), - 5631..5639, + 5579..5587, ), ( Text( "\"", ), - 5639..5640, + 5587..5588, ), ( Text( "$", ), - 5641..5642, + 5589..5590, ), ], [ @@ -7043,26 +7041,26 @@ expression: parse_unwrap(&tokenize(&stdlib)) Failure( ( Propagate, - 5642..5643, + 5590..5591, ), ), - 5642..5643, + 5590..5591, ), ], ), - 5610..5643, + 5558..5591, ), ), - 5610..5643, + 5558..5591, ), ), - 5608..5643, + 5556..5591, ), ), - 5567..5643, + 5515..5591, ), ), - 5567..5643, + 5515..5591, ), ( Else( @@ -7070,7 +7068,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Else( ( "else", - 5656..5660, + 5604..5608, ), ( Block( @@ -7080,7 +7078,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Echo( ( "echo", - 5679..5683, + 5627..5631, ), ( Text( @@ -7089,94 +7087,94 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "Error", - 5685..5690, + 5633..5638, ), ), - 5685..5690, + 5633..5638, ), ( Text( ( ":", - 5690..5691, + 5638..5639, ), ), - 5690..5691, + 5638..5639, ), ( Text( ( "Unsupported", - 5692..5703, + 5640..5651, ), ), - 5692..5703, + 5640..5651, ), ( Text( ( "file", - 5704..5708, + 5652..5656, ), ), - 5704..5708, + 5652..5656, ), ( Text( ( "type", - 5709..5713, + 5657..5661, ), ), - 5709..5713, + 5657..5661, ), ], ), - 5684..5714, + 5632..5662, ), ), - 5679..5714, + 5627..5662, ), ( Fail( ( "fail", - 5731..5735, + 5679..5683, ), Some( ( Int( ( 3, - 5736..5737, + 5684..5685, ), ), - 5736..5737, + 5684..5685, ), ), ), - 5731..5737, + 5679..5685, ), ], ), - 5661..5751, + 5609..5699, ), ), - 5656..5751, + 5604..5699, ), ), - 5656..5751, + 5604..5699, ), ], ), - 4691..5761, + 4639..5709, ), ], ), - 4681..5767, + 4629..5715, ), ), - 4663..5767, + 4611..5715, ), [], Some( @@ -7184,7 +7182,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Else( ( "else", - 5768..5772, + 5716..5720, ), ( Block( @@ -7194,7 +7192,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Echo( ( "echo", - 5783..5787, + 5731..5735, ), ( Text( @@ -7203,87 +7201,87 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "Error", - 5789..5794, + 5737..5742, ), ), - 5789..5794, + 5737..5742, ), ( Text( ( ":", - 5794..5795, + 5742..5743, ), ), - 5794..5795, + 5742..5743, ), ( Text( ( "File", - 5796..5800, + 5744..5748, ), ), - 5796..5800, + 5744..5748, ), ( Text( ( "not", - 5801..5804, + 5749..5752, ), ), - 5801..5804, + 5749..5752, ), ( Text( ( "found", - 5805..5810, + 5753..5758, ), ), - 5805..5810, + 5753..5758, ), ], ), - 5788..5811, + 5736..5759, ), ), - 5783..5811, + 5731..5759, ), ( Fail( ( "fail", - 5820..5824, + 5768..5772, ), Some( ( Int( ( 2, - 5825..5826, + 5773..5774, ), ), - 5825..5826, + 5773..5774, ), ), ), - 5820..5826, + 5768..5774, ), ], ), - 5773..5832, + 5721..5780, ), ), - 5768..5832, + 5716..5780, ), ), ), - 4660..5832, + 4608..5780, ), ], ), - 4600..5834, + 4548..5782, ), ] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap index 24057a8..66c2be6 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap @@ -82,71 +82,71 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "If none of the tools are available, the function returns `false`.", + "If none of the tools are available, the function fails.", ), - 300..370, + 300..360, ), ), - 300..370, + 300..360, ), ), - 300..370, + 300..360, ), ( FunctionDefinition( [], ( true, - 370..373, + 360..363, ), ( "fun", - 374..377, + 364..367, ), ( "file_download", - 378..391, + 368..381, ), [ ( Typed( ( false, - 392..392, + 382..382, ), ( "url", - 392..395, + 382..385, ), ( Text, - 397..401, + 387..391, ), ), - 392..401, + 382..391, ), ( Typed( ( false, - 403..402, + 393..392, ), ( "path", - 403..407, + 393..397, ), ( Text, - 409..413, + 399..403, ), ), - 403..413, + 393..403, ), ], Some( ( - Bool, - 416..420, + Null?, + 406..411, ), ), [ @@ -154,7 +154,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfChain( ( "if", - 427..429, + 418..420, ), [ ( @@ -166,7 +166,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "is_command", - 440..450, + 431..441, ), [ ( @@ -176,19 +176,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "curl", - 452..456, + 443..447, ), ), - 452..456, + 443..447, ), ], ), - 451..457, + 442..448, ), ], [], ), - 440..458, + 431..449, ), ( Block( @@ -201,11 +201,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) [ ( Silent, - 473..479, + 464..470, ), ( Trust, - 480..485, + 471..476, ), ], [ @@ -213,31 +213,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 486..487, + 477..478, ), ( Text( "curl", ), - 488..492, + 479..483, ), ( CommandOption( "-L", ), - 493..495, + 484..486, ), ( CommandOption( "-o", ), - 496..498, + 487..489, ), ( Text( "\"", ), - 499..500, + 490..491, ), ( Expression( @@ -245,25 +245,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 501..505, + 492..496, ), ), - 501..505, + 492..496, ), ), - 500..506, + 491..497, ), ( Text( "\"", ), - 506..507, + 497..498, ), ( Text( "\"", ), - 508..509, + 499..500, ), ( Expression( @@ -271,43 +271,43 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "url", - 510..513, + 501..504, ), ), - 510..513, + 501..504, ), ), - 509..514, + 500..505, ), ( Text( "\"", ), - 514..515, + 505..506, ), ( Text( "$", ), - 516..517, + 507..508, ), ], [], ), - 473..517, + 464..508, ), ), - 473..517, + 464..508, ), ], ), - 459..527, + 450..518, ), ), - 440..527, + 431..518, ), ), - 440..527, + 431..518, ), ( IfCondition( @@ -318,7 +318,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "is_command", - 536..546, + 527..537, ), [ ( @@ -328,19 +328,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "wget", - 548..552, + 539..543, ), ), - 548..552, + 539..543, ), ], ), - 547..553, + 538..544, ), ], [], ), - 536..554, + 527..545, ), ( Block( @@ -353,11 +353,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) [ ( Silent, - 569..575, + 560..566, ), ( Trust, - 576..581, + 567..572, ), ], [ @@ -365,19 +365,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 582..583, + 573..574, ), ( Text( "wget", ), - 584..588, + 575..579, ), ( Text( "\"", ), - 589..590, + 580..581, ), ( Expression( @@ -385,31 +385,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "url", - 591..594, + 582..585, ), ), - 591..594, + 582..585, ), ), - 590..595, + 581..586, ), ( Text( "\"", ), - 595..596, + 586..587, ), ( CommandOption( "-P", ), - 597..599, + 588..590, ), ( Text( "\"", ), - 600..601, + 591..592, ), ( Expression( @@ -417,43 +417,43 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 602..606, + 593..597, ), ), - 602..606, + 593..597, ), ), - 601..607, + 592..598, ), ( Text( "\"", ), - 607..608, + 598..599, ), ( Text( "$", ), - 609..610, + 600..601, ), ], [], ), - 569..610, + 560..601, ), ), - 569..610, + 560..601, ), ], ), - 555..620, + 546..611, ), ), - 536..620, + 527..611, ), ), - 536..620, + 527..611, ), ( IfCondition( @@ -464,7 +464,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "is_command", - 629..639, + 620..630, ), [ ( @@ -474,19 +474,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( ( "aria2c", - 641..647, + 632..638, ), ), - 641..647, + 632..638, ), ], ), - 640..648, + 631..639, ), ], [], ), - 629..649, + 620..640, ), ( Block( @@ -499,11 +499,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) [ ( Silent, - 664..670, + 655..661, ), ( Trust, - 671..676, + 662..667, ), ], [ @@ -511,19 +511,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 677..678, + 668..669, ), ( Text( "aria2c", ), - 679..685, + 670..676, ), ( Text( "\"", ), - 686..687, + 677..678, ), ( Expression( @@ -531,31 +531,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "url", - 688..691, + 679..682, ), ), - 688..691, + 679..682, ), ), - 687..692, + 678..683, ), ( Text( "\"", ), - 692..693, + 683..684, ), ( CommandOption( "-d", ), - 694..696, + 685..687, ), ( Text( "\"", ), - 697..698, + 688..689, ), ( Expression( @@ -563,43 +563,43 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "path", - 699..703, + 690..694, ), ), - 699..703, + 690..694, ), ), - 698..704, + 689..695, ), ( Text( "\"", ), - 704..705, + 695..696, ), ( Text( "$", ), - 706..707, + 697..698, ), ], [], ), - 664..707, + 655..698, ), ), - 664..707, + 655..698, ), ], ), - 650..717, + 641..708, ), ), - 629..717, + 620..708, ), ), - 629..717, + 620..708, ), ( Else( @@ -607,68 +607,48 @@ expression: parse_unwrap(&tokenize(&stdlib)) Else( ( "else", - 726..730, + 717..721, ), ( Block( [], [ ( - Return( + Fail( ( - "return", - 745..751, + "fail", + 736..740, ), Some( ( - Boolean( + Int( ( - false, - 752..757, + 1, + 741..742, ), ), - 752..757, + 741..742, ), ), ), - 745..757, + 736..742, ), ], ), - 731..767, + 722..752, ), ), - 726..767, + 717..752, ), ), - 726..767, + 717..752, ), ], ), - 427..773, - ), - ( - Return( - ( - "return", - 779..785, - ), - Some( - ( - Boolean( - ( - true, - 786..790, - ), - ), - 786..790, - ), - ), - ), - 779..790, + 418..758, ), ], ), - 370..792, + 360..760, ), ] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap index b4f0b52..50afb09 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap @@ -41,7 +41,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), [ ( - Typed( + Generic( ( false, 67..67, @@ -50,292 +50,116 @@ expression: parse_unwrap(&tokenize(&stdlib)) "list", 67..71, ), + ), + 67..71, + ), + ], + None, + [ + ( + VariableInit( + ( + "let", + 79..82, + ), ( - [Num], - 73..78, + "sum", + 83..86, + ), + ( + Expression( + ( + Int( + ( + 0, + 89..90, + ), + ), + 89..90, + ), + ), + 89..90, ), ), - 67..78, + 79..90, ), - ], - Some( ( - Num, - 81..84, + IterLoop( + ( + "for", + 95..98, + ), + ( + Single( + ( + "item", + 99..103, + ), + ), + 99..103, + ), + ( + "in", + 104..106, + ), + ( + Var( + ( + "list", + 107..111, + ), + ), + 107..111, + ), + ( + Singleline( + ( + ShorthandAdd( + ( + "sum", + 113..116, + ), + ( + Var( + ( + "item", + 120..124, + ), + ), + 120..124, + ), + ), + 113..124, + ), + ), + 111..124, + ), + ), + 95..124, ), - ), - [ ( Return( ( "return", - 91..97, + 129..135, ), Some( ( - Cast( - ( - Command( - [ - ( - Trust, - 98..103, - ), - ], - [ - ( - Text( - "$", - ), - 104..105, - ), - ( - Text( - "echo", - ), - 106..110, - ), - ( - Text( - "\"", - ), - 111..112, - ), - ( - Expression( - ( - Var( - ( - "list", - 113..117, - ), - ), - 113..117, - ), - ), - 112..118, - ), - ( - Text( - "\"", - ), - 118..119, - ), - ( - Text( - "|", - ), - 120..121, - ), - ( - Text( - "awk", - ), - 122..125, - ), - ( - Text( - "'", - ), - 126..127, - ), - ( - Escape( - "{", - ), - 127..129, - ), - ( - Text( - "s", - ), - 129..130, - ), - ( - Text( - "=", - ), - 130..131, - ), - ( - Text( - "0", - ), - 131..132, - ), - ( - Text( - ";", - ), - 132..133, - ), - ( - Text( - "for", - ), - 134..137, - ), - ( - Text( - "(", - ), - 138..139, - ), - ( - Text( - "i", - ), - 139..140, - ), - ( - Text( - "=", - ), - 140..141, - ), - ( - Text( - "1", - ), - 141..142, - ), - ( - Text( - ";", - ), - 142..143, - ), - ( - Text( - "i", - ), - 144..145, - ), - ( - Text( - "<=", - ), - 145..147, - ), - ( - Text( - "NF", - ), - 147..149, - ), - ( - Text( - ";", - ), - 149..150, - ), - ( - Text( - "i", - ), - 151..152, - ), - ( - Text( - "+", - ), - 152..153, - ), - ( - Text( - "+", - ), - 153..154, - ), - ( - Text( - ")", - ), - 154..155, - ), - ( - Text( - "s", - ), - 156..157, - ), - ( - Text( - "+=", - ), - 157..159, - ), - ( - Escape( - "$", - ), - 159..161, - ), - ( - Text( - "i", - ), - 161..162, - ), - ( - Text( - ";", - ), - 162..163, - ), - ( - Text( - "print", - ), - 164..169, - ), - ( - Text( - "s", - ), - 170..171, - ), - ( - Text( - "}", - ), - 171..172, - ), - ( - Text( - "'", - ), - 172..173, - ), - ( - Text( - "$", - ), - 174..175, - ), - ], - [], - ), - 98..175, - ), - ( - "as", - 176..178, - ), + Var( ( - Num, - 179..182, + "sum", + 136..139, ), ), - 98..182, + 136..139, ), ), ), - 91..182, + 129..139, ), ], ), - 29..184, + 29..141, ), ( Statement( @@ -345,57 +169,57 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Returns a number, rounded to the nearest integer", ), - 186..239, + 143..196, ), ), - 186..239, + 143..196, ), ), - 186..239, + 143..196, ), ( FunctionDefinition( [ ( AllowAbsurdCast, - 239..259, + 196..216, ), ], ( true, - 260..263, + 217..220, ), ( "fun", - 264..267, + 221..224, ), ( "math_round", - 268..278, + 225..235, ), [ ( Typed( ( false, - 279..279, + 236..236, ), ( "number", - 279..285, + 236..242, ), ( Num, - 287..290, + 244..247, ), ), - 279..290, + 236..247, ), ], Some( ( - Num, - 293..296, + Int, + 250..253, ), ), [ @@ -403,7 +227,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) IfCondition( ( "if", - 303..305, + 260..262, ), ( IfCondition( @@ -413,22 +237,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "number", - 306..312, + 263..269, ), ), - 306..312, + 263..269, ), ( Int( ( 0, - 315..316, + 272..273, ), ), - 315..316, + 272..273, ), ), - 306..316, + 263..273, ), ( Block( @@ -438,7 +262,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 327..333, + 284..290, ), Some( ( @@ -448,7 +272,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) [ ( Trust, - 334..339, + 291..296, ), ], [ @@ -456,25 +280,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 340..341, + 297..298, ), ( Text( "echo", ), - 342..346, + 299..303, ), ( Text( "\"", ), - 347..348, + 304..305, ), ( Text( "(", ), - 348..349, + 305..306, ), ( Expression( @@ -482,117 +306,117 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "number", - 350..356, + 307..313, ), ), - 350..356, + 307..313, ), ), - 349..357, + 306..314, ), ( Text( "+", ), - 357..358, + 314..315, ), ( Text( "0", ), - 358..359, + 315..316, ), ( Text( ".", ), - 359..360, + 316..317, ), ( Text( "5", ), - 360..361, + 317..318, ), ( Text( ")", ), - 361..362, + 318..319, ), ( Text( "/", ), - 362..363, + 319..320, ), ( Text( "1", ), - 363..364, + 320..321, ), ( Text( "\"", ), - 364..365, + 321..322, ), ( Text( "|", ), - 366..367, + 323..324, ), ( Text( "bc", ), - 368..370, + 325..327, ), ( Text( "$", ), - 371..372, + 328..329, ), ], [], ), - 334..372, + 291..329, ), ( "as", - 373..375, + 330..332, ), ( - Num, - 376..379, + Int, + 333..336, ), ), - 334..379, + 291..336, ), ), ), - 327..379, + 284..336, ), ], ), - 317..385, + 274..342, ), ), - 306..385, + 263..342, ), [], None, ), - 303..385, + 260..342, ), ( Return( ( "return", - 391..397, + 348..354, ), Some( ( @@ -602,7 +426,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) [ ( Trust, - 398..403, + 355..360, ), ], [ @@ -610,25 +434,25 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 404..405, + 361..362, ), ( Text( "echo", ), - 406..410, + 363..367, ), ( Text( "\"", ), - 411..412, + 368..369, ), ( Text( "(", ), - 412..413, + 369..370, ), ( Expression( @@ -636,97 +460,97 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "number", - 414..420, + 371..377, ), ), - 414..420, + 371..377, ), ), - 413..421, + 370..378, ), ( CommandOption( "-0", ), - 421..423, + 378..380, ), ( Text( ".", ), - 423..424, + 380..381, ), ( Text( "5", ), - 424..425, + 381..382, ), ( Text( ")", ), - 425..426, + 382..383, ), ( Text( "/", ), - 426..427, + 383..384, ), ( Text( "1", ), - 427..428, + 384..385, ), ( Text( "\"", ), - 428..429, + 385..386, ), ( Text( "|", ), - 430..431, + 387..388, ), ( Text( "bc", ), - 432..434, + 389..391, ), ( Text( "$", ), - 435..436, + 392..393, ), ], [], ), - 398..436, + 355..393, ), ( "as", - 437..439, + 394..396, ), ( - Num, - 440..443, + Int, + 397..400, ), ), - 398..443, + 355..400, ), ), ), - 391..443, + 348..400, ), ], ), - 239..445, + 196..402, ), ( Statement( @@ -736,57 +560,57 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Returns the largest integer less than or equal to a number", ), - 447..510, + 404..467, ), ), - 447..510, + 404..467, ), ), - 447..510, + 404..467, ), ( FunctionDefinition( [ ( AllowAbsurdCast, - 510..530, + 467..487, ), ], ( true, - 531..534, + 488..491, ), ( "fun", - 535..538, + 492..495, ), ( "math_floor", - 539..549, + 496..506, ), [ ( Typed( ( false, - 550..550, + 507..507, ), ( "number", - 550..556, + 507..513, ), ( Num, - 558..561, + 515..518, ), ), - 550..561, + 507..518, ), ], Some( ( - Num, - 564..567, + Int, + 521..524, ), ), [ @@ -794,7 +618,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 574..580, + 531..537, ), Some( ( @@ -804,7 +628,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) [ ( Trust, - 581..586, + 538..543, ), ], [ @@ -812,19 +636,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( "$", ), - 587..588, + 544..545, ), ( Text( "echo", ), - 589..593, + 546..550, ), ( Text( "\"", ), - 594..595, + 551..552, ), ( Expression( @@ -832,235 +656,235 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "number", - 596..602, + 553..559, ), ), - 596..602, + 553..559, ), ), - 595..603, + 552..560, ), ( Text( "\"", ), - 603..604, + 560..561, ), ( Text( "|", ), - 605..606, + 562..563, ), ( Text( "awk", ), - 607..610, + 564..567, ), ( Text( "'", ), - 611..612, + 568..569, ), ( Escape( "{", ), - 612..614, + 569..571, ), ( Text( "printf", ), - 614..620, + 571..577, ), ( Text( "\"", ), - 621..622, + 578..579, ), ( Text( "%", ), - 622..623, + 579..580, ), ( Text( "d", ), - 623..624, + 580..581, ), ( Text( "\"", ), - 624..625, + 581..582, ), ( Text( ",", ), - 625..626, + 582..583, ), ( Text( "(", ), - 627..628, + 584..585, ), ( Escape( "$", ), - 628..630, + 585..587, ), ( Text( "1", ), - 630..631, + 587..588, ), ( Text( "<", ), - 632..633, + 589..590, ), ( Text( "0", ), - 634..635, + 591..592, ), ( Text( "?", ), - 636..637, + 593..594, ), ( Text( "int", ), - 638..641, + 595..598, ), ( Text( "(", ), - 641..642, + 598..599, ), ( Escape( "$", ), - 642..644, + 599..601, ), ( Text( "1", ), - 644..645, + 601..602, ), ( Text( ")", ), - 645..646, + 602..603, ), ( CommandOption( "-1", ), - 647..650, + 604..607, ), ( Text( ":", ), - 651..652, + 608..609, ), ( Text( "int", ), - 653..656, + 610..613, ), ( Text( "(", ), - 656..657, + 613..614, ), ( Escape( "$", ), - 657..659, + 614..616, ), ( Text( "1", ), - 659..660, + 616..617, ), ( Text( ")", ), - 660..661, + 617..618, ), ( Text( ")", ), - 661..662, + 618..619, ), ( Text( "}", ), - 662..663, + 619..620, ), ( Text( "'", ), - 663..664, + 620..621, ), ( Text( "$", ), - 665..666, + 622..623, ), ], [], ), - 581..666, + 538..623, ), ( "as", - 667..669, + 624..626, ), ( - Num, - 670..673, + Int, + 627..630, ), ), - 581..673, + 538..630, ), ), ), - 574..673, + 531..630, ), ], ), - 510..675, + 467..632, ), ( Statement( @@ -1070,57 +894,57 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Returns the smallest integer greater than or equal to a number", ), - 677..744, + 634..701, ), ), - 677..744, + 634..701, ), ), - 677..744, + 634..701, ), ( FunctionDefinition( [ ( AllowAbsurdCast, - 744..764, + 701..721, ), ], ( true, - 765..768, + 722..725, ), ( "fun", - 769..772, + 726..729, ), ( "math_ceil", - 773..782, + 730..739, ), [ ( Typed( ( false, - 783..783, + 740..740, ), ( "number", - 783..789, + 740..746, ), ( Num, - 791..794, + 748..751, ), ), - 783..794, + 740..751, ), ], Some( ( - Num, - 797..800, + Int, + 754..757, ), ), [ @@ -1128,7 +952,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 807..813, + 764..770, ), Some( ( @@ -1138,42 +962,42 @@ expression: parse_unwrap(&tokenize(&stdlib)) [], ( "math_floor", - 814..824, + 771..781, ), [ ( Var( ( "number", - 825..831, + 782..788, ), ), - 825..831, + 782..788, ), ], [], ), - 814..832, + 771..789, ), ( - Number( + Int( ( - 1.0, - 835..838, + 1, + 792..793, ), ), - 835..838, + 792..793, ), ), - 814..838, + 771..793, ), ), ), - 807..838, + 764..793, ), ], ), - 744..840, + 701..795, ), ( Statement( @@ -1183,65 +1007,56 @@ expression: parse_unwrap(&tokenize(&stdlib)) DocString( "Returns the absolute value of a number", ), - 842..885, + 797..840, ), ), - 842..885, + 797..840, ), ), - 842..885, + 797..840, ), ( FunctionDefinition( [ ( AllowAbsurdCast, - 885..905, + 840..860, ), ], ( true, - 906..909, + 861..864, ), ( "fun", - 910..913, + 865..868, ), ( "math_abs", - 914..922, + 869..877, ), [ ( - Typed( + Generic( ( false, - 923..923, + 878..878, ), ( "number", - 923..929, - ), - ( - Num, - 931..934, + 878..884, ), ), - 923..934, + 878..884, ), ], - Some( - ( - Num, - 937..940, - ), - ), + None, [ ( IfCondition( ( "if", - 947..949, + 892..894, ), ( IfCondition( @@ -1251,22 +1066,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "number", - 950..956, + 895..901, ), ), - 950..956, + 895..901, ), ( Int( ( 0, - 959..960, + 904..905, ), ), - 959..960, + 904..905, ), ), - 950..960, + 895..905, ), ( Singleline( @@ -1274,64 +1089,64 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 962..968, + 907..913, ), Some( ( Neg( ( "-", - 969..970, + 914..915, ), ( Var( ( "number", - 970..976, + 915..921, ), ), - 970..976, + 915..921, ), ), - 970..976, + 915..921, ), ), ), - 962..976, + 907..921, ), ), - 960..976, + 905..921, ), ), - 950..976, + 895..921, ), [], None, ), - 947..976, + 892..921, ), ( Return( ( "return", - 981..987, + 926..932, ), Some( ( Var( ( "number", - 988..994, + 933..939, ), ), - 988..994, + 933..939, ), ), ), - 981..994, + 926..939, ), ], ), - 885..996, + 840..941, ), ] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap index c26b72e..217b6fd 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap @@ -720,22 +720,22 @@ expression: parse_unwrap(&tokens) 759..761, ), ( - Escape( + Text( "\"", ), - 761..763, + 761..762, ), ( Escape( "$", ), - 763..765, + 762..764, ), ( Escape( "{", ), - 765..767, + 764..766, ), ( Expression( @@ -743,58 +743,58 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 768..774, + 767..773, ), ( Var( ( "search", - 775..781, + 774..780, ), ), - 775..781, + 774..780, ), ), - 775..781, + 774..780, ), ), - 767..782, + 766..781, ), ( Text( "}", ), - 782..783, + 781..782, ), ( - Escape( + Text( "\"", ), - 783..785, + 782..783, ), ( Text( "/", ), - 785..786, + 783..784, ), ( - Escape( + Text( "\"", ), - 786..788, + 784..785, ), ( Escape( "$", ), - 788..790, + 785..787, ), ( Escape( "{", ), - 790..792, + 787..789, ), ( Expression( @@ -802,67 +802,67 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 793..799, + 790..796, ), ( Var( ( "replace", - 800..807, + 797..804, ), ), - 800..807, + 797..804, ), ), - 800..807, + 797..804, ), ), - 792..808, + 789..805, ), ( Text( "}", ), - 808..809, + 805..806, ), ( - Escape( + Text( "\"", ), - 809..811, + 806..807, ), ( Text( "}", ), - 811..812, + 807..808, ), ( Text( "\"", ), - 812..813, + 808..809, ), ( Text( "$", ), - 814..815, + 810..811, ), ], [], ), - 715..815, + 715..811, ), ), - 715..815, + 715..811, ), ], ), - 705..821, + 705..817, ), ), - 681..821, + 681..817, ), [], Some( @@ -870,7 +870,7 @@ expression: parse_unwrap(&tokens) Else( ( "else", - 822..826, + 818..822, ), ( Block( @@ -883,7 +883,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 837..842, + 833..838, ), ], [ @@ -891,7 +891,7 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 843..844, + 839..840, ), ( Expression( @@ -899,46 +899,46 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 846..852, + 842..848, ), ( Var( ( "result", - 853..859, + 849..855, ), ), - 853..859, + 849..855, ), ), - 853..859, + 849..855, ), ), - 845..860, + 841..856, ), ( Text( "=", ), - 860..861, + 856..857, ), ( Text( "\"", ), - 861..862, + 857..858, ), ( Escape( "$", ), - 862..864, + 858..860, ), ( Escape( "{", ), - 864..866, + 860..862, ), ( Expression( @@ -946,46 +946,46 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 867..873, + 863..869, ), ( Var( ( "source", - 874..880, + 870..876, ), ), - 874..880, + 870..876, ), ), - 874..880, + 870..876, ), ), - 866..881, + 862..877, ), ( Text( "//", ), - 881..883, + 877..879, ), ( - Escape( + Text( "\"", ), - 883..885, + 879..880, ), ( Escape( "$", ), - 885..887, + 880..882, ), ( Escape( "{", ), - 887..889, + 882..884, ), ( Expression( @@ -993,52 +993,52 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 890..896, + 885..891, ), ( Var( ( "search", - 897..903, + 892..898, ), ), - 897..903, + 892..898, ), ), - 897..903, + 892..898, ), ), - 889..904, + 884..899, ), ( Text( "}", ), - 904..905, + 899..900, ), ( - Escape( + Text( "\"", ), - 905..907, + 900..901, ), ( Text( "/", ), - 907..908, + 901..902, ), ( Escape( "$", ), - 908..910, + 902..904, ), ( Escape( "{", ), - 910..912, + 904..906, ), ( Expression( @@ -1046,89 +1046,89 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 913..919, + 907..913, ), ( Var( ( "replace", - 920..927, + 914..921, ), ), - 920..927, + 914..921, ), ), - 920..927, + 914..921, ), ), - 912..928, + 906..922, ), ( Text( "}", ), - 928..929, + 922..923, ), ( Text( "}", ), - 929..930, + 923..924, ), ( Text( "\"", ), - 930..931, + 924..925, ), ( Text( "$", ), - 932..933, + 926..927, ), ], [], ), - 837..933, + 833..927, ), ), - 837..933, + 833..927, ), ], ), - 827..939, + 823..933, ), ), - 822..939, + 818..933, ), ), ), - 678..939, + 678..933, ), ( Return( ( "return", - 944..950, + 938..944, ), Some( ( Var( ( "result", - 951..957, + 945..951, ), ), - 951..957, + 945..951, ), ), ), - 944..957, + 938..951, ), ], ), - 568..959, + 568..953, ), ( Statement( @@ -1138,68 +1138,68 @@ expression: parse_unwrap(&tokens) DocString( "Replaces the first occurrence of a pattern in the content with the provided replace text.", ), - 961..1055, + 955..1049, ), ), - 961..1055, + 955..1049, ), ), - 961..1055, + 955..1049, ), ( FunctionDefinition( [], ( true, - 1055..1058, + 1049..1052, ), ( "fun", - 1059..1062, + 1053..1056, ), ( "replace_one", - 1063..1074, + 1057..1068, ), [ ( Generic( ( false, - 1075..1075, + 1069..1069, ), ( "source", - 1075..1081, + 1069..1075, ), ), - 1075..1081, + 1069..1075, ), ( Generic( ( false, - 1083..1082, + 1077..1076, ), ( "search", - 1083..1089, + 1077..1083, ), ), - 1083..1089, + 1077..1083, ), ( Generic( ( false, - 1091..1090, + 1085..1084, ), ( "replace", - 1091..1098, + 1085..1092, ), ), - 1091..1098, + 1085..1092, ), ], None, @@ -1210,20 +1210,20 @@ expression: parse_unwrap(&tokens) Comment( "Here we use a command to avoid #646", ), - 1106..1145, + 1100..1139, ), ), - 1106..1145, + 1100..1139, ), ( VariableInit( ( "let", - 1149..1152, + 1143..1146, ), ( "result", - 1153..1159, + 1147..1153, ), ( Expression( @@ -1231,19 +1231,19 @@ expression: parse_unwrap(&tokens) Text( [], ), - 1162..1164, + 1156..1158, ), ), - 1162..1164, + 1156..1158, ), ), - 1149..1164, + 1143..1158, ), ( IfCondition( ( "if", - 1169..1171, + 1163..1165, ), ( IfCondition( @@ -1254,12 +1254,12 @@ expression: parse_unwrap(&tokens) [], ( "bash_version", - 1172..1184, + 1166..1178, ), [], [], ), - 1172..1186, + 1166..1180, ), ( Array( @@ -1268,26 +1268,26 @@ expression: parse_unwrap(&tokens) Int( ( 4, - 1191..1192, + 1185..1186, ), ), - 1191..1192, + 1185..1186, ), ( Int( ( 3, - 1193..1194, + 1187..1188, ), ), - 1193..1194, + 1187..1188, ), ], ), - 1190..1195, + 1184..1189, ), ), - 1172..1195, + 1166..1189, ), ( Block( @@ -1300,7 +1300,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 1206..1211, + 1200..1205, ), ], [ @@ -1308,7 +1308,7 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 1212..1213, + 1206..1207, ), ( Expression( @@ -1316,46 +1316,46 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 1215..1221, + 1209..1215, ), ( Var( ( "result", - 1222..1228, + 1216..1222, ), ), - 1222..1228, + 1216..1222, ), ), - 1222..1228, + 1216..1222, ), ), - 1214..1229, + 1208..1223, ), ( Text( "=", ), - 1229..1230, + 1223..1224, ), ( Text( "\"", ), - 1230..1231, + 1224..1225, ), ( Escape( "$", ), - 1231..1233, + 1225..1227, ), ( Escape( "{", ), - 1233..1235, + 1227..1229, ), ( Expression( @@ -1363,46 +1363,46 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 1236..1242, + 1230..1236, ), ( Var( ( "source", - 1243..1249, + 1237..1243, ), ), - 1243..1249, + 1237..1243, ), ), - 1243..1249, + 1237..1243, ), ), - 1235..1250, + 1229..1244, ), ( Text( "/", ), - 1250..1251, + 1244..1245, ), ( - Escape( + Text( "\"", ), - 1251..1253, + 1245..1246, ), ( Escape( "$", ), - 1253..1255, + 1246..1248, ), ( Escape( "{", ), - 1255..1257, + 1248..1250, ), ( Expression( @@ -1410,58 +1410,58 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 1258..1264, + 1251..1257, ), ( Var( ( "search", - 1265..1271, + 1258..1264, ), ), - 1265..1271, + 1258..1264, ), ), - 1265..1271, + 1258..1264, ), ), - 1257..1272, + 1250..1265, ), ( Text( "}", ), - 1272..1273, + 1265..1266, ), ( - Escape( + Text( "\"", ), - 1273..1275, + 1266..1267, ), ( Text( "/", ), - 1275..1276, + 1267..1268, ), ( - Escape( + Text( "\"", ), - 1276..1278, + 1268..1269, ), ( Escape( "$", ), - 1278..1280, + 1269..1271, ), ( Escape( "{", ), - 1280..1282, + 1271..1273, ), ( Expression( @@ -1469,67 +1469,67 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 1283..1289, + 1274..1280, ), ( Var( ( "replace", - 1290..1297, + 1281..1288, ), ), - 1290..1297, + 1281..1288, ), ), - 1290..1297, + 1281..1288, ), ), - 1282..1298, + 1273..1289, ), ( Text( "}", ), - 1298..1299, + 1289..1290, ), ( - Escape( + Text( "\"", ), - 1299..1301, + 1290..1291, ), ( Text( "}", ), - 1301..1302, + 1291..1292, ), ( Text( "\"", ), - 1302..1303, + 1292..1293, ), ( Text( "$", ), - 1304..1305, + 1294..1295, ), ], [], ), - 1206..1305, + 1200..1295, ), ), - 1206..1305, + 1200..1295, ), ], ), - 1196..1311, + 1190..1301, ), ), - 1172..1311, + 1166..1301, ), [], Some( @@ -1537,7 +1537,7 @@ expression: parse_unwrap(&tokens) Else( ( "else", - 1312..1316, + 1302..1306, ), ( Block( @@ -1550,7 +1550,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 1327..1332, + 1317..1322, ), ], [ @@ -1558,7 +1558,7 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 1333..1334, + 1323..1324, ), ( Expression( @@ -1566,46 +1566,46 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 1336..1342, + 1326..1332, ), ( Var( ( "result", - 1343..1349, + 1333..1339, ), ), - 1343..1349, + 1333..1339, ), ), - 1343..1349, + 1333..1339, ), ), - 1335..1350, + 1325..1340, ), ( Text( "=", ), - 1350..1351, + 1340..1341, ), ( Text( "\"", ), - 1351..1352, + 1341..1342, ), ( Escape( "$", ), - 1352..1354, + 1342..1344, ), ( Escape( "{", ), - 1354..1356, + 1344..1346, ), ( Expression( @@ -1613,46 +1613,46 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 1357..1363, + 1347..1353, ), ( Var( ( "source", - 1364..1370, + 1354..1360, ), ), - 1364..1370, + 1354..1360, ), ), - 1364..1370, + 1354..1360, ), ), - 1356..1371, + 1346..1361, ), ( Text( "/", ), - 1371..1372, + 1361..1362, ), ( - Escape( + Text( "\"", ), - 1372..1374, + 1362..1363, ), ( Escape( "$", ), - 1374..1376, + 1363..1365, ), ( Escape( "{", ), - 1376..1378, + 1365..1367, ), ( Expression( @@ -1660,52 +1660,52 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 1379..1385, + 1368..1374, ), ( Var( ( "search", - 1386..1392, + 1375..1381, ), ), - 1386..1392, + 1375..1381, ), ), - 1386..1392, + 1375..1381, ), ), - 1378..1393, + 1367..1382, ), ( Text( "}", ), - 1393..1394, + 1382..1383, ), ( - Escape( + Text( "\"", ), - 1394..1396, + 1383..1384, ), ( Text( "/", ), - 1396..1397, + 1384..1385, ), ( Escape( "$", ), - 1397..1399, + 1385..1387, ), ( Escape( "{", ), - 1399..1401, + 1387..1389, ), ( Expression( @@ -1713,89 +1713,89 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 1402..1408, + 1390..1396, ), ( Var( ( "replace", - 1409..1416, + 1397..1404, ), ), - 1409..1416, + 1397..1404, ), ), - 1409..1416, + 1397..1404, ), ), - 1401..1417, + 1389..1405, ), ( Text( "}", ), - 1417..1418, + 1405..1406, ), ( Text( "}", ), - 1418..1419, + 1406..1407, ), ( Text( "\"", ), - 1419..1420, + 1407..1408, ), ( Text( "$", ), - 1421..1422, + 1409..1410, ), ], [], ), - 1327..1422, + 1317..1410, ), ), - 1327..1422, + 1317..1410, ), ], ), - 1317..1428, + 1307..1416, ), ), - 1312..1428, + 1302..1416, ), ), ), - 1169..1428, + 1163..1416, ), ( Return( ( "return", - 1433..1439, + 1421..1427, ), Some( ( Var( ( "result", - 1440..1446, + 1428..1434, ), ), - 1440..1446, + 1428..1434, ), ), ), - 1433..1446, + 1421..1434, ), ], ), - 1055..1448, + 1049..1436, ), ( Statement( @@ -1803,26 +1803,26 @@ expression: parse_unwrap(&tokens) ConstInit( ( "const", - 1450..1455, + 1438..1443, ), ( "SED_VERSION_UNKNOWN", - 1456..1475, + 1444..1463, ), ( Int( ( 0, - 1478..1479, + 1466..1467, ), ), - 1478..1479, + 1466..1467, ), ), - 1450..1479, + 1438..1467, ), ), - 1450..1479, + 1438..1467, ), ( Statement( @@ -1830,26 +1830,26 @@ expression: parse_unwrap(&tokens) ConstInit( ( "const", - 1480..1485, + 1468..1473, ), ( "SED_VERSION_GNU", - 1486..1501, + 1474..1489, ), ( Int( ( 1, - 1504..1505, + 1492..1493, ), ), - 1504..1505, + 1492..1493, ), ), - 1480..1505, + 1468..1493, ), ), - 1480..1505, + 1468..1493, ), ( Statement( @@ -1857,47 +1857,47 @@ expression: parse_unwrap(&tokens) ConstInit( ( "const", - 1506..1511, + 1494..1499, ), ( "SED_VERSION_BUSYBOX", - 1512..1531, + 1500..1519, ), ( Int( ( 2, - 1534..1535, + 1522..1523, ), ), - 1534..1535, + 1522..1523, ), ), - 1506..1535, + 1494..1523, ), ), - 1506..1535, + 1494..1523, ), ( FunctionDefinition( [], ( false, - 1537..1535, + 1525..1523, ), ( "fun", - 1537..1540, + 1525..1528, ), ( "sed_version", - 1541..1552, + 1529..1540, ), [], Some( ( Int, - 1556..1559, + 1544..1547, ), ), [ @@ -1907,10 +1907,10 @@ expression: parse_unwrap(&tokens) Comment( "We can't match against a word \"GNU\" because", ), - 1566..1613, + 1554..1601, ), ), - 1566..1613, + 1554..1601, ), ( Comment( @@ -1918,10 +1918,10 @@ expression: parse_unwrap(&tokens) Comment( "alpine's busybox sed returns \"This is not GNU sed version\"", ), - 1617..1679, + 1605..1667, ), ), - 1617..1679, + 1605..1667, ), ( Expression( @@ -1930,7 +1930,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 1683..1688, + 1671..1676, ), ], [ @@ -1938,213 +1938,213 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 1689..1690, + 1677..1678, ), ( Text( "re", ), - 1691..1693, + 1679..1681, ), ( Text( "=", ), - 1693..1694, + 1681..1682, ), ( Text( "'", ), - 1694..1695, + 1682..1683, ), ( Escape( "bCopyright", ), - 1695..1706, + 1683..1694, ), ( Escape( "b", ), - 1706..1708, + 1694..1696, ), ( Text( ".", ), - 1708..1709, + 1696..1697, ), ( Text( "+", ), - 1709..1710, + 1697..1698, ), ( Escape( "bFree", ), - 1710..1716, + 1698..1704, ), ( Text( "Software", ), - 1717..1725, + 1705..1713, ), ( Text( "Foundation", ), - 1726..1736, + 1714..1724, ), ( Escape( "b'", ), - 1736..1739, + 1724..1727, ), ( Text( ";", ), - 1739..1740, + 1727..1728, ), ( Text( "[", ), - 1741..1742, + 1729..1730, ), ( Text( "[", ), - 1742..1743, + 1730..1731, ), ( Escape( "$", ), - 1744..1746, + 1732..1734, ), ( Text( "(", ), - 1746..1747, + 1734..1735, ), ( Text( "sed", ), - 1747..1750, + 1735..1738, ), ( CommandOption( "--version", ), - 1751..1760, + 1739..1748, ), ( Text( "2", ), - 1761..1762, + 1749..1750, ), ( Text( ">", ), - 1762..1763, + 1750..1751, ), ( Text( "/", ), - 1763..1764, + 1751..1752, ), ( Text( "dev", ), - 1764..1767, + 1752..1755, ), ( Text( "/", ), - 1767..1768, + 1755..1756, ), ( Text( "null", ), - 1768..1772, + 1756..1760, ), ( Text( ")", ), - 1772..1773, + 1760..1761, ), ( Text( "=", ), - 1774..1775, + 1762..1763, ), ( Text( "~", ), - 1775..1776, + 1763..1764, ), ( Escape( "$", ), - 1777..1779, + 1765..1767, ), ( Text( "re", ), - 1779..1781, + 1767..1769, ), ( Text( "]", ), - 1782..1783, + 1770..1771, ), ( Text( "]", ), - 1783..1784, + 1771..1772, ), ( Text( "$", ), - 1785..1786, + 1773..1774, ), ], [], ), - 1683..1786, + 1671..1774, ), ), - 1683..1786, + 1671..1774, ), ( IfCondition( ( "if", - 1791..1793, + 1779..1781, ), ( IfCondition( @@ -2152,19 +2152,19 @@ expression: parse_unwrap(&tokens) Eq( ( Status, - 1794..1800, + 1782..1788, ), ( Int( ( 0, - 1804..1805, + 1792..1793, ), ), - 1804..1805, + 1792..1793, ), ), - 1794..1805, + 1782..1793, ), ( Block( @@ -2174,33 +2174,33 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 1816..1822, + 1804..1810, ), Some( ( Var( ( "SED_VERSION_GNU", - 1823..1838, + 1811..1826, ), ), - 1823..1838, + 1811..1826, ), ), ), - 1816..1838, + 1804..1826, ), ], ), - 1806..1844, + 1794..1832, ), ), - 1794..1844, + 1782..1832, ), [], None, ), - 1791..1844, + 1779..1832, ), ( Expression( @@ -2209,7 +2209,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 1849..1854, + 1837..1842, ), ], [ @@ -2217,153 +2217,153 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 1855..1856, + 1843..1844, ), ( Text( "re", ), - 1857..1859, + 1845..1847, ), ( Text( "=", ), - 1859..1860, + 1847..1848, ), ( Text( "'", ), - 1860..1861, + 1848..1849, ), ( Escape( "bBusyBox", ), - 1861..1870, + 1849..1858, ), ( Escape( "b'", ), - 1870..1873, + 1858..1861, ), ( Text( ";", ), - 1873..1874, + 1861..1862, ), ( Text( "[", ), - 1875..1876, + 1863..1864, ), ( Text( "[", ), - 1876..1877, + 1864..1865, ), ( Escape( "$", ), - 1878..1880, + 1866..1868, ), ( Text( "(", ), - 1880..1881, + 1868..1869, ), ( Text( "sed", ), - 1881..1884, + 1869..1872, ), ( Text( "2", ), - 1885..1886, + 1873..1874, ), ( Text( ">", ), - 1886..1887, + 1874..1875, ), ( Text( "&1", ), - 1887..1889, + 1875..1877, ), ( Text( ")", ), - 1889..1890, + 1877..1878, ), ( Text( "=", ), - 1891..1892, + 1879..1880, ), ( Text( "~", ), - 1892..1893, + 1880..1881, ), ( Escape( "$", ), - 1894..1896, + 1882..1884, ), ( Text( "re", ), - 1896..1898, + 1884..1886, ), ( Text( "]", ), - 1899..1900, + 1887..1888, ), ( Text( "]", ), - 1900..1901, + 1888..1889, ), ( Text( "$", ), - 1902..1903, + 1890..1891, ), ], [], ), - 1849..1903, + 1837..1891, ), ), - 1849..1903, + 1837..1891, ), ( IfCondition( ( "if", - 1908..1910, + 1896..1898, ), ( IfCondition( @@ -2371,19 +2371,19 @@ expression: parse_unwrap(&tokens) Eq( ( Status, - 1911..1917, + 1899..1905, ), ( Int( ( 0, - 1921..1922, + 1909..1910, ), ), - 1921..1922, + 1909..1910, ), ), - 1911..1922, + 1899..1910, ), ( Block( @@ -2393,57 +2393,57 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 1933..1939, + 1921..1927, ), Some( ( Var( ( "SED_VERSION_BUSYBOX", - 1940..1959, + 1928..1947, ), ), - 1940..1959, + 1928..1947, ), ), ), - 1933..1959, + 1921..1947, ), ], ), - 1923..1965, + 1911..1953, ), ), - 1911..1965, + 1899..1953, ), [], None, ), - 1908..1965, + 1896..1953, ), ( Return( ( "return", - 1970..1976, + 1958..1964, ), Some( ( Var( ( "SED_VERSION_UNKNOWN", - 1977..1996, + 1965..1984, ), ), - 1977..1996, + 1965..1984, ), ), ), - 1970..1996, + 1958..1984, ), ], ), - 1537..1998, + 1525..1986, ), ( Statement( @@ -2451,15 +2451,15 @@ expression: parse_unwrap(&tokens) Comment( ( DocString( - "Replaces all occurences of a regex pattern in the content with the provided replace text.", + "Replaces all occurrences of a regex pattern in the content with the provided replace text.", ), - 2000..2094, + 1988..2083, ), ), - 2000..2094, + 1988..2083, ), ), - 2000..2094, + 1988..2083, ), ( Statement( @@ -2469,13 +2469,13 @@ expression: parse_unwrap(&tokens) DocString( "", ), - 2094..2098, + 2083..2087, ), ), - 2094..2098, + 2083..2087, ), ), - 2094..2098, + 2083..2087, ), ( Statement( @@ -2485,114 +2485,114 @@ expression: parse_unwrap(&tokens) DocString( "Function uses `sed`", ), - 2098..2122, + 2087..2111, ), ), - 2098..2122, + 2087..2111, ), ), - 2098..2122, + 2087..2111, ), ( FunctionDefinition( [], ( true, - 2122..2125, + 2111..2114, ), ( "fun", - 2126..2129, + 2115..2118, ), ( "replace_regex", - 2130..2143, + 2119..2132, ), [ ( Typed( ( false, - 2144..2144, + 2133..2133, ), ( "source", - 2144..2150, + 2133..2139, ), ( Text, - 2152..2156, + 2141..2145, ), ), - 2144..2156, + 2133..2145, ), ( Typed( ( false, - 2158..2157, + 2147..2146, ), ( "search", - 2158..2164, + 2147..2153, ), ( Text, - 2166..2170, + 2155..2159, ), ), - 2158..2170, + 2147..2159, ), ( Typed( ( false, - 2172..2171, + 2161..2160, ), ( "replace_text", - 2172..2184, + 2161..2173, ), ( Text, - 2186..2190, + 2175..2179, ), ), - 2172..2190, + 2161..2179, ), ( Optional( ( false, - 2192..2191, + 2181..2180, ), ( "extended", - 2192..2200, + 2181..2189, ), Some( ( Bool, - 2202..2206, + 2191..2195, ), ), ( Boolean( ( false, - 2209..2214, + 2198..2203, ), ), - 2209..2214, + 2198..2203, ), ), - 2192..2214, + 2181..2203, ), ], Some( ( Text, - 2217..2221, + 2206..2210, ), ), [ @@ -2603,7 +2603,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 2228..2233, + 2217..2222, ), ], [ @@ -2611,49 +2611,49 @@ expression: parse_unwrap(&tokens) ConstInit( ( "const", - 2244..2249, + 2233..2238, ), ( "sed_version", - 2250..2261, + 2239..2250, ), ( FunctionInvocation( [], ( "sed_version", - 2264..2275, + 2253..2264, ), [], [], ), - 2264..2277, + 2253..2266, ), ), - 2244..2277, + 2233..2266, ), ( VariableSet( ( "search", - 2286..2292, + 2275..2281, ), ( FunctionInvocation( [], ( "replace", - 2295..2302, + 2284..2291, ), [ ( Var( ( "search", - 2303..2309, + 2292..2298, ), ), - 2303..2309, + 2292..2298, ), ( Text( @@ -2662,61 +2662,70 @@ expression: parse_unwrap(&tokens) Text( ( "/", - 2312..2313, + 2301..2302, ), ), - 2312..2313, + 2301..2302, ), ], ), - 2311..2314, + 2300..2303, ), ( Text( [ ( Escape( + ( + "\\", + 2306..2308, + ), + ), + 2306..2308, + ), + ( + Text( ( "/", - 2317..2319, + 2308..2309, ), ), - 2317..2319, + 2308..2309, ), ], ), - 2316..2320, + 2305..2310, ), ], [], ), - 2295..2321, + 2284..2311, ), ), - 2286..2321, + 2275..2311, ), ( VariableSet( ( "replace_text", - 2330..2342, + 2320..2332, ), ( FunctionInvocation( [], ( "replace", - 2345..2352, + 2335..2342, ), [ ( Var( ( "replace_text", - 2353..2365, + 2343..2355, ), ), - 2353..2365, + 2343..2355, ), ( Text( @@ -2725,44 +2734,53 @@ expression: parse_unwrap(&tokens) Text( ( "/", - 2368..2369, + 2358..2359, ), ), - 2368..2369, + 2358..2359, ), ], ), - 2367..2370, + 2357..2360, ), ( Text( [ ( Escape( + ( + "\\", + 2363..2365, + ), + ), + 2363..2365, + ), + ( + Text( ( "/", - 2373..2375, + 2365..2366, ), ), - 2373..2375, + 2365..2366, ), ], ), - 2372..2376, + 2362..2367, ), ], [], ), - 2345..2377, + 2335..2368, ), ), - 2330..2377, + 2320..2368, ), ( IfCondition( ( "if", - 2386..2388, + 2377..2379, ), ( IfCondition( @@ -2774,26 +2792,26 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 2389..2400, + 2380..2391, ), ), - 2389..2400, + 2380..2391, ), ( Var( ( "SED_VERSION_GNU", - 2404..2419, + 2395..2410, ), ), - 2404..2419, + 2395..2410, ), ), - 2389..2419, + 2380..2410, ), ( "or", - 2420..2422, + 2411..2413, ), ( Eq( @@ -2801,25 +2819,25 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 2423..2434, + 2414..2425, ), ), - 2423..2434, + 2414..2425, ), ( Var( ( "SED_VERSION_BUSYBOX", - 2438..2457, + 2429..2448, ), ), - 2438..2457, + 2429..2448, ), ), - 2423..2457, + 2414..2448, ), ), - 2389..2457, + 2380..2448, ), ( Block( @@ -2831,33 +2849,33 @@ expression: parse_unwrap(&tokens) Comment( "'\\b' is supported but not in POSIX standards. Disable it", ), - 2472..2532, + 2463..2523, ), ), - 2472..2532, + 2463..2523, ), ( VariableSet( ( "search", - 2544..2550, + 2535..2541, ), ( FunctionInvocation( [], ( "replace", - 2553..2560, + 2544..2551, ), [ ( Var( ( "search", - 2561..2567, + 2552..2558, ), ), - 2561..2567, + 2552..2558, ), ( Text( @@ -2866,23 +2884,23 @@ expression: parse_unwrap(&tokens) Escape( ( "\\", - 2570..2572, + 2561..2563, ), ), - 2570..2572, + 2561..2563, ), ( Text( ( "b", - 2572..2573, + 2563..2564, ), ), - 2572..2573, + 2563..2564, ), ], ), - 2569..2574, + 2560..2565, ), ( Text( @@ -2891,49 +2909,49 @@ expression: parse_unwrap(&tokens) Escape( ( "\\", - 2577..2579, + 2568..2570, ), ), - 2577..2579, + 2568..2570, ), ( Escape( ( "b", - 2579..2581, + 2570..2572, ), ), - 2579..2581, + 2570..2572, ), ], ), - 2576..2582, + 2567..2573, ), ], [], ), - 2553..2583, + 2544..2574, ), ), - 2544..2583, + 2535..2574, ), ], ), - 2458..2593, + 2449..2584, ), ), - 2389..2593, + 2380..2584, ), [], None, ), - 2386..2593, + 2377..2584, ), ( IfCondition( ( "if", - 2602..2604, + 2593..2595, ), ( IfCondition( @@ -2941,10 +2959,10 @@ expression: parse_unwrap(&tokens) Var( ( "extended", - 2605..2613, + 2596..2604, ), ), - 2605..2613, + 2596..2604, ), ( Block( @@ -2956,10 +2974,10 @@ expression: parse_unwrap(&tokens) Comment( "GNU sed versions 4.0 through 4.2 support extended regex syntax,", ), - 2628..2695, + 2619..2686, ), ), - 2628..2695, + 2619..2686, ), ( Comment( @@ -2967,16 +2985,16 @@ expression: parse_unwrap(&tokens) Comment( "but only via the \"-r\" option", ), - 2707..2739, + 2698..2730, ), ), - 2707..2739, + 2698..2730, ), ( IfCondition( ( "if", - 2751..2753, + 2742..2744, ), ( IfCondition( @@ -2986,22 +3004,22 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 2754..2765, + 2745..2756, ), ), - 2754..2765, + 2745..2756, ), ( Var( ( "SED_VERSION_GNU", - 2769..2784, + 2760..2775, ), ), - 2769..2784, + 2760..2775, ), ), - 2754..2784, + 2745..2775, ), ( Block( @@ -3011,7 +3029,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 2803..2809, + 2794..2800, ), Some( ( @@ -3022,19 +3040,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 2810..2811, + 2801..2802, ), ( Text( "echo", ), - 2812..2816, + 2803..2807, ), ( Text( "\"", ), - 2817..2818, + 2808..2809, ), ( Expression( @@ -3042,61 +3060,61 @@ expression: parse_unwrap(&tokens) Var( ( "source", - 2819..2825, + 2810..2816, ), ), - 2819..2825, + 2810..2816, ), ), - 2818..2826, + 2809..2817, ), ( Text( "\"", ), - 2826..2827, + 2817..2818, ), ( Text( "|", ), - 2828..2829, + 2819..2820, ), ( Text( "sed", ), - 2830..2833, + 2821..2824, ), ( CommandOption( "-r", ), - 2834..2836, + 2825..2827, ), ( CommandOption( "-e", ), - 2837..2839, + 2828..2830, ), ( Text( "\"", ), - 2840..2841, + 2831..2832, ), ( Text( "s", ), - 2841..2842, + 2832..2833, ), ( Text( "/", ), - 2842..2843, + 2833..2834, ), ( Expression( @@ -3104,19 +3122,19 @@ expression: parse_unwrap(&tokens) Var( ( "search", - 2844..2850, + 2835..2841, ), ), - 2844..2850, + 2835..2841, ), ), - 2843..2851, + 2834..2842, ), ( Text( "/", ), - 2851..2852, + 2842..2843, ), ( Expression( @@ -3124,53 +3142,53 @@ expression: parse_unwrap(&tokens) Var( ( "replace_text", - 2853..2865, + 2844..2856, ), ), - 2853..2865, + 2844..2856, ), ), - 2852..2866, + 2843..2857, ), ( Text( "/", ), - 2866..2867, + 2857..2858, ), ( Text( "g", ), - 2867..2868, + 2858..2859, ), ( Text( "\"", ), - 2868..2869, + 2859..2860, ), ( Text( "$", ), - 2870..2871, + 2861..2862, ), ], [], ), - 2810..2871, + 2801..2862, ), ), ), - 2803..2871, + 2794..2862, ), ], ), - 2785..2885, + 2776..2876, ), ), - 2754..2885, + 2745..2876, ), [], Some( @@ -3178,7 +3196,7 @@ expression: parse_unwrap(&tokens) Else( ( "else", - 2886..2890, + 2877..2881, ), ( Block( @@ -3188,7 +3206,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 2909..2915, + 2900..2906, ), Some( ( @@ -3199,19 +3217,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 2916..2917, + 2907..2908, ), ( Text( "echo", ), - 2918..2922, + 2909..2913, ), ( Text( "\"", ), - 2923..2924, + 2914..2915, ), ( Expression( @@ -3219,61 +3237,61 @@ expression: parse_unwrap(&tokens) Var( ( "source", - 2925..2931, + 2916..2922, ), ), - 2925..2931, + 2916..2922, ), ), - 2924..2932, + 2915..2923, ), ( Text( "\"", ), - 2932..2933, + 2923..2924, ), ( Text( "|", ), - 2934..2935, + 2925..2926, ), ( Text( "sed", ), - 2936..2939, + 2927..2930, ), ( CommandOption( "-E", ), - 2940..2942, + 2931..2933, ), ( CommandOption( "-e", ), - 2943..2945, + 2934..2936, ), ( Text( "\"", ), - 2946..2947, + 2937..2938, ), ( Text( "s", ), - 2947..2948, + 2938..2939, ), ( Text( "/", ), - 2948..2949, + 2939..2940, ), ( Expression( @@ -3281,19 +3299,19 @@ expression: parse_unwrap(&tokens) Var( ( "search", - 2950..2956, + 2941..2947, ), ), - 2950..2956, + 2941..2947, ), ), - 2949..2957, + 2940..2948, ), ( Text( "/", ), - 2957..2958, + 2948..2949, ), ( Expression( @@ -3301,64 +3319,64 @@ expression: parse_unwrap(&tokens) Var( ( "replace_text", - 2959..2971, + 2950..2962, ), ), - 2959..2971, + 2950..2962, ), ), - 2958..2972, + 2949..2963, ), ( Text( "/", ), - 2972..2973, + 2963..2964, ), ( Text( "g", ), - 2973..2974, + 2964..2965, ), ( Text( "\"", ), - 2974..2975, + 2965..2966, ), ( Text( "$", ), - 2976..2977, + 2967..2968, ), ], [], ), - 2916..2977, + 2907..2968, ), ), ), - 2909..2977, + 2900..2968, ), ], ), - 2891..2991, + 2882..2982, ), ), - 2886..2991, + 2877..2982, ), ), ), - 2751..2991, + 2742..2982, ), ], ), - 2614..3001, + 2605..2992, ), ), - 2605..3001, + 2596..2992, ), [], Some( @@ -3366,7 +3384,7 @@ expression: parse_unwrap(&tokens) Else( ( "else", - 3002..3006, + 2993..2997, ), ( Block( @@ -3376,7 +3394,7 @@ expression: parse_unwrap(&tokens) IfCondition( ( "if", - 3021..3023, + 3012..3014, ), ( IfCondition( @@ -3388,26 +3406,26 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 3024..3035, + 3015..3026, ), ), - 3024..3035, + 3015..3026, ), ( Var( ( "SED_VERSION_GNU", - 3039..3054, + 3030..3045, ), ), - 3039..3054, + 3030..3045, ), ), - 3024..3054, + 3015..3045, ), ( "or", - 3055..3057, + 3046..3048, ), ( Eq( @@ -3415,25 +3433,25 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 3058..3069, + 3049..3060, ), ), - 3058..3069, + 3049..3060, ), ( Var( ( "SED_VERSION_BUSYBOX", - 3073..3092, + 3064..3083, ), ), - 3073..3092, + 3064..3083, ), ), - 3058..3092, + 3049..3083, ), ), - 3024..3092, + 3015..3083, ), ( Block( @@ -3445,33 +3463,33 @@ expression: parse_unwrap(&tokens) Comment( "GNU Sed BRE handle \\| as a metacharacter, but it is not POSIX standands. Disable it", ), - 3111..3198, + 3102..3189, ), ), - 3111..3198, + 3102..3189, ), ( VariableSet( ( "search", - 3214..3220, + 3205..3211, ), ( FunctionInvocation( [], ( "replace", - 3223..3230, + 3214..3221, ), [ ( Var( ( "search", - 3231..3237, + 3222..3228, ), ), - 3231..3237, + 3222..3228, ), ( Text( @@ -3480,14 +3498,14 @@ expression: parse_unwrap(&tokens) Escape( ( "|", - 3240..3242, + 3231..3233, ), ), - 3240..3242, + 3231..3233, ), ], ), - 3239..3243, + 3230..3234, ), ( Text( @@ -3496,40 +3514,40 @@ expression: parse_unwrap(&tokens) Text( ( "|", - 3246..3247, + 3237..3238, ), ), - 3246..3247, + 3237..3238, ), ], ), - 3245..3248, + 3236..3239, ), ], [], ), - 3223..3249, + 3214..3240, ), ), - 3214..3249, + 3205..3240, ), ], ), - 3093..3263, + 3084..3254, ), ), - 3024..3263, + 3015..3254, ), [], None, ), - 3021..3263, + 3012..3254, ), ( Return( ( "return", - 3276..3282, + 3267..3273, ), Some( ( @@ -3540,19 +3558,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 3283..3284, + 3274..3275, ), ( Text( "echo", ), - 3285..3289, + 3276..3280, ), ( Text( "\"", ), - 3290..3291, + 3281..3282, ), ( Expression( @@ -3560,55 +3578,55 @@ expression: parse_unwrap(&tokens) Var( ( "source", - 3292..3298, + 3283..3289, ), ), - 3292..3298, + 3283..3289, ), ), - 3291..3299, + 3282..3290, ), ( Text( "\"", ), - 3299..3300, + 3290..3291, ), ( Text( "|", ), - 3301..3302, + 3292..3293, ), ( Text( "sed", ), - 3303..3306, + 3294..3297, ), ( CommandOption( "-e", ), - 3307..3309, + 3298..3300, ), ( Text( "\"", ), - 3310..3311, + 3301..3302, ), ( Text( "s", ), - 3311..3312, + 3302..3303, ), ( Text( "/", ), - 3312..3313, + 3303..3304, ), ( Expression( @@ -3616,19 +3634,19 @@ expression: parse_unwrap(&tokens) Var( ( "search", - 3314..3320, + 3305..3311, ), ), - 3314..3320, + 3305..3311, ), ), - 3313..3321, + 3304..3312, ), ( Text( "/", ), - 3321..3322, + 3312..3313, ), ( Expression( @@ -3636,68 +3654,68 @@ expression: parse_unwrap(&tokens) Var( ( "replace_text", - 3323..3335, + 3314..3326, ), ), - 3323..3335, + 3314..3326, ), ), - 3322..3336, + 3313..3327, ), ( Text( "/", ), - 3336..3337, + 3327..3328, ), ( Text( "g", ), - 3337..3338, + 3328..3329, ), ( Text( "\"", ), - 3338..3339, + 3329..3330, ), ( Text( "$", ), - 3340..3341, + 3331..3332, ), ], [], ), - 3283..3341, + 3274..3332, ), ), ), - 3276..3341, + 3267..3332, ), ], ), - 3007..3351, + 2998..3342, ), ), - 3002..3351, + 2993..3342, ), ), ), - 2602..3351, + 2593..3342, ), ], ), - 2228..3357, + 2217..3348, ), ), - 2228..3357, + 2217..3348, ), ], ), - 2122..3359, + 2111..3350, ), ( Statement( @@ -3707,69 +3725,69 @@ expression: parse_unwrap(&tokens) DocString( "Splits the input `text` into an array of substrings using the specified `delimiter`.", ), - 3361..3450, + 3352..3441, ), ), - 3361..3450, + 3352..3441, ), ), - 3361..3450, + 3352..3441, ), ( FunctionDefinition( [], ( true, - 3450..3453, + 3441..3444, ), ( "fun", - 3454..3457, + 3445..3448, ), ( "split", - 3458..3463, + 3449..3454, ), [ ( Typed( ( false, - 3464..3464, + 3455..3455, ), ( "text", - 3464..3468, + 3455..3459, ), ( Text, - 3470..3474, + 3461..3465, ), ), - 3464..3474, + 3455..3465, ), ( Typed( ( false, - 3476..3475, + 3467..3466, ), ( "delimiter", - 3476..3485, + 3467..3476, ), ( Text, - 3487..3491, + 3478..3482, ), ), - 3476..3491, + 3467..3482, ), ], Some( ( [Text], - 3494..3500, + 3485..3491, ), ), [ @@ -3777,23 +3795,23 @@ expression: parse_unwrap(&tokens) VariableInit( ( "let", - 3507..3510, + 3498..3501, ), ( "result", - 3511..3517, + 3502..3508, ), ( DataType( ( [Text], - 3520..3526, + 3511..3517, ), ), - 3520..3526, + 3511..3517, ), ), - 3507..3526, + 3498..3517, ), ( Expression( @@ -3802,7 +3820,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 3531..3536, + 3522..3527, ), ], [ @@ -3810,25 +3828,25 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 3537..3538, + 3528..3529, ), ( Text( "IFS", ), - 3539..3542, + 3530..3533, ), ( Text( "=", ), - 3542..3543, + 3533..3534, ), ( Text( "\"", ), - 3543..3544, + 3534..3535, ), ( Expression( @@ -3836,43 +3854,43 @@ expression: parse_unwrap(&tokens) Var( ( "delimiter", - 3545..3554, + 3536..3545, ), ), - 3545..3554, + 3536..3545, ), ), - 3544..3555, + 3535..3546, ), ( Text( "\"", ), - 3555..3556, + 3546..3547, ), ( Text( "read", ), - 3557..3561, + 3548..3552, ), ( CommandOption( "-rd", ), - 3562..3565, + 3553..3556, ), ( Text( "''", ), - 3566..3568, + 3557..3559, ), ( CommandOption( "-a", ), - 3569..3571, + 3560..3562, ), ( Expression( @@ -3880,70 +3898,70 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 3573..3579, + 3564..3570, ), ( Var( ( "result", - 3580..3586, + 3571..3577, ), ), - 3580..3586, + 3571..3577, ), ), - 3580..3586, + 3571..3577, ), ), - 3572..3587, + 3563..3578, ), ( Text( "<", ), - 3588..3589, + 3579..3580, ), ( Text( "<", ), - 3590..3591, + 3581..3582, ), ( Text( "(", ), - 3591..3592, + 3582..3583, ), ( Text( "printf", ), - 3592..3598, + 3583..3589, ), ( Text( "%", ), - 3599..3600, + 3590..3591, ), ( Text( "s", ), - 3600..3601, + 3591..3592, ), ( Text( "\"", ), - 3602..3603, + 3593..3594, ), ( Escape( "$", ), - 3603..3605, + 3594..3596, ), ( Expression( @@ -3951,72 +3969,72 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 3606..3612, + 3597..3603, ), ( Var( ( "text", - 3613..3617, + 3604..3608, ), ), - 3613..3617, + 3604..3608, ), ), - 3613..3617, + 3604..3608, ), ), - 3605..3618, + 3596..3609, ), ( Text( "\"", ), - 3618..3619, + 3609..3610, ), ( Text( ")", ), - 3619..3620, + 3610..3611, ), ( Text( "$", ), - 3621..3622, + 3612..3613, ), ], [], ), - 3531..3622, + 3522..3613, ), ), - 3531..3622, + 3522..3613, ), ( Return( ( "return", - 3627..3633, + 3618..3624, ), Some( ( Var( ( "result", - 3634..3640, + 3625..3631, ), ), - 3634..3640, + 3625..3631, ), ), ), - 3627..3640, + 3618..3631, ), ], ), - 3450..3642, + 3441..3633, ), ( Statement( @@ -4026,52 +4044,52 @@ expression: parse_unwrap(&tokens) DocString( "Splits a `text` into an array of substrings based on newline characters.", ), - 3644..3721, + 3635..3712, ), ), - 3644..3721, + 3635..3712, ), ), - 3644..3721, + 3635..3712, ), ( FunctionDefinition( [], ( true, - 3721..3724, + 3712..3715, ), ( "fun", - 3725..3728, + 3716..3719, ), ( "split_lines", - 3729..3740, + 3720..3731, ), [ ( Typed( ( false, - 3741..3741, + 3732..3732, ), ( "text", - 3741..3745, + 3732..3736, ), ( Text, - 3747..3751, + 3738..3742, ), ), - 3741..3751, + 3732..3742, ), ], Some( ( [Text], - 3754..3760, + 3745..3751, ), ), [ @@ -4079,7 +4097,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 3767..3773, + 3758..3764, ), Some( ( @@ -4087,17 +4105,17 @@ expression: parse_unwrap(&tokens) [], ( "split", - 3774..3779, + 3765..3770, ), [ ( Var( ( "text", - 3780..3784, + 3771..3775, ), ), - 3780..3784, + 3771..3775, ), ( Text( @@ -4106,27 +4124,27 @@ expression: parse_unwrap(&tokens) Escape( ( "n", - 3787..3789, + 3778..3780, ), ), - 3787..3789, + 3778..3780, ), ], ), - 3786..3790, + 3777..3781, ), ], [], ), - 3774..3791, + 3765..3782, ), ), ), - 3767..3791, + 3758..3782, ), ], ), - 3721..3793, + 3712..3784, ), ( Statement( @@ -4136,52 +4154,52 @@ expression: parse_unwrap(&tokens) DocString( "Splits a `text` into an array of substrings based on space character.", ), - 3795..3869, + 3786..3860, ), ), - 3795..3869, + 3786..3860, ), ), - 3795..3869, + 3786..3860, ), ( FunctionDefinition( [], ( true, - 3869..3872, + 3860..3863, ), ( "fun", - 3873..3876, + 3864..3867, ), ( "split_words", - 3877..3888, + 3868..3879, ), [ ( Typed( ( false, - 3889..3889, + 3880..3880, ), ( "text", - 3889..3893, + 3880..3884, ), ( Text, - 3895..3899, + 3886..3890, ), ), - 3889..3899, + 3880..3890, ), ], Some( ( [Text], - 3902..3908, + 3893..3899, ), ), [ @@ -4189,7 +4207,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 3915..3921, + 3906..3912, ), Some( ( @@ -4197,36 +4215,36 @@ expression: parse_unwrap(&tokens) [], ( "split", - 3922..3927, + 3913..3918, ), [ ( Var( ( "text", - 3928..3932, + 3919..3923, ), ), - 3928..3932, + 3919..3923, ), ( Text( [], ), - 3934..3937, + 3925..3928, ), ], [], ), - 3922..3938, + 3913..3929, ), ), ), - 3915..3938, + 3906..3929, ), ], ), - 3869..3940, + 3860..3931, ), ( Statement( @@ -4236,69 +4254,69 @@ expression: parse_unwrap(&tokens) DocString( "Merges text using the delimiter specified.", ), - 3942..3989, + 3933..3980, ), ), - 3942..3989, + 3933..3980, ), ), - 3942..3989, + 3933..3980, ), ( FunctionDefinition( [], ( true, - 3989..3992, + 3980..3983, ), ( "fun", - 3993..3996, + 3984..3987, ), ( "join", - 3997..4001, + 3988..3992, ), [ ( Typed( ( false, - 4002..4002, + 3993..3993, ), ( "list", - 4002..4006, + 3993..3997, ), ( [Text], - 4008..4014, + 3999..4005, ), ), - 4002..4014, + 3993..4005, ), ( Typed( ( false, - 4016..4015, + 4007..4006, ), ( "delimiter", - 4016..4025, + 4007..4016, ), ( Text, - 4027..4031, + 4018..4022, ), ), - 4016..4031, + 4007..4022, ), ], Some( ( Text, - 4034..4038, + 4025..4029, ), ), [ @@ -4306,7 +4324,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 4045..4051, + 4036..4042, ), Some( ( @@ -4314,7 +4332,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 4052..4057, + 4043..4048, ), ], [ @@ -4322,25 +4340,25 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 4058..4059, + 4049..4050, ), ( Text( "IFS", ), - 4060..4063, + 4051..4054, ), ( Text( "=", ), - 4063..4064, + 4054..4055, ), ( Text( "\"", ), - 4064..4065, + 4055..4056, ), ( Expression( @@ -4348,49 +4366,49 @@ expression: parse_unwrap(&tokens) Var( ( "delimiter", - 4066..4075, + 4057..4066, ), ), - 4066..4075, + 4057..4066, ), ), - 4065..4076, + 4056..4067, ), ( Text( "\"", ), - 4076..4077, + 4067..4068, ), ( Text( ";", ), - 4078..4079, + 4069..4070, ), ( Text( "echo", ), - 4080..4084, + 4071..4075, ), ( Text( "\"", ), - 4085..4086, + 4076..4077, ), ( Escape( "$", ), - 4086..4088, + 4077..4079, ), ( Escape( "{", ), - 4088..4090, + 4079..4081, ), ( Expression( @@ -4398,71 +4416,71 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 4091..4097, + 4082..4088, ), ( Var( ( "list", - 4098..4102, + 4089..4093, ), ), - 4098..4102, + 4089..4093, ), ), - 4098..4102, + 4089..4093, ), ), - 4090..4103, + 4081..4094, ), ( Text( "[", ), - 4103..4104, + 4094..4095, ), ( Text( "*", ), - 4104..4105, + 4095..4096, ), ( Text( "]", ), - 4105..4106, + 4096..4097, ), ( Text( "}", ), - 4106..4107, + 4097..4098, ), ( Text( "\"", ), - 4107..4108, + 4098..4099, ), ( Text( "$", ), - 4109..4110, + 4100..4101, ), ], [], ), - 4052..4110, + 4043..4101, ), ), ), - 4045..4110, + 4036..4101, ), ], ), - 3989..4112, + 3980..4103, ), ( Statement( @@ -4472,52 +4490,52 @@ expression: parse_unwrap(&tokens) DocString( "Trims the spaces at top of the text using `sed`.", ), - 4114..4167, + 4105..4158, ), ), - 4114..4167, + 4105..4158, ), ), - 4114..4167, + 4105..4158, ), ( FunctionDefinition( [], ( true, - 4167..4170, + 4158..4161, ), ( "fun", - 4171..4174, + 4162..4165, ), ( "trim_left", - 4175..4184, + 4166..4175, ), [ ( Typed( ( false, - 4185..4185, + 4176..4176, ), ( "text", - 4185..4189, + 4176..4180, ), ( Text, - 4191..4195, + 4182..4186, ), ), - 4185..4195, + 4176..4186, ), ], Some( ( Text, - 4198..4202, + 4189..4193, ), ), [ @@ -4525,7 +4543,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 4209..4215, + 4200..4206, ), Some( ( @@ -4533,7 +4551,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 4216..4221, + 4207..4212, ), ], [ @@ -4541,19 +4559,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 4222..4223, + 4213..4214, ), ( Text( "echo", ), - 4224..4228, + 4215..4219, ), ( Text( "\"", ), - 4229..4230, + 4220..4221, ), ( Expression( @@ -4561,134 +4579,134 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 4231..4235, + 4222..4226, ), ), - 4231..4235, + 4222..4226, ), ), - 4230..4236, + 4221..4227, ), ( Text( "\"", ), - 4236..4237, + 4227..4228, ), ( Text( "|", ), - 4238..4239, + 4229..4230, ), ( Text( "sed", ), - 4240..4243, + 4231..4234, ), ( CommandOption( "-e", ), - 4244..4246, + 4235..4237, ), ( Text( "'s", ), - 4247..4249, + 4238..4240, ), ( Text( "/", ), - 4249..4250, + 4240..4241, ), ( Text( "^", ), - 4250..4251, + 4241..4242, ), ( Text( "[", ), - 4251..4252, + 4242..4243, ), ( Text( "[", ), - 4252..4253, + 4243..4244, ), ( Text( ":", ), - 4253..4254, + 4244..4245, ), ( Text( "space", ), - 4254..4259, + 4245..4250, ), ( Text( ":", ), - 4259..4260, + 4250..4251, ), ( Text( "]", ), - 4260..4261, + 4251..4252, ), ( Text( "]", ), - 4261..4262, + 4252..4253, ), ( Text( "*", ), - 4262..4263, + 4253..4254, ), ( Text( "//", ), - 4263..4265, + 4254..4256, ), ( Text( "'", ), - 4265..4266, + 4256..4257, ), ( Text( "$", ), - 4267..4268, + 4258..4259, ), ], [], ), - 4216..4268, + 4207..4259, ), ), ), - 4209..4268, + 4200..4259, ), ], ), - 4167..4270, + 4158..4261, ), ( Statement( @@ -4698,52 +4716,52 @@ expression: parse_unwrap(&tokens) DocString( "Trims the spaces at end of the text using `sed`.", ), - 4272..4325, + 4263..4316, ), ), - 4272..4325, + 4263..4316, ), ), - 4272..4325, + 4263..4316, ), ( FunctionDefinition( [], ( true, - 4325..4328, + 4316..4319, ), ( "fun", - 4329..4332, + 4320..4323, ), ( "trim_right", - 4333..4343, + 4324..4334, ), [ ( Typed( ( false, - 4344..4344, + 4335..4335, ), ( "text", - 4344..4348, + 4335..4339, ), ( Text, - 4350..4354, + 4341..4345, ), ), - 4344..4354, + 4335..4345, ), ], Some( ( Text, - 4357..4361, + 4348..4352, ), ), [ @@ -4751,7 +4769,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 4368..4374, + 4359..4365, ), Some( ( @@ -4759,7 +4777,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 4375..4380, + 4366..4371, ), ], [ @@ -4767,19 +4785,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 4381..4382, + 4372..4373, ), ( Text( "echo", ), - 4383..4387, + 4374..4378, ), ( Text( "\"", ), - 4388..4389, + 4379..4380, ), ( Expression( @@ -4787,134 +4805,134 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 4390..4394, + 4381..4385, ), ), - 4390..4394, + 4381..4385, ), ), - 4389..4395, + 4380..4386, ), ( Text( "\"", ), - 4395..4396, + 4386..4387, ), ( Text( "|", ), - 4397..4398, + 4388..4389, ), ( Text( "sed", ), - 4399..4402, + 4390..4393, ), ( CommandOption( "-e", ), - 4403..4405, + 4394..4396, ), ( Text( "'s", ), - 4406..4408, + 4397..4399, ), ( Text( "/", ), - 4408..4409, + 4399..4400, ), ( Text( "[", ), - 4409..4410, + 4400..4401, ), ( Text( "[", ), - 4410..4411, + 4401..4402, ), ( Text( ":", ), - 4411..4412, + 4402..4403, ), ( Text( "space", ), - 4412..4417, + 4403..4408, ), ( Text( ":", ), - 4417..4418, + 4408..4409, ), ( Text( "]", ), - 4418..4419, + 4409..4410, ), ( Text( "]", ), - 4419..4420, + 4410..4411, ), ( Text( "*", ), - 4420..4421, + 4411..4412, ), ( Escape( "$", ), - 4421..4423, + 4412..4414, ), ( Text( "//", ), - 4423..4425, + 4414..4416, ), ( Text( "'", ), - 4425..4426, + 4416..4417, ), ( Text( "$", ), - 4427..4428, + 4418..4419, ), ], [], ), - 4375..4428, + 4366..4419, ), ), ), - 4368..4428, + 4359..4419, ), ], ), - 4325..4430, + 4316..4421, ), ( Statement( @@ -4924,52 +4942,52 @@ expression: parse_unwrap(&tokens) DocString( "Trims the spaces from the text input.", ), - 4432..4474, + 4423..4465, ), ), - 4432..4474, + 4423..4465, ), ), - 4432..4474, + 4423..4465, ), ( FunctionDefinition( [], ( true, - 4474..4477, + 4465..4468, ), ( "fun", - 4478..4481, + 4469..4472, ), ( "trim", - 4482..4486, + 4473..4477, ), [ ( Typed( ( false, - 4487..4487, + 4478..4478, ), ( "text", - 4487..4491, + 4478..4482, ), ( Text, - 4493..4497, + 4484..4488, ), ), - 4487..4497, + 4478..4488, ), ], Some( ( Text, - 4500..4504, + 4491..4495, ), ), [ @@ -4977,7 +4995,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 4511..4517, + 4502..4508, ), Some( ( @@ -4985,7 +5003,7 @@ expression: parse_unwrap(&tokens) [], ( "trim_left", - 4518..4527, + 4509..4518, ), [ ( @@ -4993,35 +5011,35 @@ expression: parse_unwrap(&tokens) [], ( "trim_right", - 4528..4538, + 4519..4529, ), [ ( Var( ( "text", - 4539..4543, + 4530..4534, ), ), - 4539..4543, + 4530..4534, ), ], [], ), - 4528..4544, + 4519..4535, ), ], [], ), - 4518..4545, + 4509..4536, ), ), ), - 4511..4545, + 4502..4536, ), ], ), - 4474..4547, + 4465..4538, ), ( Statement( @@ -5031,52 +5049,52 @@ expression: parse_unwrap(&tokens) DocString( "Makes the text input lowercase using `tr`.", ), - 4549..4596, + 4540..4587, ), ), - 4549..4596, + 4540..4587, ), ), - 4549..4596, + 4540..4587, ), ( FunctionDefinition( [], ( true, - 4596..4599, + 4587..4590, ), ( "fun", - 4600..4603, + 4591..4594, ), ( "lowercase", - 4604..4613, + 4595..4604, ), [ ( Typed( ( false, - 4614..4614, + 4605..4605, ), ( "text", - 4614..4618, + 4605..4609, ), ( Text, - 4620..4624, + 4611..4615, ), ), - 4614..4624, + 4605..4615, ), ], Some( ( Text, - 4627..4631, + 4618..4622, ), ), [ @@ -5084,7 +5102,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 4638..4644, + 4629..4635, ), Some( ( @@ -5092,7 +5110,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 4645..4650, + 4636..4641, ), ], [ @@ -5100,19 +5118,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 4651..4652, + 4642..4643, ), ( Text( "echo", ), - 4653..4657, + 4644..4648, ), ( Text( "\"", ), - 4658..4659, + 4649..4650, ), ( Expression( @@ -5120,134 +5138,134 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 4660..4664, + 4651..4655, ), ), - 4660..4664, + 4651..4655, ), ), - 4659..4665, + 4650..4656, ), ( Text( "\"", ), - 4665..4666, + 4656..4657, ), ( Text( "|", ), - 4667..4668, + 4658..4659, ), ( Text( "tr", ), - 4669..4671, + 4660..4662, ), ( Text( "'", ), - 4672..4673, + 4663..4664, ), ( Text( "[", ), - 4673..4674, + 4664..4665, ), ( Text( ":", ), - 4674..4675, + 4665..4666, ), ( Text( "upper", ), - 4675..4680, + 4666..4671, ), ( Text( ":", ), - 4680..4681, + 4671..4672, ), ( Text( "]", ), - 4681..4682, + 4672..4673, ), ( Text( "'", ), - 4682..4683, + 4673..4674, ), ( Text( "'", ), - 4684..4685, + 4675..4676, ), ( Text( "[", ), - 4685..4686, + 4676..4677, ), ( Text( ":", ), - 4686..4687, + 4677..4678, ), ( Text( "lower", ), - 4687..4692, + 4678..4683, ), ( Text( ":", ), - 4692..4693, + 4683..4684, ), ( Text( "]", ), - 4693..4694, + 4684..4685, ), ( Text( "'", ), - 4694..4695, + 4685..4686, ), ( Text( "$", ), - 4696..4697, + 4687..4688, ), ], [], ), - 4645..4697, + 4636..4688, ), ), ), - 4638..4697, + 4629..4688, ), ], ), - 4596..4699, + 4587..4690, ), ( Statement( @@ -5257,52 +5275,52 @@ expression: parse_unwrap(&tokens) DocString( "Makes the text input uppercase using `tr`.", ), - 4701..4748, + 4692..4739, ), ), - 4701..4748, + 4692..4739, ), ), - 4701..4748, + 4692..4739, ), ( FunctionDefinition( [], ( true, - 4748..4751, + 4739..4742, ), ( "fun", - 4752..4755, + 4743..4746, ), ( "uppercase", - 4756..4765, + 4747..4756, ), [ ( Typed( ( false, - 4766..4766, + 4757..4757, ), ( "text", - 4766..4770, + 4757..4761, ), ( Text, - 4772..4776, + 4763..4767, ), ), - 4766..4776, + 4757..4767, ), ], Some( ( Text, - 4779..4783, + 4770..4774, ), ), [ @@ -5310,7 +5328,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 4790..4796, + 4781..4787, ), Some( ( @@ -5318,7 +5336,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 4797..4802, + 4788..4793, ), ], [ @@ -5326,19 +5344,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 4803..4804, + 4794..4795, ), ( Text( "echo", ), - 4805..4809, + 4796..4800, ), ( Text( "\"", ), - 4810..4811, + 4801..4802, ), ( Expression( @@ -5346,197 +5364,781 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 4812..4816, + 4803..4807, ), ), - 4812..4816, + 4803..4807, ), ), - 4811..4817, + 4802..4808, ), ( Text( "\"", ), - 4817..4818, + 4808..4809, ), ( Text( "|", ), - 4819..4820, + 4810..4811, ), ( Text( "tr", ), - 4821..4823, + 4812..4814, ), ( Text( "'", ), - 4824..4825, + 4815..4816, ), ( Text( "[", ), - 4825..4826, + 4816..4817, ), ( Text( ":", ), - 4826..4827, + 4817..4818, ), ( Text( "lower", ), - 4827..4832, - ), - ( - Text( - ":", + 4818..4823, + ), + ( + Text( + ":", + ), + 4823..4824, + ), + ( + Text( + "]", + ), + 4824..4825, + ), + ( + Text( + "'", + ), + 4825..4826, + ), + ( + Text( + "'", + ), + 4827..4828, + ), + ( + Text( + "[", + ), + 4828..4829, + ), + ( + Text( + ":", + ), + 4829..4830, + ), + ( + Text( + "upper", + ), + 4830..4835, + ), + ( + Text( + ":", + ), + 4835..4836, + ), + ( + Text( + "]", + ), + 4836..4837, + ), + ( + Text( + "'", + ), + 4837..4838, + ), + ( + Text( + "$", + ), + 4839..4840, + ), + ], + [], + ), + 4788..4840, + ), + ), + ), + 4781..4840, + ), + ], + ), + 4739..4842, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Attempts to parse a given text into an `Int` number.", + ), + 4844..4901, + ), + ), + 4844..4901, + ), + ), + 4844..4901, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 4901..4921, + ), + ], + ( + true, + 4922..4925, + ), + ( + "fun", + 4926..4929, + ), + ( + "parse_int", + 4930..4939, + ), + [ + ( + Typed( + ( + false, + 4940..4940, + ), + ( + "text", + 4940..4944, + ), + ( + Text, + 4946..4950, + ), + ), + 4940..4950, + ), + ], + Some( + ( + Int?, + 4953..4957, + ), + ), + [ + ( + Expression( + ( + Command( + [], + [ + ( + Text( + "$", + ), + 4964..4965, + ), + ( + Text( + "[", + ), + 4966..4967, + ), + ( + CommandOption( + "-n", + ), + 4968..4970, + ), + ( + Text( + "\"", + ), + 4971..4972, + ), + ( + Expression( + ( + Var( + ( + "text", + 4973..4977, + ), + ), + 4973..4977, + ), + ), + 4972..4978, + ), + ( + Text( + "\"", + ), + 4978..4979, + ), + ( + Text( + "]", + ), + 4980..4981, + ), + ( + Text( + "&&", + ), + 4982..4984, + ), + ( + Text( + "[", + ), + 4985..4986, + ), + ( + Text( + "\"", + ), + 4987..4988, + ), + ( + Expression( + ( + Var( + ( + "text", + 4989..4993, + ), + ), + 4989..4993, + ), + ), + 4988..4994, + ), + ( + Text( + "\"", + ), + 4994..4995, + ), + ( + CommandOption( + "-eq", + ), + 4996..4999, + ), + ( + Text( + "\"", + ), + 5000..5001, + ), + ( + Expression( + ( + Var( + ( + "text", + 5002..5006, + ), + ), + 5002..5006, + ), + ), + 5001..5007, + ), + ( + Text( + "\"", + ), + 5007..5008, + ), + ( + Text( + "]", + ), + 5009..5010, + ), + ( + Text( + "2", + ), + 5011..5012, + ), + ( + Text( + ">", + ), + 5012..5013, + ), + ( + Text( + "/", + ), + 5013..5014, + ), + ( + Text( + "dev", + ), + 5014..5017, + ), + ( + Text( + "/", + ), + 5017..5018, + ), + ( + Text( + "null", + ), + 5018..5022, + ), + ( + Text( + "$", + ), + 5023..5024, + ), + ], + [ + ( + Failure( + ( + Propagate, + 5024..5025, + ), + ), + 5024..5025, + ), + ], + ), + 4964..5025, + ), + ), + 4964..5025, + ), + ( + Return( + ( + "return", + 5030..5036, + ), + Some( + ( + Cast( + ( + Var( + ( + "text", + 5037..5041, + ), + ), + 5037..5041, + ), + ( + "as", + 5042..5044, + ), + ( + Int, + 5045..5048, + ), + ), + 5037..5048, + ), + ), + ), + 5030..5048, + ), + ], + ), + 4901..5050, + ), + ( + Statement( + ( + Comment( + ( + DocString( + "Attempts to parse a given text into a `Num` number.", + ), + 5052..5108, + ), + ), + 5052..5108, + ), + ), + 5052..5108, + ), + ( + FunctionDefinition( + [ + ( + AllowAbsurdCast, + 5108..5128, + ), + ], + ( + true, + 5129..5132, + ), + ( + "fun", + 5133..5136, + ), + ( + "parse_num", + 5137..5146, + ), + [ + ( + Typed( + ( + false, + 5147..5147, + ), + ( + "text", + 5147..5151, + ), + ( + Text, + 5153..5157, + ), + ), + 5147..5157, + ), + ], + Some( + ( + Num?, + 5160..5164, + ), + ), + [ + ( + VariableInit( + ( + "let", + 5171..5174, + ), + ( + "re_int", + 5175..5181, + ), + ( + Expression( + ( + Text( + [ + ( + Text( + ( + "^", + 5183..5184, + ), + ), + 5183..5184, + ), + ( + Text( + ( + "-", + 5184..5185, + ), + ), + 5184..5185, + ), + ( + Text( + ( + "?", + 5185..5186, + ), + ), + 5185..5186, + ), + ( + Text( + ( + "[", + 5186..5187, + ), + ), + 5186..5187, + ), + ( + Text( + ( + "0", + 5187..5188, + ), + ), + 5187..5188, + ), + ( + Text( + ( + "-", + 5188..5189, + ), + ), + 5188..5189, + ), + ( + Text( + ( + "9", + 5189..5190, + ), + ), + 5189..5190, + ), + ( + Text( + ( + "]", + 5190..5191, + ), + ), + 5190..5191, + ), + ( + Text( + ( + "+", + 5191..5192, + ), + ), + 5191..5192, + ), + ( + Text( + ( + "$", + 5192..5193, + ), + ), + 5192..5193, + ), + ], + ), + 5182..5194, + ), + ), + 5182..5194, + ), + ), + 5171..5194, + ), + ( + VariableInit( + ( + "let", + 5199..5202, + ), + ( + "re_float", + 5203..5211, + ), + ( + Expression( + ( + Text( + [ + ( + Text( + ( + "^", + 5213..5214, + ), + ), + 5213..5214, + ), + ( + Text( + ( + "-", + 5214..5215, + ), + ), + 5214..5215, + ), + ( + Text( + ( + "?", + 5215..5216, + ), + ), + 5215..5216, + ), + ( + Text( + ( + "[", + 5216..5217, + ), + ), + 5216..5217, + ), + ( + Text( + ( + "0", + 5217..5218, + ), + ), + 5217..5218, + ), + ( + Text( + ( + "-", + 5218..5219, + ), + ), + 5218..5219, + ), + ( + Text( + ( + "9", + 5219..5220, + ), + ), + 5219..5220, ), - 4832..4833, - ), - ( - Text( - "]", + ( + Text( + ( + "]", + 5220..5221, + ), + ), + 5220..5221, ), - 4833..4834, - ), - ( - Text( - "'", + ( + Text( + ( + "*", + 5221..5222, + ), + ), + 5221..5222, ), - 4834..4835, - ), - ( - Text( - "'", + ( + Escape( + ( + ".", + 5222..5224, + ), + ), + 5222..5224, ), - 4836..4837, - ), - ( - Text( - "[", + ( + Text( + ( + "[", + 5224..5225, + ), + ), + 5224..5225, ), - 4837..4838, - ), - ( - Text( - ":", + ( + Text( + ( + "0", + 5225..5226, + ), + ), + 5225..5226, ), - 4838..4839, - ), - ( - Text( - "upper", + ( + Text( + ( + "-", + 5226..5227, + ), + ), + 5226..5227, ), - 4839..4844, - ), - ( - Text( - ":", + ( + Text( + ( + "9", + 5227..5228, + ), + ), + 5227..5228, ), - 4844..4845, - ), - ( - Text( - "]", + ( + Text( + ( + "]", + 5228..5229, + ), + ), + 5228..5229, ), - 4845..4846, - ), - ( - Text( - "'", + ( + Text( + ( + "+", + 5229..5230, + ), + ), + 5229..5230, ), - 4846..4847, - ), - ( - Text( - "$", + ( + Text( + ( + "$", + 5230..5231, + ), + ), + 5230..5231, ), - 4848..4849, - ), - ], - [], + ], + ), + 5212..5232, ), - 4797..4849, ), + 5212..5232, ), ), - 4790..4849, - ), - ], - ), - 4748..4851, - ), - ( - Statement( - ( - Comment( - ( - DocString( - "Attempts to parse a given text into a number, returning the parsed number or zero if parsing fails.", - ), - 4853..4957, - ), - ), - 4853..4957, - ), - ), - 4853..4957, - ), - ( - FunctionDefinition( - [ - ( - AllowAbsurdCast, - 4957..4977, - ), - ], - ( - true, - 4978..4981, - ), - ( - "fun", - 4982..4985, - ), - ( - "parse_number", - 4986..4998, - ), - [ - ( - Typed( - ( - false, - 4999..4999, - ), - ( - "text", - 4999..5003, - ), - ( - Text, - 5005..5009, - ), - ), - 4999..5009, - ), - ], - Some( - ( - Num?, - 5012..5016, + 5199..5232, ), - ), - [ ( Expression( ( @@ -5547,69 +6149,89 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 5023..5024, + 5238..5239, ), ( Text( "[", ), - 5025..5026, + 5240..5241, ), ( - CommandOption( - "-n", + Text( + "[", + ), + 5241..5242, + ), + ( + Expression( + ( + Var( + ( + "text", + 5244..5248, + ), + ), + 5244..5248, + ), ), - 5027..5029, + 5243..5249, ), ( Text( - "\"", + "=", ), - 5030..5031, + 5250..5251, + ), + ( + Text( + "~", + ), + 5251..5252, ), ( Expression( ( Var( ( - "text", - 5032..5036, + "re_int", + 5254..5260, ), ), - 5032..5036, + 5254..5260, ), ), - 5031..5037, + 5253..5261, ), ( Text( - "\"", + "]", ), - 5037..5038, + 5262..5263, ), ( Text( "]", ), - 5039..5040, + 5263..5264, ), ( Text( - "&&", + "||", ), - 5041..5043, + 5265..5267, ), ( Text( "[", ), - 5044..5045, + 5268..5269, ), ( Text( - "\"", + "[", ), - 5046..5047, + 5269..5270, ), ( Expression( @@ -5617,99 +6239,57 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 5048..5052, + 5272..5276, ), ), - 5048..5052, + 5272..5276, ), ), - 5047..5053, + 5271..5277, ), ( Text( - "\"", - ), - 5053..5054, - ), - ( - CommandOption( - "-eq", + "=", ), - 5055..5058, + 5278..5279, ), ( Text( - "\"", + "~", ), - 5059..5060, + 5279..5280, ), ( Expression( ( Var( ( - "text", - 5061..5065, + "re_float", + 5282..5290, ), ), - 5061..5065, + 5282..5290, ), ), - 5060..5066, - ), - ( - Text( - "\"", - ), - 5066..5067, + 5281..5291, ), ( Text( "]", ), - 5068..5069, - ), - ( - Text( - "2", - ), - 5070..5071, - ), - ( - Text( - ">", - ), - 5071..5072, - ), - ( - Text( - "/", - ), - 5072..5073, - ), - ( - Text( - "dev", - ), - 5073..5076, - ), - ( - Text( - "/", - ), - 5076..5077, + 5292..5293, ), ( Text( - "null", + "]", ), - 5077..5081, + 5293..5294, ), ( Text( "$", ), - 5082..5083, + 5295..5296, ), ], [ @@ -5717,23 +6297,23 @@ expression: parse_unwrap(&tokens) Failure( ( Propagate, - 5083..5084, + 5296..5297, ), ), - 5083..5084, + 5296..5297, ), ], ), - 5023..5084, + 5238..5297, ), ), - 5023..5084, + 5238..5297, ), ( Return( ( "return", - 5089..5095, + 5302..5308, ), Some( ( @@ -5742,29 +6322,29 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 5096..5100, + 5309..5313, ), ), - 5096..5100, + 5309..5313, ), ( "as", - 5101..5103, + 5314..5316, ), ( Num, - 5104..5107, + 5317..5320, ), ), - 5096..5107, + 5309..5320, ), ), ), - 5089..5107, + 5302..5320, ), ], ), - 4957..5109, + 5108..5322, ), ( Statement( @@ -5774,52 +6354,52 @@ expression: parse_unwrap(&tokens) DocString( "Splits a text into an array of individual characters.", ), - 5111..5169, + 5324..5382, ), ), - 5111..5169, + 5324..5382, ), ), - 5111..5169, + 5324..5382, ), ( FunctionDefinition( [], ( true, - 5169..5172, + 5382..5385, ), ( "fun", - 5173..5176, + 5386..5389, ), ( "split_chars", - 5177..5188, + 5390..5401, ), [ ( Typed( ( false, - 5189..5189, + 5402..5402, ), ( "text", - 5189..5193, + 5402..5406, ), ( Text, - 5195..5199, + 5408..5412, ), ), - 5189..5199, + 5402..5412, ), ], Some( ( [Text], - 5202..5208, + 5415..5421, ), ), [ @@ -5827,23 +6407,23 @@ expression: parse_unwrap(&tokens) VariableInit( ( "let", - 5215..5218, + 5428..5431, ), ( "chars", - 5219..5224, + 5432..5437, ), ( DataType( ( [Text], - 5227..5233, + 5440..5446, ), ), - 5227..5233, + 5440..5446, ), ), - 5215..5233, + 5428..5446, ), ( Expression( @@ -5852,7 +6432,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 5238..5243, + 5451..5456, ), ], [ @@ -5860,79 +6440,79 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 5244..5245, + 5457..5458, ), ( Text( "for", ), - 5246..5249, + 5459..5462, ), ( Text( "(", ), - 5250..5251, + 5463..5464, ), ( Text( "(", ), - 5251..5252, + 5464..5465, ), ( Text( "i", ), - 5252..5253, + 5465..5466, ), ( Text( "=", ), - 5253..5254, + 5466..5467, ), ( Text( "0", ), - 5254..5255, + 5467..5468, ), ( Text( ";", ), - 5255..5256, + 5468..5469, ), ( Text( "i", ), - 5257..5258, + 5470..5471, ), ( Text( "<", ), - 5258..5259, + 5471..5472, ), ( Escape( "$", ), - 5259..5261, + 5472..5474, ), ( Escape( "{", ), - 5261..5263, + 5474..5476, ), ( Text( "#", ), - 5263..5264, + 5476..5477, ), ( Expression( @@ -5940,76 +6520,76 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 5265..5271, + 5478..5484, ), ( Var( ( "text", - 5272..5276, + 5485..5489, ), ), - 5272..5276, + 5485..5489, ), ), - 5272..5276, + 5485..5489, ), ), - 5264..5277, + 5477..5490, ), ( Text( "}", ), - 5277..5278, + 5490..5491, ), ( Text( ";", ), - 5278..5279, + 5491..5492, ), ( Text( "i", ), - 5280..5281, + 5493..5494, ), ( Text( "+", ), - 5281..5282, + 5494..5495, ), ( Text( "+", ), - 5282..5283, + 5495..5496, ), ( Text( ")", ), - 5283..5284, + 5496..5497, ), ( Text( ")", ), - 5284..5285, + 5497..5498, ), ( Text( ";", ), - 5285..5286, + 5498..5499, ), ( Text( "do", ), - 5287..5289, + 5500..5502, ), ( Expression( @@ -6017,52 +6597,52 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 5299..5305, + 5512..5518, ), ( Var( ( "chars", - 5306..5311, + 5519..5524, ), ), - 5306..5311, + 5519..5524, ), ), - 5306..5311, + 5519..5524, ), ), - 5298..5312, + 5511..5525, ), ( Text( "+=", ), - 5312..5314, + 5525..5527, ), ( Text( "(", ), - 5314..5315, + 5527..5528, ), ( Text( "\"", ), - 5316..5317, + 5529..5530, ), ( Escape( "$", ), - 5317..5319, + 5530..5532, ), ( Escape( "{", ), - 5319..5321, + 5532..5534, ), ( Expression( @@ -6070,120 +6650,120 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 5322..5328, + 5535..5541, ), ( Var( ( "text", - 5329..5333, + 5542..5546, ), ), - 5329..5333, + 5542..5546, ), ), - 5329..5333, + 5542..5546, ), ), - 5321..5334, + 5534..5547, ), ( Text( ":", ), - 5334..5335, + 5547..5548, ), ( Escape( "$", ), - 5335..5337, + 5548..5550, ), ( Text( "i", ), - 5337..5338, + 5550..5551, ), ( Text( ":", ), - 5338..5339, + 5551..5552, ), ( Text( "1", ), - 5339..5340, + 5552..5553, ), ( Text( "}", ), - 5340..5341, + 5553..5554, ), ( Text( "\"", ), - 5341..5342, + 5554..5555, ), ( Text( ")", ), - 5343..5344, + 5556..5557, ), ( Text( ";", ), - 5344..5345, + 5557..5558, ), ( Text( "done", ), - 5350..5354, + 5563..5567, ), ( Text( "$", ), - 5355..5356, + 5568..5569, ), ], [], ), - 5238..5356, + 5451..5569, ), ), - 5238..5356, + 5451..5569, ), ( Return( ( "return", - 5361..5367, + 5574..5580, ), Some( ( Var( ( "chars", - 5368..5373, + 5581..5586, ), ), - 5368..5373, + 5581..5586, ), ), ), - 5361..5373, + 5574..5586, ), ], ), - 5169..5375, + 5382..5588, ), ( Statement( @@ -6193,69 +6773,69 @@ expression: parse_unwrap(&tokens) DocString( "Checks if some text contains a value.", ), - 5377..5419, + 5590..5632, ), ), - 5377..5419, + 5590..5632, ), ), - 5377..5419, + 5590..5632, ), ( FunctionDefinition( [], ( true, - 5419..5422, + 5632..5635, ), ( "fun", - 5423..5426, + 5636..5639, ), ( "text_contains", - 5427..5440, + 5640..5653, ), [ ( Typed( ( false, - 5441..5441, + 5654..5654, ), ( "source", - 5441..5447, + 5654..5660, ), ( Text, - 5449..5453, + 5662..5666, ), ), - 5441..5453, + 5654..5666, ), ( Typed( ( false, - 5455..5454, + 5668..5667, ), ( "search", - 5455..5461, + 5668..5674, ), ( Text, - 5463..5467, + 5676..5680, ), ), - 5455..5467, + 5668..5680, ), ], Some( ( Bool, - 5470..5474, + 5683..5687, ), ), [ @@ -6263,11 +6843,11 @@ expression: parse_unwrap(&tokens) VariableInit( ( "let", - 5479..5482, + 5692..5695, ), ( "result", - 5483..5489, + 5696..5702, ), ( Expression( @@ -6276,7 +6856,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 5492..5497, + 5705..5710, ), ], [ @@ -6284,31 +6864,31 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 5498..5499, + 5711..5712, ), ( Text( "if", ), - 5500..5502, + 5713..5715, ), ( Text( "[", ), - 5503..5504, + 5716..5717, ), ( Text( "[", ), - 5504..5505, + 5717..5718, ), ( Text( "\"", ), - 5506..5507, + 5719..5720, ), ( Expression( @@ -6316,37 +6896,37 @@ expression: parse_unwrap(&tokens) Var( ( "source", - 5508..5514, + 5721..5727, ), ), - 5508..5514, + 5721..5727, ), ), - 5507..5515, + 5720..5728, ), ( Text( "\"", ), - 5515..5516, + 5728..5729, ), ( Text( "==", ), - 5517..5519, + 5730..5732, ), ( Text( "*", ), - 5520..5521, + 5733..5734, ), ( Text( "\"", ), - 5521..5522, + 5734..5735, ), ( Expression( @@ -6354,90 +6934,90 @@ expression: parse_unwrap(&tokens) Var( ( "search", - 5523..5529, + 5736..5742, ), ), - 5523..5529, + 5736..5742, ), ), - 5522..5530, + 5735..5743, ), ( Text( "\"", ), - 5530..5531, + 5743..5744, ), ( Text( "*", ), - 5531..5532, + 5744..5745, ), ( Text( "]", ), - 5533..5534, + 5746..5747, ), ( Text( "]", ), - 5534..5535, + 5747..5748, ), ( Text( ";", ), - 5535..5536, + 5748..5749, ), ( Text( "then", ), - 5537..5541, + 5750..5754, ), ( Text( "echo", ), - 5546..5550, + 5759..5763, ), ( Text( "1", ), - 5551..5552, + 5764..5765, ), ( Text( "fi", ), - 5555..5557, + 5768..5770, ), ( Text( "$", ), - 5558..5559, + 5771..5772, ), ], [], ), - 5492..5559, + 5705..5772, ), ), - 5492..5559, + 5705..5772, ), ), - 5479..5559, + 5692..5772, ), ( Return( ( "return", - 5563..5569, + 5776..5782, ), Some( ( @@ -6446,10 +7026,10 @@ expression: parse_unwrap(&tokens) Var( ( "result", - 5570..5576, + 5783..5789, ), ), - 5570..5576, + 5783..5789, ), ( Text( @@ -6458,25 +7038,25 @@ expression: parse_unwrap(&tokens) Text( ( "1", - 5581..5582, + 5794..5795, ), ), - 5581..5582, + 5794..5795, ), ], ), - 5580..5583, + 5793..5796, ), ), - 5570..5583, + 5783..5796, ), ), ), - 5563..5583, + 5776..5796, ), ], ), - 5419..5585, + 5632..5798, ), ( Statement( @@ -6486,69 +7066,69 @@ expression: parse_unwrap(&tokens) DocString( "Checks if an array value is in the text.", ), - 5587..5632, + 5800..5845, ), ), - 5587..5632, + 5800..5845, ), ), - 5587..5632, + 5800..5845, ), ( FunctionDefinition( [], ( true, - 5632..5635, + 5845..5848, ), ( "fun", - 5636..5639, + 5849..5852, ), ( "text_contains_any", - 5640..5657, + 5853..5870, ), [ ( Typed( ( false, - 5658..5658, + 5871..5871, ), ( "source", - 5658..5664, + 5871..5877, ), ( Text, - 5666..5670, + 5879..5883, ), ), - 5658..5670, + 5871..5883, ), ( Typed( ( false, - 5672..5671, + 5885..5884, ), ( "searches", - 5672..5680, + 5885..5893, ), ( [Text], - 5682..5688, + 5895..5901, ), ), - 5672..5688, + 5885..5901, ), ], Some( ( Bool, - 5691..5695, + 5904..5908, ), ), [ @@ -6556,29 +7136,29 @@ expression: parse_unwrap(&tokens) IterLoop( ( "for", - 5702..5705, + 5915..5918, ), ( Single( ( "search", - 5706..5712, + 5919..5925, ), ), - 5706..5712, + 5919..5925, ), ( "in", - 5713..5715, + 5926..5928, ), ( Var( ( "searches", - 5716..5724, + 5929..5937, ), ), - 5716..5724, + 5929..5937, ), ( Block( @@ -6588,7 +7168,7 @@ expression: parse_unwrap(&tokens) IfCondition( ( "if", - 5735..5737, + 5948..5950, ), ( IfCondition( @@ -6597,31 +7177,31 @@ expression: parse_unwrap(&tokens) [], ( "text_contains", - 5738..5751, + 5951..5964, ), [ ( Var( ( "source", - 5752..5758, + 5965..5971, ), ), - 5752..5758, + 5965..5971, ), ( Var( ( "search", - 5760..5766, + 5973..5979, ), ), - 5760..5766, + 5973..5979, ), ], [], ), - 5738..5767, + 5951..5980, ), ( Block( @@ -6631,64 +7211,64 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 5782..5788, + 5995..6001, ), Some( ( Boolean( ( true, - 5789..5793, + 6002..6006, ), ), - 5789..5793, + 6002..6006, ), ), ), - 5782..5793, + 5995..6006, ), ], ), - 5768..5803, + 5981..6016, ), ), - 5738..5803, + 5951..6016, ), [], None, ), - 5735..5803, + 5948..6016, ), ], ), - 5725..5809, + 5938..6022, ), ), - 5702..5809, + 5915..6022, ), ( Return( ( "return", - 5815..5821, + 6028..6034, ), Some( ( Boolean( ( false, - 5822..5827, + 6035..6040, ), ), - 5822..5827, + 6035..6040, ), ), ), - 5815..5827, + 6028..6040, ), ], ), - 5632..5829, + 5845..6042, ), ( Statement( @@ -6698,69 +7278,69 @@ expression: parse_unwrap(&tokens) DocString( "Checks if all the arrays values are in the string", ), - 5831..5885, + 6044..6098, ), ), - 5831..5885, + 6044..6098, ), ), - 5831..5885, + 6044..6098, ), ( FunctionDefinition( [], ( true, - 5885..5888, + 6098..6101, ), ( "fun", - 5889..5892, + 6102..6105, ), ( "text_contains_all", - 5893..5910, + 6106..6123, ), [ ( Typed( ( false, - 5911..5911, + 6124..6124, ), ( "source", - 5911..5917, + 6124..6130, ), ( Text, - 5919..5923, + 6132..6136, ), ), - 5911..5923, + 6124..6136, ), ( Typed( ( false, - 5925..5924, + 6138..6137, ), ( "searches", - 5925..5933, + 6138..6146, ), ( [Text], - 5935..5941, + 6148..6154, ), ), - 5925..5941, + 6138..6154, ), ], Some( ( Bool, - 5944..5948, + 6157..6161, ), ), [ @@ -6768,29 +7348,29 @@ expression: parse_unwrap(&tokens) IterLoop( ( "for", - 5955..5958, + 6168..6171, ), ( Single( ( "search", - 5959..5965, + 6172..6178, ), ), - 5959..5965, + 6172..6178, ), ( "in", - 5966..5968, + 6179..6181, ), ( Var( ( "searches", - 5969..5977, + 6182..6190, ), ), - 5969..5977, + 6182..6190, ), ( Block( @@ -6800,7 +7380,7 @@ expression: parse_unwrap(&tokens) IfCondition( ( "if", - 5988..5990, + 6201..6203, ), ( IfCondition( @@ -6808,41 +7388,41 @@ expression: parse_unwrap(&tokens) Not( ( "not", - 5991..5994, + 6204..6207, ), ( FunctionInvocation( [], ( "text_contains", - 5995..6008, + 6208..6221, ), [ ( Var( ( "source", - 6009..6015, + 6222..6228, ), ), - 6009..6015, + 6222..6228, ), ( Var( ( "search", - 6017..6023, + 6230..6236, ), ), - 6017..6023, + 6230..6236, ), ], [], ), - 5995..6024, + 6208..6237, ), ), - 5995..6024, + 6208..6237, ), ( Block( @@ -6852,64 +7432,64 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 6039..6045, + 6252..6258, ), Some( ( Boolean( ( false, - 6046..6051, + 6259..6264, ), ), - 6046..6051, + 6259..6264, ), ), ), - 6039..6051, + 6252..6264, ), ], ), - 6025..6061, + 6238..6274, ), ), - 5991..6061, + 6204..6274, ), [], None, ), - 5988..6061, + 6201..6274, ), ], ), - 5978..6067, + 6191..6280, ), ), - 5955..6067, + 6168..6280, ), ( Return( ( "return", - 6073..6079, + 6285..6291, ), Some( ( Boolean( ( true, - 6080..6084, + 6292..6296, ), ), - 6080..6084, + 6292..6296, ), ), ), - 6073..6084, + 6285..6296, ), ], ), - 5885..6086, + 6098..6298, ), ( Statement( @@ -6917,15 +7497,15 @@ expression: parse_unwrap(&tokens) Comment( ( DocString( - "Match all occurences of a regex pattern.", + "Match all occurrences of a regex pattern.", ), - 6088..6133, + 6300..6346, ), ), - 6088..6133, + 6300..6346, ), ), - 6088..6133, + 6300..6346, ), ( Statement( @@ -6935,13 +7515,13 @@ expression: parse_unwrap(&tokens) DocString( "", ), - 6133..6137, + 6346..6350, ), ), - 6133..6137, + 6346..6350, ), ), - 6133..6137, + 6346..6350, ), ( Statement( @@ -6951,97 +7531,97 @@ expression: parse_unwrap(&tokens) DocString( "Function uses `sed`", ), - 6137..6161, + 6350..6374, ), ), - 6137..6161, + 6350..6374, ), ), - 6137..6161, + 6350..6374, ), ( FunctionDefinition( [], ( true, - 6161..6164, + 6374..6377, ), ( "fun", - 6165..6168, + 6378..6381, ), ( "match_regex", - 6169..6180, + 6382..6393, ), [ ( Typed( ( false, - 6181..6181, + 6394..6394, ), ( "source", - 6181..6187, + 6394..6400, ), ( Text, - 6189..6193, + 6402..6406, ), ), - 6181..6193, + 6394..6406, ), ( Typed( ( false, - 6195..6194, + 6408..6407, ), ( "search", - 6195..6201, + 6408..6414, ), ( Text, - 6203..6207, + 6416..6420, ), ), - 6195..6207, + 6408..6420, ), ( Optional( ( false, - 6209..6208, + 6422..6421, ), ( "extended", - 6209..6217, + 6422..6430, ), Some( ( Bool, - 6219..6223, + 6432..6436, ), ), ( Boolean( ( false, - 6226..6231, + 6439..6444, ), ), - 6226..6231, + 6439..6444, ), ), - 6209..6231, + 6422..6444, ), ], Some( ( Bool, - 6234..6238, + 6447..6451, ), ), [ @@ -7052,7 +7632,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 6245..6250, + 6458..6463, ), ], [ @@ -7060,49 +7640,49 @@ expression: parse_unwrap(&tokens) ConstInit( ( "const", - 6261..6266, + 6474..6479, ), ( "sed_version", - 6267..6278, + 6480..6491, ), ( FunctionInvocation( [], ( "sed_version", - 6281..6292, + 6494..6505, ), [], [], ), - 6281..6294, + 6494..6507, ), ), - 6261..6294, + 6474..6507, ), ( VariableSet( ( "search", - 6303..6309, + 6516..6522, ), ( FunctionInvocation( [], ( "replace", - 6312..6319, + 6525..6532, ), [ ( Var( ( "search", - 6320..6326, + 6533..6539, ), ), - 6320..6326, + 6533..6539, ), ( Text( @@ -7111,14 +7691,14 @@ expression: parse_unwrap(&tokens) Text( ( "/", - 6329..6330, + 6542..6543, ), ), - 6329..6330, + 6542..6543, ), ], ), - 6328..6331, + 6541..6544, ), ( Text( @@ -7127,32 +7707,32 @@ expression: parse_unwrap(&tokens) Escape( ( "/", - 6334..6336, + 6547..6549, ), ), - 6334..6336, + 6547..6549, ), ], ), - 6333..6337, + 6546..6550, ), ], [], ), - 6312..6338, + 6525..6551, ), ), - 6303..6338, + 6516..6551, ), ( VariableInit( ( "let", - 6347..6350, + 6560..6563, ), ( "output", - 6351..6357, + 6564..6570, ), ( Expression( @@ -7160,19 +7740,19 @@ expression: parse_unwrap(&tokens) Text( [], ), - 6360..6362, + 6573..6575, ), ), - 6360..6362, + 6573..6575, ), ), - 6347..6362, + 6560..6575, ), ( IfCondition( ( "if", - 6371..6373, + 6584..6586, ), ( IfCondition( @@ -7184,26 +7764,26 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 6374..6385, + 6587..6598, ), ), - 6374..6385, + 6587..6598, ), ( Var( ( "SED_VERSION_GNU", - 6389..6404, + 6602..6617, ), ), - 6389..6404, + 6602..6617, ), ), - 6374..6404, + 6587..6617, ), ( "or", - 6405..6407, + 6618..6620, ), ( Eq( @@ -7211,25 +7791,25 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 6408..6419, + 6621..6632, ), ), - 6408..6419, + 6621..6632, ), ( Var( ( "SED_VERSION_BUSYBOX", - 6423..6442, + 6636..6655, ), ), - 6423..6442, + 6636..6655, ), ), - 6408..6442, + 6621..6655, ), ), - 6374..6442, + 6587..6655, ), ( Block( @@ -7241,33 +7821,33 @@ expression: parse_unwrap(&tokens) Comment( "'\\b' is supported but not in POSIX standards. Disable it", ), - 6457..6517, + 6670..6730, ), ), - 6457..6517, + 6670..6730, ), ( VariableSet( ( "search", - 6529..6535, + 6742..6748, ), ( FunctionInvocation( [], ( "replace", - 6538..6545, + 6751..6758, ), [ ( Var( ( "search", - 6546..6552, + 6759..6765, ), ), - 6546..6552, + 6759..6765, ), ( Text( @@ -7276,23 +7856,23 @@ expression: parse_unwrap(&tokens) Escape( ( "\\", - 6555..6557, + 6768..6770, ), ), - 6555..6557, + 6768..6770, ), ( Text( ( "b", - 6557..6558, + 6770..6771, ), ), - 6557..6558, + 6770..6771, ), ], ), - 6554..6559, + 6767..6772, ), ( Text( @@ -7301,49 +7881,49 @@ expression: parse_unwrap(&tokens) Escape( ( "\\", - 6562..6564, + 6775..6777, ), ), - 6562..6564, + 6775..6777, ), ( Escape( ( "b", - 6564..6566, + 6777..6779, ), ), - 6564..6566, + 6777..6779, ), ], ), - 6561..6567, + 6774..6780, ), ], [], ), - 6538..6568, + 6751..6781, ), ), - 6529..6568, + 6742..6781, ), ], ), - 6443..6578, + 6656..6791, ), ), - 6374..6578, + 6587..6791, ), [], None, ), - 6371..6578, + 6584..6791, ), ( IfCondition( ( "if", - 6587..6589, + 6800..6802, ), ( IfCondition( @@ -7351,10 +7931,10 @@ expression: parse_unwrap(&tokens) Var( ( "extended", - 6590..6598, + 6803..6811, ), ), - 6590..6598, + 6803..6811, ), ( Block( @@ -7366,10 +7946,10 @@ expression: parse_unwrap(&tokens) Comment( "GNU sed versions 4.0 through 4.2 support extended regex syntax,", ), - 6613..6680, + 6826..6893, ), ), - 6613..6680, + 6826..6893, ), ( Comment( @@ -7377,16 +7957,16 @@ expression: parse_unwrap(&tokens) Comment( "but only via the \"-r\" option", ), - 6692..6724, + 6905..6937, ), ), - 6692..6724, + 6905..6937, ), ( IfCondition( ( "if", - 6736..6738, + 6949..6951, ), ( IfCondition( @@ -7396,22 +7976,22 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 6739..6750, + 6952..6963, ), ), - 6739..6750, + 6952..6963, ), ( Var( ( "SED_VERSION_GNU", - 6754..6769, + 6967..6982, ), ), - 6754..6769, + 6967..6982, ), ), - 6739..6769, + 6952..6982, ), ( Block( @@ -7423,33 +8003,33 @@ expression: parse_unwrap(&tokens) Comment( "'\\b' is not in POSIX standards. Disable it", ), - 6788..6834, + 7001..7047, ), ), - 6788..6834, + 7001..7047, ), ( VariableSet( ( "search", - 6850..6856, + 7063..7069, ), ( FunctionInvocation( [], ( "replace", - 6859..6866, + 7072..7079, ), [ ( Var( ( "search", - 6867..6873, + 7080..7086, ), ), - 6867..6873, + 7080..7086, ), ( Text( @@ -7458,14 +8038,14 @@ expression: parse_unwrap(&tokens) Escape( ( "b", - 6876..6878, + 7089..7091, ), ), - 6876..6878, + 7089..7091, ), ], ), - 6875..6879, + 7088..7092, ), ( Text( @@ -7474,37 +8054,37 @@ expression: parse_unwrap(&tokens) Escape( ( "\\", - 6882..6884, + 7095..7097, ), ), - 6882..6884, + 7095..7097, ), ( Text( ( "b", - 6884..6885, + 7097..7098, ), ), - 6884..6885, + 7097..7098, ), ], ), - 6881..6886, + 7094..7099, ), ], [], ), - 6859..6887, + 7072..7100, ), ), - 6850..6887, + 7063..7100, ), ( VariableSet( ( "output", - 6904..6910, + 7117..7123, ), ( Command( @@ -7514,19 +8094,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 6913..6914, + 7126..7127, ), ( Text( "echo", ), - 6915..6919, + 7128..7132, ), ( Text( "\"", ), - 6920..6921, + 7133..7134, ), ( Expression( @@ -7534,55 +8114,55 @@ expression: parse_unwrap(&tokens) Var( ( "source", - 6922..6928, + 7135..7141, ), ), - 6922..6928, + 7135..7141, ), ), - 6921..6929, + 7134..7142, ), ( Text( "\"", ), - 6929..6930, + 7142..7143, ), ( Text( "|", ), - 6931..6932, + 7144..7145, ), ( Text( "sed", ), - 6933..6936, + 7146..7149, ), ( CommandOption( "-r", ), - 6937..6939, + 7150..7152, ), ( CommandOption( "-ne", ), - 6940..6943, + 7153..7156, ), ( Text( "\"", ), - 6944..6945, + 7157..7158, ), ( Text( "/", ), - 6945..6946, + 7158..7159, ), ( Expression( @@ -7590,52 +8170,52 @@ expression: parse_unwrap(&tokens) Var( ( "search", - 6947..6953, + 7160..7166, ), ), - 6947..6953, + 7160..7166, ), ), - 6946..6954, + 7159..7167, ), ( Text( "/", ), - 6954..6955, + 7167..7168, ), ( Text( "p", ), - 6955..6956, + 7168..7169, ), ( Text( "\"", ), - 6956..6957, + 7169..7170, ), ( Text( "$", ), - 6958..6959, + 7171..7172, ), ], [], ), - 6913..6959, + 7126..7172, ), ), - 6904..6959, + 7117..7172, ), ], ), - 6770..6973, + 6983..7186, ), ), - 6739..6973, + 6952..7186, ), [], Some( @@ -7643,7 +8223,7 @@ expression: parse_unwrap(&tokens) Else( ( "else", - 6974..6978, + 7187..7191, ), ( Block( @@ -7653,7 +8233,7 @@ expression: parse_unwrap(&tokens) VariableSet( ( "output", - 6997..7003, + 7210..7216, ), ( Command( @@ -7663,19 +8243,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 7006..7007, + 7219..7220, ), ( Text( "echo", ), - 7008..7012, + 7221..7225, ), ( Text( "\"", ), - 7013..7014, + 7226..7227, ), ( Expression( @@ -7683,55 +8263,55 @@ expression: parse_unwrap(&tokens) Var( ( "source", - 7015..7021, + 7228..7234, ), ), - 7015..7021, + 7228..7234, ), ), - 7014..7022, + 7227..7235, ), ( Text( "\"", ), - 7022..7023, + 7235..7236, ), ( Text( "|", ), - 7024..7025, + 7237..7238, ), ( Text( "sed", ), - 7026..7029, + 7239..7242, ), ( CommandOption( "-E", ), - 7030..7032, + 7243..7245, ), ( CommandOption( "-ne", ), - 7033..7036, + 7246..7249, ), ( Text( "\"", ), - 7037..7038, + 7250..7251, ), ( Text( "/", ), - 7038..7039, + 7251..7252, ), ( Expression( @@ -7739,63 +8319,63 @@ expression: parse_unwrap(&tokens) Var( ( "search", - 7040..7046, + 7253..7259, ), ), - 7040..7046, + 7253..7259, ), ), - 7039..7047, + 7252..7260, ), ( Text( "/", ), - 7047..7048, + 7260..7261, ), ( Text( "p", ), - 7048..7049, + 7261..7262, ), ( Text( "\"", ), - 7049..7050, + 7262..7263, ), ( Text( "$", ), - 7051..7052, + 7264..7265, ), ], [], ), - 7006..7052, + 7219..7265, ), ), - 6997..7052, + 7210..7265, ), ], ), - 6979..7066, + 7192..7279, ), ), - 6974..7066, + 7187..7279, ), ), ), - 6736..7066, + 6949..7279, ), ], ), - 6599..7076, + 6812..7289, ), ), - 6590..7076, + 6803..7289, ), [], Some( @@ -7803,7 +8383,7 @@ expression: parse_unwrap(&tokens) Else( ( "else", - 7077..7081, + 7290..7294, ), ( Block( @@ -7813,7 +8393,7 @@ expression: parse_unwrap(&tokens) IfCondition( ( "if", - 7096..7098, + 7309..7311, ), ( IfCondition( @@ -7825,26 +8405,26 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 7099..7110, + 7312..7323, ), ), - 7099..7110, + 7312..7323, ), ( Var( ( "SED_VERSION_GNU", - 7114..7129, + 7327..7342, ), ), - 7114..7129, + 7327..7342, ), ), - 7099..7129, + 7312..7342, ), ( "or", - 7130..7132, + 7343..7345, ), ( Eq( @@ -7852,25 +8432,25 @@ expression: parse_unwrap(&tokens) Var( ( "sed_version", - 7133..7144, + 7346..7357, ), ), - 7133..7144, + 7346..7357, ), ( Var( ( "SED_VERSION_BUSYBOX", - 7148..7167, + 7361..7380, ), ), - 7148..7167, + 7361..7380, ), ), - 7133..7167, + 7346..7380, ), ), - 7099..7167, + 7312..7380, ), ( Block( @@ -7882,33 +8462,33 @@ expression: parse_unwrap(&tokens) Comment( "GNU Sed BRE handle \\| as a metacharacter, but it is not POSIX standands. Disable it", ), - 7186..7273, + 7399..7486, ), ), - 7186..7273, + 7399..7486, ), ( VariableSet( ( "search", - 7289..7295, + 7502..7508, ), ( FunctionInvocation( [], ( "replace", - 7298..7305, + 7511..7518, ), [ ( Var( ( "search", - 7306..7312, + 7519..7525, ), ), - 7306..7312, + 7519..7525, ), ( Text( @@ -7917,14 +8497,14 @@ expression: parse_unwrap(&tokens) Escape( ( "|", - 7315..7317, + 7528..7530, ), ), - 7315..7317, + 7528..7530, ), ], ), - 7314..7318, + 7527..7531, ), ( Text( @@ -7933,40 +8513,40 @@ expression: parse_unwrap(&tokens) Text( ( "|", - 7321..7322, + 7534..7535, ), ), - 7321..7322, + 7534..7535, ), ], ), - 7320..7323, + 7533..7536, ), ], [], ), - 7298..7324, + 7511..7537, ), ), - 7289..7324, + 7502..7537, ), ], ), - 7168..7338, + 7381..7551, ), ), - 7099..7338, + 7312..7551, ), [], None, ), - 7096..7338, + 7309..7551, ), ( VariableSet( ( "output", - 7351..7357, + 7564..7570, ), ( Command( @@ -7976,19 +8556,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 7360..7361, + 7573..7574, ), ( Text( "echo", ), - 7362..7366, + 7575..7579, ), ( Text( "\"", ), - 7367..7368, + 7580..7581, ), ( Expression( @@ -7996,49 +8576,49 @@ expression: parse_unwrap(&tokens) Var( ( "source", - 7369..7375, + 7582..7588, ), ), - 7369..7375, + 7582..7588, ), ), - 7368..7376, + 7581..7589, ), ( Text( "\"", ), - 7376..7377, + 7589..7590, ), ( Text( "|", ), - 7378..7379, + 7591..7592, ), ( Text( "sed", ), - 7380..7383, + 7593..7596, ), ( CommandOption( "-ne", ), - 7384..7387, + 7597..7600, ), ( Text( "\"", ), - 7388..7389, + 7601..7602, ), ( Text( "/", ), - 7389..7390, + 7602..7603, ), ( Expression( @@ -8046,62 +8626,62 @@ expression: parse_unwrap(&tokens) Var( ( "search", - 7391..7397, + 7604..7610, ), ), - 7391..7397, + 7604..7610, ), ), - 7390..7398, + 7603..7611, ), ( Text( "/", ), - 7398..7399, + 7611..7612, ), ( Text( "p", ), - 7399..7400, + 7612..7613, ), ( Text( "\"", ), - 7400..7401, + 7613..7614, ), ( Text( "$", ), - 7402..7403, + 7615..7616, ), ], [], ), - 7360..7403, + 7573..7616, ), ), - 7351..7403, + 7564..7616, ), ], ), - 7082..7413, + 7295..7626, ), ), - 7077..7413, + 7290..7626, ), ), ), - 6587..7413, + 6800..7626, ), ( IfCondition( ( "if", - 7422..7424, + 7635..7637, ), ( IfCondition( @@ -8111,19 +8691,19 @@ expression: parse_unwrap(&tokens) Var( ( "output", - 7425..7431, + 7638..7644, ), ), - 7425..7431, + 7638..7644, ), ( Text( [], ), - 7435..7437, + 7648..7650, ), ), - 7425..7437, + 7638..7650, ), ( Block( @@ -8133,64 +8713,64 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 7452..7458, + 7665..7671, ), Some( ( Boolean( ( true, - 7459..7463, + 7672..7676, ), ), - 7459..7463, + 7672..7676, ), ), ), - 7452..7463, + 7665..7676, ), ], ), - 7438..7473, + 7651..7686, ), ), - 7425..7473, + 7638..7686, ), [], None, ), - 7422..7473, + 7635..7686, ), ], ), - 6245..7479, + 6458..7692, ), ), - 6245..7479, + 6458..7692, ), ( Return( ( "return", - 7484..7490, + 7697..7703, ), Some( ( Boolean( ( false, - 7491..7496, + 7704..7709, ), ), - 7491..7496, + 7704..7709, ), ), ), - 7484..7496, + 7697..7709, ), ], ), - 6161..7498, + 6374..7711, ), ( Statement( @@ -8200,69 +8780,69 @@ expression: parse_unwrap(&tokens) DocString( "Checks if an array value (with regular expression) is in the text.", ), - 7500..7571, + 7713..7784, ), ), - 7500..7571, + 7713..7784, ), ), - 7500..7571, + 7713..7784, ), ( FunctionDefinition( [], ( true, - 7571..7574, + 7784..7787, ), ( "fun", - 7575..7578, + 7788..7791, ), ( "match_regex_any", - 7579..7594, + 7792..7807, ), [ ( Typed( ( false, - 7595..7595, + 7808..7808, ), ( "text", - 7595..7599, + 7808..7812, ), ( Text, - 7601..7605, + 7814..7818, ), ), - 7595..7605, + 7808..7818, ), ( Typed( ( false, - 7607..7606, + 7820..7819, ), ( "terms", - 7607..7612, + 7820..7825, ), ( [Text], - 7614..7620, + 7827..7833, ), ), - 7607..7620, + 7820..7833, ), ], Some( ( Bool, - 7623..7627, + 7836..7840, ), ), [ @@ -8270,29 +8850,29 @@ expression: parse_unwrap(&tokens) IterLoop( ( "for", - 7634..7637, + 7847..7850, ), ( Single( ( "term", - 7638..7642, + 7851..7855, ), ), - 7638..7642, + 7851..7855, ), ( "in", - 7643..7645, + 7856..7858, ), ( Var( ( "terms", - 7646..7651, + 7859..7864, ), ), - 7646..7651, + 7859..7864, ), ( Block( @@ -8302,7 +8882,7 @@ expression: parse_unwrap(&tokens) IfCondition( ( "if", - 7662..7664, + 7875..7877, ), ( IfCondition( @@ -8311,40 +8891,40 @@ expression: parse_unwrap(&tokens) [], ( "match_regex", - 7665..7676, + 7878..7889, ), [ ( Var( ( "text", - 7677..7681, + 7890..7894, ), ), - 7677..7681, + 7890..7894, ), ( Var( ( "term", - 7683..7687, + 7896..7900, ), ), - 7683..7687, + 7896..7900, ), ( Boolean( ( false, - 7689..7694, + 7902..7907, ), ), - 7689..7694, + 7902..7907, ), ], [], ), - 7665..7695, + 7878..7908, ), ( Block( @@ -8354,64 +8934,64 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 7710..7716, + 7923..7929, ), Some( ( Boolean( ( true, - 7717..7721, + 7930..7934, ), ), - 7717..7721, + 7930..7934, ), ), ), - 7710..7721, + 7923..7934, ), ], ), - 7696..7731, + 7909..7944, ), ), - 7665..7731, + 7878..7944, ), [], None, ), - 7662..7731, + 7875..7944, ), ], ), - 7652..7737, + 7865..7950, ), ), - 7634..7737, + 7847..7950, ), ( Return( ( "return", - 7743..7749, + 7956..7962, ), Some( ( Boolean( ( false, - 7750..7755, + 7963..7968, ), ), - 7750..7755, + 7963..7968, ), ), ), - 7743..7755, + 7956..7968, ), ], ), - 7571..7757, + 7784..7970, ), ( Statement( @@ -8421,52 +9001,52 @@ expression: parse_unwrap(&tokens) DocString( "Reverses text using `rev`.", ), - 7759..7790, + 7972..8003, ), ), - 7759..7790, + 7972..8003, ), ), - 7759..7790, + 7972..8003, ), ( FunctionDefinition( [], ( true, - 7790..7793, + 8003..8006, ), ( "fun", - 7794..7797, + 8007..8010, ), ( "reversed", - 7798..7806, + 8011..8019, ), [ ( Typed( ( false, - 7807..7807, + 8020..8020, ), ( "text", - 7807..7811, + 8020..8024, ), ( Text, - 7813..7817, + 8026..8030, ), ), - 7807..7817, + 8020..8030, ), ], Some( ( Text, - 7820..7824, + 8033..8037, ), ), [ @@ -8474,7 +9054,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 7831..7837, + 8044..8050, ), Some( ( @@ -8482,7 +9062,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 7838..7843, + 8051..8056, ), ], [ @@ -8490,19 +9070,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 7844..7845, + 8057..8058, ), ( Text( "echo", ), - 7846..7850, + 8059..8063, ), ( Text( "\"", ), - 7851..7852, + 8064..8065, ), ( Expression( @@ -8510,50 +9090,50 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 7853..7857, + 8066..8070, ), ), - 7853..7857, + 8066..8070, ), ), - 7852..7858, + 8065..8071, ), ( Text( "\"", ), - 7858..7859, + 8071..8072, ), ( Text( "|", ), - 7860..7861, + 8073..8074, ), ( Text( "rev", ), - 7862..7865, + 8075..8078, ), ( Text( "$", ), - 7866..7867, + 8079..8080, ), ], [], ), - 7838..7867, + 8051..8080, ), ), ), - 7831..7867, + 8044..8080, ), ], ), - 7790..7869, + 8003..8082, ), ( Statement( @@ -8563,69 +9143,69 @@ expression: parse_unwrap(&tokens) DocString( "Checks if text starts with a value.", ), - 7871..7911, + 8084..8124, ), ), - 7871..7911, + 8084..8124, ), ), - 7871..7911, + 8084..8124, ), ( FunctionDefinition( [], ( true, - 7911..7914, + 8124..8127, ), ( "fun", - 7915..7918, + 8128..8131, ), ( "starts_with", - 7919..7930, + 8132..8143, ), [ ( Typed( ( false, - 7931..7931, + 8144..8144, ), ( "text", - 7931..7935, + 8144..8148, ), ( Text, - 7937..7941, + 8150..8154, ), ), - 7931..7941, + 8144..8154, ), ( Typed( ( false, - 7943..7942, + 8156..8155, ), ( "prefix", - 7943..7949, + 8156..8162, ), ( Text, - 7951..7955, + 8164..8168, ), ), - 7943..7955, + 8156..8168, ), ], Some( ( Bool, - 7958..7962, + 8171..8175, ), ), [ @@ -8633,11 +9213,11 @@ expression: parse_unwrap(&tokens) VariableInit( ( "let", - 7967..7970, + 8180..8183, ), ( "result", - 7971..7977, + 8184..8190, ), ( Expression( @@ -8646,7 +9226,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 7980..7985, + 8193..8198, ), ], [ @@ -8654,31 +9234,31 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 7986..7987, + 8199..8200, ), ( Text( "if", ), - 7988..7990, + 8201..8203, ), ( Text( "[", ), - 7991..7992, + 8204..8205, ), ( Text( "[", ), - 7992..7993, + 8205..8206, ), ( Text( "\"", ), - 7994..7995, + 8207..8208, ), ( Expression( @@ -8686,31 +9266,31 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 7996..8000, + 8209..8213, ), ), - 7996..8000, + 8209..8213, ), ), - 7995..8001, + 8208..8214, ), ( Text( "\"", ), - 8001..8002, + 8214..8215, ), ( Text( "==", ), - 8003..8005, + 8216..8218, ), ( Text( "\"", ), - 8006..8007, + 8219..8220, ), ( Expression( @@ -8718,90 +9298,90 @@ expression: parse_unwrap(&tokens) Var( ( "prefix", - 8008..8014, + 8221..8227, ), ), - 8008..8014, + 8221..8227, ), ), - 8007..8015, + 8220..8228, ), ( Text( "\"", ), - 8015..8016, + 8228..8229, ), ( Text( "*", ), - 8016..8017, + 8229..8230, ), ( Text( "]", ), - 8018..8019, + 8231..8232, ), ( Text( "]", ), - 8019..8020, + 8232..8233, ), ( Text( ";", ), - 8020..8021, + 8233..8234, ), ( Text( "then", ), - 8022..8026, + 8235..8239, ), ( Text( "echo", ), - 8031..8035, + 8244..8248, ), ( Text( "1", ), - 8036..8037, + 8249..8250, ), ( Text( "fi", ), - 8040..8042, + 8253..8255, ), ( Text( "$", ), - 8043..8044, + 8256..8257, ), ], [], ), - 7980..8044, + 8193..8257, ), ), - 7980..8044, + 8193..8257, ), ), - 7967..8044, + 8180..8257, ), ( Return( ( "return", - 8048..8054, + 8261..8267, ), Some( ( @@ -8810,10 +9390,10 @@ expression: parse_unwrap(&tokens) Var( ( "result", - 8055..8061, + 8268..8274, ), ), - 8055..8061, + 8268..8274, ), ( Text( @@ -8822,25 +9402,25 @@ expression: parse_unwrap(&tokens) Text( ( "1", - 8066..8067, + 8279..8280, ), ), - 8066..8067, + 8279..8280, ), ], ), - 8065..8068, + 8278..8281, ), ), - 8055..8068, + 8268..8281, ), ), ), - 8048..8068, + 8261..8281, ), ], ), - 7911..8070, + 8124..8283, ), ( Statement( @@ -8850,69 +9430,69 @@ expression: parse_unwrap(&tokens) DocString( "Checks if text ends with a value.", ), - 8072..8110, + 8285..8323, ), ), - 8072..8110, + 8285..8323, ), ), - 8072..8110, + 8285..8323, ), ( FunctionDefinition( [], ( true, - 8110..8113, + 8323..8326, ), ( "fun", - 8114..8117, + 8327..8330, ), ( "ends_with", - 8118..8127, + 8331..8340, ), [ ( Typed( ( false, - 8128..8128, + 8341..8341, ), ( "text", - 8128..8132, + 8341..8345, ), ( Text, - 8134..8138, + 8347..8351, ), ), - 8128..8138, + 8341..8351, ), ( Typed( ( false, - 8140..8139, + 8353..8352, ), ( "suffix", - 8140..8146, + 8353..8359, ), ( Text, - 8148..8152, + 8361..8365, ), ), - 8140..8152, + 8353..8365, ), ], Some( ( Bool, - 8155..8159, + 8368..8372, ), ), [ @@ -8920,11 +9500,11 @@ expression: parse_unwrap(&tokens) VariableInit( ( "let", - 8164..8167, + 8377..8380, ), ( "result", - 8168..8174, + 8381..8387, ), ( Expression( @@ -8933,7 +9513,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 8177..8182, + 8390..8395, ), ], [ @@ -8941,31 +9521,31 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 8183..8184, + 8396..8397, ), ( Text( "if", ), - 8185..8187, + 8398..8400, ), ( Text( "[", ), - 8188..8189, + 8401..8402, ), ( Text( "[", ), - 8189..8190, + 8402..8403, ), ( Text( "\"", ), - 8191..8192, + 8404..8405, ), ( Expression( @@ -8973,37 +9553,37 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 8193..8197, + 8406..8410, ), ), - 8193..8197, + 8406..8410, ), ), - 8192..8198, + 8405..8411, ), ( Text( "\"", ), - 8198..8199, + 8411..8412, ), ( Text( "==", ), - 8200..8202, + 8413..8415, ), ( Text( "*", ), - 8203..8204, + 8416..8417, ), ( Text( "\"", ), - 8204..8205, + 8417..8418, ), ( Expression( @@ -9011,84 +9591,84 @@ expression: parse_unwrap(&tokens) Var( ( "suffix", - 8206..8212, + 8419..8425, ), ), - 8206..8212, + 8419..8425, ), ), - 8205..8213, + 8418..8426, ), ( Text( "\"", ), - 8213..8214, + 8426..8427, ), ( Text( "]", ), - 8215..8216, + 8428..8429, ), ( Text( "]", ), - 8216..8217, + 8429..8430, ), ( Text( ";", ), - 8217..8218, + 8430..8431, ), ( Text( "then", ), - 8219..8223, + 8432..8436, ), ( Text( "echo", ), - 8228..8232, + 8441..8445, ), ( Text( "1", ), - 8233..8234, + 8446..8447, ), ( Text( "fi", ), - 8237..8239, + 8450..8452, ), ( Text( "$", ), - 8240..8241, + 8453..8454, ), ], [], ), - 8177..8241, + 8390..8454, ), ), - 8177..8241, + 8390..8454, ), ), - 8164..8241, + 8377..8454, ), ( Return( ( "return", - 8245..8251, + 8458..8464, ), Some( ( @@ -9097,10 +9677,10 @@ expression: parse_unwrap(&tokens) Var( ( "result", - 8252..8258, + 8465..8471, ), ), - 8252..8258, + 8465..8471, ), ( Text( @@ -9109,25 +9689,25 @@ expression: parse_unwrap(&tokens) Text( ( "1", - 8263..8264, + 8476..8477, ), ), - 8263..8264, + 8476..8477, ), ], ), - 8262..8265, + 8475..8478, ), ), - 8252..8265, + 8465..8478, ), ), ), - 8245..8265, + 8458..8478, ), ], ), - 8110..8267, + 8323..8480, ), ( Statement( @@ -9137,13 +9717,13 @@ expression: parse_unwrap(&tokens) DocString( "Returns a substring from `text` starting at the given `index` (0-based).", ), - 8269..8346, + 8482..8559, ), ), - 8269..8346, + 8482..8559, ), ), - 8269..8346, + 8482..8559, ), ( Statement( @@ -9153,13 +9733,13 @@ expression: parse_unwrap(&tokens) DocString( "", ), - 8346..8350, + 8559..8563, ), ), - 8346..8350, + 8559..8563, ), ), - 8346..8350, + 8559..8563, ), ( Statement( @@ -9169,13 +9749,13 @@ expression: parse_unwrap(&tokens) DocString( "If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.", ), - 8350..8462, + 8563..8675, ), ), - 8350..8462, + 8563..8675, ), ), - 8350..8462, + 8563..8675, ), ( Statement( @@ -9185,13 +9765,13 @@ expression: parse_unwrap(&tokens) DocString( "If `length` is provided, the substring will include `length` characters; otherwise, it slices to the end of `text`.", ), - 8462..8582, + 8675..8795, ), ), - 8462..8582, + 8675..8795, ), ), - 8462..8582, + 8675..8795, ), ( Statement( @@ -9201,97 +9781,97 @@ expression: parse_unwrap(&tokens) DocString( "If `length` is negative, an empty string is returned.", ), - 8582..8640, + 8795..8853, ), ), - 8582..8640, + 8795..8853, ), ), - 8582..8640, + 8795..8853, ), ( FunctionDefinition( [], ( true, - 8640..8643, + 8853..8856, ), ( "fun", - 8644..8647, + 8857..8860, ), ( "slice", - 8648..8653, + 8861..8866, ), [ ( Typed( ( false, - 8654..8654, + 8867..8867, ), ( "text", - 8654..8658, + 8867..8871, ), ( Text, - 8660..8664, + 8873..8877, ), ), - 8654..8664, + 8867..8877, ), ( Typed( ( false, - 8666..8665, + 8879..8878, ), ( "index", - 8666..8671, + 8879..8884, ), ( Int, - 8673..8676, + 8886..8889, ), ), - 8666..8676, + 8879..8889, ), ( Optional( ( false, - 8678..8677, + 8891..8890, ), ( "length", - 8678..8684, + 8891..8897, ), Some( ( Int, - 8686..8689, + 8899..8902, ), ), ( Int( ( 0, - 8692..8693, + 8905..8906, ), ), - 8692..8693, + 8905..8906, ), ), - 8678..8693, + 8891..8906, ), ], Some( ( Text, - 8696..8700, + 8909..8913, ), ), [ @@ -9299,7 +9879,7 @@ expression: parse_unwrap(&tokens) IfCondition( ( "if", - 8707..8709, + 8920..8922, ), ( IfCondition( @@ -9309,22 +9889,22 @@ expression: parse_unwrap(&tokens) Var( ( "length", - 8710..8716, + 8923..8929, ), ), - 8710..8716, + 8923..8929, ), ( Int( ( 0, - 8720..8721, + 8933..8934, ), ), - 8720..8721, + 8933..8934, ), ), - 8710..8721, + 8923..8934, ), ( Singleline( @@ -9332,7 +9912,7 @@ expression: parse_unwrap(&tokens) VariableSet( ( "length", - 8723..8729, + 8936..8942, ), ( Subtract( @@ -9341,54 +9921,54 @@ expression: parse_unwrap(&tokens) [], ( "len", - 8732..8735, + 8945..8948, ), [ ( Var( ( "text", - 8736..8740, + 8949..8953, ), ), - 8736..8740, + 8949..8953, ), ], [], ), - 8732..8741, + 8945..8954, ), ( Var( ( "index", - 8744..8749, + 8957..8962, ), ), - 8744..8749, + 8957..8962, ), ), - 8732..8749, + 8945..8962, ), ), - 8723..8749, + 8936..8962, ), ), - 8721..8749, + 8934..8962, ), ), - 8710..8749, + 8923..8962, ), [], None, ), - 8707..8749, + 8920..8962, ), ( IfCondition( ( "if", - 8754..8756, + 8967..8969, ), ( IfCondition( @@ -9398,22 +9978,22 @@ expression: parse_unwrap(&tokens) Var( ( "length", - 8757..8763, + 8970..8976, ), ), - 8757..8763, + 8970..8976, ), ( Int( ( 0, - 8767..8768, + 8980..8981, ), ), - 8767..8768, + 8980..8981, ), ), - 8757..8768, + 8970..8981, ), ( Singleline( @@ -9421,35 +10001,35 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 8770..8776, + 8983..8989, ), Some( ( Text( [], ), - 8777..8779, + 8990..8992, ), ), ), - 8770..8779, + 8983..8992, ), ), - 8768..8779, + 8981..8992, ), ), - 8757..8779, + 8970..8992, ), [], None, ), - 8754..8779, + 8967..8992, ), ( Return( ( "return", - 8784..8790, + 8997..9003, ), Some( ( @@ -9457,7 +10037,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 8791..8796, + 9004..9009, ), ], [ @@ -9465,31 +10045,31 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 8797..8798, + 9010..9011, ), ( Text( "printf", ), - 8799..8805, + 9012..9018, ), ( Text( "\"", ), - 8806..8807, + 9019..9020, ), ( Text( "%", ), - 8807..8808, + 9020..9021, ), ( Text( ".", ), - 8808..8809, + 9021..9022, ), ( Expression( @@ -9497,55 +10077,55 @@ expression: parse_unwrap(&tokens) Var( ( "length", - 8810..8816, + 9023..9029, ), ), - 8810..8816, + 9023..9029, ), ), - 8809..8817, + 9022..9030, ), ( Text( "s", ), - 8817..8818, + 9030..9031, ), ( Text( "\"", ), - 8818..8819, + 9031..9032, ), ( Text( "\"", ), - 8820..8821, + 9033..9034, ), ( Escape( "$", ), - 8821..8823, + 9034..9036, ), ( Escape( "{", ), - 8823..8825, + 9036..9038, ), ( Text( "text", ), - 8825..8829, + 9038..9042, ), ( Text( ":", ), - 8829..8830, + 9042..9043, ), ( Expression( @@ -9553,44 +10133,44 @@ expression: parse_unwrap(&tokens) Var( ( "index", - 8831..8836, + 9045..9050, ), ), - 8831..8836, + 9045..9050, ), ), - 8830..8837, + 9044..9051, ), ( Text( "}", ), - 8837..8838, + 9051..9052, ), ( Text( "\"", ), - 8838..8839, + 9052..9053, ), ( Text( "$", ), - 8840..8841, + 9054..9055, ), ], [], ), - 8791..8841, + 9004..9055, ), ), ), - 8784..8841, + 8997..9055, ), ], ), - 8640..8843, + 8853..9057, ), ( Statement( @@ -9600,13 +10180,13 @@ expression: parse_unwrap(&tokens) DocString( "Returns the character from `text` at the specified `index` (0-based).", ), - 8845..8919, + 9059..9133, ), ), - 8845..8919, + 9059..9133, ), ), - 8845..8919, + 9059..9133, ), ( Statement( @@ -9616,13 +10196,13 @@ expression: parse_unwrap(&tokens) DocString( "", ), - 8919..8923, + 9133..9137, ), ), - 8919..8923, + 9133..9137, ), ), - 8919..8923, + 9133..9137, ), ( Statement( @@ -9632,69 +10212,69 @@ expression: parse_unwrap(&tokens) DocString( "If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.", ), - 8923..9035, + 9137..9249, ), ), - 8923..9035, + 9137..9249, ), ), - 8923..9035, + 9137..9249, ), ( FunctionDefinition( [], ( true, - 9035..9038, + 9249..9252, ), ( "fun", - 9039..9042, + 9253..9256, ), ( "char_at", - 9043..9050, + 9257..9264, ), [ ( Typed( ( false, - 9051..9051, + 9265..9265, ), ( "text", - 9051..9055, + 9265..9269, ), ( Text, - 9057..9061, + 9271..9275, ), ), - 9051..9061, + 9265..9275, ), ( Typed( ( false, - 9063..9062, + 9277..9276, ), ( "index", - 9063..9068, + 9277..9282, ), ( Int, - 9070..9073, + 9284..9287, ), ), - 9063..9073, + 9277..9287, ), ], Some( ( Text, - 9076..9080, + 9290..9294, ), ), [ @@ -9702,7 +10282,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 9087..9093, + 9301..9307, ), Some( ( @@ -9710,7 +10290,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 9094..9099, + 9308..9313, ), ], [ @@ -9718,73 +10298,73 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 9100..9101, + 9314..9315, ), ( Text( "printf", ), - 9102..9108, + 9316..9322, ), ( Text( "\"", ), - 9109..9110, + 9323..9324, ), ( Text( "%", ), - 9110..9111, + 9324..9325, ), ( Text( ".", ), - 9111..9112, + 9325..9326, ), ( Text( "1s", ), - 9112..9114, + 9326..9328, ), ( Text( "\"", ), - 9114..9115, + 9328..9329, ), ( Text( "\"", ), - 9116..9117, + 9330..9331, ), ( Escape( "$", ), - 9117..9119, + 9331..9333, ), ( Escape( "{", ), - 9119..9121, + 9333..9335, ), ( Text( "text", ), - 9121..9125, + 9335..9339, ), ( Text( ":", ), - 9125..9126, + 9339..9340, ), ( Expression( @@ -9792,44 +10372,44 @@ expression: parse_unwrap(&tokens) Var( ( "index", - 9127..9132, + 9342..9347, ), ), - 9127..9132, + 9342..9347, ), ), - 9126..9133, + 9341..9348, ), ( Text( "}", ), - 9133..9134, + 9348..9349, ), ( Text( "\"", ), - 9134..9135, + 9349..9350, ), ( Text( "$", ), - 9136..9137, + 9351..9352, ), ], [], ), - 9094..9137, + 9308..9352, ), ), ), - 9087..9137, + 9301..9352, ), ], ), - 9035..9139, + 9249..9354, ), ( Statement( @@ -9839,57 +10419,57 @@ expression: parse_unwrap(&tokens) DocString( "Capitalize the first letter of the given `text`.", ), - 9141..9194, + 9356..9409, ), ), - 9141..9194, + 9356..9409, ), ), - 9141..9194, + 9356..9409, ), ( FunctionDefinition( [ ( AllowAbsurdCast, - 9194..9214, + 9409..9429, ), ], ( true, - 9215..9218, + 9430..9433, ), ( "fun", - 9219..9222, + 9434..9437, ), ( "capitalized", - 9223..9234, + 9438..9449, ), [ ( Typed( ( false, - 9235..9235, + 9450..9450, ), ( "text", - 9235..9239, + 9450..9454, ), ( Text, - 9241..9245, + 9456..9460, ), ), - 9235..9245, + 9450..9460, ), ], Some( ( Text, - 9248..9252, + 9463..9467, ), ), [ @@ -9900,7 +10480,7 @@ expression: parse_unwrap(&tokens) [ ( Trust, - 9259..9264, + 9474..9479, ), ], [ @@ -9908,7 +10488,7 @@ expression: parse_unwrap(&tokens) IfCondition( ( "if", - 9275..9277, + 9490..9492, ), ( IfCondition( @@ -9919,34 +10499,34 @@ expression: parse_unwrap(&tokens) [], ( "len", - 9278..9281, + 9493..9496, ), [ ( Var( ( "text", - 9282..9286, + 9497..9501, ), ), - 9282..9286, + 9497..9501, ), ], [], ), - 9278..9287, + 9493..9502, ), ( Int( ( 0, - 9291..9292, + 9506..9507, ), ), - 9291..9292, + 9506..9507, ), ), - 9278..9292, + 9493..9507, ), ( Block( @@ -9956,39 +10536,39 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 9307..9313, + 9522..9528, ), Some( ( Var( ( "text", - 9314..9318, + 9529..9533, ), ), - 9314..9318, + 9529..9533, ), ), ), - 9307..9318, + 9522..9533, ), ], ), - 9293..9328, + 9508..9543, ), ), - 9278..9328, + 9493..9543, ), [], None, ), - 9275..9328, + 9490..9543, ), ( IfCondition( ( "if", - 9337..9339, + 9552..9554, ), ( IfCondition( @@ -9999,12 +10579,12 @@ expression: parse_unwrap(&tokens) [], ( "bash_version", - 9340..9352, + 9555..9567, ), [], [], ), - 9340..9354, + 9555..9569, ), ( Array( @@ -10013,17 +10593,17 @@ expression: parse_unwrap(&tokens) Int( ( 4, - 9359..9360, + 9574..9575, ), ), - 9359..9360, + 9574..9575, ), ], ), - 9358..9361, + 9573..9576, ), ), - 9340..9361, + 9555..9576, ), ( Block( @@ -10033,7 +10613,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 9376..9382, + 9591..9597, ), Some( ( @@ -10044,31 +10624,31 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 9383..9384, + 9598..9599, ), ( Text( "echo", ), - 9385..9389, + 9600..9604, ), ( - Escape( + Text( "\"", ), - 9390..9392, + 9605..9606, ), ( Escape( "$", ), - 9392..9394, + 9606..9608, ), ( Escape( "{", ), - 9394..9396, + 9608..9610, ), ( Expression( @@ -10076,73 +10656,73 @@ expression: parse_unwrap(&tokens) Nameof( ( "nameof", - 9397..9403, + 9611..9617, ), ( Var( ( "text", - 9404..9408, + 9618..9622, ), ), - 9404..9408, + 9618..9622, ), ), - 9404..9408, + 9618..9622, ), ), - 9396..9409, + 9610..9623, ), ( Text( "^", ), - 9409..9410, + 9623..9624, ), ( Text( "}", ), - 9410..9411, + 9624..9625, ), ( - Escape( + Text( "\"", ), - 9411..9413, + 9625..9626, ), ( Text( "$", ), - 9414..9415, + 9627..9628, ), ], [], ), - 9383..9415, + 9598..9628, ), ), ), - 9376..9415, + 9591..9628, ), ], ), - 9362..9425, + 9577..9638, ), ), - 9340..9425, + 9555..9638, ), [], None, ), - 9337..9425, + 9552..9638, ), ( IfCondition( ( "if", - 9434..9436, + 9647..9649, ), ( IfCondition( @@ -10153,24 +10733,24 @@ expression: parse_unwrap(&tokens) [], ( "sed_version", - 9437..9448, + 9650..9661, ), [], [], ), - 9437..9450, + 9650..9663, ), ( Var( ( "SED_VERSION_GNU", - 9454..9469, + 9667..9682, ), ), - 9454..9469, + 9667..9682, ), ), - 9437..9469, + 9650..9682, ), ( Block( @@ -10182,16 +10762,16 @@ expression: parse_unwrap(&tokens) Comment( "GNU sed supports \\U", ), - 9484..9507, + 9697..9720, ), ), - 9484..9507, + 9697..9720, ), ( Return( ( "return", - 9519..9525, + 9732..9738, ), Some( ( @@ -10202,19 +10782,19 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 9526..9527, + 9739..9740, ), ( Text( "echo", ), - 9528..9532, + 9741..9745, ), ( Text( "\"", ), - 9533..9534, + 9746..9747, ), ( Expression( @@ -10222,147 +10802,147 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 9535..9539, + 9748..9752, ), ), - 9535..9539, + 9748..9752, ), ), - 9534..9540, + 9747..9753, ), ( Text( "\"", ), - 9540..9541, + 9753..9754, ), ( Text( "|", ), - 9542..9543, + 9755..9756, ), ( Text( "sed", ), - 9544..9547, + 9757..9760, ), ( Text( "\"", ), - 9548..9549, + 9761..9762, ), ( Text( "s", ), - 9549..9550, + 9762..9763, ), ( Text( "/", ), - 9550..9551, + 9763..9764, ), ( Text( "^", ), - 9551..9552, + 9764..9765, ), ( Escape( "(", ), - 9552..9554, + 9765..9767, ), ( Text( ".", ), - 9554..9555, + 9767..9768, ), ( Escape( ")", ), - 9555..9557, + 9768..9770, ), ( Text( "/", ), - 9557..9558, + 9770..9771, ), ( Escape( "U", ), - 9558..9560, + 9771..9773, ), ( Escape( "1", ), - 9560..9562, + 9773..9775, ), ( Text( "/", ), - 9562..9563, + 9775..9776, ), ( Text( "\"", ), - 9563..9564, + 9776..9777, ), ( Text( "$", ), - 9565..9566, + 9778..9779, ), ], [], ), - 9526..9566, + 9739..9779, ), ), ), - 9519..9566, + 9732..9779, ), ], ), - 9470..9576, + 9683..9789, ), ), - 9437..9576, + 9650..9789, ), [], None, ), - 9434..9576, + 9647..9789, ), ( ConstInit( ( "const", - 9585..9590, + 9798..9803, ), ( "first_letter", - 9591..9603, + 9804..9816, ), ( FunctionInvocation( [], ( "uppercase", - 9606..9615, + 9819..9828, ), [ ( @@ -10370,45 +10950,45 @@ expression: parse_unwrap(&tokens) [], ( "char_at", - 9616..9623, + 9829..9836, ), [ ( Var( ( "text", - 9624..9628, + 9837..9841, ), ), - 9624..9628, + 9837..9841, ), ( Int( ( 0, - 9630..9631, + 9843..9844, ), ), - 9630..9631, + 9843..9844, ), ], [], ), - 9616..9632, + 9829..9845, ), ], [], ), - 9606..9633, + 9819..9846, ), ), - 9585..9633, + 9798..9846, ), ( Return( ( "return", - 9642..9648, + 9855..9861, ), Some( ( @@ -10417,59 +10997,59 @@ expression: parse_unwrap(&tokens) Var( ( "first_letter", - 9649..9661, + 9862..9874, ), ), - 9649..9661, + 9862..9874, ), ( FunctionInvocation( [], ( "slice", - 9664..9669, + 9877..9882, ), [ ( Var( ( "text", - 9670..9674, + 9883..9887, ), ), - 9670..9674, + 9883..9887, ), ( Int( ( 1, - 9676..9677, + 9889..9890, ), ), - 9676..9677, + 9889..9890, ), ], [], ), - 9664..9678, + 9877..9891, ), ), - 9649..9678, + 9862..9891, ), ), ), - 9642..9678, + 9855..9891, ), ], ), - 9259..9684, + 9474..9897, ), ), - 9259..9684, + 9474..9897, ), ], ), - 9194..9686, + 9409..9899, ), ( Statement( @@ -10479,86 +11059,86 @@ expression: parse_unwrap(&tokens) DocString( "Pads `text` with the specified `pad` character on left until it reaches the desired `length`.", ), - 9688..9786, + 9901..9999, ), ), - 9688..9786, + 9901..9999, ), ), - 9688..9786, + 9901..9999, ), ( FunctionDefinition( [], ( true, - 9786..9789, + 9999..10002, ), ( "fun", - 9790..9793, + 10003..10006, ), ( "lpad", - 9794..9798, + 10007..10011, ), [ ( Typed( ( false, - 9799..9799, + 10012..10012, ), ( "text", - 9799..9803, + 10012..10016, ), ( Text, - 9805..9809, + 10018..10022, ), ), - 9799..9809, + 10012..10022, ), ( Typed( ( false, - 9811..9810, + 10024..10023, ), ( "pad", - 9811..9814, + 10024..10027, ), ( Text, - 9816..9820, + 10029..10033, ), ), - 9811..9820, + 10024..10033, ), ( Typed( ( false, - 9822..9821, + 10035..10034, ), ( "length", - 9822..9828, + 10035..10041, ), ( - Num, - 9830..9833, + Int, + 10043..10046, ), ), - 9822..9833, + 10035..10046, ), ], Some( ( Text, - 9836..9840, + 10049..10053, ), ), [ @@ -10566,7 +11146,7 @@ expression: parse_unwrap(&tokens) IfCondition( ( "if", - 9847..9849, + 10060..10062, ), ( IfCondition( @@ -10576,35 +11156,35 @@ expression: parse_unwrap(&tokens) Var( ( "length", - 9850..9856, + 10063..10069, ), ), - 9850..9856, + 10063..10069, ), ( FunctionInvocation( [], ( "len", - 9860..9863, + 10073..10076, ), [ ( Var( ( "text", - 9864..9868, + 10077..10081, ), ), - 9864..9868, + 10077..10081, ), ], [], ), - 9860..9869, + 10073..10082, ), ), - 9850..9869, + 10063..10082, ), ( Singleline( @@ -10612,38 +11192,38 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 9871..9877, + 10084..10090, ), Some( ( Var( ( "text", - 9878..9882, + 10091..10095, ), ), - 9878..9882, + 10091..10095, ), ), ), - 9871..9882, + 10084..10095, ), ), - 9869..9882, + 10082..10095, ), ), - 9850..9882, + 10063..10095, ), [], None, ), - 9847..9882, + 10060..10095, ), ( VariableSet( ( "length", - 9887..9893, + 10100..10106, ), ( Subtract( @@ -10652,50 +11232,50 @@ expression: parse_unwrap(&tokens) [], ( "len", - 9896..9899, + 10109..10112, ), [ ( Var( ( "text", - 9900..9904, + 10113..10117, ), ), - 9900..9904, + 10113..10117, ), ], [], ), - 9896..9905, + 10109..10118, ), ( Var( ( "length", - 9908..9914, + 10121..10127, ), ), - 9908..9914, + 10121..10127, ), ), - 9896..9914, + 10109..10127, ), ), - 9887..9914, + 10100..10127, ), ( VariableSet( ( "pad", - 9919..9922, + 10132..10135, ), ( Command( [ ( Trust, - 9925..9930, + 10138..10143, ), ], [ @@ -10703,25 +11283,25 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 9931..9932, + 10144..10145, ), ( Text( "printf", ), - 9933..9939, + 10146..10152, ), ( Text( "\"", ), - 9940..9941, + 10153..10154, ), ( Text( "%", ), - 9941..9942, + 10154..10155, ), ( Expression( @@ -10729,67 +11309,67 @@ expression: parse_unwrap(&tokens) Var( ( "length", - 9943..9949, + 10156..10162, ), ), - 9943..9949, + 10156..10162, ), ), - 9942..9950, + 10155..10163, ), ( Text( "s", ), - 9950..9951, + 10163..10164, ), ( Text( "\"", ), - 9951..9952, + 10164..10165, ), ( Text( "\"", ), - 9953..9954, + 10166..10167, ), ( Text( "\"", ), - 9954..9955, + 10167..10168, ), ( Text( "|", ), - 9956..9957, + 10169..10170, ), ( Text( "tr", ), - 9958..9960, + 10171..10173, ), ( Text( "\"", ), - 9961..9962, + 10174..10175, ), ( Text( "\"", ), - 9963..9964, + 10176..10177, ), ( Text( "\"", ), - 9965..9966, + 10178..10179, ), ( Expression( @@ -10797,39 +11377,39 @@ expression: parse_unwrap(&tokens) Var( ( "pad", - 9967..9970, + 10180..10183, ), ), - 9967..9970, + 10180..10183, ), ), - 9966..9971, + 10179..10184, ), ( Text( "\"", ), - 9971..9972, + 10184..10185, ), ( Text( "$", ), - 9973..9974, + 10186..10187, ), ], [], ), - 9925..9974, + 10138..10187, ), ), - 9919..9974, + 10132..10187, ), ( Return( ( "return", - 9979..9985, + 10192..10198, ), Some( ( @@ -10838,30 +11418,30 @@ expression: parse_unwrap(&tokens) Var( ( "pad", - 9986..9989, + 10199..10202, ), ), - 9986..9989, + 10199..10202, ), ( Var( ( "text", - 9992..9996, + 10205..10209, ), ), - 9992..9996, + 10205..10209, ), ), - 9986..9996, + 10199..10209, ), ), ), - 9979..9996, + 10192..10209, ), ], ), - 9786..9998, + 9999..10211, ), ( Statement( @@ -10871,86 +11451,86 @@ expression: parse_unwrap(&tokens) DocString( "Pads `text` with the specified `pad` character on the right until it reaches the desired `length`.", ), - 10000..10103, + 10213..10316, ), ), - 10000..10103, + 10213..10316, ), ), - 10000..10103, + 10213..10316, ), ( FunctionDefinition( [], ( true, - 10103..10106, + 10316..10319, ), ( "fun", - 10107..10110, + 10320..10323, ), ( "rpad", - 10111..10115, + 10324..10328, ), [ ( Typed( ( false, - 10116..10116, + 10329..10329, ), ( "text", - 10116..10120, + 10329..10333, ), ( Text, - 10122..10126, + 10335..10339, ), ), - 10116..10126, + 10329..10339, ), ( Typed( ( false, - 10128..10127, + 10341..10340, ), ( "pad", - 10128..10131, + 10341..10344, ), ( Text, - 10133..10137, + 10346..10350, ), ), - 10128..10137, + 10341..10350, ), ( Typed( ( false, - 10139..10138, + 10352..10351, ), ( "length", - 10139..10145, + 10352..10358, ), ( - Num, - 10147..10150, + Int, + 10360..10363, ), ), - 10139..10150, + 10352..10363, ), ], Some( ( Text, - 10153..10157, + 10366..10370, ), ), [ @@ -10958,7 +11538,7 @@ expression: parse_unwrap(&tokens) IfCondition( ( "if", - 10164..10166, + 10377..10379, ), ( IfCondition( @@ -10968,35 +11548,35 @@ expression: parse_unwrap(&tokens) Var( ( "length", - 10167..10173, + 10380..10386, ), ), - 10167..10173, + 10380..10386, ), ( FunctionInvocation( [], ( "len", - 10177..10180, + 10390..10393, ), [ ( Var( ( "text", - 10181..10185, + 10394..10398, ), ), - 10181..10185, + 10394..10398, ), ], [], ), - 10177..10186, + 10390..10399, ), ), - 10167..10186, + 10380..10399, ), ( Singleline( @@ -11004,38 +11584,38 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 10188..10194, + 10401..10407, ), Some( ( Var( ( "text", - 10195..10199, + 10408..10412, ), ), - 10195..10199, + 10408..10412, ), ), ), - 10188..10199, + 10401..10412, ), ), - 10186..10199, + 10399..10412, ), ), - 10167..10199, + 10380..10412, ), [], None, ), - 10164..10199, + 10377..10412, ), ( VariableSet( ( "length", - 10204..10210, + 10417..10423, ), ( Subtract( @@ -11044,50 +11624,50 @@ expression: parse_unwrap(&tokens) [], ( "len", - 10213..10216, + 10426..10429, ), [ ( Var( ( "text", - 10217..10221, + 10430..10434, ), ), - 10217..10221, + 10430..10434, ), ], [], ), - 10213..10222, + 10426..10435, ), ( Var( ( "length", - 10225..10231, + 10438..10444, ), ), - 10225..10231, + 10438..10444, ), ), - 10213..10231, + 10426..10444, ), ), - 10204..10231, + 10417..10444, ), ( VariableSet( ( "pad", - 10236..10239, + 10449..10452, ), ( Command( [ ( Trust, - 10242..10247, + 10455..10460, ), ], [ @@ -11095,25 +11675,25 @@ expression: parse_unwrap(&tokens) Text( "$", ), - 10248..10249, + 10461..10462, ), ( Text( "printf", ), - 10250..10256, + 10463..10469, ), ( Text( "\"", ), - 10257..10258, + 10470..10471, ), ( Text( "%", ), - 10258..10259, + 10471..10472, ), ( Expression( @@ -11121,67 +11701,67 @@ expression: parse_unwrap(&tokens) Var( ( "length", - 10260..10266, + 10473..10479, ), ), - 10260..10266, + 10473..10479, ), ), - 10259..10267, + 10472..10480, ), ( Text( "s", ), - 10267..10268, + 10480..10481, ), ( Text( "\"", ), - 10268..10269, + 10481..10482, ), ( Text( "\"", ), - 10270..10271, + 10483..10484, ), ( Text( "\"", ), - 10271..10272, + 10484..10485, ), ( Text( "|", ), - 10273..10274, + 10486..10487, ), ( Text( "tr", ), - 10275..10277, + 10488..10490, ), ( Text( "\"", ), - 10278..10279, + 10491..10492, ), ( Text( "\"", ), - 10280..10281, + 10493..10494, ), ( Text( "\"", ), - 10282..10283, + 10495..10496, ), ( Expression( @@ -11189,39 +11769,39 @@ expression: parse_unwrap(&tokens) Var( ( "pad", - 10284..10287, + 10497..10500, ), ), - 10284..10287, + 10497..10500, ), ), - 10283..10288, + 10496..10501, ), ( Text( "\"", ), - 10288..10289, + 10501..10502, ), ( Text( "$", ), - 10290..10291, + 10503..10504, ), ], [], ), - 10242..10291, + 10455..10504, ), ), - 10236..10291, + 10449..10504, ), ( Return( ( "return", - 10296..10302, + 10509..10515, ), Some( ( @@ -11230,30 +11810,30 @@ expression: parse_unwrap(&tokens) Var( ( "text", - 10303..10307, + 10516..10520, ), ), - 10303..10307, + 10516..10520, ), ( Var( ( "pad", - 10310..10313, + 10523..10526, ), ), - 10310..10313, + 10523..10526, ), ), - 10303..10313, + 10516..10526, ), ), ), - 10296..10313, + 10509..10526, ), ], ), - 10103..10315, + 10316..10528, ), ( Statement( @@ -11263,69 +11843,69 @@ expression: parse_unwrap(&tokens) DocString( "Pads `text` with zeros on the left until it reaches the desired `length`.", ), - 10317..10395, + 10530..10608, ), ), - 10317..10395, + 10530..10608, ), ), - 10317..10395, + 10530..10608, ), ( FunctionDefinition( [], ( true, - 10395..10398, + 10608..10611, ), ( "fun", - 10399..10402, + 10612..10615, ), ( "zfill", - 10403..10408, + 10616..10621, ), [ ( Typed( ( false, - 10409..10409, + 10622..10622, ), ( "text", - 10409..10413, + 10622..10626, ), ( Text, - 10415..10419, + 10628..10632, ), ), - 10409..10419, + 10622..10632, ), ( Typed( ( false, - 10421..10420, + 10634..10633, ), ( "length", - 10421..10427, + 10634..10640, ), ( - Num, - 10429..10432, + Int, + 10642..10645, ), ), - 10421..10432, + 10634..10645, ), ], Some( ( Text, - 10435..10439, + 10648..10652, ), ), [ @@ -11333,7 +11913,7 @@ expression: parse_unwrap(&tokens) Return( ( "return", - 10446..10452, + 10659..10665, ), Some( ( @@ -11341,17 +11921,17 @@ expression: parse_unwrap(&tokens) [], ( "lpad", - 10453..10457, + 10666..10670, ), [ ( Var( ( "text", - 10458..10462, + 10671..10675, ), ), - 10458..10462, + 10671..10675, ), ( Text( @@ -11360,35 +11940,35 @@ expression: parse_unwrap(&tokens) Text( ( "0", - 10465..10466, + 10678..10679, ), ), - 10465..10466, + 10678..10679, ), ], ), - 10464..10467, + 10677..10680, ), ( Var( ( "length", - 10469..10475, + 10682..10688, ), ), - 10469..10475, + 10682..10688, ), ], [], ), - 10453..10476, + 10666..10689, ), ), ), - 10446..10476, + 10659..10689, ), ], ), - 10395..10478, + 10608..10691, ), ] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap index 254e485..5ee2d62 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap @@ -785,31 +785,31 @@ expression: tokens ), ( Token( - "\\", + "\"", ), 761..762, ), ( Token( - "\"", + "\\", ), 762..763, ), ( Token( - "\\", + "$", ), 763..764, ), ( Token( - "$", + "\\", ), 764..765, ), ( Token( - "\\", + "{", ), 765..766, ), @@ -819,11518 +819,11974 @@ expression: tokens ), 766..767, ), - ( - Token( - "{", - ), - 767..768, - ), ( Token( "nameof", ), - 768..774, + 767..773, ), ( Token( "search", ), - 775..781, + 774..780, ), ( Token( "}", ), - 781..782, + 780..781, ), ( Token( "}", ), - 782..783, - ), - ( - Token( - "\\", - ), - 783..784, + 781..782, ), ( Token( "\"", ), - 784..785, + 782..783, ), ( Token( "/", ), - 785..786, - ), - ( - Token( - "\\", - ), - 786..787, + 783..784, ), ( Token( "\"", ), - 787..788, + 784..785, ), ( Token( "\\", ), - 788..789, + 785..786, ), ( Token( "$", ), - 789..790, + 786..787, ), ( Token( "\\", ), - 790..791, + 787..788, ), ( Token( "{", ), - 791..792, + 788..789, ), ( Token( "{", ), - 792..793, + 789..790, ), ( Token( "nameof", ), - 793..799, + 790..796, ), ( Token( "replace", ), - 800..807, + 797..804, ), ( Token( "}", ), - 807..808, + 804..805, ), ( Token( "}", ), - 808..809, - ), - ( - Token( - "\\", - ), - 809..810, + 805..806, ), ( Token( "\"", ), - 810..811, + 806..807, ), ( Token( "}", ), - 811..812, + 807..808, ), ( Token( "\"", ), - 812..813, + 808..809, ), ( Token( "$", ), - 814..815, + 810..811, ), ( Token( "}", ), - 820..821, + 816..817, ), ( Token( "else", ), - 822..826, + 818..822, ), ( Token( "{", ), - 827..828, + 823..824, ), ( Token( "trust", ), - 837..842, + 833..838, ), ( Token( "$", ), - 843..844, + 839..840, ), ( Token( "{", ), - 845..846, + 841..842, ), ( Token( "nameof", ), - 846..852, + 842..848, ), ( Token( "result", ), - 853..859, + 849..855, ), ( Token( "}", ), - 859..860, + 855..856, ), ( Token( "=", ), - 860..861, + 856..857, ), ( Token( "\"", ), - 861..862, + 857..858, ), ( Token( "\\", ), - 862..863, + 858..859, ), ( Token( "$", ), - 863..864, + 859..860, ), ( Token( "\\", ), - 864..865, + 860..861, ), ( Token( "{", ), - 865..866, + 861..862, ), ( Token( "{", ), - 866..867, + 862..863, ), ( Token( "nameof", ), - 867..873, + 863..869, ), ( Token( "source", ), - 874..880, + 870..876, ), ( Token( "}", ), - 880..881, + 876..877, ), ( Token( "//", ), - 881..883, - ), - ( - Token( - "\\", - ), - 883..884, + 877..879, ), ( Token( "\"", ), - 884..885, + 879..880, ), ( Token( "\\", ), - 885..886, + 880..881, ), ( Token( "$", ), - 886..887, + 881..882, ), ( Token( "\\", ), - 887..888, + 882..883, ), ( Token( "{", ), - 888..889, + 883..884, ), ( Token( "{", ), - 889..890, + 884..885, ), ( Token( "nameof", ), - 890..896, + 885..891, ), ( Token( "search", ), - 897..903, + 892..898, ), ( Token( "}", ), - 903..904, + 898..899, ), ( Token( "}", ), - 904..905, - ), - ( - Token( - "\\", - ), - 905..906, + 899..900, ), ( Token( "\"", ), - 906..907, + 900..901, ), ( Token( "/", ), - 907..908, + 901..902, ), ( Token( "\\", ), - 908..909, + 902..903, ), ( Token( "$", ), - 909..910, + 903..904, ), ( Token( "\\", ), - 910..911, + 904..905, ), ( Token( "{", ), - 911..912, + 905..906, ), ( Token( "{", ), - 912..913, + 906..907, ), ( Token( "nameof", ), - 913..919, + 907..913, ), ( Token( "replace", ), - 920..927, + 914..921, ), ( Token( "}", ), - 927..928, + 921..922, ), ( Token( "}", ), - 928..929, + 922..923, ), ( Token( "}", ), - 929..930, + 923..924, ), ( Token( "\"", ), - 930..931, + 924..925, ), ( Token( "$", ), - 932..933, + 926..927, ), ( Token( "}", ), - 938..939, + 932..933, ), ( Token( "return", ), - 944..950, + 938..944, ), ( Token( "result", ), - 951..957, + 945..951, ), ( Token( "}", ), - 958..959, + 952..953, ), ( Token( "/// Replaces the first occurrence of a pattern in the content with the provided replace text.\n", ), - 961..1055, + 955..1049, ), ( Token( "pub", ), - 1055..1058, + 1049..1052, ), ( Token( "fun", ), - 1059..1062, + 1053..1056, ), ( Token( "replace_one", ), - 1063..1074, + 1057..1068, ), ( Token( "(", ), - 1074..1075, + 1068..1069, ), ( Token( "source", ), - 1075..1081, + 1069..1075, ), ( Token( ",", ), - 1081..1082, + 1075..1076, ), ( Token( "search", ), - 1083..1089, + 1077..1083, ), ( Token( ",", ), - 1089..1090, + 1083..1084, ), ( Token( "replace", ), - 1091..1098, + 1085..1092, ), ( Token( ")", ), - 1098..1099, + 1092..1093, ), ( Token( "{", ), - 1100..1101, + 1094..1095, ), ( Token( "// Here we use a command to avoid #646\n", ), - 1106..1145, + 1100..1139, ), ( Token( "let", ), - 1149..1152, + 1143..1146, ), ( Token( "result", ), - 1153..1159, + 1147..1153, ), ( Token( "=", ), - 1160..1161, + 1154..1155, ), ( Token( "\"", ), - 1162..1163, + 1156..1157, ), ( Token( "\"", ), - 1163..1164, + 1157..1158, ), ( Token( "if", ), - 1169..1171, + 1163..1165, ), ( Token( "bash_version", ), - 1172..1184, + 1166..1178, ), ( Token( "(", ), - 1184..1185, + 1178..1179, ), ( Token( ")", ), - 1185..1186, + 1179..1180, ), ( Token( ">=", ), - 1187..1189, + 1181..1183, ), ( Token( "[", ), - 1190..1191, + 1184..1185, ), ( Token( "4", ), - 1191..1192, + 1185..1186, ), ( Token( ",", ), - 1192..1193, + 1186..1187, ), ( Token( "3", ), - 1193..1194, + 1187..1188, ), ( Token( "]", ), - 1194..1195, + 1188..1189, ), ( Token( "{", ), - 1196..1197, + 1190..1191, ), ( Token( "trust", ), - 1206..1211, + 1200..1205, ), ( Token( "$", ), - 1212..1213, + 1206..1207, ), ( Token( "{", ), - 1214..1215, + 1208..1209, ), ( Token( "nameof", ), - 1215..1221, + 1209..1215, ), ( Token( "result", ), - 1222..1228, + 1216..1222, ), ( Token( "}", ), - 1228..1229, + 1222..1223, ), ( Token( "=", ), - 1229..1230, + 1223..1224, ), ( Token( "\"", ), - 1230..1231, + 1224..1225, ), ( Token( "\\", ), - 1231..1232, + 1225..1226, ), ( Token( "$", ), - 1232..1233, + 1226..1227, ), ( Token( "\\", ), - 1233..1234, + 1227..1228, ), ( Token( "{", ), - 1234..1235, + 1228..1229, ), ( Token( "{", ), - 1235..1236, + 1229..1230, ), ( Token( "nameof", ), - 1236..1242, + 1230..1236, ), ( Token( "source", ), - 1243..1249, + 1237..1243, ), ( Token( "}", ), - 1249..1250, + 1243..1244, ), ( Token( "/", ), - 1250..1251, - ), - ( - Token( - "\\", - ), - 1251..1252, + 1244..1245, ), ( Token( "\"", ), - 1252..1253, + 1245..1246, ), ( Token( "\\", ), - 1253..1254, + 1246..1247, ), ( Token( "$", ), - 1254..1255, + 1247..1248, ), ( Token( "\\", ), - 1255..1256, + 1248..1249, ), ( Token( "{", ), - 1256..1257, + 1249..1250, ), ( Token( "{", ), - 1257..1258, + 1250..1251, ), ( Token( "nameof", ), - 1258..1264, + 1251..1257, ), ( Token( "search", ), - 1265..1271, + 1258..1264, ), ( Token( "}", ), - 1271..1272, + 1264..1265, ), ( Token( "}", ), - 1272..1273, - ), - ( - Token( - "\\", - ), - 1273..1274, + 1265..1266, ), ( Token( "\"", ), - 1274..1275, + 1266..1267, ), ( Token( "/", ), - 1275..1276, - ), - ( - Token( - "\\", - ), - 1276..1277, + 1267..1268, ), ( Token( "\"", ), - 1277..1278, + 1268..1269, ), ( Token( "\\", ), - 1278..1279, + 1269..1270, ), ( Token( "$", ), - 1279..1280, + 1270..1271, ), ( Token( "\\", ), - 1280..1281, + 1271..1272, ), ( Token( "{", ), - 1281..1282, + 1272..1273, ), ( Token( "{", ), - 1282..1283, + 1273..1274, ), ( Token( "nameof", ), - 1283..1289, + 1274..1280, ), ( Token( "replace", ), - 1290..1297, + 1281..1288, ), ( Token( "}", ), - 1297..1298, + 1288..1289, ), ( Token( "}", ), - 1298..1299, - ), - ( - Token( - "\\", - ), - 1299..1300, + 1289..1290, ), ( Token( "\"", ), - 1300..1301, + 1290..1291, ), ( Token( "}", ), - 1301..1302, + 1291..1292, ), ( Token( "\"", ), - 1302..1303, + 1292..1293, ), ( Token( "$", ), - 1304..1305, + 1294..1295, ), ( Token( "}", ), - 1310..1311, + 1300..1301, ), ( Token( "else", ), - 1312..1316, + 1302..1306, ), ( Token( "{", ), - 1317..1318, + 1307..1308, ), ( Token( "trust", ), - 1327..1332, + 1317..1322, ), ( Token( "$", ), - 1333..1334, + 1323..1324, ), ( Token( "{", ), - 1335..1336, + 1325..1326, ), ( Token( "nameof", ), - 1336..1342, + 1326..1332, ), ( Token( "result", ), - 1343..1349, + 1333..1339, ), ( Token( "}", ), - 1349..1350, + 1339..1340, ), ( Token( "=", ), - 1350..1351, + 1340..1341, ), ( Token( "\"", ), - 1351..1352, + 1341..1342, ), ( Token( "\\", ), - 1352..1353, + 1342..1343, ), ( Token( "$", ), - 1353..1354, + 1343..1344, ), ( Token( "\\", ), - 1354..1355, + 1344..1345, ), ( Token( "{", ), - 1355..1356, + 1345..1346, ), ( Token( "{", ), - 1356..1357, + 1346..1347, ), ( Token( "nameof", ), - 1357..1363, + 1347..1353, ), ( Token( "source", ), - 1364..1370, + 1354..1360, ), ( Token( "}", ), - 1370..1371, + 1360..1361, ), ( Token( "/", ), - 1371..1372, - ), - ( - Token( - "\\", - ), - 1372..1373, + 1361..1362, ), ( Token( "\"", ), - 1373..1374, + 1362..1363, ), ( Token( "\\", ), - 1374..1375, + 1363..1364, ), ( Token( "$", ), - 1375..1376, + 1364..1365, ), ( Token( "\\", ), - 1376..1377, + 1365..1366, ), ( Token( "{", ), - 1377..1378, + 1366..1367, ), ( Token( "{", ), - 1378..1379, + 1367..1368, ), ( Token( "nameof", ), - 1379..1385, + 1368..1374, ), ( Token( "search", ), - 1386..1392, + 1375..1381, ), ( Token( "}", ), - 1392..1393, + 1381..1382, ), ( Token( "}", ), - 1393..1394, - ), - ( - Token( - "\\", - ), - 1394..1395, + 1382..1383, ), ( Token( "\"", ), - 1395..1396, + 1383..1384, ), ( Token( "/", ), - 1396..1397, + 1384..1385, ), ( Token( "\\", ), - 1397..1398, + 1385..1386, ), ( Token( "$", ), - 1398..1399, + 1386..1387, ), ( Token( "\\", ), - 1399..1400, + 1387..1388, ), ( Token( "{", ), - 1400..1401, + 1388..1389, ), ( Token( "{", ), - 1401..1402, + 1389..1390, ), ( Token( "nameof", ), - 1402..1408, + 1390..1396, ), ( Token( "replace", ), - 1409..1416, + 1397..1404, ), ( Token( "}", ), - 1416..1417, + 1404..1405, ), ( Token( "}", ), - 1417..1418, + 1405..1406, ), ( Token( "}", ), - 1418..1419, + 1406..1407, ), ( Token( "\"", ), - 1419..1420, + 1407..1408, ), ( Token( "$", ), - 1421..1422, + 1409..1410, ), ( Token( "}", ), - 1427..1428, + 1415..1416, ), ( Token( "return", ), - 1433..1439, + 1421..1427, ), ( Token( "result", ), - 1440..1446, + 1428..1434, ), ( Token( "}", ), - 1447..1448, + 1435..1436, ), ( Token( "const", ), - 1450..1455, + 1438..1443, ), ( Token( "SED_VERSION_UNKNOWN", ), - 1456..1475, + 1444..1463, ), ( Token( "=", ), - 1476..1477, + 1464..1465, ), ( Token( "0", ), - 1478..1479, + 1466..1467, ), ( Token( "const", ), - 1480..1485, + 1468..1473, ), ( Token( "SED_VERSION_GNU", ), - 1486..1501, + 1474..1489, ), ( Token( "=", ), - 1502..1503, + 1490..1491, ), ( Token( "1", ), - 1504..1505, + 1492..1493, ), ( Token( "const", ), - 1506..1511, + 1494..1499, ), ( Token( "SED_VERSION_BUSYBOX", ), - 1512..1531, + 1500..1519, ), ( Token( "=", ), - 1532..1533, + 1520..1521, ), ( Token( "2", ), - 1534..1535, + 1522..1523, ), ( Token( "fun", ), - 1537..1540, + 1525..1528, ), ( Token( "sed_version", ), - 1541..1552, + 1529..1540, ), ( Token( "(", ), - 1552..1553, + 1540..1541, ), ( Token( ")", ), - 1553..1554, + 1541..1542, ), ( Token( ":", ), - 1554..1555, + 1542..1543, ), ( Token( "Int", ), - 1556..1559, + 1544..1547, ), ( Token( "{", ), - 1560..1561, + 1548..1549, ), ( Token( "// We can't match against a word \"GNU\" because\n", ), - 1566..1613, + 1554..1601, ), ( Token( "// alpine's busybox sed returns \"This is not GNU sed version\"\n", ), - 1617..1679, + 1605..1667, ), ( Token( "trust", ), - 1683..1688, + 1671..1676, ), ( Token( "$", ), - 1689..1690, + 1677..1678, ), ( Token( "re", ), - 1691..1693, + 1679..1681, ), ( Token( "=", ), - 1693..1694, + 1681..1682, ), ( Token( "'", ), - 1694..1695, + 1682..1683, ), ( Token( "\\", ), - 1695..1696, + 1683..1684, ), ( Token( "bCopyright", ), - 1696..1706, + 1684..1694, ), ( Token( "\\", ), - 1706..1707, + 1694..1695, ), ( Token( "b", ), - 1707..1708, + 1695..1696, ), ( Token( ".", ), - 1708..1709, + 1696..1697, ), ( Token( "+", ), - 1709..1710, + 1697..1698, ), ( Token( "\\", ), - 1710..1711, + 1698..1699, ), ( Token( "bFree", ), - 1711..1716, + 1699..1704, ), ( Token( "Software", ), - 1717..1725, + 1705..1713, ), ( Token( "Foundation", ), - 1726..1736, + 1714..1724, ), ( Token( "\\", ), - 1736..1737, + 1724..1725, ), ( Token( "b'", ), - 1737..1739, + 1725..1727, ), ( Token( ";", ), - 1739..1740, + 1727..1728, ), ( Token( "[", ), - 1741..1742, + 1729..1730, ), ( Token( "[", ), - 1742..1743, + 1730..1731, ), ( Token( "\\", ), - 1744..1745, + 1732..1733, ), ( Token( "$", ), - 1745..1746, + 1733..1734, ), ( Token( "(", ), - 1746..1747, + 1734..1735, ), ( Token( "sed", ), - 1747..1750, + 1735..1738, ), ( Token( "-", ), - 1751..1752, + 1739..1740, ), ( Token( "-", ), - 1752..1753, + 1740..1741, ), ( Token( "version", ), - 1753..1760, + 1741..1748, ), ( Token( "2", ), - 1761..1762, + 1749..1750, ), ( Token( ">", ), - 1762..1763, + 1750..1751, ), ( Token( "/", ), - 1763..1764, + 1751..1752, ), ( Token( "dev", ), - 1764..1767, + 1752..1755, ), ( Token( "/", ), - 1767..1768, + 1755..1756, ), ( Token( "null", ), - 1768..1772, + 1756..1760, ), ( Token( ")", ), - 1772..1773, + 1760..1761, ), ( Token( "=", ), - 1774..1775, + 1762..1763, ), ( Token( "~", ), - 1775..1776, + 1763..1764, ), ( Token( "\\", ), - 1777..1778, + 1765..1766, ), ( Token( "$", ), - 1778..1779, + 1766..1767, ), ( Token( "re", ), - 1779..1781, + 1767..1769, ), ( Token( "]", ), - 1782..1783, + 1770..1771, ), ( Token( "]", ), - 1783..1784, + 1771..1772, ), ( Token( "$", ), - 1785..1786, + 1773..1774, ), ( Token( "if", ), - 1791..1793, + 1779..1781, ), ( Token( "status", ), - 1794..1800, + 1782..1788, ), ( Token( "==", ), - 1801..1803, + 1789..1791, ), ( Token( "0", ), - 1804..1805, + 1792..1793, ), ( Token( "{", ), - 1806..1807, + 1794..1795, ), ( Token( "return", ), - 1816..1822, + 1804..1810, ), ( Token( "SED_VERSION_GNU", ), - 1823..1838, + 1811..1826, ), ( Token( "}", ), - 1843..1844, + 1831..1832, ), ( Token( "trust", ), - 1849..1854, + 1837..1842, ), ( Token( "$", ), - 1855..1856, + 1843..1844, ), ( Token( "re", ), - 1857..1859, + 1845..1847, ), ( Token( "=", ), - 1859..1860, + 1847..1848, ), ( Token( "'", ), - 1860..1861, + 1848..1849, ), ( Token( "\\", ), - 1861..1862, + 1849..1850, ), ( Token( "bBusyBox", ), - 1862..1870, + 1850..1858, ), ( Token( "\\", ), - 1870..1871, + 1858..1859, ), ( Token( "b'", ), - 1871..1873, + 1859..1861, ), ( Token( ";", ), - 1873..1874, + 1861..1862, ), ( Token( "[", ), - 1875..1876, + 1863..1864, ), ( Token( "[", ), - 1876..1877, + 1864..1865, ), ( Token( "\\", ), - 1878..1879, + 1866..1867, ), ( Token( "$", ), - 1879..1880, + 1867..1868, ), ( Token( "(", ), - 1880..1881, + 1868..1869, ), ( Token( "sed", ), - 1881..1884, + 1869..1872, ), ( Token( "2", ), - 1885..1886, + 1873..1874, ), ( Token( ">", ), - 1886..1887, + 1874..1875, ), ( Token( "&1", ), - 1887..1889, + 1875..1877, ), ( Token( ")", ), - 1889..1890, + 1877..1878, ), ( Token( "=", ), - 1891..1892, + 1879..1880, ), ( Token( "~", ), - 1892..1893, + 1880..1881, ), ( Token( "\\", ), - 1894..1895, + 1882..1883, ), ( Token( "$", ), - 1895..1896, + 1883..1884, ), ( Token( "re", ), - 1896..1898, + 1884..1886, ), ( Token( "]", ), - 1899..1900, + 1887..1888, ), ( Token( "]", ), - 1900..1901, + 1888..1889, ), ( Token( "$", ), - 1902..1903, + 1890..1891, ), ( Token( "if", ), - 1908..1910, + 1896..1898, ), ( Token( "status", ), - 1911..1917, + 1899..1905, ), ( Token( "==", ), - 1918..1920, + 1906..1908, ), ( Token( "0", ), - 1921..1922, + 1909..1910, ), ( Token( "{", ), - 1923..1924, + 1911..1912, ), ( Token( "return", ), - 1933..1939, + 1921..1927, ), ( Token( "SED_VERSION_BUSYBOX", ), - 1940..1959, + 1928..1947, ), ( Token( "}", ), - 1964..1965, + 1952..1953, ), ( Token( "return", ), - 1970..1976, + 1958..1964, ), ( Token( "SED_VERSION_UNKNOWN", ), - 1977..1996, + 1965..1984, ), ( Token( "}", ), - 1997..1998, + 1985..1986, ), ( Token( - "/// Replaces all occurences of a regex pattern in the content with the provided replace text.\n", + "/// Replaces all occurrences of a regex pattern in the content with the provided replace text.\n", ), - 2000..2094, + 1988..2083, ), ( Token( "///\n", ), - 2094..2098, + 2083..2087, ), ( Token( "/// Function uses `sed`\n", ), - 2098..2122, + 2087..2111, ), ( Token( "pub", ), - 2122..2125, + 2111..2114, ), ( Token( "fun", ), - 2126..2129, + 2115..2118, ), ( Token( "replace_regex", ), - 2130..2143, + 2119..2132, ), ( Token( "(", ), - 2143..2144, + 2132..2133, ), ( Token( "source", ), - 2144..2150, + 2133..2139, ), ( Token( ":", ), - 2150..2151, + 2139..2140, ), ( Token( "Text", ), - 2152..2156, + 2141..2145, ), ( Token( ",", ), - 2156..2157, + 2145..2146, ), ( Token( "search", ), - 2158..2164, + 2147..2153, ), ( Token( ":", ), - 2164..2165, + 2153..2154, ), ( Token( "Text", ), - 2166..2170, + 2155..2159, ), ( Token( ",", ), - 2170..2171, + 2159..2160, ), ( Token( "replace_text", ), - 2172..2184, + 2161..2173, ), ( Token( ":", ), - 2184..2185, + 2173..2174, ), ( Token( "Text", ), - 2186..2190, + 2175..2179, ), ( Token( ",", ), - 2190..2191, + 2179..2180, ), ( Token( "extended", ), - 2192..2200, + 2181..2189, ), ( Token( ":", ), - 2200..2201, + 2189..2190, ), ( Token( "Bool", ), - 2202..2206, + 2191..2195, ), ( Token( "=", ), - 2207..2208, + 2196..2197, ), ( Token( "false", ), - 2209..2214, + 2198..2203, ), ( Token( ")", ), - 2214..2215, + 2203..2204, ), ( Token( ":", ), - 2215..2216, + 2204..2205, ), ( Token( "Text", ), - 2217..2221, + 2206..2210, ), ( Token( "{", ), - 2222..2223, + 2211..2212, ), ( Token( "trust", ), - 2228..2233, + 2217..2222, ), ( Token( "{", ), - 2234..2235, + 2223..2224, ), ( Token( "const", ), - 2244..2249, + 2233..2238, ), ( Token( "sed_version", ), - 2250..2261, + 2239..2250, ), ( Token( "=", ), - 2262..2263, + 2251..2252, ), ( Token( "sed_version", ), - 2264..2275, + 2253..2264, ), ( Token( "(", ), - 2275..2276, + 2264..2265, ), ( Token( ")", ), - 2276..2277, + 2265..2266, ), ( Token( "search", ), - 2286..2292, + 2275..2281, ), ( Token( "=", ), - 2293..2294, + 2282..2283, ), ( Token( "replace", ), - 2295..2302, + 2284..2291, ), ( Token( "(", ), - 2302..2303, + 2291..2292, ), ( Token( "search", ), - 2303..2309, + 2292..2298, ), ( Token( ",", ), - 2309..2310, + 2298..2299, ), ( Token( "\"", ), - 2311..2312, + 2300..2301, ), ( Token( "/", ), - 2312..2313, + 2301..2302, ), ( Token( "\"", ), - 2313..2314, + 2302..2303, ), ( Token( ",", ), - 2314..2315, + 2303..2304, ), ( Token( "\"", ), - 2316..2317, + 2305..2306, + ), + ( + Token( + "\\", + ), + 2306..2307, ), ( Token( "\\", ), - 2317..2318, + 2307..2308, ), ( Token( "/", ), - 2318..2319, + 2308..2309, ), ( Token( "\"", ), - 2319..2320, + 2309..2310, ), ( Token( ")", ), - 2320..2321, + 2310..2311, ), ( Token( "replace_text", ), - 2330..2342, + 2320..2332, ), ( Token( "=", ), - 2343..2344, + 2333..2334, ), ( Token( "replace", ), - 2345..2352, + 2335..2342, ), ( Token( "(", ), - 2352..2353, + 2342..2343, ), ( Token( "replace_text", ), - 2353..2365, + 2343..2355, ), ( Token( ",", ), - 2365..2366, + 2355..2356, ), ( Token( "\"", ), - 2367..2368, + 2357..2358, ), ( Token( "/", ), - 2368..2369, + 2358..2359, ), ( Token( "\"", ), - 2369..2370, + 2359..2360, ), ( Token( ",", ), - 2370..2371, + 2360..2361, ), ( Token( "\"", ), - 2372..2373, + 2362..2363, + ), + ( + Token( + "\\", + ), + 2363..2364, ), ( Token( "\\", ), - 2373..2374, + 2364..2365, ), ( Token( "/", ), - 2374..2375, + 2365..2366, ), ( Token( "\"", ), - 2375..2376, + 2366..2367, ), ( Token( ")", ), - 2376..2377, + 2367..2368, ), ( Token( "if", ), - 2386..2388, + 2377..2379, ), ( Token( "sed_version", ), - 2389..2400, + 2380..2391, ), ( Token( "==", ), - 2401..2403, + 2392..2394, ), ( Token( "SED_VERSION_GNU", ), - 2404..2419, + 2395..2410, ), ( Token( "or", ), - 2420..2422, + 2411..2413, ), ( Token( "sed_version", ), - 2423..2434, + 2414..2425, ), ( Token( "==", ), - 2435..2437, + 2426..2428, ), ( Token( "SED_VERSION_BUSYBOX", ), - 2438..2457, + 2429..2448, ), ( Token( "{", ), - 2458..2459, + 2449..2450, ), ( Token( "// '\\b' is supported but not in POSIX standards. Disable it\n", ), - 2472..2532, + 2463..2523, ), ( Token( "search", ), - 2544..2550, + 2535..2541, ), ( Token( "=", ), - 2551..2552, + 2542..2543, ), ( Token( "replace", ), - 2553..2560, + 2544..2551, ), ( Token( "(", ), - 2560..2561, + 2551..2552, ), ( Token( "search", ), - 2561..2567, + 2552..2558, ), ( Token( ",", ), - 2567..2568, + 2558..2559, ), ( Token( "\"", ), - 2569..2570, + 2560..2561, ), ( Token( "\\", ), - 2570..2571, + 2561..2562, ), ( Token( "\\", ), - 2571..2572, + 2562..2563, ), ( Token( "b", ), - 2572..2573, + 2563..2564, ), ( Token( "\"", ), - 2573..2574, + 2564..2565, ), ( Token( ",", ), - 2574..2575, + 2565..2566, ), ( Token( "\"", ), - 2576..2577, + 2567..2568, ), ( Token( "\\", ), - 2577..2578, + 2568..2569, ), ( Token( "\\", ), - 2578..2579, + 2569..2570, ), ( Token( "\\", ), - 2579..2580, + 2570..2571, ), ( Token( "b", ), - 2580..2581, + 2571..2572, ), ( Token( "\"", ), - 2581..2582, + 2572..2573, ), ( Token( ")", ), - 2582..2583, + 2573..2574, ), ( Token( "}", ), - 2592..2593, + 2583..2584, ), ( Token( "if", ), - 2602..2604, + 2593..2595, ), ( Token( "extended", ), - 2605..2613, + 2596..2604, ), ( Token( "{", ), - 2614..2615, + 2605..2606, ), ( Token( "// GNU sed versions 4.0 through 4.2 support extended regex syntax,\n", ), - 2628..2695, + 2619..2686, ), ( Token( "// but only via the \"-r\" option\n", ), - 2707..2739, + 2698..2730, ), ( Token( "if", ), - 2751..2753, + 2742..2744, ), ( Token( "sed_version", ), - 2754..2765, + 2745..2756, ), ( Token( "==", ), - 2766..2768, + 2757..2759, ), ( Token( "SED_VERSION_GNU", ), - 2769..2784, + 2760..2775, ), ( Token( "{", ), - 2785..2786, + 2776..2777, ), ( Token( "return", ), - 2803..2809, + 2794..2800, ), ( Token( "$", ), - 2810..2811, + 2801..2802, ), ( Token( "echo", ), - 2812..2816, + 2803..2807, ), ( Token( "\"", ), - 2817..2818, + 2808..2809, ), ( Token( "{", ), - 2818..2819, + 2809..2810, ), ( Token( "source", ), - 2819..2825, + 2810..2816, ), ( Token( "}", ), - 2825..2826, + 2816..2817, ), ( Token( "\"", ), - 2826..2827, + 2817..2818, ), ( Token( "|", ), - 2828..2829, + 2819..2820, ), ( Token( "sed", ), - 2830..2833, + 2821..2824, ), ( Token( "-", ), - 2834..2835, + 2825..2826, ), ( Token( "r", ), - 2835..2836, + 2826..2827, ), ( Token( "-", ), - 2837..2838, + 2828..2829, ), ( Token( "e", ), - 2838..2839, + 2829..2830, ), ( Token( "\"", ), - 2840..2841, + 2831..2832, ), ( Token( "s", ), - 2841..2842, + 2832..2833, ), ( Token( "/", ), - 2842..2843, + 2833..2834, ), ( Token( "{", ), - 2843..2844, + 2834..2835, ), ( Token( "search", ), - 2844..2850, + 2835..2841, ), ( Token( "}", ), - 2850..2851, + 2841..2842, ), ( Token( "/", ), - 2851..2852, + 2842..2843, ), ( Token( "{", ), - 2852..2853, + 2843..2844, ), ( Token( "replace_text", ), - 2853..2865, + 2844..2856, ), ( Token( "}", ), - 2865..2866, + 2856..2857, ), ( Token( "/", ), - 2866..2867, + 2857..2858, ), ( Token( "g", ), - 2867..2868, + 2858..2859, ), ( Token( "\"", ), - 2868..2869, + 2859..2860, ), ( Token( "$", ), - 2870..2871, + 2861..2862, ), ( Token( "}", ), - 2884..2885, + 2875..2876, ), ( Token( "else", ), - 2886..2890, + 2877..2881, ), ( Token( "{", ), - 2891..2892, + 2882..2883, ), ( Token( "return", ), - 2909..2915, + 2900..2906, ), ( Token( "$", ), - 2916..2917, + 2907..2908, ), ( Token( "echo", ), - 2918..2922, + 2909..2913, ), ( Token( "\"", ), - 2923..2924, + 2914..2915, ), ( Token( "{", ), - 2924..2925, + 2915..2916, ), ( Token( "source", ), - 2925..2931, + 2916..2922, ), ( Token( "}", ), - 2931..2932, + 2922..2923, ), ( Token( "\"", ), - 2932..2933, + 2923..2924, ), ( Token( "|", ), - 2934..2935, + 2925..2926, ), ( Token( "sed", ), - 2936..2939, + 2927..2930, ), ( Token( "-", ), - 2940..2941, + 2931..2932, ), ( Token( "E", ), - 2941..2942, + 2932..2933, ), ( Token( "-", ), - 2943..2944, + 2934..2935, ), ( Token( "e", ), - 2944..2945, + 2935..2936, ), ( Token( "\"", ), - 2946..2947, + 2937..2938, ), ( Token( "s", ), - 2947..2948, + 2938..2939, ), ( Token( "/", ), - 2948..2949, + 2939..2940, ), ( Token( "{", ), - 2949..2950, + 2940..2941, ), ( Token( "search", ), - 2950..2956, + 2941..2947, ), ( Token( "}", ), - 2956..2957, + 2947..2948, ), ( Token( "/", ), - 2957..2958, + 2948..2949, ), ( Token( "{", ), - 2958..2959, + 2949..2950, ), ( Token( "replace_text", ), - 2959..2971, + 2950..2962, ), ( Token( "}", ), - 2971..2972, + 2962..2963, ), ( Token( "/", ), - 2972..2973, + 2963..2964, ), ( Token( "g", ), - 2973..2974, + 2964..2965, ), ( Token( "\"", ), - 2974..2975, + 2965..2966, ), ( Token( "$", ), - 2976..2977, + 2967..2968, ), ( Token( "}", ), - 2990..2991, + 2981..2982, ), ( Token( "}", ), - 3000..3001, + 2991..2992, ), ( Token( "else", ), - 3002..3006, + 2993..2997, ), ( Token( "{", ), - 3007..3008, + 2998..2999, ), ( Token( "if", ), - 3021..3023, + 3012..3014, ), ( Token( "sed_version", ), - 3024..3035, + 3015..3026, ), ( Token( "==", ), - 3036..3038, + 3027..3029, ), ( Token( "SED_VERSION_GNU", ), - 3039..3054, + 3030..3045, ), ( Token( "or", ), - 3055..3057, + 3046..3048, ), ( Token( "sed_version", ), - 3058..3069, + 3049..3060, ), ( Token( "==", ), - 3070..3072, + 3061..3063, ), ( Token( "SED_VERSION_BUSYBOX", ), - 3073..3092, + 3064..3083, ), ( Token( "{", ), - 3093..3094, + 3084..3085, ), ( Token( "// GNU Sed BRE handle \\| as a metacharacter, but it is not POSIX standands. Disable it\n", ), - 3111..3198, + 3102..3189, ), ( Token( "search", ), - 3214..3220, + 3205..3211, ), ( Token( "=", ), - 3221..3222, + 3212..3213, ), ( Token( "replace", ), - 3223..3230, + 3214..3221, ), ( Token( "(", ), - 3230..3231, + 3221..3222, ), ( Token( "search", ), - 3231..3237, + 3222..3228, ), ( Token( ",", ), - 3237..3238, + 3228..3229, ), ( Token( "\"", ), - 3239..3240, + 3230..3231, ), ( Token( "\\", ), - 3240..3241, + 3231..3232, ), ( Token( "|", ), - 3241..3242, + 3232..3233, ), ( Token( "\"", ), - 3242..3243, + 3233..3234, ), ( Token( ",", ), - 3243..3244, + 3234..3235, ), ( Token( "\"", ), - 3245..3246, + 3236..3237, ), ( Token( "|", ), - 3246..3247, + 3237..3238, ), ( Token( "\"", ), - 3247..3248, + 3238..3239, ), ( Token( ")", ), - 3248..3249, + 3239..3240, ), ( Token( "}", ), - 3262..3263, + 3253..3254, ), ( Token( "return", ), - 3276..3282, + 3267..3273, ), ( Token( "$", ), - 3283..3284, + 3274..3275, ), ( Token( "echo", ), - 3285..3289, + 3276..3280, ), ( Token( "\"", ), - 3290..3291, + 3281..3282, ), ( Token( "{", ), - 3291..3292, + 3282..3283, ), ( Token( "source", ), - 3292..3298, + 3283..3289, ), ( Token( "}", ), - 3298..3299, + 3289..3290, ), ( Token( "\"", ), - 3299..3300, + 3290..3291, ), ( Token( "|", ), - 3301..3302, + 3292..3293, ), ( Token( "sed", ), - 3303..3306, + 3294..3297, ), ( Token( "-", ), - 3307..3308, + 3298..3299, ), ( Token( "e", ), - 3308..3309, + 3299..3300, ), ( Token( "\"", ), - 3310..3311, + 3301..3302, ), ( Token( "s", ), - 3311..3312, + 3302..3303, ), ( Token( "/", ), - 3312..3313, + 3303..3304, ), ( Token( "{", ), - 3313..3314, + 3304..3305, ), ( Token( "search", ), - 3314..3320, + 3305..3311, ), ( Token( "}", ), - 3320..3321, + 3311..3312, ), ( Token( "/", ), - 3321..3322, + 3312..3313, ), ( Token( "{", ), - 3322..3323, + 3313..3314, ), ( Token( "replace_text", ), - 3323..3335, + 3314..3326, ), ( Token( "}", ), - 3335..3336, + 3326..3327, ), ( Token( "/", ), - 3336..3337, + 3327..3328, ), ( Token( "g", ), - 3337..3338, + 3328..3329, ), ( Token( "\"", ), - 3338..3339, + 3329..3330, ), ( Token( "$", ), - 3340..3341, + 3331..3332, ), ( Token( "}", ), - 3350..3351, + 3341..3342, ), ( Token( "}", ), - 3356..3357, + 3347..3348, ), ( Token( "}", ), - 3358..3359, + 3349..3350, ), ( Token( "/// Splits the input `text` into an array of substrings using the specified `delimiter`.\n", ), - 3361..3450, + 3352..3441, ), ( Token( "pub", ), - 3450..3453, + 3441..3444, ), ( Token( "fun", ), - 3454..3457, + 3445..3448, ), ( Token( "split", ), - 3458..3463, + 3449..3454, ), ( Token( "(", ), - 3463..3464, + 3454..3455, ), ( Token( "text", ), - 3464..3468, + 3455..3459, ), ( Token( ":", ), - 3468..3469, + 3459..3460, ), ( Token( "Text", ), - 3470..3474, + 3461..3465, ), ( Token( ",", ), - 3474..3475, + 3465..3466, ), ( Token( "delimiter", ), - 3476..3485, + 3467..3476, ), ( Token( ":", ), - 3485..3486, + 3476..3477, ), ( Token( "Text", ), - 3487..3491, + 3478..3482, ), ( Token( ")", ), - 3491..3492, + 3482..3483, ), ( Token( ":", ), - 3492..3493, + 3483..3484, ), ( Token( "[", ), - 3494..3495, + 3485..3486, ), ( Token( "Text", ), - 3495..3499, + 3486..3490, ), ( Token( "]", ), - 3499..3500, + 3490..3491, ), ( Token( "{", ), - 3501..3502, + 3492..3493, ), ( Token( "let", ), - 3507..3510, + 3498..3501, ), ( Token( "result", ), - 3511..3517, + 3502..3508, ), ( Token( "=", ), - 3518..3519, + 3509..3510, ), ( Token( "[", ), - 3520..3521, + 3511..3512, ), ( Token( "Text", ), - 3521..3525, + 3512..3516, ), ( Token( "]", ), - 3525..3526, + 3516..3517, ), ( Token( "trust", ), - 3531..3536, + 3522..3527, ), ( Token( "$", ), - 3537..3538, + 3528..3529, ), ( Token( "IFS", ), - 3539..3542, + 3530..3533, ), ( Token( "=", ), - 3542..3543, + 3533..3534, ), ( Token( "\"", ), - 3543..3544, + 3534..3535, ), ( Token( "{", ), - 3544..3545, + 3535..3536, ), ( Token( "delimiter", ), - 3545..3554, + 3536..3545, ), ( Token( "}", ), - 3554..3555, + 3545..3546, ), ( Token( "\"", ), - 3555..3556, + 3546..3547, ), ( Token( "read", ), - 3557..3561, + 3548..3552, ), ( Token( "-", ), - 3562..3563, + 3553..3554, ), ( Token( "rd", ), - 3563..3565, + 3554..3556, ), ( Token( "''", ), - 3566..3568, + 3557..3559, ), ( Token( "-", ), - 3569..3570, + 3560..3561, ), ( Token( "a", ), - 3570..3571, + 3561..3562, ), ( Token( "{", ), - 3572..3573, + 3563..3564, ), ( Token( "nameof", ), - 3573..3579, + 3564..3570, ), ( Token( "result", ), - 3580..3586, + 3571..3577, ), ( Token( "}", ), - 3586..3587, + 3577..3578, ), ( Token( "<", ), - 3588..3589, + 3579..3580, ), ( Token( "<", ), - 3590..3591, + 3581..3582, ), ( Token( "(", ), - 3591..3592, + 3582..3583, ), ( Token( "printf", ), - 3592..3598, + 3583..3589, ), ( Token( "%", ), - 3599..3600, + 3590..3591, ), ( Token( "s", ), - 3600..3601, + 3591..3592, ), ( Token( "\"", ), - 3602..3603, + 3593..3594, ), ( Token( "\\", ), - 3603..3604, + 3594..3595, ), ( Token( "$", ), - 3604..3605, + 3595..3596, ), ( Token( "{", ), - 3605..3606, + 3596..3597, ), ( Token( "nameof", ), - 3606..3612, + 3597..3603, ), ( Token( "text", ), - 3613..3617, + 3604..3608, ), ( Token( "}", ), - 3617..3618, + 3608..3609, ), ( Token( "\"", ), - 3618..3619, + 3609..3610, ), ( Token( ")", ), - 3619..3620, + 3610..3611, ), ( Token( "$", ), - 3621..3622, + 3612..3613, ), ( Token( "return", ), - 3627..3633, + 3618..3624, ), ( Token( "result", ), - 3634..3640, + 3625..3631, ), ( Token( "}", ), - 3641..3642, + 3632..3633, ), ( Token( "/// Splits a `text` into an array of substrings based on newline characters.\n", ), - 3644..3721, + 3635..3712, ), ( Token( "pub", ), - 3721..3724, + 3712..3715, ), ( Token( "fun", ), - 3725..3728, + 3716..3719, ), ( Token( "split_lines", ), - 3729..3740, + 3720..3731, ), ( Token( "(", ), - 3740..3741, + 3731..3732, ), ( Token( "text", ), - 3741..3745, + 3732..3736, ), ( Token( ":", ), - 3745..3746, + 3736..3737, ), ( Token( "Text", ), - 3747..3751, + 3738..3742, ), ( Token( ")", ), - 3751..3752, + 3742..3743, ), ( Token( ":", ), - 3752..3753, + 3743..3744, ), ( Token( "[", ), - 3754..3755, + 3745..3746, ), ( Token( "Text", ), - 3755..3759, + 3746..3750, ), ( Token( "]", ), - 3759..3760, + 3750..3751, ), ( Token( "{", ), - 3761..3762, + 3752..3753, ), ( Token( "return", ), - 3767..3773, + 3758..3764, ), ( Token( "split", ), - 3774..3779, + 3765..3770, ), ( Token( "(", ), - 3779..3780, + 3770..3771, ), ( Token( "text", ), - 3780..3784, + 3771..3775, ), ( Token( ",", ), - 3784..3785, + 3775..3776, ), ( Token( "\"", ), - 3786..3787, + 3777..3778, ), ( Token( "\\", ), - 3787..3788, + 3778..3779, ), ( Token( "n", ), - 3788..3789, + 3779..3780, ), ( Token( "\"", ), - 3789..3790, + 3780..3781, ), ( Token( ")", ), - 3790..3791, + 3781..3782, ), ( Token( "}", ), - 3792..3793, + 3783..3784, ), ( Token( "/// Splits a `text` into an array of substrings based on space character.\n", ), - 3795..3869, + 3786..3860, ), ( Token( "pub", ), - 3869..3872, + 3860..3863, ), ( Token( "fun", ), - 3873..3876, + 3864..3867, ), ( Token( "split_words", ), - 3877..3888, + 3868..3879, ), ( Token( "(", ), - 3888..3889, + 3879..3880, ), ( Token( "text", ), - 3889..3893, + 3880..3884, ), ( Token( ":", ), - 3893..3894, + 3884..3885, ), ( Token( "Text", ), - 3895..3899, + 3886..3890, ), ( Token( ")", ), - 3899..3900, + 3890..3891, ), ( Token( ":", ), - 3900..3901, + 3891..3892, ), ( Token( "[", ), - 3902..3903, + 3893..3894, ), ( Token( "Text", ), - 3903..3907, + 3894..3898, ), ( Token( "]", ), - 3907..3908, + 3898..3899, ), ( Token( "{", ), - 3909..3910, + 3900..3901, ), ( Token( "return", ), - 3915..3921, + 3906..3912, ), ( Token( "split", ), - 3922..3927, + 3913..3918, ), ( Token( "(", ), - 3927..3928, + 3918..3919, ), ( Token( "text", ), - 3928..3932, + 3919..3923, ), ( Token( ",", ), - 3932..3933, + 3923..3924, ), ( Token( "\"", ), - 3934..3935, + 3925..3926, ), ( Token( "\"", ), - 3936..3937, + 3927..3928, ), ( Token( ")", ), - 3937..3938, + 3928..3929, ), ( Token( "}", ), - 3939..3940, + 3930..3931, ), ( Token( "/// Merges text using the delimiter specified.\n", ), - 3942..3989, + 3933..3980, ), ( Token( "pub", ), - 3989..3992, + 3980..3983, ), ( Token( "fun", ), - 3993..3996, + 3984..3987, ), ( Token( "join", ), - 3997..4001, + 3988..3992, ), ( Token( "(", ), - 4001..4002, + 3992..3993, ), ( Token( "list", ), - 4002..4006, + 3993..3997, ), ( Token( ":", ), - 4006..4007, + 3997..3998, ), ( Token( "[", ), - 4008..4009, + 3999..4000, ), ( Token( "Text", ), - 4009..4013, + 4000..4004, ), ( Token( "]", ), - 4013..4014, + 4004..4005, ), ( Token( ",", ), - 4014..4015, + 4005..4006, ), ( Token( "delimiter", ), - 4016..4025, + 4007..4016, ), ( Token( ":", ), - 4025..4026, + 4016..4017, ), ( Token( "Text", ), - 4027..4031, + 4018..4022, ), ( Token( ")", ), - 4031..4032, + 4022..4023, ), ( Token( ":", ), - 4032..4033, + 4023..4024, ), ( Token( "Text", ), - 4034..4038, + 4025..4029, ), ( Token( "{", ), - 4039..4040, + 4030..4031, ), ( Token( "return", ), - 4045..4051, + 4036..4042, ), ( Token( "trust", ), - 4052..4057, + 4043..4048, ), ( Token( "$", ), - 4058..4059, + 4049..4050, ), ( Token( "IFS", ), - 4060..4063, + 4051..4054, ), ( Token( "=", ), - 4063..4064, + 4054..4055, ), ( Token( "\"", ), - 4064..4065, + 4055..4056, ), ( Token( "{", ), - 4065..4066, + 4056..4057, ), ( Token( "delimiter", ), - 4066..4075, + 4057..4066, ), ( Token( "}", ), - 4075..4076, + 4066..4067, ), ( Token( "\"", ), - 4076..4077, + 4067..4068, ), ( Token( ";", ), - 4078..4079, + 4069..4070, ), ( Token( "echo", ), - 4080..4084, + 4071..4075, ), ( Token( "\"", ), - 4085..4086, + 4076..4077, ), ( Token( "\\", ), - 4086..4087, + 4077..4078, ), ( Token( "$", ), - 4087..4088, + 4078..4079, ), ( Token( "\\", ), - 4088..4089, + 4079..4080, ), ( Token( "{", ), - 4089..4090, + 4080..4081, ), ( Token( "{", ), - 4090..4091, + 4081..4082, ), ( Token( "nameof", ), - 4091..4097, + 4082..4088, ), ( Token( "list", ), - 4098..4102, + 4089..4093, ), ( Token( "}", ), - 4102..4103, + 4093..4094, ), ( Token( "[", ), - 4103..4104, + 4094..4095, ), ( Token( "*", ), - 4104..4105, + 4095..4096, ), ( Token( "]", ), - 4105..4106, + 4096..4097, ), ( Token( "}", ), - 4106..4107, + 4097..4098, ), ( Token( "\"", ), - 4107..4108, + 4098..4099, ), ( Token( "$", ), - 4109..4110, + 4100..4101, ), ( Token( "}", ), - 4111..4112, + 4102..4103, ), ( Token( "/// Trims the spaces at top of the text using `sed`.\n", ), - 4114..4167, + 4105..4158, ), ( Token( "pub", ), - 4167..4170, + 4158..4161, ), ( Token( "fun", ), - 4171..4174, + 4162..4165, ), ( Token( "trim_left", ), - 4175..4184, + 4166..4175, ), ( Token( "(", ), - 4184..4185, + 4175..4176, ), ( Token( "text", ), - 4185..4189, + 4176..4180, ), ( Token( ":", ), - 4189..4190, + 4180..4181, ), ( Token( "Text", ), - 4191..4195, + 4182..4186, ), ( Token( ")", ), - 4195..4196, + 4186..4187, ), ( Token( ":", ), - 4196..4197, + 4187..4188, ), ( Token( "Text", ), - 4198..4202, + 4189..4193, ), ( Token( "{", ), - 4203..4204, + 4194..4195, ), ( Token( "return", ), - 4209..4215, + 4200..4206, ), ( Token( "trust", ), - 4216..4221, + 4207..4212, ), ( Token( "$", ), - 4222..4223, + 4213..4214, ), ( Token( "echo", ), - 4224..4228, + 4215..4219, ), ( Token( "\"", ), - 4229..4230, + 4220..4221, ), ( Token( "{", ), - 4230..4231, + 4221..4222, ), ( Token( "text", ), - 4231..4235, + 4222..4226, ), ( Token( "}", ), - 4235..4236, + 4226..4227, ), ( Token( "\"", ), - 4236..4237, + 4227..4228, ), ( Token( "|", ), - 4238..4239, + 4229..4230, ), ( Token( "sed", ), - 4240..4243, + 4231..4234, ), ( Token( "-", ), - 4244..4245, + 4235..4236, ), ( Token( "e", ), - 4245..4246, + 4236..4237, ), ( Token( "'s", ), - 4247..4249, + 4238..4240, ), ( Token( "/", ), - 4249..4250, + 4240..4241, ), ( Token( "^", ), - 4250..4251, + 4241..4242, ), ( Token( "[", ), - 4251..4252, + 4242..4243, ), ( Token( "[", ), - 4252..4253, + 4243..4244, ), ( Token( ":", ), - 4253..4254, + 4244..4245, ), ( Token( "space", ), - 4254..4259, + 4245..4250, ), ( Token( ":", ), - 4259..4260, + 4250..4251, ), ( Token( "]", ), - 4260..4261, + 4251..4252, ), ( Token( "]", ), - 4261..4262, + 4252..4253, ), ( Token( "*", ), - 4262..4263, + 4253..4254, ), ( Token( "//", ), - 4263..4265, + 4254..4256, ), ( Token( "'", ), - 4265..4266, + 4256..4257, ), ( Token( "$", ), - 4267..4268, + 4258..4259, ), ( Token( "}", ), - 4269..4270, + 4260..4261, ), ( Token( "/// Trims the spaces at end of the text using `sed`.\n", ), - 4272..4325, + 4263..4316, ), ( Token( "pub", ), - 4325..4328, + 4316..4319, ), ( Token( "fun", ), - 4329..4332, + 4320..4323, ), ( Token( "trim_right", ), - 4333..4343, + 4324..4334, ), ( Token( "(", ), - 4343..4344, + 4334..4335, ), ( Token( "text", ), - 4344..4348, + 4335..4339, ), ( Token( ":", ), - 4348..4349, + 4339..4340, ), ( Token( "Text", ), - 4350..4354, + 4341..4345, ), ( Token( ")", ), - 4354..4355, + 4345..4346, ), ( Token( ":", ), - 4355..4356, + 4346..4347, ), ( Token( "Text", ), - 4357..4361, + 4348..4352, ), ( Token( "{", ), - 4362..4363, + 4353..4354, ), ( Token( "return", ), - 4368..4374, + 4359..4365, ), ( Token( "trust", ), - 4375..4380, + 4366..4371, ), ( Token( "$", ), - 4381..4382, + 4372..4373, ), ( Token( "echo", ), - 4383..4387, + 4374..4378, ), ( Token( "\"", ), - 4388..4389, + 4379..4380, ), ( Token( "{", ), - 4389..4390, + 4380..4381, ), ( Token( "text", ), - 4390..4394, + 4381..4385, ), ( Token( "}", ), - 4394..4395, + 4385..4386, ), ( Token( "\"", ), - 4395..4396, + 4386..4387, ), ( Token( "|", ), - 4397..4398, + 4388..4389, ), ( Token( "sed", ), - 4399..4402, + 4390..4393, ), ( Token( "-", ), - 4403..4404, + 4394..4395, ), ( Token( "e", ), - 4404..4405, + 4395..4396, ), ( Token( "'s", ), - 4406..4408, + 4397..4399, ), ( Token( "/", ), - 4408..4409, + 4399..4400, ), ( Token( "[", ), - 4409..4410, + 4400..4401, ), ( Token( "[", ), - 4410..4411, + 4401..4402, ), ( Token( ":", ), - 4411..4412, + 4402..4403, ), ( Token( "space", ), - 4412..4417, + 4403..4408, ), ( Token( ":", ), - 4417..4418, + 4408..4409, ), ( Token( "]", ), - 4418..4419, + 4409..4410, ), ( Token( "]", ), - 4419..4420, + 4410..4411, ), ( Token( "*", ), - 4420..4421, + 4411..4412, ), ( Token( "\\", ), - 4421..4422, + 4412..4413, ), ( Token( "$", ), - 4422..4423, + 4413..4414, ), ( Token( "//", ), - 4423..4425, + 4414..4416, ), ( Token( "'", ), - 4425..4426, + 4416..4417, ), ( Token( "$", ), - 4427..4428, + 4418..4419, ), ( Token( "}", ), - 4429..4430, + 4420..4421, ), ( Token( "/// Trims the spaces from the text input.\n", ), - 4432..4474, + 4423..4465, ), ( Token( "pub", ), - 4474..4477, + 4465..4468, ), ( Token( "fun", ), - 4478..4481, + 4469..4472, ), ( Token( "trim", ), - 4482..4486, + 4473..4477, ), ( Token( "(", ), - 4486..4487, + 4477..4478, ), ( Token( "text", ), - 4487..4491, + 4478..4482, ), ( Token( ":", ), - 4491..4492, + 4482..4483, ), ( Token( "Text", ), - 4493..4497, + 4484..4488, ), ( Token( ")", ), - 4497..4498, + 4488..4489, ), ( Token( ":", ), - 4498..4499, + 4489..4490, ), ( Token( "Text", ), - 4500..4504, + 4491..4495, ), ( Token( "{", ), - 4505..4506, + 4496..4497, ), ( Token( "return", ), - 4511..4517, + 4502..4508, ), ( Token( "trim_left", ), - 4518..4527, + 4509..4518, ), ( Token( "(", ), - 4527..4528, + 4518..4519, ), ( Token( "trim_right", ), - 4528..4538, + 4519..4529, ), ( Token( "(", ), - 4538..4539, + 4529..4530, ), ( Token( "text", ), - 4539..4543, + 4530..4534, ), ( Token( ")", ), - 4543..4544, + 4534..4535, ), ( Token( ")", ), - 4544..4545, + 4535..4536, ), ( Token( "}", ), - 4546..4547, + 4537..4538, ), ( Token( "/// Makes the text input lowercase using `tr`.\n", ), - 4549..4596, + 4540..4587, ), ( Token( "pub", ), - 4596..4599, + 4587..4590, ), ( Token( "fun", ), - 4600..4603, + 4591..4594, ), ( Token( "lowercase", ), - 4604..4613, + 4595..4604, ), ( Token( "(", ), - 4613..4614, + 4604..4605, ), ( Token( "text", ), - 4614..4618, + 4605..4609, ), ( Token( ":", ), - 4618..4619, + 4609..4610, ), ( Token( "Text", ), - 4620..4624, + 4611..4615, ), ( Token( ")", ), - 4624..4625, + 4615..4616, ), ( Token( ":", ), - 4625..4626, + 4616..4617, ), ( Token( "Text", ), - 4627..4631, + 4618..4622, ), ( Token( "{", ), - 4632..4633, + 4623..4624, ), ( Token( "return", ), - 4638..4644, + 4629..4635, ), ( Token( "trust", ), - 4645..4650, + 4636..4641, ), ( Token( "$", ), - 4651..4652, + 4642..4643, ), ( Token( "echo", ), - 4653..4657, + 4644..4648, ), ( Token( "\"", ), - 4658..4659, + 4649..4650, ), ( Token( "{", ), - 4659..4660, + 4650..4651, ), ( Token( "text", ), - 4660..4664, + 4651..4655, ), ( Token( "}", ), - 4664..4665, + 4655..4656, ), ( Token( "\"", ), - 4665..4666, + 4656..4657, ), ( Token( "|", ), - 4667..4668, + 4658..4659, ), ( Token( "tr", ), - 4669..4671, + 4660..4662, ), ( Token( "'", ), - 4672..4673, + 4663..4664, ), ( Token( "[", ), - 4673..4674, + 4664..4665, ), ( Token( ":", ), - 4674..4675, + 4665..4666, ), ( Token( "upper", ), - 4675..4680, + 4666..4671, ), ( Token( ":", ), - 4680..4681, + 4671..4672, ), ( Token( "]", ), - 4681..4682, + 4672..4673, ), ( Token( "'", ), - 4682..4683, + 4673..4674, ), ( Token( "'", ), - 4684..4685, + 4675..4676, ), ( Token( "[", ), - 4685..4686, + 4676..4677, ), ( Token( ":", ), - 4686..4687, + 4677..4678, ), ( Token( "lower", ), - 4687..4692, + 4678..4683, ), ( Token( ":", ), - 4692..4693, + 4683..4684, ), ( Token( "]", ), - 4693..4694, + 4684..4685, ), ( Token( "'", ), - 4694..4695, + 4685..4686, ), ( Token( "$", ), - 4696..4697, + 4687..4688, ), ( Token( "}", ), - 4698..4699, + 4689..4690, ), ( Token( "/// Makes the text input uppercase using `tr`.\n", ), - 4701..4748, + 4692..4739, ), ( Token( "pub", ), - 4748..4751, + 4739..4742, ), ( Token( "fun", ), - 4752..4755, + 4743..4746, ), ( Token( "uppercase", ), - 4756..4765, + 4747..4756, ), ( Token( "(", ), - 4765..4766, + 4756..4757, ), ( Token( "text", ), - 4766..4770, + 4757..4761, ), ( Token( ":", ), - 4770..4771, + 4761..4762, ), ( Token( "Text", ), - 4772..4776, + 4763..4767, ), ( Token( ")", ), - 4776..4777, + 4767..4768, ), ( Token( ":", ), - 4777..4778, + 4768..4769, ), ( Token( "Text", ), - 4779..4783, + 4770..4774, ), ( Token( "{", ), - 4784..4785, + 4775..4776, ), ( Token( "return", ), - 4790..4796, + 4781..4787, ), ( Token( "trust", ), - 4797..4802, + 4788..4793, ), ( Token( "$", ), - 4803..4804, + 4794..4795, ), ( Token( "echo", ), - 4805..4809, + 4796..4800, ), ( Token( "\"", ), - 4810..4811, + 4801..4802, ), ( Token( "{", ), - 4811..4812, + 4802..4803, ), ( Token( "text", ), - 4812..4816, + 4803..4807, ), ( Token( "}", ), - 4816..4817, + 4807..4808, ), ( Token( "\"", ), - 4817..4818, + 4808..4809, ), ( Token( "|", ), - 4819..4820, + 4810..4811, ), ( Token( "tr", ), - 4821..4823, + 4812..4814, ), ( Token( "'", ), + 4815..4816, + ), + ( + Token( + "[", + ), + 4816..4817, + ), + ( + Token( + ":", + ), + 4817..4818, + ), + ( + Token( + "lower", + ), + 4818..4823, + ), + ( + Token( + ":", + ), + 4823..4824, + ), + ( + Token( + "]", + ), 4824..4825, ), + ( + Token( + "'", + ), + 4825..4826, + ), + ( + Token( + "'", + ), + 4827..4828, + ), + ( + Token( + "[", + ), + 4828..4829, + ), + ( + Token( + ":", + ), + 4829..4830, + ), + ( + Token( + "upper", + ), + 4830..4835, + ), + ( + Token( + ":", + ), + 4835..4836, + ), + ( + Token( + "]", + ), + 4836..4837, + ), + ( + Token( + "'", + ), + 4837..4838, + ), + ( + Token( + "$", + ), + 4839..4840, + ), + ( + Token( + "}", + ), + 4841..4842, + ), + ( + Token( + "/// Attempts to parse a given text into an `Int` number.\n", + ), + 4844..4901, + ), + ( + Token( + "#", + ), + 4901..4902, + ), + ( + Token( + "[", + ), + 4902..4903, + ), + ( + Token( + "allow_absurd_cast", + ), + 4903..4920, + ), + ( + Token( + "]", + ), + 4920..4921, + ), + ( + Token( + "pub", + ), + 4922..4925, + ), + ( + Token( + "fun", + ), + 4926..4929, + ), + ( + Token( + "parse_int", + ), + 4930..4939, + ), + ( + Token( + "(", + ), + 4939..4940, + ), + ( + Token( + "text", + ), + 4940..4944, + ), + ( + Token( + ":", + ), + 4944..4945, + ), + ( + Token( + "Text", + ), + 4946..4950, + ), + ( + Token( + ")", + ), + 4950..4951, + ), + ( + Token( + ":", + ), + 4951..4952, + ), + ( + Token( + "Int", + ), + 4953..4956, + ), + ( + Token( + "?", + ), + 4956..4957, + ), + ( + Token( + "{", + ), + 4958..4959, + ), + ( + Token( + "$", + ), + 4964..4965, + ), ( Token( "[", ), - 4825..4826, + 4966..4967, + ), + ( + Token( + "-", + ), + 4968..4969, + ), + ( + Token( + "n", + ), + 4969..4970, + ), + ( + Token( + "\"", + ), + 4971..4972, + ), + ( + Token( + "{", + ), + 4972..4973, + ), + ( + Token( + "text", + ), + 4973..4977, + ), + ( + Token( + "}", + ), + 4977..4978, + ), + ( + Token( + "\"", + ), + 4978..4979, + ), + ( + Token( + "]", + ), + 4980..4981, + ), + ( + Token( + "&&", + ), + 4982..4984, + ), + ( + Token( + "[", + ), + 4985..4986, + ), + ( + Token( + "\"", + ), + 4987..4988, + ), + ( + Token( + "{", + ), + 4988..4989, + ), + ( + Token( + "text", + ), + 4989..4993, + ), + ( + Token( + "}", + ), + 4993..4994, + ), + ( + Token( + "\"", + ), + 4994..4995, + ), + ( + Token( + "-", + ), + 4996..4997, + ), + ( + Token( + "eq", + ), + 4997..4999, + ), + ( + Token( + "\"", + ), + 5000..5001, + ), + ( + Token( + "{", + ), + 5001..5002, + ), + ( + Token( + "text", + ), + 5002..5006, + ), + ( + Token( + "}", + ), + 5006..5007, + ), + ( + Token( + "\"", + ), + 5007..5008, + ), + ( + Token( + "]", + ), + 5009..5010, + ), + ( + Token( + "2", + ), + 5011..5012, + ), + ( + Token( + ">", + ), + 5012..5013, + ), + ( + Token( + "/", + ), + 5013..5014, + ), + ( + Token( + "dev", + ), + 5014..5017, + ), + ( + Token( + "/", + ), + 5017..5018, + ), + ( + Token( + "null", + ), + 5018..5022, + ), + ( + Token( + "$", + ), + 5023..5024, + ), + ( + Token( + "?", + ), + 5024..5025, + ), + ( + Token( + "return", + ), + 5030..5036, + ), + ( + Token( + "text", + ), + 5037..5041, + ), + ( + Token( + "as", + ), + 5042..5044, + ), + ( + Token( + "Int", + ), + 5045..5048, + ), + ( + Token( + "}", + ), + 5049..5050, + ), + ( + Token( + "/// Attempts to parse a given text into a `Num` number.\n", + ), + 5052..5108, + ), + ( + Token( + "#", + ), + 5108..5109, + ), + ( + Token( + "[", + ), + 5109..5110, + ), + ( + Token( + "allow_absurd_cast", + ), + 5110..5127, + ), + ( + Token( + "]", + ), + 5127..5128, + ), + ( + Token( + "pub", + ), + 5129..5132, + ), + ( + Token( + "fun", + ), + 5133..5136, + ), + ( + Token( + "parse_num", + ), + 5137..5146, + ), + ( + Token( + "(", + ), + 5146..5147, + ), + ( + Token( + "text", + ), + 5147..5151, + ), + ( + Token( + ":", + ), + 5151..5152, + ), + ( + Token( + "Text", + ), + 5153..5157, + ), + ( + Token( + ")", + ), + 5157..5158, + ), + ( + Token( + ":", + ), + 5158..5159, + ), + ( + Token( + "Num", + ), + 5160..5163, + ), + ( + Token( + "?", + ), + 5163..5164, + ), + ( + Token( + "{", + ), + 5165..5166, + ), + ( + Token( + "let", + ), + 5171..5174, ), ( Token( - ":", + "re_int", ), - 4826..4827, + 5175..5181, ), ( Token( - "lower", + "=", ), - 4827..4832, + 5181..5182, ), ( Token( - ":", + "\"", ), - 4832..4833, + 5182..5183, ), ( Token( - "]", + "^", ), - 4833..4834, + 5183..5184, ), ( Token( - "'", + "-", ), - 4834..4835, + 5184..5185, ), ( Token( - "'", + "?", ), - 4836..4837, + 5185..5186, ), ( Token( "[", ), - 4837..4838, + 5186..5187, ), ( Token( - ":", + "0", ), - 4838..4839, + 5187..5188, ), ( Token( - "upper", + "-", ), - 4839..4844, + 5188..5189, ), ( Token( - ":", + "9", ), - 4844..4845, + 5189..5190, ), ( Token( "]", ), - 4845..4846, + 5190..5191, ), ( Token( - "'", + "+", ), - 4846..4847, + 5191..5192, ), ( Token( "$", ), - 4848..4849, + 5192..5193, ), ( Token( - "}", + "\"", ), - 4850..4851, + 5193..5194, ), ( Token( - "/// Attempts to parse a given text into a number, returning the parsed number or zero if parsing fails.\n", + "let", ), - 4853..4957, + 5199..5202, ), ( Token( - "#", + "re_float", ), - 4957..4958, + 5203..5211, ), ( Token( - "[", + "=", ), - 4958..4959, + 5211..5212, ), ( Token( - "allow_absurd_cast", + "\"", ), - 4959..4976, + 5212..5213, ), ( Token( - "]", + "^", ), - 4976..4977, + 5213..5214, ), ( Token( - "pub", + "-", ), - 4978..4981, + 5214..5215, ), ( Token( - "fun", + "?", ), - 4982..4985, + 5215..5216, ), ( Token( - "parse_number", + "[", ), - 4986..4998, + 5216..5217, ), ( Token( - "(", + "0", ), - 4998..4999, + 5217..5218, ), ( Token( - "text", + "-", ), - 4999..5003, + 5218..5219, ), ( Token( - ":", + "9", ), - 5003..5004, + 5219..5220, ), ( Token( - "Text", + "]", ), - 5005..5009, + 5220..5221, ), ( Token( - ")", + "*", ), - 5009..5010, + 5221..5222, ), ( Token( - ":", + "\\", ), - 5010..5011, + 5222..5223, ), ( Token( - "Num", + ".", ), - 5012..5015, + 5223..5224, ), ( Token( - "?", + "[", ), - 5015..5016, + 5224..5225, ), ( Token( - "{", + "0", ), - 5017..5018, + 5225..5226, ), ( Token( - "$", + "-", ), - 5023..5024, + 5226..5227, ), ( Token( - "[", + "9", ), - 5025..5026, + 5227..5228, ), ( Token( - "-", + "]", ), - 5027..5028, + 5228..5229, ), ( Token( - "n", + "+", + ), + 5229..5230, + ), + ( + Token( + "$", ), - 5028..5029, + 5230..5231, ), ( Token( "\"", ), - 5030..5031, + 5231..5232, ), ( Token( - "{", + "$", ), - 5031..5032, + 5238..5239, ), ( Token( - "text", + "[", ), - 5032..5036, + 5240..5241, ), ( Token( - "}", + "[", ), - 5036..5037, + 5241..5242, ), ( Token( - "\"", + "{", ), - 5037..5038, + 5243..5244, ), ( Token( - "]", + "text", ), - 5039..5040, + 5244..5248, ), ( Token( - "&&", + "}", ), - 5041..5043, + 5248..5249, ), ( Token( - "[", + "=", ), - 5044..5045, + 5250..5251, ), ( Token( - "\"", + "~", ), - 5046..5047, + 5251..5252, ), ( Token( "{", ), - 5047..5048, + 5253..5254, ), ( Token( - "text", + "re_int", ), - 5048..5052, + 5254..5260, ), ( Token( "}", ), - 5052..5053, + 5260..5261, ), ( Token( - "\"", + "]", ), - 5053..5054, + 5262..5263, ), ( Token( - "-", + "]", ), - 5055..5056, + 5263..5264, ), ( Token( - "eq", + "||", ), - 5056..5058, + 5265..5267, ), ( Token( - "\"", + "[", ), - 5059..5060, + 5268..5269, ), ( Token( - "{", + "[", ), - 5060..5061, + 5269..5270, ), ( Token( - "text", + "{", ), - 5061..5065, + 5271..5272, ), ( Token( - "}", + "text", ), - 5065..5066, + 5272..5276, ), ( Token( - "\"", + "}", ), - 5066..5067, + 5276..5277, ), ( Token( - "]", + "=", ), - 5068..5069, + 5278..5279, ), ( Token( - "2", + "~", ), - 5070..5071, + 5279..5280, ), ( Token( - ">", + "{", ), - 5071..5072, + 5281..5282, ), ( Token( - "/", + "re_float", ), - 5072..5073, + 5282..5290, ), ( Token( - "dev", + "}", ), - 5073..5076, + 5290..5291, ), ( Token( - "/", + "]", ), - 5076..5077, + 5292..5293, ), ( Token( - "null", + "]", ), - 5077..5081, + 5293..5294, ), ( Token( "$", ), - 5082..5083, + 5295..5296, ), ( Token( "?", ), - 5083..5084, + 5296..5297, ), ( Token( "return", ), - 5089..5095, + 5302..5308, ), ( Token( "text", ), - 5096..5100, + 5309..5313, ), ( Token( "as", ), - 5101..5103, + 5314..5316, ), ( Token( "Num", ), - 5104..5107, + 5317..5320, ), ( Token( "}", ), - 5108..5109, + 5321..5322, ), ( Token( "/// Splits a text into an array of individual characters.\n", ), - 5111..5169, + 5324..5382, ), ( Token( "pub", ), - 5169..5172, + 5382..5385, ), ( Token( "fun", ), - 5173..5176, + 5386..5389, ), ( Token( "split_chars", ), - 5177..5188, + 5390..5401, ), ( Token( "(", ), - 5188..5189, + 5401..5402, ), ( Token( "text", ), - 5189..5193, + 5402..5406, ), ( Token( ":", ), - 5193..5194, + 5406..5407, ), ( Token( "Text", ), - 5195..5199, + 5408..5412, ), ( Token( ")", ), - 5199..5200, + 5412..5413, ), ( Token( ":", ), - 5200..5201, + 5413..5414, ), ( Token( "[", ), - 5202..5203, + 5415..5416, ), ( Token( "Text", ), - 5203..5207, + 5416..5420, ), ( Token( "]", ), - 5207..5208, + 5420..5421, ), ( Token( "{", ), - 5209..5210, + 5422..5423, ), ( Token( "let", ), - 5215..5218, + 5428..5431, ), ( Token( "chars", ), - 5219..5224, + 5432..5437, ), ( Token( "=", ), - 5225..5226, + 5438..5439, ), ( Token( "[", ), - 5227..5228, + 5440..5441, ), ( Token( "Text", ), - 5228..5232, + 5441..5445, ), ( Token( "]", ), - 5232..5233, + 5445..5446, ), ( Token( "trust", ), - 5238..5243, + 5451..5456, ), ( Token( "$", ), - 5244..5245, + 5457..5458, ), ( Token( "for", ), - 5246..5249, + 5459..5462, ), ( Token( "(", ), - 5250..5251, + 5463..5464, ), ( Token( "(", ), - 5251..5252, + 5464..5465, ), ( Token( "i", ), - 5252..5253, + 5465..5466, ), ( Token( "=", ), - 5253..5254, + 5466..5467, ), ( Token( "0", ), - 5254..5255, + 5467..5468, ), ( Token( ";", ), - 5255..5256, + 5468..5469, ), ( Token( "i", ), - 5257..5258, + 5470..5471, ), ( Token( "<", ), - 5258..5259, + 5471..5472, ), ( Token( "\\", ), - 5259..5260, + 5472..5473, ), ( Token( "$", ), - 5260..5261, + 5473..5474, ), ( Token( "\\", ), - 5261..5262, + 5474..5475, ), ( Token( "{", ), - 5262..5263, + 5475..5476, ), ( Token( "#", ), - 5263..5264, + 5476..5477, ), ( Token( "{", ), - 5264..5265, + 5477..5478, ), ( Token( "nameof", ), - 5265..5271, + 5478..5484, ), ( Token( "text", ), - 5272..5276, + 5485..5489, ), ( Token( "}", ), - 5276..5277, + 5489..5490, ), ( Token( "}", ), - 5277..5278, + 5490..5491, ), ( Token( ";", ), - 5278..5279, + 5491..5492, ), ( Token( "i", ), - 5280..5281, + 5493..5494, ), ( Token( "+", ), - 5281..5282, + 5494..5495, ), ( Token( "+", ), - 5282..5283, + 5495..5496, ), ( Token( ")", ), - 5283..5284, + 5496..5497, ), ( Token( ")", ), - 5284..5285, + 5497..5498, ), ( Token( ";", ), - 5285..5286, + 5498..5499, ), ( Token( "do", ), - 5287..5289, + 5500..5502, ), ( Token( "{", ), - 5298..5299, + 5511..5512, ), ( Token( "nameof", ), - 5299..5305, + 5512..5518, ), ( Token( "chars", ), - 5306..5311, + 5519..5524, ), ( Token( "}", ), - 5311..5312, + 5524..5525, ), ( Token( "+=", ), - 5312..5314, + 5525..5527, ), ( Token( "(", ), - 5314..5315, + 5527..5528, ), ( Token( "\"", ), - 5316..5317, + 5529..5530, ), ( Token( "\\", ), - 5317..5318, + 5530..5531, ), ( Token( "$", ), - 5318..5319, + 5531..5532, ), ( Token( "\\", ), - 5319..5320, + 5532..5533, ), ( Token( "{", ), - 5320..5321, + 5533..5534, ), ( Token( "{", ), - 5321..5322, + 5534..5535, ), ( Token( "nameof", ), - 5322..5328, + 5535..5541, ), ( Token( "text", ), - 5329..5333, + 5542..5546, ), ( Token( "}", ), - 5333..5334, + 5546..5547, ), ( Token( ":", ), - 5334..5335, + 5547..5548, ), ( Token( "\\", ), - 5335..5336, + 5548..5549, ), ( Token( "$", ), - 5336..5337, + 5549..5550, ), ( Token( "i", ), - 5337..5338, + 5550..5551, ), ( Token( ":", ), - 5338..5339, + 5551..5552, ), ( Token( "1", ), - 5339..5340, + 5552..5553, ), ( Token( "}", ), - 5340..5341, + 5553..5554, ), ( Token( "\"", ), - 5341..5342, + 5554..5555, ), ( Token( ")", ), - 5343..5344, + 5556..5557, ), ( Token( ";", ), - 5344..5345, + 5557..5558, ), ( Token( "done", ), - 5350..5354, + 5563..5567, ), ( Token( "$", ), - 5355..5356, + 5568..5569, ), ( Token( "return", ), - 5361..5367, + 5574..5580, ), ( Token( "chars", ), - 5368..5373, + 5581..5586, ), ( Token( "}", ), - 5374..5375, + 5587..5588, ), ( Token( "/// Checks if some text contains a value.\n", ), - 5377..5419, + 5590..5632, ), ( Token( "pub", ), - 5419..5422, + 5632..5635, ), ( Token( "fun", ), - 5423..5426, + 5636..5639, ), ( Token( "text_contains", ), - 5427..5440, + 5640..5653, ), ( Token( "(", ), - 5440..5441, + 5653..5654, ), ( Token( "source", ), - 5441..5447, + 5654..5660, ), ( Token( ":", ), - 5447..5448, + 5660..5661, ), ( Token( "Text", ), - 5449..5453, + 5662..5666, ), ( Token( ",", ), - 5453..5454, + 5666..5667, ), ( Token( "search", ), - 5455..5461, + 5668..5674, ), ( Token( ":", ), - 5461..5462, + 5674..5675, ), ( Token( "Text", ), - 5463..5467, + 5676..5680, ), ( Token( ")", ), - 5467..5468, + 5680..5681, ), ( Token( ":", ), - 5468..5469, + 5681..5682, ), ( Token( "Bool", ), - 5470..5474, + 5683..5687, ), ( Token( "{", ), - 5475..5476, + 5688..5689, ), ( Token( "let", ), - 5479..5482, + 5692..5695, ), ( Token( "result", ), - 5483..5489, + 5696..5702, ), ( Token( "=", ), - 5490..5491, + 5703..5704, ), ( Token( "trust", ), - 5492..5497, + 5705..5710, ), ( Token( "$", ), - 5498..5499, + 5711..5712, ), ( Token( "if", ), - 5500..5502, + 5713..5715, ), ( Token( "[", ), - 5503..5504, + 5716..5717, ), ( Token( "[", ), - 5504..5505, + 5717..5718, ), ( Token( "\"", ), - 5506..5507, + 5719..5720, ), ( Token( "{", ), - 5507..5508, + 5720..5721, ), ( Token( "source", ), - 5508..5514, + 5721..5727, ), ( Token( "}", ), - 5514..5515, + 5727..5728, ), ( Token( "\"", ), - 5515..5516, + 5728..5729, ), ( Token( "==", ), - 5517..5519, + 5730..5732, ), ( Token( "*", ), - 5520..5521, + 5733..5734, ), ( Token( "\"", ), - 5521..5522, + 5734..5735, ), ( Token( "{", ), - 5522..5523, + 5735..5736, ), ( Token( "search", ), - 5523..5529, + 5736..5742, ), ( Token( "}", ), - 5529..5530, + 5742..5743, ), ( Token( "\"", ), - 5530..5531, + 5743..5744, ), ( Token( "*", ), - 5531..5532, + 5744..5745, ), ( Token( "]", ), - 5533..5534, + 5746..5747, ), ( Token( "]", ), - 5534..5535, + 5747..5748, ), ( Token( ";", ), - 5535..5536, + 5748..5749, ), ( Token( "then", ), - 5537..5541, + 5750..5754, ), ( Token( "echo", ), - 5546..5550, + 5759..5763, ), ( Token( "1", ), - 5551..5552, + 5764..5765, ), ( Token( "fi", ), - 5555..5557, + 5768..5770, ), ( Token( "$", ), - 5558..5559, + 5771..5772, ), ( Token( "return", ), - 5563..5569, + 5776..5782, ), ( Token( "result", ), - 5570..5576, + 5783..5789, ), ( Token( "==", ), - 5577..5579, + 5790..5792, ), ( Token( "\"", ), - 5580..5581, + 5793..5794, ), ( Token( "1", ), - 5581..5582, + 5794..5795, ), ( Token( "\"", ), - 5582..5583, + 5795..5796, ), ( Token( "}", ), - 5584..5585, + 5797..5798, ), ( Token( "/// Checks if an array value is in the text.\n", ), - 5587..5632, + 5800..5845, ), ( Token( "pub", ), - 5632..5635, + 5845..5848, ), ( Token( "fun", ), - 5636..5639, + 5849..5852, ), ( Token( "text_contains_any", ), - 5640..5657, + 5853..5870, ), ( Token( "(", ), - 5657..5658, + 5870..5871, ), ( Token( "source", ), - 5658..5664, + 5871..5877, ), ( Token( ":", ), - 5664..5665, + 5877..5878, ), ( Token( "Text", ), - 5666..5670, + 5879..5883, ), ( Token( ",", ), - 5670..5671, + 5883..5884, ), ( Token( "searches", ), - 5672..5680, + 5885..5893, ), ( Token( ":", ), - 5680..5681, + 5893..5894, ), ( Token( "[", ), - 5682..5683, + 5895..5896, ), ( Token( "Text", ), - 5683..5687, + 5896..5900, ), ( Token( "]", ), - 5687..5688, + 5900..5901, ), ( Token( ")", ), - 5688..5689, + 5901..5902, ), ( Token( ":", ), - 5689..5690, + 5902..5903, ), ( Token( "Bool", ), - 5691..5695, + 5904..5908, ), ( Token( "{", ), - 5696..5697, + 5909..5910, ), ( Token( "for", ), - 5702..5705, + 5915..5918, ), ( Token( "search", ), - 5706..5712, + 5919..5925, ), ( Token( "in", ), - 5713..5715, + 5926..5928, ), ( Token( "searches", ), - 5716..5724, + 5929..5937, ), ( Token( "{", ), - 5725..5726, + 5938..5939, ), ( Token( "if", ), - 5735..5737, + 5948..5950, ), ( Token( "text_contains", ), - 5738..5751, + 5951..5964, ), ( Token( "(", ), - 5751..5752, + 5964..5965, ), ( Token( "source", ), - 5752..5758, + 5965..5971, ), ( Token( ",", ), - 5758..5759, + 5971..5972, ), ( Token( "search", ), - 5760..5766, + 5973..5979, ), ( Token( ")", ), - 5766..5767, + 5979..5980, ), ( Token( "{", ), - 5768..5769, + 5981..5982, ), ( Token( "return", ), - 5782..5788, + 5995..6001, ), ( Token( "true", ), - 5789..5793, + 6002..6006, ), ( Token( "}", ), - 5802..5803, + 6015..6016, ), ( Token( "}", ), - 5808..5809, + 6021..6022, ), ( Token( "return", ), - 5815..5821, + 6028..6034, ), ( Token( "false", ), - 5822..5827, + 6035..6040, ), ( Token( "}", ), - 5828..5829, + 6041..6042, ), ( Token( "/// Checks if all the arrays values are in the string\n", ), - 5831..5885, + 6044..6098, ), ( Token( "pub", ), - 5885..5888, + 6098..6101, ), ( Token( "fun", ), - 5889..5892, + 6102..6105, ), ( Token( "text_contains_all", ), - 5893..5910, + 6106..6123, ), ( Token( "(", ), - 5910..5911, + 6123..6124, ), ( Token( "source", ), - 5911..5917, + 6124..6130, ), ( Token( ":", ), - 5917..5918, + 6130..6131, ), ( Token( "Text", ), - 5919..5923, + 6132..6136, ), ( Token( ",", ), - 5923..5924, + 6136..6137, ), ( Token( "searches", ), - 5925..5933, + 6138..6146, ), ( Token( ":", ), - 5933..5934, + 6146..6147, ), ( Token( "[", ), - 5935..5936, + 6148..6149, ), ( Token( "Text", ), - 5936..5940, + 6149..6153, ), ( Token( "]", ), - 5940..5941, + 6153..6154, ), ( Token( ")", ), - 5941..5942, + 6154..6155, ), ( Token( ":", ), - 5942..5943, + 6155..6156, ), ( Token( "Bool", ), - 5944..5948, + 6157..6161, ), ( Token( "{", ), - 5949..5950, + 6162..6163, ), ( Token( "for", ), - 5955..5958, + 6168..6171, ), ( Token( "search", ), - 5959..5965, + 6172..6178, ), ( Token( "in", ), - 5966..5968, + 6179..6181, ), ( Token( "searches", ), - 5969..5977, + 6182..6190, ), ( Token( "{", ), - 5978..5979, + 6191..6192, ), ( Token( "if", ), - 5988..5990, + 6201..6203, ), ( Token( "not", ), - 5991..5994, + 6204..6207, ), ( Token( "text_contains", ), - 5995..6008, + 6208..6221, ), ( Token( "(", ), - 6008..6009, + 6221..6222, ), ( Token( "source", ), - 6009..6015, + 6222..6228, ), ( Token( ",", ), - 6015..6016, + 6228..6229, ), ( Token( "search", ), - 6017..6023, + 6230..6236, ), ( Token( ")", ), - 6023..6024, + 6236..6237, ), ( Token( "{", ), - 6025..6026, + 6238..6239, ), ( Token( "return", ), - 6039..6045, + 6252..6258, ), ( Token( "false", ), - 6046..6051, + 6259..6264, ), ( Token( "}", ), - 6060..6061, + 6273..6274, ), ( Token( "}", ), - 6066..6067, + 6279..6280, ), ( Token( "return", ), - 6073..6079, + 6285..6291, ), ( Token( "true", ), - 6080..6084, + 6292..6296, ), ( Token( "}", ), - 6085..6086, + 6297..6298, ), ( Token( - "/// Match all occurences of a regex pattern.\n", + "/// Match all occurrences of a regex pattern.\n", ), - 6088..6133, + 6300..6346, ), ( Token( "///\n", ), - 6133..6137, + 6346..6350, ), ( Token( "/// Function uses `sed`\n", ), - 6137..6161, + 6350..6374, ), ( Token( "pub", ), - 6161..6164, + 6374..6377, ), ( Token( "fun", ), - 6165..6168, + 6378..6381, ), ( Token( "match_regex", ), - 6169..6180, + 6382..6393, ), ( Token( "(", ), - 6180..6181, + 6393..6394, ), ( Token( "source", ), - 6181..6187, + 6394..6400, ), ( Token( ":", ), - 6187..6188, + 6400..6401, ), ( Token( "Text", ), - 6189..6193, + 6402..6406, ), ( Token( ",", ), - 6193..6194, + 6406..6407, ), ( Token( "search", ), - 6195..6201, + 6408..6414, ), ( Token( ":", ), - 6201..6202, + 6414..6415, ), ( Token( "Text", ), - 6203..6207, + 6416..6420, ), ( Token( ",", ), - 6207..6208, + 6420..6421, ), ( Token( "extended", ), - 6209..6217, + 6422..6430, ), ( Token( ":", ), - 6217..6218, + 6430..6431, ), ( Token( "Bool", ), - 6219..6223, + 6432..6436, ), ( Token( "=", ), - 6224..6225, + 6437..6438, ), ( Token( "false", ), - 6226..6231, + 6439..6444, ), ( Token( ")", ), - 6231..6232, + 6444..6445, ), ( Token( ":", ), - 6232..6233, + 6445..6446, ), ( Token( "Bool", ), - 6234..6238, + 6447..6451, ), ( Token( "{", ), - 6239..6240, + 6452..6453, ), ( Token( "trust", ), - 6245..6250, + 6458..6463, ), ( Token( "{", ), - 6251..6252, + 6464..6465, ), ( Token( "const", ), - 6261..6266, + 6474..6479, ), ( Token( "sed_version", ), - 6267..6278, + 6480..6491, ), ( Token( "=", ), - 6279..6280, + 6492..6493, ), ( Token( "sed_version", ), - 6281..6292, + 6494..6505, ), ( Token( "(", ), - 6292..6293, + 6505..6506, ), ( Token( ")", ), - 6293..6294, + 6506..6507, ), ( Token( "search", ), - 6303..6309, + 6516..6522, ), ( Token( "=", ), - 6310..6311, + 6523..6524, ), ( Token( "replace", ), - 6312..6319, + 6525..6532, ), ( Token( "(", ), - 6319..6320, + 6532..6533, ), ( Token( "search", ), - 6320..6326, + 6533..6539, ), ( Token( ",", ), - 6326..6327, + 6539..6540, ), ( Token( "\"", ), - 6328..6329, + 6541..6542, ), ( Token( "/", ), - 6329..6330, + 6542..6543, ), ( Token( "\"", ), - 6330..6331, + 6543..6544, ), ( Token( ",", ), - 6331..6332, + 6544..6545, ), ( Token( "\"", ), - 6333..6334, + 6546..6547, ), ( Token( "\\", ), - 6334..6335, + 6547..6548, ), ( Token( "/", ), - 6335..6336, + 6548..6549, ), ( Token( "\"", ), - 6336..6337, + 6549..6550, ), ( Token( ")", ), - 6337..6338, + 6550..6551, ), ( Token( "let", ), - 6347..6350, + 6560..6563, ), ( Token( "output", ), - 6351..6357, + 6564..6570, ), ( Token( "=", ), - 6358..6359, + 6571..6572, ), ( Token( "\"", ), - 6360..6361, + 6573..6574, ), ( Token( "\"", ), - 6361..6362, + 6574..6575, ), ( Token( "if", ), - 6371..6373, + 6584..6586, ), ( Token( "sed_version", ), - 6374..6385, + 6587..6598, ), ( Token( "==", ), - 6386..6388, + 6599..6601, ), ( Token( "SED_VERSION_GNU", ), - 6389..6404, + 6602..6617, ), ( Token( "or", ), - 6405..6407, + 6618..6620, ), ( Token( "sed_version", ), - 6408..6419, + 6621..6632, ), ( Token( "==", ), - 6420..6422, + 6633..6635, ), ( Token( "SED_VERSION_BUSYBOX", ), - 6423..6442, + 6636..6655, ), ( Token( "{", ), - 6443..6444, + 6656..6657, ), ( Token( "// '\\b' is supported but not in POSIX standards. Disable it\n", ), - 6457..6517, + 6670..6730, ), ( Token( "search", ), - 6529..6535, + 6742..6748, ), ( Token( "=", ), - 6536..6537, + 6749..6750, ), ( Token( "replace", ), - 6538..6545, + 6751..6758, ), ( Token( "(", ), - 6545..6546, + 6758..6759, ), ( Token( "search", ), - 6546..6552, + 6759..6765, ), ( Token( ",", ), - 6552..6553, + 6765..6766, ), ( Token( "\"", ), - 6554..6555, + 6767..6768, ), ( Token( "\\", ), - 6555..6556, + 6768..6769, ), ( Token( "\\", ), - 6556..6557, + 6769..6770, ), ( Token( "b", ), - 6557..6558, + 6770..6771, ), ( Token( "\"", ), - 6558..6559, + 6771..6772, ), ( Token( ",", ), - 6559..6560, + 6772..6773, ), ( Token( "\"", ), - 6561..6562, + 6774..6775, ), ( Token( "\\", ), - 6562..6563, + 6775..6776, ), ( Token( "\\", ), - 6563..6564, + 6776..6777, ), ( Token( "\\", ), - 6564..6565, + 6777..6778, ), ( Token( "b", ), - 6565..6566, + 6778..6779, ), ( Token( "\"", ), - 6566..6567, + 6779..6780, ), ( Token( ")", ), - 6567..6568, + 6780..6781, ), ( Token( "}", ), - 6577..6578, + 6790..6791, ), ( Token( "if", ), - 6587..6589, + 6800..6802, ), ( Token( "extended", ), - 6590..6598, + 6803..6811, ), ( Token( "{", ), - 6599..6600, + 6812..6813, ), ( Token( "// GNU sed versions 4.0 through 4.2 support extended regex syntax,\n", ), - 6613..6680, + 6826..6893, ), ( Token( "// but only via the \"-r\" option\n", ), - 6692..6724, + 6905..6937, ), ( Token( "if", ), - 6736..6738, + 6949..6951, ), ( Token( "sed_version", ), - 6739..6750, + 6952..6963, ), ( Token( "==", ), - 6751..6753, + 6964..6966, ), ( Token( "SED_VERSION_GNU", ), - 6754..6769, + 6967..6982, ), ( Token( "{", ), - 6770..6771, + 6983..6984, ), ( Token( "// '\\b' is not in POSIX standards. Disable it\n", ), - 6788..6834, + 7001..7047, ), ( Token( "search", ), - 6850..6856, + 7063..7069, ), ( Token( "=", ), - 6857..6858, + 7070..7071, ), ( Token( "replace", ), - 6859..6866, + 7072..7079, ), ( Token( "(", ), - 6866..6867, + 7079..7080, ), ( Token( "search", ), - 6867..6873, + 7080..7086, ), ( Token( ",", ), - 6873..6874, + 7086..7087, ), ( Token( "\"", ), - 6875..6876, + 7088..7089, ), ( Token( "\\", ), - 6876..6877, + 7089..7090, ), ( Token( "b", ), - 6877..6878, + 7090..7091, ), ( Token( "\"", ), - 6878..6879, + 7091..7092, ), ( Token( ",", ), - 6879..6880, + 7092..7093, ), ( Token( "\"", ), - 6881..6882, + 7094..7095, ), ( Token( "\\", ), - 6882..6883, + 7095..7096, ), ( Token( "\\", ), - 6883..6884, + 7096..7097, ), ( Token( "b", ), - 6884..6885, + 7097..7098, ), ( Token( "\"", ), - 6885..6886, + 7098..7099, ), ( Token( ")", ), - 6886..6887, + 7099..7100, ), ( Token( "output", ), - 6904..6910, + 7117..7123, ), ( Token( "=", ), - 6911..6912, + 7124..7125, ), ( Token( "$", ), - 6913..6914, + 7126..7127, ), ( Token( "echo", ), - 6915..6919, + 7128..7132, ), ( Token( "\"", ), - 6920..6921, + 7133..7134, ), ( Token( "{", ), - 6921..6922, + 7134..7135, ), ( Token( "source", ), - 6922..6928, + 7135..7141, ), ( Token( "}", ), - 6928..6929, + 7141..7142, ), ( Token( "\"", ), - 6929..6930, + 7142..7143, ), ( Token( "|", ), - 6931..6932, + 7144..7145, ), ( Token( "sed", ), - 6933..6936, + 7146..7149, ), ( Token( "-", ), - 6937..6938, + 7150..7151, ), ( Token( "r", ), - 6938..6939, + 7151..7152, ), ( Token( "-", ), - 6940..6941, + 7153..7154, ), ( Token( "ne", ), - 6941..6943, + 7154..7156, ), ( Token( "\"", ), - 6944..6945, + 7157..7158, ), ( Token( "/", ), - 6945..6946, + 7158..7159, ), ( Token( "{", ), - 6946..6947, + 7159..7160, ), ( Token( "search", ), - 6947..6953, + 7160..7166, ), ( Token( "}", ), - 6953..6954, + 7166..7167, ), ( Token( "/", ), - 6954..6955, + 7167..7168, ), ( Token( "p", ), - 6955..6956, + 7168..7169, ), ( Token( "\"", ), - 6956..6957, + 7169..7170, ), ( Token( "$", ), - 6958..6959, + 7171..7172, ), ( Token( "}", ), - 6972..6973, + 7185..7186, ), ( Token( "else", ), - 6974..6978, + 7187..7191, ), ( Token( "{", ), - 6979..6980, + 7192..7193, ), ( Token( "output", ), - 6997..7003, + 7210..7216, ), ( Token( "=", ), - 7004..7005, + 7217..7218, ), ( Token( "$", ), - 7006..7007, + 7219..7220, ), ( Token( "echo", ), - 7008..7012, + 7221..7225, ), ( Token( "\"", ), - 7013..7014, + 7226..7227, ), ( Token( "{", ), - 7014..7015, + 7227..7228, ), ( Token( "source", ), - 7015..7021, + 7228..7234, ), ( Token( "}", ), - 7021..7022, + 7234..7235, ), ( Token( "\"", ), - 7022..7023, + 7235..7236, ), ( Token( "|", ), - 7024..7025, + 7237..7238, ), ( Token( "sed", ), - 7026..7029, + 7239..7242, ), ( Token( "-", ), - 7030..7031, + 7243..7244, ), ( Token( "E", ), - 7031..7032, + 7244..7245, ), ( Token( "-", ), - 7033..7034, + 7246..7247, ), ( Token( "ne", ), - 7034..7036, + 7247..7249, ), ( Token( "\"", ), - 7037..7038, + 7250..7251, ), ( Token( "/", ), - 7038..7039, + 7251..7252, ), ( Token( "{", ), - 7039..7040, + 7252..7253, ), ( Token( "search", ), - 7040..7046, + 7253..7259, ), ( Token( "}", ), - 7046..7047, + 7259..7260, ), ( Token( "/", ), - 7047..7048, + 7260..7261, ), ( Token( "p", ), - 7048..7049, + 7261..7262, ), ( Token( "\"", ), - 7049..7050, + 7262..7263, ), ( Token( "$", ), - 7051..7052, + 7264..7265, ), ( Token( "}", ), - 7065..7066, + 7278..7279, ), ( Token( "}", ), - 7075..7076, + 7288..7289, ), ( Token( "else", ), - 7077..7081, + 7290..7294, ), ( Token( "{", ), - 7082..7083, + 7295..7296, ), ( Token( "if", ), - 7096..7098, + 7309..7311, ), ( Token( "sed_version", ), - 7099..7110, + 7312..7323, ), ( Token( "==", ), - 7111..7113, + 7324..7326, ), ( Token( "SED_VERSION_GNU", ), - 7114..7129, + 7327..7342, ), ( Token( "or", ), - 7130..7132, + 7343..7345, ), ( Token( "sed_version", ), - 7133..7144, + 7346..7357, ), ( Token( "==", ), - 7145..7147, + 7358..7360, ), ( Token( "SED_VERSION_BUSYBOX", ), - 7148..7167, + 7361..7380, ), ( Token( "{", ), - 7168..7169, + 7381..7382, ), ( Token( "// GNU Sed BRE handle \\| as a metacharacter, but it is not POSIX standands. Disable it\n", ), - 7186..7273, + 7399..7486, ), ( Token( "search", ), - 7289..7295, + 7502..7508, ), ( Token( "=", ), - 7296..7297, + 7509..7510, ), ( Token( "replace", ), - 7298..7305, + 7511..7518, ), ( Token( "(", ), - 7305..7306, + 7518..7519, ), ( Token( "search", ), - 7306..7312, + 7519..7525, ), ( Token( ",", ), - 7312..7313, + 7525..7526, ), ( Token( "\"", ), - 7314..7315, + 7527..7528, ), ( Token( "\\", ), - 7315..7316, + 7528..7529, ), ( Token( "|", ), - 7316..7317, + 7529..7530, ), ( Token( "\"", ), - 7317..7318, + 7530..7531, ), ( Token( ",", ), - 7318..7319, + 7531..7532, ), ( Token( "\"", ), - 7320..7321, + 7533..7534, ), ( Token( "|", ), - 7321..7322, + 7534..7535, ), ( Token( "\"", ), - 7322..7323, + 7535..7536, ), ( Token( ")", ), - 7323..7324, + 7536..7537, ), ( Token( "}", ), - 7337..7338, + 7550..7551, ), ( Token( "output", ), - 7351..7357, + 7564..7570, ), ( Token( "=", ), - 7358..7359, + 7571..7572, ), ( Token( "$", ), - 7360..7361, + 7573..7574, ), ( Token( "echo", ), - 7362..7366, + 7575..7579, ), ( Token( "\"", ), - 7367..7368, + 7580..7581, ), ( Token( "{", ), - 7368..7369, + 7581..7582, ), ( Token( "source", ), - 7369..7375, + 7582..7588, ), ( Token( "}", ), - 7375..7376, + 7588..7589, ), ( Token( "\"", ), - 7376..7377, + 7589..7590, ), ( Token( "|", ), - 7378..7379, + 7591..7592, ), ( Token( "sed", ), - 7380..7383, + 7593..7596, ), ( Token( "-", ), - 7384..7385, + 7597..7598, ), ( Token( "ne", ), - 7385..7387, + 7598..7600, ), ( Token( "\"", ), - 7388..7389, + 7601..7602, ), ( Token( "/", ), - 7389..7390, + 7602..7603, ), ( Token( "{", ), - 7390..7391, + 7603..7604, ), ( Token( "search", ), - 7391..7397, + 7604..7610, ), ( Token( "}", ), - 7397..7398, + 7610..7611, ), ( Token( "/", ), - 7398..7399, + 7611..7612, ), ( Token( "p", ), - 7399..7400, + 7612..7613, ), ( Token( "\"", ), - 7400..7401, + 7613..7614, ), ( Token( "$", ), - 7402..7403, + 7615..7616, ), ( Token( "}", ), - 7412..7413, + 7625..7626, ), ( Token( "if", ), - 7422..7424, + 7635..7637, ), ( Token( "output", ), - 7425..7431, + 7638..7644, ), ( Token( "!=", ), - 7432..7434, + 7645..7647, ), ( Token( "\"", ), - 7435..7436, + 7648..7649, ), ( Token( "\"", ), - 7436..7437, + 7649..7650, ), ( Token( "{", ), - 7438..7439, + 7651..7652, ), ( Token( "return", ), - 7452..7458, + 7665..7671, ), ( Token( "true", ), - 7459..7463, + 7672..7676, ), ( Token( "}", ), - 7472..7473, + 7685..7686, ), ( Token( "}", ), - 7478..7479, + 7691..7692, ), ( Token( "return", ), - 7484..7490, + 7697..7703, ), ( Token( "false", ), - 7491..7496, + 7704..7709, ), ( Token( "}", ), - 7497..7498, + 7710..7711, ), ( Token( "/// Checks if an array value (with regular expression) is in the text.\n", ), - 7500..7571, + 7713..7784, ), ( Token( "pub", ), - 7571..7574, + 7784..7787, ), ( Token( "fun", ), - 7575..7578, + 7788..7791, ), ( Token( "match_regex_any", ), - 7579..7594, + 7792..7807, ), ( Token( "(", ), - 7594..7595, + 7807..7808, ), ( Token( "text", ), - 7595..7599, + 7808..7812, ), ( Token( ":", ), - 7599..7600, + 7812..7813, ), ( Token( "Text", ), - 7601..7605, + 7814..7818, ), ( Token( ",", ), - 7605..7606, + 7818..7819, ), ( Token( "terms", ), - 7607..7612, + 7820..7825, ), ( Token( ":", ), - 7612..7613, + 7825..7826, ), ( Token( "[", ), - 7614..7615, + 7827..7828, ), ( Token( "Text", ), - 7615..7619, + 7828..7832, ), ( Token( "]", ), - 7619..7620, + 7832..7833, ), ( Token( ")", ), - 7620..7621, + 7833..7834, ), ( Token( ":", ), - 7621..7622, + 7834..7835, ), ( Token( "Bool", ), - 7623..7627, + 7836..7840, ), ( Token( "{", ), - 7628..7629, + 7841..7842, ), ( Token( "for", ), - 7634..7637, + 7847..7850, ), ( Token( "term", ), - 7638..7642, + 7851..7855, ), ( Token( "in", ), - 7643..7645, + 7856..7858, ), ( Token( "terms", ), - 7646..7651, + 7859..7864, ), ( Token( "{", ), - 7652..7653, + 7865..7866, ), ( Token( "if", ), - 7662..7664, + 7875..7877, ), ( Token( "match_regex", ), - 7665..7676, + 7878..7889, ), ( Token( "(", ), - 7676..7677, + 7889..7890, ), ( Token( "text", ), - 7677..7681, + 7890..7894, ), ( Token( ",", ), - 7681..7682, + 7894..7895, ), ( Token( "term", ), - 7683..7687, + 7896..7900, ), ( Token( ",", ), - 7687..7688, + 7900..7901, ), ( Token( "false", ), - 7689..7694, + 7902..7907, ), ( Token( ")", ), - 7694..7695, + 7907..7908, ), ( Token( "{", ), - 7696..7697, + 7909..7910, ), ( Token( "return", ), - 7710..7716, + 7923..7929, ), ( Token( "true", ), - 7717..7721, + 7930..7934, ), ( Token( "}", ), - 7730..7731, + 7943..7944, ), ( Token( "}", ), - 7736..7737, + 7949..7950, ), ( Token( "return", ), - 7743..7749, + 7956..7962, ), ( Token( "false", ), - 7750..7755, + 7963..7968, ), ( Token( "}", ), - 7756..7757, + 7969..7970, ), ( Token( "/// Reverses text using `rev`.\n", ), - 7759..7790, + 7972..8003, ), ( Token( "pub", ), - 7790..7793, + 8003..8006, ), ( Token( "fun", ), - 7794..7797, + 8007..8010, ), ( Token( "reversed", ), - 7798..7806, + 8011..8019, ), ( Token( "(", ), - 7806..7807, + 8019..8020, ), ( Token( "text", ), - 7807..7811, + 8020..8024, ), ( Token( ":", ), - 7811..7812, + 8024..8025, ), ( Token( "Text", ), - 7813..7817, + 8026..8030, ), ( Token( ")", ), - 7817..7818, + 8030..8031, ), ( Token( ":", ), - 7818..7819, + 8031..8032, ), ( Token( "Text", ), - 7820..7824, + 8033..8037, ), ( Token( "{", ), - 7825..7826, + 8038..8039, ), ( Token( "return", ), - 7831..7837, + 8044..8050, ), ( Token( "trust", ), - 7838..7843, + 8051..8056, ), ( Token( "$", ), - 7844..7845, + 8057..8058, ), ( Token( "echo", ), - 7846..7850, + 8059..8063, ), ( Token( "\"", ), - 7851..7852, + 8064..8065, ), ( Token( "{", ), - 7852..7853, + 8065..8066, ), ( Token( "text", ), - 7853..7857, + 8066..8070, ), ( Token( "}", ), - 7857..7858, + 8070..8071, ), ( Token( "\"", ), - 7858..7859, + 8071..8072, ), ( Token( "|", ), - 7860..7861, + 8073..8074, ), ( Token( "rev", ), - 7862..7865, + 8075..8078, ), ( Token( "$", ), - 7866..7867, + 8079..8080, ), ( Token( "}", ), - 7868..7869, + 8081..8082, ), ( Token( "/// Checks if text starts with a value.\n", ), - 7871..7911, + 8084..8124, ), ( Token( "pub", ), - 7911..7914, + 8124..8127, ), ( Token( "fun", ), - 7915..7918, + 8128..8131, ), ( Token( "starts_with", ), - 7919..7930, + 8132..8143, ), ( Token( "(", ), - 7930..7931, + 8143..8144, ), ( Token( "text", ), - 7931..7935, + 8144..8148, ), ( Token( ":", ), - 7935..7936, + 8148..8149, ), ( Token( "Text", ), - 7937..7941, + 8150..8154, ), ( Token( ",", ), - 7941..7942, + 8154..8155, ), ( Token( "prefix", ), - 7943..7949, + 8156..8162, ), ( Token( ":", ), - 7949..7950, + 8162..8163, ), ( Token( "Text", ), - 7951..7955, + 8164..8168, ), ( Token( ")", ), - 7955..7956, + 8168..8169, ), ( Token( ":", ), - 7956..7957, + 8169..8170, ), ( Token( "Bool", ), - 7958..7962, + 8171..8175, ), ( Token( "{", ), - 7963..7964, + 8176..8177, ), ( Token( "let", ), - 7967..7970, + 8180..8183, ), ( Token( "result", ), - 7971..7977, + 8184..8190, ), ( Token( "=", ), - 7978..7979, + 8191..8192, ), ( Token( "trust", ), - 7980..7985, + 8193..8198, ), ( Token( "$", ), - 7986..7987, + 8199..8200, ), ( Token( "if", ), - 7988..7990, + 8201..8203, ), ( Token( "[", ), - 7991..7992, + 8204..8205, ), ( Token( "[", ), - 7992..7993, + 8205..8206, ), ( Token( "\"", ), - 7994..7995, + 8207..8208, ), ( Token( "{", ), - 7995..7996, + 8208..8209, ), ( Token( "text", ), - 7996..8000, + 8209..8213, ), ( Token( "}", ), - 8000..8001, + 8213..8214, ), ( Token( "\"", ), - 8001..8002, + 8214..8215, ), ( Token( "==", ), - 8003..8005, + 8216..8218, ), ( Token( "\"", ), - 8006..8007, + 8219..8220, ), ( Token( "{", ), - 8007..8008, + 8220..8221, ), ( Token( "prefix", ), - 8008..8014, + 8221..8227, ), ( Token( "}", ), - 8014..8015, + 8227..8228, ), ( Token( "\"", ), - 8015..8016, + 8228..8229, ), ( Token( "*", ), - 8016..8017, + 8229..8230, ), ( Token( "]", ), - 8018..8019, + 8231..8232, ), ( Token( "]", ), - 8019..8020, + 8232..8233, ), ( Token( ";", ), - 8020..8021, + 8233..8234, ), ( Token( "then", ), - 8022..8026, + 8235..8239, ), ( Token( "echo", ), - 8031..8035, + 8244..8248, ), ( Token( "1", ), - 8036..8037, + 8249..8250, ), ( Token( "fi", ), - 8040..8042, + 8253..8255, ), ( Token( "$", ), - 8043..8044, + 8256..8257, ), ( Token( "return", ), - 8048..8054, + 8261..8267, ), ( Token( "result", ), - 8055..8061, + 8268..8274, ), ( Token( "==", ), - 8062..8064, + 8275..8277, ), ( Token( "\"", ), - 8065..8066, + 8278..8279, ), ( Token( "1", ), - 8066..8067, + 8279..8280, ), ( Token( "\"", ), - 8067..8068, + 8280..8281, ), ( Token( "}", ), - 8069..8070, + 8282..8283, ), ( Token( "/// Checks if text ends with a value.\n", ), - 8072..8110, + 8285..8323, ), ( Token( "pub", ), - 8110..8113, + 8323..8326, ), ( Token( "fun", ), - 8114..8117, + 8327..8330, ), ( Token( "ends_with", ), - 8118..8127, + 8331..8340, ), ( Token( "(", ), - 8127..8128, + 8340..8341, ), ( Token( "text", ), - 8128..8132, + 8341..8345, ), ( Token( ":", ), - 8132..8133, + 8345..8346, ), ( Token( "Text", ), - 8134..8138, + 8347..8351, ), ( Token( ",", ), - 8138..8139, + 8351..8352, ), ( Token( "suffix", ), - 8140..8146, + 8353..8359, ), ( Token( ":", ), - 8146..8147, + 8359..8360, ), ( Token( "Text", ), - 8148..8152, + 8361..8365, ), ( Token( ")", ), - 8152..8153, + 8365..8366, ), ( Token( ":", ), - 8153..8154, + 8366..8367, ), ( Token( "Bool", ), - 8155..8159, + 8368..8372, ), ( Token( "{", ), - 8160..8161, + 8373..8374, ), ( Token( "let", ), - 8164..8167, + 8377..8380, ), ( Token( "result", ), - 8168..8174, + 8381..8387, ), ( Token( "=", ), - 8175..8176, + 8388..8389, ), ( Token( "trust", ), - 8177..8182, + 8390..8395, ), ( Token( "$", ), - 8183..8184, + 8396..8397, ), ( Token( "if", ), - 8185..8187, + 8398..8400, ), ( Token( "[", ), - 8188..8189, + 8401..8402, ), ( Token( "[", ), - 8189..8190, + 8402..8403, ), ( Token( "\"", ), - 8191..8192, + 8404..8405, ), ( Token( "{", ), - 8192..8193, + 8405..8406, ), ( Token( "text", ), - 8193..8197, + 8406..8410, ), ( Token( "}", ), - 8197..8198, + 8410..8411, ), ( Token( "\"", ), - 8198..8199, + 8411..8412, ), ( Token( "==", ), - 8200..8202, + 8413..8415, ), ( Token( "*", ), - 8203..8204, + 8416..8417, ), ( Token( "\"", ), - 8204..8205, + 8417..8418, ), ( Token( "{", ), - 8205..8206, + 8418..8419, ), ( Token( "suffix", ), - 8206..8212, + 8419..8425, ), ( Token( "}", ), - 8212..8213, + 8425..8426, ), ( Token( "\"", ), - 8213..8214, + 8426..8427, ), ( Token( "]", ), - 8215..8216, + 8428..8429, ), ( Token( "]", ), - 8216..8217, + 8429..8430, ), ( Token( ";", ), - 8217..8218, + 8430..8431, ), ( Token( "then", ), - 8219..8223, + 8432..8436, ), ( Token( "echo", ), - 8228..8232, + 8441..8445, ), ( Token( "1", ), - 8233..8234, + 8446..8447, ), ( Token( "fi", ), - 8237..8239, + 8450..8452, ), ( Token( "$", ), - 8240..8241, + 8453..8454, ), ( Token( "return", ), - 8245..8251, + 8458..8464, ), ( Token( "result", ), - 8252..8258, + 8465..8471, ), ( Token( "==", ), - 8259..8261, + 8472..8474, ), ( Token( "\"", ), - 8262..8263, + 8475..8476, ), ( Token( "1", ), - 8263..8264, + 8476..8477, ), ( Token( "\"", ), - 8264..8265, + 8477..8478, ), ( Token( "}", ), - 8266..8267, + 8479..8480, ), ( Token( "/// Returns a substring from `text` starting at the given `index` (0-based).\n", ), - 8269..8346, + 8482..8559, ), ( Token( "///\n", ), - 8346..8350, + 8559..8563, ), ( Token( "/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.\n", ), - 8350..8462, + 8563..8675, ), ( Token( "/// If `length` is provided, the substring will include `length` characters; otherwise, it slices to the end of `text`.\n", ), - 8462..8582, + 8675..8795, ), ( Token( "/// If `length` is negative, an empty string is returned.\n", ), - 8582..8640, + 8795..8853, ), ( Token( "pub", ), - 8640..8643, + 8853..8856, ), ( Token( "fun", ), - 8644..8647, + 8857..8860, ), ( Token( "slice", ), - 8648..8653, + 8861..8866, ), ( Token( "(", ), - 8653..8654, + 8866..8867, ), ( Token( "text", ), - 8654..8658, + 8867..8871, ), ( Token( ":", ), - 8658..8659, + 8871..8872, ), ( Token( "Text", ), - 8660..8664, + 8873..8877, ), ( Token( ",", ), - 8664..8665, + 8877..8878, ), ( Token( "index", ), - 8666..8671, + 8879..8884, ), ( Token( ":", ), - 8671..8672, + 8884..8885, ), ( Token( "Int", ), - 8673..8676, + 8886..8889, ), ( Token( ",", ), - 8676..8677, + 8889..8890, ), ( Token( "length", ), - 8678..8684, + 8891..8897, ), ( Token( ":", ), - 8684..8685, + 8897..8898, ), ( Token( "Int", ), - 8686..8689, + 8899..8902, ), ( Token( "=", ), - 8690..8691, + 8903..8904, ), ( Token( "0", ), - 8692..8693, + 8905..8906, ), ( Token( ")", ), - 8693..8694, + 8906..8907, ), ( Token( ":", ), - 8694..8695, + 8907..8908, ), ( Token( "Text", ), - 8696..8700, + 8909..8913, ), ( Token( "{", ), - 8701..8702, + 8914..8915, ), ( Token( "if", ), - 8707..8709, + 8920..8922, ), ( Token( "length", ), - 8710..8716, + 8923..8929, ), ( Token( "==", ), - 8717..8719, + 8930..8932, ), ( Token( "0", ), - 8720..8721, + 8933..8934, ), ( Token( ":", ), - 8721..8722, + 8934..8935, ), ( Token( "length", ), - 8723..8729, + 8936..8942, ), ( Token( "=", ), - 8730..8731, + 8943..8944, ), ( Token( "len", ), - 8732..8735, + 8945..8948, ), ( Token( "(", ), - 8735..8736, + 8948..8949, ), ( Token( "text", ), - 8736..8740, + 8949..8953, ), ( Token( ")", ), - 8740..8741, + 8953..8954, ), ( Token( "-", ), - 8742..8743, + 8955..8956, ), ( Token( "index", ), - 8744..8749, + 8957..8962, ), ( Token( "if", ), - 8754..8756, + 8967..8969, ), ( Token( "length", ), - 8757..8763, + 8970..8976, ), ( Token( "<=", ), - 8764..8766, + 8977..8979, ), ( Token( "0", ), - 8767..8768, + 8980..8981, ), ( Token( ":", ), - 8768..8769, + 8981..8982, ), ( Token( "return", ), - 8770..8776, + 8983..8989, ), ( Token( "\"", ), - 8777..8778, + 8990..8991, ), ( Token( "\"", ), - 8778..8779, + 8991..8992, ), ( Token( "return", ), - 8784..8790, + 8997..9003, ), ( Token( "trust", ), - 8791..8796, + 9004..9009, ), ( Token( "$", ), - 8797..8798, + 9010..9011, ), ( Token( "printf", ), - 8799..8805, + 9012..9018, ), ( Token( "\"", ), - 8806..8807, + 9019..9020, ), ( Token( "%", ), - 8807..8808, + 9020..9021, ), ( Token( ".", ), - 8808..8809, + 9021..9022, ), ( Token( "{", ), - 8809..8810, + 9022..9023, ), ( Token( "length", ), - 8810..8816, + 9023..9029, ), ( Token( "}", ), - 8816..8817, + 9029..9030, ), ( Token( "s", ), - 8817..8818, + 9030..9031, ), ( Token( "\"", ), - 8818..8819, + 9031..9032, ), ( Token( "\"", ), - 8820..8821, + 9033..9034, ), ( Token( "\\", ), - 8821..8822, + 9034..9035, ), ( Token( "$", ), - 8822..8823, + 9035..9036, ), ( Token( "\\", ), - 8823..8824, + 9036..9037, ), ( Token( "{", ), - 8824..8825, + 9037..9038, ), ( Token( "text", ), - 8825..8829, + 9038..9042, ), ( Token( ":", ), - 8829..8830, + 9042..9043, ), ( Token( "{", ), - 8830..8831, + 9044..9045, ), ( Token( "index", ), - 8831..8836, + 9045..9050, ), ( Token( "}", ), - 8836..8837, + 9050..9051, ), ( Token( "}", ), - 8837..8838, + 9051..9052, ), ( Token( "\"", ), - 8838..8839, + 9052..9053, ), ( Token( "$", ), - 8840..8841, + 9054..9055, ), ( Token( "}", ), - 8842..8843, + 9056..9057, ), ( Token( "/// Returns the character from `text` at the specified `index` (0-based).\n", ), - 8845..8919, + 9059..9133, ), ( Token( "///\n", ), - 8919..8923, + 9133..9137, ), ( Token( "/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.\n", ), - 8923..9035, + 9137..9249, ), ( Token( "pub", ), - 9035..9038, + 9249..9252, ), ( Token( "fun", ), - 9039..9042, + 9253..9256, ), ( Token( "char_at", ), - 9043..9050, + 9257..9264, ), ( Token( "(", ), - 9050..9051, + 9264..9265, ), ( Token( "text", ), - 9051..9055, + 9265..9269, ), ( Token( ":", ), - 9055..9056, + 9269..9270, ), ( Token( "Text", ), - 9057..9061, + 9271..9275, ), ( Token( ",", ), - 9061..9062, + 9275..9276, ), ( Token( "index", ), - 9063..9068, + 9277..9282, ), ( Token( ":", ), - 9068..9069, + 9282..9283, ), ( Token( "Int", ), - 9070..9073, + 9284..9287, ), ( Token( ")", ), - 9073..9074, + 9287..9288, ), ( Token( ":", ), - 9074..9075, + 9288..9289, ), ( Token( "Text", ), - 9076..9080, + 9290..9294, ), ( Token( "{", ), - 9081..9082, + 9295..9296, ), ( Token( "return", ), - 9087..9093, + 9301..9307, ), ( Token( "trust", ), - 9094..9099, + 9308..9313, ), ( Token( "$", ), - 9100..9101, + 9314..9315, ), ( Token( "printf", ), - 9102..9108, + 9316..9322, ), ( Token( "\"", ), - 9109..9110, + 9323..9324, ), ( Token( "%", ), - 9110..9111, + 9324..9325, ), ( Token( ".", ), - 9111..9112, + 9325..9326, ), ( Token( "1s", ), - 9112..9114, + 9326..9328, ), ( Token( "\"", ), - 9114..9115, + 9328..9329, ), ( Token( "\"", ), - 9116..9117, + 9330..9331, ), ( Token( "\\", ), - 9117..9118, + 9331..9332, ), ( Token( "$", ), - 9118..9119, + 9332..9333, ), ( Token( "\\", ), - 9119..9120, + 9333..9334, ), ( Token( "{", ), - 9120..9121, + 9334..9335, ), ( Token( "text", ), - 9121..9125, + 9335..9339, ), ( Token( ":", ), - 9125..9126, + 9339..9340, ), ( Token( "{", ), - 9126..9127, + 9341..9342, ), ( Token( "index", ), - 9127..9132, + 9342..9347, ), ( Token( "}", ), - 9132..9133, + 9347..9348, ), ( Token( "}", ), - 9133..9134, + 9348..9349, ), ( Token( "\"", ), - 9134..9135, + 9349..9350, ), ( Token( "$", ), - 9136..9137, + 9351..9352, ), ( Token( "}", ), - 9138..9139, + 9353..9354, ), ( Token( "/// Capitalize the first letter of the given `text`.\n", ), - 9141..9194, + 9356..9409, ), ( Token( "#", ), - 9194..9195, + 9409..9410, ), ( Token( "[", ), - 9195..9196, + 9410..9411, ), ( Token( "allow_absurd_cast", ), - 9196..9213, + 9411..9428, ), ( Token( "]", ), - 9213..9214, + 9428..9429, ), ( Token( "pub", ), - 9215..9218, + 9430..9433, ), ( Token( "fun", ), - 9219..9222, + 9434..9437, ), ( Token( "capitalized", ), - 9223..9234, + 9438..9449, ), ( Token( "(", ), - 9234..9235, + 9449..9450, ), ( Token( "text", ), - 9235..9239, + 9450..9454, ), ( Token( ":", ), - 9239..9240, + 9454..9455, ), ( Token( "Text", ), - 9241..9245, + 9456..9460, ), ( Token( ")", ), - 9245..9246, + 9460..9461, ), ( Token( ":", ), - 9246..9247, + 9461..9462, ), ( Token( "Text", ), - 9248..9252, + 9463..9467, ), ( Token( "{", ), - 9253..9254, + 9468..9469, ), ( Token( "trust", ), - 9259..9264, + 9474..9479, ), ( Token( "{", ), - 9265..9266, + 9480..9481, ), ( Token( "if", ), - 9275..9277, + 9490..9492, ), ( Token( "len", ), - 9278..9281, + 9493..9496, ), ( Token( "(", ), - 9281..9282, + 9496..9497, ), ( Token( "text", ), - 9282..9286, + 9497..9501, ), ( Token( ")", ), - 9286..9287, + 9501..9502, ), ( Token( "==", ), - 9288..9290, + 9503..9505, ), ( Token( "0", ), - 9291..9292, + 9506..9507, ), ( Token( "{", ), - 9293..9294, + 9508..9509, ), ( Token( "return", ), - 9307..9313, + 9522..9528, ), ( Token( "text", ), - 9314..9318, + 9529..9533, ), ( Token( "}", ), - 9327..9328, + 9542..9543, ), ( Token( "if", ), - 9337..9339, + 9552..9554, ), ( Token( "bash_version", ), - 9340..9352, + 9555..9567, ), ( Token( "(", ), - 9352..9353, + 9567..9568, ), ( Token( ")", ), - 9353..9354, + 9568..9569, ), ( Token( ">=", ), - 9355..9357, + 9570..9572, ), ( Token( "[", ), - 9358..9359, + 9573..9574, ), ( Token( "4", ), - 9359..9360, + 9574..9575, ), ( Token( "]", ), - 9360..9361, + 9575..9576, ), ( Token( "{", ), - 9362..9363, + 9577..9578, ), ( Token( "return", ), - 9376..9382, + 9591..9597, ), ( Token( "$", ), - 9383..9384, + 9598..9599, ), ( Token( "echo", ), - 9385..9389, - ), - ( - Token( - "\\", - ), - 9390..9391, + 9600..9604, ), ( Token( "\"", ), - 9391..9392, + 9605..9606, ), ( Token( "\\", ), - 9392..9393, + 9606..9607, ), ( Token( "$", ), - 9393..9394, + 9607..9608, ), ( Token( "\\", ), - 9394..9395, + 9608..9609, ), ( Token( "{", ), - 9395..9396, + 9609..9610, ), ( Token( "{", ), - 9396..9397, + 9610..9611, ), ( Token( "nameof", ), - 9397..9403, + 9611..9617, ), ( Token( "text", ), - 9404..9408, + 9618..9622, ), ( Token( "}", ), - 9408..9409, + 9622..9623, ), ( Token( "^", ), - 9409..9410, + 9623..9624, ), ( Token( "}", ), - 9410..9411, - ), - ( - Token( - "\\", - ), - 9411..9412, + 9624..9625, ), ( Token( "\"", ), - 9412..9413, + 9625..9626, ), ( Token( "$", ), - 9414..9415, + 9627..9628, ), ( Token( "}", ), - 9424..9425, + 9637..9638, ), ( Token( "if", ), - 9434..9436, + 9647..9649, ), ( Token( "sed_version", ), - 9437..9448, + 9650..9661, ), ( Token( "(", ), - 9448..9449, + 9661..9662, ), ( Token( ")", ), - 9449..9450, + 9662..9663, ), ( Token( "==", ), - 9451..9453, + 9664..9666, ), ( Token( "SED_VERSION_GNU", ), - 9454..9469, + 9667..9682, ), ( Token( "{", ), - 9470..9471, + 9683..9684, ), ( Token( "// GNU sed supports \\U\n", ), - 9484..9507, + 9697..9720, ), ( Token( "return", ), - 9519..9525, + 9732..9738, ), ( Token( "$", ), - 9526..9527, + 9739..9740, ), ( Token( "echo", ), - 9528..9532, + 9741..9745, ), ( Token( "\"", ), - 9533..9534, + 9746..9747, ), ( Token( "{", ), - 9534..9535, + 9747..9748, ), ( Token( "text", ), - 9535..9539, + 9748..9752, ), ( Token( "}", ), - 9539..9540, + 9752..9753, ), ( Token( "\"", ), - 9540..9541, + 9753..9754, ), ( Token( "|", ), - 9542..9543, + 9755..9756, ), ( Token( "sed", ), - 9544..9547, + 9757..9760, ), ( Token( "\"", ), - 9548..9549, + 9761..9762, ), ( Token( "s", ), - 9549..9550, + 9762..9763, ), ( Token( "/", ), - 9550..9551, + 9763..9764, ), ( Token( "^", ), - 9551..9552, + 9764..9765, ), ( Token( "\\", ), - 9552..9553, + 9765..9766, ), ( Token( "(", ), - 9553..9554, + 9766..9767, ), ( Token( ".", ), - 9554..9555, + 9767..9768, ), ( Token( "\\", ), - 9555..9556, + 9768..9769, ), ( Token( ")", ), - 9556..9557, + 9769..9770, ), ( Token( "/", ), - 9557..9558, + 9770..9771, ), ( Token( "\\", ), - 9558..9559, + 9771..9772, ), ( Token( "U", ), - 9559..9560, + 9772..9773, ), ( Token( "\\", ), - 9560..9561, + 9773..9774, ), ( Token( "1", ), - 9561..9562, + 9774..9775, ), ( Token( "/", ), - 9562..9563, + 9775..9776, ), ( Token( "\"", ), - 9563..9564, + 9776..9777, ), ( Token( "$", ), - 9565..9566, + 9778..9779, ), ( Token( "}", ), - 9575..9576, + 9788..9789, ), ( Token( "const", ), - 9585..9590, + 9798..9803, ), ( Token( "first_letter", ), - 9591..9603, + 9804..9816, ), ( Token( "=", ), - 9604..9605, + 9817..9818, ), ( Token( "uppercase", ), - 9606..9615, + 9819..9828, ), ( Token( "(", ), - 9615..9616, + 9828..9829, ), ( Token( "char_at", ), - 9616..9623, + 9829..9836, ), ( Token( "(", ), - 9623..9624, + 9836..9837, ), ( Token( "text", ), - 9624..9628, + 9837..9841, ), ( Token( ",", ), - 9628..9629, + 9841..9842, ), ( Token( "0", ), - 9630..9631, + 9843..9844, ), ( Token( ")", ), - 9631..9632, + 9844..9845, ), ( Token( ")", ), - 9632..9633, + 9845..9846, ), ( Token( "return", ), - 9642..9648, + 9855..9861, ), ( Token( "first_letter", ), - 9649..9661, + 9862..9874, ), ( Token( "+", ), - 9662..9663, + 9875..9876, ), ( Token( "slice", ), - 9664..9669, + 9877..9882, ), ( Token( "(", ), - 9669..9670, + 9882..9883, ), ( Token( "text", ), - 9670..9674, + 9883..9887, ), ( Token( ",", ), - 9674..9675, + 9887..9888, ), ( Token( "1", ), - 9676..9677, + 9889..9890, ), ( Token( ")", ), - 9677..9678, + 9890..9891, ), ( Token( "}", ), - 9683..9684, + 9896..9897, ), ( Token( "}", ), - 9685..9686, + 9898..9899, ), ( Token( "/// Pads `text` with the specified `pad` character on left until it reaches the desired `length`.\n", ), - 9688..9786, + 9901..9999, ), ( Token( "pub", ), - 9786..9789, + 9999..10002, ), ( Token( "fun", ), - 9790..9793, + 10003..10006, ), ( Token( "lpad", ), - 9794..9798, + 10007..10011, ), ( Token( "(", ), - 9798..9799, + 10011..10012, ), ( Token( "text", ), - 9799..9803, + 10012..10016, ), ( Token( ":", ), - 9803..9804, + 10016..10017, ), ( Token( "Text", ), - 9805..9809, + 10018..10022, ), ( Token( ",", ), - 9809..9810, + 10022..10023, ), ( Token( "pad", ), - 9811..9814, + 10024..10027, ), ( Token( ":", ), - 9814..9815, + 10027..10028, ), ( Token( "Text", ), - 9816..9820, + 10029..10033, ), ( Token( ",", ), - 9820..9821, + 10033..10034, ), ( Token( "length", ), - 9822..9828, + 10035..10041, ), ( Token( ":", ), - 9828..9829, + 10041..10042, ), ( Token( - "Num", + "Int", ), - 9830..9833, + 10043..10046, ), ( Token( ")", ), - 9833..9834, + 10046..10047, ), ( Token( ":", ), - 9834..9835, + 10047..10048, ), ( Token( "Text", ), - 9836..9840, + 10049..10053, ), ( Token( "{", ), - 9841..9842, + 10054..10055, ), ( Token( "if", ), - 9847..9849, + 10060..10062, ), ( Token( "length", ), - 9850..9856, + 10063..10069, ), ( Token( "<=", ), - 9857..9859, + 10070..10072, ), ( Token( "len", ), - 9860..9863, + 10073..10076, ), ( Token( "(", ), - 9863..9864, + 10076..10077, ), ( Token( "text", ), - 9864..9868, + 10077..10081, ), ( Token( ")", ), - 9868..9869, + 10081..10082, ), ( Token( ":", ), - 9869..9870, + 10082..10083, ), ( Token( "return", ), - 9871..9877, + 10084..10090, ), ( Token( "text", ), - 9878..9882, + 10091..10095, ), ( Token( "length", ), - 9887..9893, + 10100..10106, ), ( Token( "=", ), - 9894..9895, + 10107..10108, ), ( Token( "len", ), - 9896..9899, + 10109..10112, ), ( Token( "(", ), - 9899..9900, + 10112..10113, ), ( Token( "text", ), - 9900..9904, + 10113..10117, ), ( Token( ")", ), - 9904..9905, + 10117..10118, ), ( Token( "-", ), - 9906..9907, + 10119..10120, ), ( Token( "length", ), - 9908..9914, + 10121..10127, ), ( Token( "pad", ), - 9919..9922, + 10132..10135, ), ( Token( "=", ), - 9923..9924, + 10136..10137, ), ( Token( "trust", ), - 9925..9930, + 10138..10143, ), ( Token( "$", ), - 9931..9932, + 10144..10145, ), ( Token( "printf", ), - 9933..9939, + 10146..10152, ), ( Token( "\"", ), - 9940..9941, + 10153..10154, ), ( Token( "%", ), - 9941..9942, + 10154..10155, ), ( Token( "{", ), - 9942..9943, + 10155..10156, ), ( Token( "length", ), - 9943..9949, + 10156..10162, ), ( Token( "}", ), - 9949..9950, + 10162..10163, ), ( Token( "s", ), - 9950..9951, + 10163..10164, ), ( Token( "\"", ), - 9951..9952, + 10164..10165, ), ( Token( "\"", ), - 9953..9954, + 10166..10167, ), ( Token( "\"", ), - 9954..9955, + 10167..10168, ), ( Token( "|", ), - 9956..9957, + 10169..10170, ), ( Token( "tr", ), - 9958..9960, + 10171..10173, ), ( Token( "\"", ), - 9961..9962, + 10174..10175, ), ( Token( "\"", ), - 9963..9964, + 10176..10177, ), ( Token( "\"", ), - 9965..9966, + 10178..10179, ), ( Token( "{", ), - 9966..9967, + 10179..10180, ), ( Token( "pad", ), - 9967..9970, + 10180..10183, ), ( Token( "}", ), - 9970..9971, + 10183..10184, ), ( Token( "\"", ), - 9971..9972, + 10184..10185, ), ( Token( "$", ), - 9973..9974, + 10186..10187, ), ( Token( "return", ), - 9979..9985, + 10192..10198, ), ( Token( "pad", ), - 9986..9989, + 10199..10202, ), ( Token( "+", ), - 9990..9991, + 10203..10204, ), ( Token( "text", ), - 9992..9996, + 10205..10209, ), ( Token( "}", ), - 9997..9998, + 10210..10211, ), ( Token( "/// Pads `text` with the specified `pad` character on the right until it reaches the desired `length`.\n", ), - 10000..10103, + 10213..10316, ), ( Token( "pub", ), - 10103..10106, + 10316..10319, ), ( Token( "fun", ), - 10107..10110, + 10320..10323, ), ( Token( "rpad", ), - 10111..10115, + 10324..10328, ), ( Token( "(", ), - 10115..10116, + 10328..10329, ), ( Token( "text", ), - 10116..10120, + 10329..10333, ), ( Token( ":", ), - 10120..10121, + 10333..10334, ), ( Token( "Text", ), - 10122..10126, + 10335..10339, ), ( Token( ",", ), - 10126..10127, + 10339..10340, ), ( Token( "pad", ), - 10128..10131, + 10341..10344, ), ( Token( ":", ), - 10131..10132, + 10344..10345, ), ( Token( "Text", ), - 10133..10137, + 10346..10350, ), ( Token( ",", ), - 10137..10138, + 10350..10351, ), ( Token( "length", ), - 10139..10145, + 10352..10358, ), ( Token( ":", ), - 10145..10146, + 10358..10359, ), ( Token( - "Num", + "Int", ), - 10147..10150, + 10360..10363, ), ( Token( ")", ), - 10150..10151, + 10363..10364, ), ( Token( ":", ), - 10151..10152, + 10364..10365, ), ( Token( "Text", ), - 10153..10157, + 10366..10370, ), ( Token( "{", ), - 10158..10159, + 10371..10372, ), ( Token( "if", ), - 10164..10166, + 10377..10379, ), ( Token( "length", ), - 10167..10173, + 10380..10386, ), ( Token( "<=", ), - 10174..10176, + 10387..10389, ), ( Token( "len", ), - 10177..10180, + 10390..10393, ), ( Token( "(", ), - 10180..10181, + 10393..10394, ), ( Token( "text", ), - 10181..10185, + 10394..10398, ), ( Token( ")", ), - 10185..10186, + 10398..10399, ), ( Token( ":", ), - 10186..10187, + 10399..10400, ), ( Token( "return", ), - 10188..10194, + 10401..10407, ), ( Token( "text", ), - 10195..10199, + 10408..10412, ), ( Token( "length", ), - 10204..10210, + 10417..10423, ), ( Token( "=", ), - 10211..10212, + 10424..10425, ), ( Token( "len", ), - 10213..10216, + 10426..10429, ), ( Token( "(", ), - 10216..10217, + 10429..10430, ), ( Token( "text", ), - 10217..10221, + 10430..10434, ), ( Token( ")", ), - 10221..10222, + 10434..10435, ), ( Token( "-", ), - 10223..10224, + 10436..10437, ), ( Token( "length", ), - 10225..10231, + 10438..10444, ), ( Token( "pad", ), - 10236..10239, + 10449..10452, ), ( Token( "=", ), - 10240..10241, + 10453..10454, ), ( Token( "trust", ), - 10242..10247, + 10455..10460, ), ( Token( "$", ), - 10248..10249, + 10461..10462, ), ( Token( "printf", ), - 10250..10256, + 10463..10469, ), ( Token( "\"", ), - 10257..10258, + 10470..10471, ), ( Token( "%", ), - 10258..10259, + 10471..10472, ), ( Token( "{", ), - 10259..10260, + 10472..10473, ), ( Token( "length", ), - 10260..10266, + 10473..10479, ), ( Token( "}", ), - 10266..10267, + 10479..10480, ), ( Token( "s", ), - 10267..10268, + 10480..10481, ), ( Token( "\"", ), - 10268..10269, + 10481..10482, ), ( Token( "\"", ), - 10270..10271, + 10483..10484, ), ( Token( "\"", ), - 10271..10272, + 10484..10485, ), ( Token( "|", ), - 10273..10274, + 10486..10487, ), ( Token( "tr", ), - 10275..10277, + 10488..10490, ), ( Token( "\"", ), - 10278..10279, + 10491..10492, ), ( Token( "\"", ), - 10280..10281, + 10493..10494, ), ( Token( "\"", ), - 10282..10283, + 10495..10496, ), ( Token( "{", ), - 10283..10284, + 10496..10497, ), ( Token( "pad", ), - 10284..10287, + 10497..10500, ), ( Token( "}", ), - 10287..10288, + 10500..10501, ), ( Token( "\"", ), - 10288..10289, + 10501..10502, ), ( Token( "$", ), - 10290..10291, + 10503..10504, ), ( Token( "return", ), - 10296..10302, + 10509..10515, ), ( Token( "text", ), - 10303..10307, + 10516..10520, ), ( Token( "+", ), - 10308..10309, + 10521..10522, ), ( Token( "pad", ), - 10310..10313, + 10523..10526, ), ( Token( "}", ), - 10314..10315, + 10527..10528, ), ( Token( "/// Pads `text` with zeros on the left until it reaches the desired `length`.\n", ), - 10317..10395, + 10530..10608, ), ( Token( "pub", ), - 10395..10398, + 10608..10611, ), ( Token( "fun", ), - 10399..10402, + 10612..10615, ), ( Token( "zfill", ), - 10403..10408, + 10616..10621, ), ( Token( "(", ), - 10408..10409, + 10621..10622, ), ( Token( "text", ), - 10409..10413, + 10622..10626, ), ( Token( ":", ), - 10413..10414, + 10626..10627, ), ( Token( "Text", ), - 10415..10419, + 10628..10632, ), ( Token( ",", ), - 10419..10420, + 10632..10633, ), ( Token( "length", ), - 10421..10427, + 10634..10640, ), ( Token( ":", ), - 10427..10428, + 10640..10641, ), ( Token( - "Num", + "Int", ), - 10429..10432, + 10642..10645, ), ( Token( ")", ), - 10432..10433, + 10645..10646, ), ( Token( ":", ), - 10433..10434, + 10646..10647, ), ( Token( "Text", ), - 10435..10439, + 10648..10652, ), ( Token( "{", ), - 10440..10441, + 10653..10654, ), ( Token( "return", ), - 10446..10452, + 10659..10665, ), ( Token( "lpad", ), - 10453..10457, + 10666..10670, ), ( Token( "(", ), - 10457..10458, + 10670..10671, ), ( Token( "text", ), - 10458..10462, + 10671..10675, ), ( Token( ",", ), - 10462..10463, + 10675..10676, ), ( Token( "\"", ), - 10464..10465, + 10677..10678, ), ( Token( "0", ), - 10465..10466, + 10678..10679, ), ( Token( "\"", ), - 10466..10467, + 10679..10680, ), ( Token( ",", ), - 10467..10468, + 10680..10681, ), ( Token( "length", ), - 10469..10475, + 10682..10688, ), ( Token( ")", ), - 10475..10476, + 10688..10689, ), ( Token( "}", ), - 10477..10478, + 10690..10691, ), ] From 5dfa1b761c3357007b0d85c780075f8b0872c377 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Thu, 6 Nov 2025 21:19:58 +0100 Subject: [PATCH 07/19] Updated stdlib --- resources/alpha050/std/array.ab | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/resources/alpha050/std/array.ab b/resources/alpha050/std/array.ab index 3ef932b..1cba830 100644 --- a/resources/alpha050/std/array.ab +++ b/resources/alpha050/std/array.ab @@ -88,13 +88,16 @@ pub fun array_shift(ref array) { } /// Returns an array of length `size` with each element set to `value`; if `size` -/// is less than zero or not of type `Int`, an empty array is returned +/// is less than zero an empty array is returned pub fun array_filled(size, value = 0) { - let array = [value] - array = array[0..0] - if not (size is Int): + let array = [value] // Used for type casting array + array = array[0..0] // Resetting the array size to 0 + + if size <= 0 or not (size is Int): return array - for _ in 0..(size as Int >= 0 then size else 0): + + for _ in 0..size: array += [value] + return array } From 4d446c45e2691e93d3c48baecf2de0e957c069ac Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sat, 8 Nov 2025 18:18:00 +0100 Subject: [PATCH 08/19] Improved formatting and added new lexer --- .pre-commit-config.yaml | 2 +- Cargo.lock | 54 +- Cargo.toml | 9 +- rustfmt.toml | 1 + src/analysis/alpha034/exp.rs | 28 +- src/analysis/alpha034/global.rs | 27 +- src/analysis/alpha034/stmnts.rs | 28 +- src/analysis/alpha035/exp.rs | 39 +- src/analysis/alpha035/global.rs | 32 +- src/analysis/alpha035/stmnts.rs | 42 +- src/analysis/alpha040/exp.rs | 39 +- src/analysis/alpha040/global.rs | 32 +- src/analysis/alpha040/stmnts.rs | 42 +- src/analysis/alpha050/exp.rs | 40 +- src/analysis/alpha050/global.rs | 34 +- src/analysis/alpha050/stmnts.rs | 43 +- src/analysis/mod.rs | 32 +- src/analysis/types.rs | 15 +- src/backend.rs | 41 +- src/files.rs | 16 +- src/fs.rs | 18 +- src/grammar/alpha034/expressions/and.rs | 7 +- .../alpha034/expressions/atom/array.rs | 8 +- src/grammar/alpha034/expressions/atom/bool.rs | 7 +- src/grammar/alpha034/expressions/atom/call.rs | 15 +- .../alpha034/expressions/atom/command.rs | 11 +- src/grammar/alpha034/expressions/atom/mod.rs | 6 +- src/grammar/alpha034/expressions/atom/null.rs | 7 +- .../alpha034/expressions/atom/number.rs | 6 +- .../alpha034/expressions/atom/parentheses.rs | 7 +- .../alpha034/expressions/atom/status.rs | 7 +- src/grammar/alpha034/expressions/atom/text.rs | 7 +- src/grammar/alpha034/expressions/atom/var.rs | 6 +- src/grammar/alpha034/expressions/cast.rs | 10 +- .../alpha034/expressions/comparison.rs | 7 +- src/grammar/alpha034/expressions/is.rs | 10 +- src/grammar/alpha034/expressions/mod.rs | 7 +- src/grammar/alpha034/expressions/or.rs | 13 +- src/grammar/alpha034/expressions/product.rs | 7 +- src/grammar/alpha034/expressions/range.rs | 7 +- src/grammar/alpha034/expressions/sum.rs | 7 +- src/grammar/alpha034/expressions/ternary.rs | 6 +- src/grammar/alpha034/expressions/unary.rs | 8 +- src/grammar/alpha034/global.rs | 17 +- src/grammar/alpha034/mod.rs | 19 +- src/grammar/alpha034/parser.rs | 5 +- src/grammar/alpha034/statements/block.rs | 7 +- src/grammar/alpha034/statements/comment.rs | 7 +- src/grammar/alpha034/statements/const_init.rs | 9 +- src/grammar/alpha034/statements/failed.rs | 7 +- src/grammar/alpha034/statements/if_cond.rs | 13 +- src/grammar/alpha034/statements/keywords.rs | 9 +- src/grammar/alpha034/statements/loops.rs | 12 +- src/grammar/alpha034/statements/mod.rs | 12 +- src/grammar/alpha034/statements/modifiers.rs | 7 +- src/grammar/alpha034/statements/shebang.rs | 7 +- src/grammar/alpha034/statements/shorthands.rs | 10 +- src/grammar/alpha034/statements/var_init.rs | 10 +- src/grammar/alpha034/statements/var_set.rs | 10 +- src/grammar/alpha035/expressions/and.rs | 7 +- .../alpha035/expressions/atom/array.rs | 8 +- src/grammar/alpha035/expressions/atom/bool.rs | 7 +- src/grammar/alpha035/expressions/atom/call.rs | 15 +- .../alpha035/expressions/atom/command.rs | 11 +- src/grammar/alpha035/expressions/atom/mod.rs | 6 +- src/grammar/alpha035/expressions/atom/null.rs | 7 +- .../alpha035/expressions/atom/number.rs | 6 +- .../alpha035/expressions/atom/parentheses.rs | 7 +- .../alpha035/expressions/atom/status.rs | 7 +- src/grammar/alpha035/expressions/atom/text.rs | 7 +- src/grammar/alpha035/expressions/atom/var.rs | 6 +- src/grammar/alpha035/expressions/cast.rs | 10 +- .../alpha035/expressions/comparison.rs | 7 +- src/grammar/alpha035/expressions/is.rs | 10 +- src/grammar/alpha035/expressions/mod.rs | 7 +- src/grammar/alpha035/expressions/or.rs | 13 +- src/grammar/alpha035/expressions/product.rs | 7 +- src/grammar/alpha035/expressions/range.rs | 7 +- src/grammar/alpha035/expressions/sum.rs | 7 +- src/grammar/alpha035/expressions/ternary.rs | 6 +- src/grammar/alpha035/expressions/unary.rs | 8 +- src/grammar/alpha035/global.rs | 16 +- src/grammar/alpha035/mod.rs | 19 +- src/grammar/alpha035/parser.rs | 5 +- src/grammar/alpha035/statements/block.rs | 7 +- src/grammar/alpha035/statements/comment.rs | 7 +- src/grammar/alpha035/statements/const_init.rs | 9 +- src/grammar/alpha035/statements/failed.rs | 7 +- src/grammar/alpha035/statements/if_cond.rs | 13 +- src/grammar/alpha035/statements/keywords.rs | 9 +- src/grammar/alpha035/statements/loops.rs | 12 +- src/grammar/alpha035/statements/mod.rs | 12 +- src/grammar/alpha035/statements/modifiers.rs | 7 +- src/grammar/alpha035/statements/move_files.rs | 14 +- src/grammar/alpha035/statements/shebang.rs | 7 +- src/grammar/alpha035/statements/shorthands.rs | 10 +- src/grammar/alpha035/statements/var_init.rs | 10 +- src/grammar/alpha035/statements/var_set.rs | 10 +- src/grammar/alpha040/expressions/and.rs | 7 +- .../alpha040/expressions/atom/array.rs | 8 +- src/grammar/alpha040/expressions/atom/bool.rs | 7 +- src/grammar/alpha040/expressions/atom/call.rs | 15 +- .../alpha040/expressions/atom/command.rs | 11 +- src/grammar/alpha040/expressions/atom/exit.rs | 7 +- src/grammar/alpha040/expressions/atom/mod.rs | 7 +- src/grammar/alpha040/expressions/atom/null.rs | 7 +- .../alpha040/expressions/atom/number.rs | 6 +- .../alpha040/expressions/atom/parentheses.rs | 7 +- .../alpha040/expressions/atom/status.rs | 7 +- src/grammar/alpha040/expressions/atom/text.rs | 7 +- src/grammar/alpha040/expressions/atom/var.rs | 6 +- src/grammar/alpha040/expressions/cast.rs | 10 +- .../alpha040/expressions/comparison.rs | 7 +- src/grammar/alpha040/expressions/is.rs | 10 +- src/grammar/alpha040/expressions/mod.rs | 7 +- src/grammar/alpha040/expressions/or.rs | 13 +- src/grammar/alpha040/expressions/product.rs | 7 +- src/grammar/alpha040/expressions/range.rs | 7 +- src/grammar/alpha040/expressions/sum.rs | 7 +- src/grammar/alpha040/expressions/ternary.rs | 6 +- src/grammar/alpha040/expressions/unary.rs | 8 +- src/grammar/alpha040/global.rs | 16 +- src/grammar/alpha040/mod.rs | 19 +- src/grammar/alpha040/parser.rs | 5 +- src/grammar/alpha040/statements/block.rs | 7 +- src/grammar/alpha040/statements/comment.rs | 7 +- src/grammar/alpha040/statements/const_init.rs | 9 +- src/grammar/alpha040/statements/failed.rs | 7 +- src/grammar/alpha040/statements/if_cond.rs | 13 +- src/grammar/alpha040/statements/keywords.rs | 9 +- src/grammar/alpha040/statements/loops.rs | 12 +- src/grammar/alpha040/statements/mod.rs | 12 +- src/grammar/alpha040/statements/modifiers.rs | 7 +- src/grammar/alpha040/statements/move_files.rs | 14 +- src/grammar/alpha040/statements/shebang.rs | 7 +- src/grammar/alpha040/statements/shorthands.rs | 10 +- src/grammar/alpha040/statements/var_init.rs | 10 +- src/grammar/alpha040/statements/var_set.rs | 10 +- src/grammar/alpha050/expressions/and.rs | 7 +- .../alpha050/expressions/atom/array.rs | 8 +- src/grammar/alpha050/expressions/atom/bool.rs | 7 +- src/grammar/alpha050/expressions/atom/call.rs | 17 +- .../alpha050/expressions/atom/command.rs | 13 +- src/grammar/alpha050/expressions/atom/exit.rs | 7 +- src/grammar/alpha050/expressions/atom/int.rs | 6 +- src/grammar/alpha050/expressions/atom/mod.rs | 9 +- src/grammar/alpha050/expressions/atom/null.rs | 7 +- .../alpha050/expressions/atom/number.rs | 55 +- .../alpha050/expressions/atom/parentheses.rs | 7 +- .../alpha050/expressions/atom/status.rs | 7 +- src/grammar/alpha050/expressions/atom/text.rs | 7 +- src/grammar/alpha050/expressions/atom/var.rs | 6 +- src/grammar/alpha050/expressions/cast.rs | 10 +- .../alpha050/expressions/comparison.rs | 7 +- src/grammar/alpha050/expressions/is.rs | 10 +- src/grammar/alpha050/expressions/mod.rs | 7 +- src/grammar/alpha050/expressions/or.rs | 13 +- src/grammar/alpha050/expressions/product.rs | 7 +- src/grammar/alpha050/expressions/range.rs | 7 +- src/grammar/alpha050/expressions/sum.rs | 7 +- src/grammar/alpha050/expressions/ternary.rs | 8 +- src/grammar/alpha050/expressions/unary.rs | 8 +- src/grammar/alpha050/global.rs | 28 +- src/grammar/alpha050/lexer.rs | 74 - src/grammar/alpha050/lexer_logos_v2.rs | 999 ++++ src/grammar/alpha050/mod.rs | 52 +- src/grammar/alpha050/parser.rs | 7 +- src/grammar/alpha050/statements/block.rs | 7 +- src/grammar/alpha050/statements/comment.rs | 7 +- src/grammar/alpha050/statements/const_init.rs | 17 +- .../alpha050/statements/failable_handlers.rs | 14 +- src/grammar/alpha050/statements/if_cond.rs | 13 +- src/grammar/alpha050/statements/keywords.rs | 9 +- src/grammar/alpha050/statements/loops.rs | 14 +- src/grammar/alpha050/statements/mod.rs | 12 +- src/grammar/alpha050/statements/modifiers.rs | 7 +- src/grammar/alpha050/statements/move_files.rs | 14 +- src/grammar/alpha050/statements/shebang.rs | 7 +- src/grammar/alpha050/statements/shorthands.rs | 12 +- src/grammar/alpha050/statements/var_init.rs | 12 +- src/grammar/alpha050/statements/var_set.rs | 12 +- src/grammar/mod.rs | 11 +- src/main.rs | 21 +- src/paths.rs | 5 +- src/stdlib.rs | 21 +- src/utils.rs | 5 +- tests/analysis/alpha034.rs | 21 +- tests/analysis/alpha050.rs | 15 +- tests/grammar/alpha034.rs | 10 +- tests/grammar/alpha035.rs | 10 +- tests/grammar/alpha040.rs | 10 +- tests/grammar/alpha050.rs | 21 +- ...d__grammar__alpha050__comments_in_ifs.snap | 24 +- .../r#mod__grammar__alpha050__mv_files.snap | 264 +- .../r#mod__grammar__alpha050__numbers.snap | 63 + ...#mod__grammar__alpha050__stdlib_array.snap | 283 +- ...r#mod__grammar__alpha050__stdlib_date.snap | 448 +- .../r#mod__grammar__alpha050__stdlib_env.snap | 1925 ++------ .../r#mod__grammar__alpha050__stdlib_fs.snap | 1827 ++----- ...r#mod__grammar__alpha050__stdlib_http.snap | 96 +- ...r#mod__grammar__alpha050__stdlib_math.snap | 318 +- ...mod__grammar__alpha050__stdlib_text-2.snap | 3127 ++---------- ...r#mod__grammar__alpha050__stdlib_text.snap | 4234 +++-------------- ..._alpha050__unfinished_function_call-2.snap | 24 +- ...r__alpha050__unfinished_function_call.snap | 32 +- 205 files changed, 5006 insertions(+), 11032 deletions(-) create mode 100644 rustfmt.toml delete mode 100644 src/grammar/alpha050/lexer.rs create mode 100644 src/grammar/alpha050/lexer_logos_v2.rs create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__numbers.snap diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1251cc1..5a4eaf7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,7 +29,7 @@ repos: hooks: - id: cargo-fmt name: cargo fmt --check - entry: cargo fmt -- --check + entry: cargo +nightly fmt --check language: system types: [rust] pass_filenames: false diff --git a/Cargo.lock b/Cargo.lock index ea753a0..419dc2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -41,6 +41,7 @@ dependencies = [ "include_dir", "indexmap", "insta", + "logos", "phf", "rangemap", "ropey", @@ -113,6 +114,12 @@ dependencies = [ "object", ] +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + [[package]] name = "bitflags" version = "1.3.2" @@ -298,6 +305,12 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "fs_extra" version = "1.3.0" @@ -500,6 +513,39 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "logos" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7251356ef8cb7aec833ddf598c6cb24d17b689d20b993f9d11a3d764e34e6458" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59f80069600c0d66734f5ff52cc42f2dabd6b29d205f333d61fd7832e9e9963f" +dependencies = [ + "beef", + "fnv", + "lazy_static", + "proc-macro2", + "quote", + "regex-syntax 0.8.8", + "syn", +] + +[[package]] +name = "logos-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24fb722b06a9dc12adb0963ed585f19fc61dc5413e6a9be9422ef92c091e731d" +dependencies = [ + "logos-codegen", +] + [[package]] name = "lsp-types" version = "0.97.0" @@ -730,7 +776,7 @@ checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.5", ] [[package]] @@ -739,6 +785,12 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + [[package]] name = "ropey" version = "1.6.1" diff --git a/Cargo.toml b/Cargo.toml index addb53b..2ec333b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ chumsky = { git = "https://github.com/KrosFire/chumsky", rev = "406ea80", featur "label", ] } heraclitus-compiler = "1.8.2" +logos = "0.14" serde_json = "1.0.128" rangemap = "1.5.1" indexmap = "2.6.0" @@ -47,7 +48,13 @@ ci = "github" # The installers to generate for each app installers = [] # Target platforms to build apps for (Rust target-triple syntax) -targets = ["aarch64-apple-darwin", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", "x86_64-pc-windows-msvc"] +targets = [ + "aarch64-apple-darwin", + "x86_64-apple-darwin", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl", + "x86_64-pc-windows-msvc", +] # Publish jobs to run in CI pr-run-mode = "plan" # Skip checking whether the specified configuration files are up to date diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..27f8fd6 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1 @@ +imports_layout="Vertical" diff --git a/src/analysis/alpha034/exp.rs b/src/analysis/alpha034/exp.rs index bdf4a09..da02dbb 100644 --- a/src/analysis/alpha034/exp.rs +++ b/src/analysis/alpha034/exp.rs @@ -4,14 +4,32 @@ use chumsky::span::SimpleSpan; use crate::{ analysis::{ - get_symbol_definition_info, insert_symbol_reference, - types::{make_union_type, matches_type, DataType, GenericsMap}, - Context, FunctionArgument, FunctionSymbol, SymbolInfo, SymbolLocation, SymbolType, + get_symbol_definition_info, + insert_symbol_reference, + types::{ + make_union_type, + matches_type, + DataType, + GenericsMap, + }, + Context, + FunctionArgument, + FunctionSymbol, + SymbolInfo, + SymbolLocation, + SymbolType, VariableSymbol, }, - files::{FileVersion, Files}, + files::{ + FileVersion, + Files, + }, grammar::{ - alpha034::{Expression, InterpolatedCommand, InterpolatedText}, + alpha034::{ + Expression, + InterpolatedCommand, + InterpolatedText, + }, Spanned, }, paths::FileId, diff --git a/src/analysis/alpha034/global.rs b/src/analysis/alpha034/global.rs index da19d49..d1c2a81 100644 --- a/src/analysis/alpha034/global.rs +++ b/src/analysis/alpha034/global.rs @@ -1,15 +1,32 @@ use crate::{ analysis::{ - self, import_symbol, insert_symbol_definition, map_import_path, - types::{make_union_type, matches_type, DataType}, - Context, FunctionContext, FunctionSymbol, ImportContext, SymbolInfo, SymbolType, + self, + import_symbol, + insert_symbol_definition, + map_import_path, + types::{ + make_union_type, + matches_type, + DataType, + }, + Context, + FunctionContext, + FunctionSymbol, + ImportContext, + SymbolInfo, + SymbolType, VariableSymbol, }, backend::Backend, files::FileVersion, grammar::{ - alpha034::{FunctionArgument, GlobalStatement, ImportContent}, - Span, Spanned, + alpha034::{ + FunctionArgument, + GlobalStatement, + ImportContent, + }, + Span, + Spanned, }, paths::FileId, }; diff --git a/src/analysis/alpha034/stmnts.rs b/src/analysis/alpha034/stmnts.rs index a51edf9..37ae7e3 100644 --- a/src/analysis/alpha034/stmnts.rs +++ b/src/analysis/alpha034/stmnts.rs @@ -1,11 +1,29 @@ use crate::{ analysis::{ - get_symbol_definition_info, insert_symbol_definition, insert_symbol_reference, - types::{make_union_type, matches_type, GenericsMap}, - BlockContext, Context, DataType, SymbolInfo, SymbolLocation, SymbolType, VariableSymbol, + get_symbol_definition_info, + insert_symbol_definition, + insert_symbol_reference, + types::{ + make_union_type, + matches_type, + GenericsMap, + }, + BlockContext, + Context, + DataType, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, + }, + files::{ + FileVersion, + Files, + }, + grammar::{ + alpha034::*, + Spanned, }, - files::{FileVersion, Files}, - grammar::{alpha034::*, Spanned}, paths::FileId, }; diff --git a/src/analysis/alpha035/exp.rs b/src/analysis/alpha035/exp.rs index 20b9a3e..bd25a91 100644 --- a/src/analysis/alpha035/exp.rs +++ b/src/analysis/alpha035/exp.rs @@ -4,20 +4,43 @@ use chumsky::span::SimpleSpan; use crate::{ analysis::{ - get_symbol_definition_info, insert_symbol_reference, - types::{make_union_type, matches_type, DataType, GenericsMap}, - BlockContext, Context, FunctionArgument, FunctionSymbol, SymbolInfo, SymbolLocation, - SymbolType, VariableSymbol, + get_symbol_definition_info, + insert_symbol_reference, + types::{ + make_union_type, + matches_type, + DataType, + GenericsMap, + }, + BlockContext, + Context, + FunctionArgument, + FunctionSymbol, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, + }, + files::{ + FileVersion, + Files, }, - files::{FileVersion, Files}, grammar::{ - alpha035::{Expression, InterpolatedCommand, InterpolatedText}, - CommandModifier, Spanned, + alpha035::{ + Expression, + InterpolatedCommand, + InterpolatedText, + }, + CommandModifier, + Spanned, }, paths::FileId, }; -use super::stmnts::{analyze_failure_handler, StmntAnalysisResult}; +use super::stmnts::{ + analyze_failure_handler, + StmntAnalysisResult, +}; #[derive(Debug, Clone)] pub struct ExpAnalysisResult { diff --git a/src/analysis/alpha035/global.rs b/src/analysis/alpha035/global.rs index 6104e80..06181dd 100644 --- a/src/analysis/alpha035/global.rs +++ b/src/analysis/alpha035/global.rs @@ -1,22 +1,42 @@ use crate::{ analysis::{ - self, import_symbol, insert_symbol_definition, map_import_path, - types::{make_union_type, matches_type, DataType}, - Context, FunctionContext, FunctionSymbol, ImportContext, SymbolInfo, SymbolType, + self, + import_symbol, + insert_symbol_definition, + map_import_path, + types::{ + make_union_type, + matches_type, + DataType, + }, + Context, + FunctionContext, + FunctionSymbol, + ImportContext, + SymbolInfo, + SymbolType, VariableSymbol, }, backend::Backend, files::FileVersion, grammar::{ - alpha035::{FunctionArgument, GlobalStatement, ImportContent}, - Span, Spanned, + alpha035::{ + FunctionArgument, + GlobalStatement, + ImportContent, + }, + Span, + Spanned, }, paths::FileId, }; use super::{ exp::analyze_exp, - stmnts::{analyze_stmnt, StmntAnalysisResult}, + stmnts::{ + analyze_stmnt, + StmntAnalysisResult, + }, }; #[tracing::instrument(skip_all)] diff --git a/src/analysis/alpha035/stmnts.rs b/src/analysis/alpha035/stmnts.rs index 7c401c6..edb9b9e 100644 --- a/src/analysis/alpha035/stmnts.rs +++ b/src/analysis/alpha035/stmnts.rs @@ -1,21 +1,47 @@ use crate::{ analysis::{ - get_symbol_definition_info, insert_symbol_definition, insert_symbol_reference, - types::{make_union_type, matches_type, GenericsMap}, - BlockContext, Context, DataType, SymbolInfo, SymbolLocation, SymbolType, VariableSymbol, + get_symbol_definition_info, + insert_symbol_definition, + insert_symbol_reference, + types::{ + make_union_type, + matches_type, + GenericsMap, + }, + BlockContext, + Context, + DataType, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, + }, + files::{ + FileVersion, + Files, }, - files::{FileVersion, Files}, grammar::{ alpha035::{ - Block, Comment, ElseCondition, FailureHandler, IfChainContent, IfCondition, - IterLoopVars, Statement, VariableInitType, + Block, + Comment, + ElseCondition, + FailureHandler, + IfChainContent, + IfCondition, + IterLoopVars, + Statement, + VariableInitType, }, - CommandModifier, Spanned, + CommandModifier, + Spanned, }, paths::FileId, }; -use super::exp::{analyze_exp, ExpAnalysisResult}; +use super::exp::{ + analyze_exp, + ExpAnalysisResult, +}; #[derive(Debug, Clone)] pub struct StmntAnalysisResult { diff --git a/src/analysis/alpha040/exp.rs b/src/analysis/alpha040/exp.rs index ed6d75e..480afe1 100644 --- a/src/analysis/alpha040/exp.rs +++ b/src/analysis/alpha040/exp.rs @@ -4,20 +4,43 @@ use chumsky::span::SimpleSpan; use crate::{ analysis::{ - get_symbol_definition_info, insert_symbol_reference, - types::{make_union_type, matches_type, DataType, GenericsMap}, - BlockContext, Context, FunctionArgument, FunctionSymbol, SymbolInfo, SymbolLocation, - SymbolType, VariableSymbol, + get_symbol_definition_info, + insert_symbol_reference, + types::{ + make_union_type, + matches_type, + DataType, + GenericsMap, + }, + BlockContext, + Context, + FunctionArgument, + FunctionSymbol, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, + }, + files::{ + FileVersion, + Files, }, - files::{FileVersion, Files}, grammar::{ - alpha040::{Expression, InterpolatedCommand, InterpolatedText}, - CommandModifier, Spanned, + alpha040::{ + Expression, + InterpolatedCommand, + InterpolatedText, + }, + CommandModifier, + Spanned, }, paths::FileId, }; -use super::stmnts::{analyze_failure_handler, StmntAnalysisResult}; +use super::stmnts::{ + analyze_failure_handler, + StmntAnalysisResult, +}; #[derive(Debug, Clone)] pub struct ExpAnalysisResult { diff --git a/src/analysis/alpha040/global.rs b/src/analysis/alpha040/global.rs index 45c4047..1c9d1a4 100644 --- a/src/analysis/alpha040/global.rs +++ b/src/analysis/alpha040/global.rs @@ -1,15 +1,32 @@ use crate::{ analysis::{ - self, import_symbol, insert_symbol_definition, map_import_path, - types::{make_union_type, matches_type, DataType}, - Context, FunctionContext, FunctionSymbol, ImportContext, SymbolInfo, SymbolType, + self, + import_symbol, + insert_symbol_definition, + map_import_path, + types::{ + make_union_type, + matches_type, + DataType, + }, + Context, + FunctionContext, + FunctionSymbol, + ImportContext, + SymbolInfo, + SymbolType, VariableSymbol, }, backend::Backend, files::FileVersion, grammar::{ - alpha040::{FunctionArgument, GlobalStatement, ImportContent}, - Span, Spanned, + alpha040::{ + FunctionArgument, + GlobalStatement, + ImportContent, + }, + Span, + Spanned, }, paths::FileId, stdlib::is_builtin_file, @@ -17,7 +34,10 @@ use crate::{ use super::{ exp::analyze_exp, - stmnts::{analyze_stmnt, StmntAnalysisResult}, + stmnts::{ + analyze_stmnt, + StmntAnalysisResult, + }, }; #[tracing::instrument(skip_all)] diff --git a/src/analysis/alpha040/stmnts.rs b/src/analysis/alpha040/stmnts.rs index 629310e..013a657 100644 --- a/src/analysis/alpha040/stmnts.rs +++ b/src/analysis/alpha040/stmnts.rs @@ -1,21 +1,47 @@ use crate::{ analysis::{ - get_symbol_definition_info, insert_symbol_definition, insert_symbol_reference, - types::{make_union_type, matches_type, GenericsMap}, - BlockContext, Context, DataType, SymbolInfo, SymbolLocation, SymbolType, VariableSymbol, + get_symbol_definition_info, + insert_symbol_definition, + insert_symbol_reference, + types::{ + make_union_type, + matches_type, + GenericsMap, + }, + BlockContext, + Context, + DataType, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, + }, + files::{ + FileVersion, + Files, }, - files::{FileVersion, Files}, grammar::{ alpha040::{ - Block, Comment, ElseCondition, FailureHandler, IfChainContent, IfCondition, - IterLoopVars, Statement, VariableInitType, + Block, + Comment, + ElseCondition, + FailureHandler, + IfChainContent, + IfCondition, + IterLoopVars, + Statement, + VariableInitType, }, - CommandModifier, Spanned, + CommandModifier, + Spanned, }, paths::FileId, }; -use super::exp::{analyze_exp, ExpAnalysisResult}; +use super::exp::{ + analyze_exp, + ExpAnalysisResult, +}; #[derive(Debug, Clone)] pub struct StmntAnalysisResult { diff --git a/src/analysis/alpha050/exp.rs b/src/analysis/alpha050/exp.rs index 9ac4261..68cd99f 100644 --- a/src/analysis/alpha050/exp.rs +++ b/src/analysis/alpha050/exp.rs @@ -4,20 +4,44 @@ use chumsky::span::SimpleSpan; use crate::{ analysis::{ - get_symbol_definition_info, insert_symbol_reference, - types::{make_union_type, matches_type, DataType, GenericsMap}, - BlockContext, Context, FunctionArgument, FunctionSymbol, SymbolInfo, SymbolLocation, - SymbolType, VariableSymbol, + get_symbol_definition_info, + insert_symbol_reference, + types::{ + make_union_type, + matches_type, + DataType, + GenericsMap, + }, + BlockContext, + Context, + FunctionArgument, + FunctionSymbol, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, + }, + files::{ + FileVersion, + Files, }, - files::{FileVersion, Files}, grammar::{ - alpha050::{Expression, FailableHandler, InterpolatedCommand, InterpolatedText}, - CommandModifier, Spanned, + alpha050::{ + Expression, + FailableHandler, + InterpolatedCommand, + InterpolatedText, + }, + CommandModifier, + Spanned, }, paths::FileId, }; -use super::stmnts::{analyze_failable_handlers, StmntAnalysisResult}; +use super::stmnts::{ + analyze_failable_handlers, + StmntAnalysisResult, +}; #[derive(Debug, Clone)] pub struct ExpAnalysisResult { diff --git a/src/analysis/alpha050/global.rs b/src/analysis/alpha050/global.rs index ccf2224..ba40ad9 100644 --- a/src/analysis/alpha050/global.rs +++ b/src/analysis/alpha050/global.rs @@ -1,15 +1,34 @@ use crate::{ analysis::{ - self, import_symbol, insert_symbol_definition, map_import_path, - types::{make_union_type, matches_type, DataType}, - Context, FunctionContext, FunctionSymbol, ImportContext, SymbolInfo, SymbolType, + self, + import_symbol, + insert_symbol_definition, + map_import_path, + types::{ + make_union_type, + matches_type, + DataType, + }, + Context, + FunctionContext, + FunctionSymbol, + ImportContext, + SymbolInfo, + SymbolType, VariableSymbol, }, backend::Backend, files::FileVersion, grammar::{ - alpha050::{Block, FunctionArgument, GlobalStatement, ImportContent, Statement}, - Span, Spanned, + alpha050::{ + Block, + FunctionArgument, + GlobalStatement, + ImportContent, + Statement, + }, + Span, + Spanned, }, paths::FileId, stdlib::is_builtin_file, @@ -17,7 +36,10 @@ use crate::{ use super::{ exp::analyze_exp, - stmnts::{analyze_stmnt, StmntAnalysisResult}, + stmnts::{ + analyze_stmnt, + StmntAnalysisResult, + }, }; #[tracing::instrument(skip_all)] diff --git a/src/analysis/alpha050/stmnts.rs b/src/analysis/alpha050/stmnts.rs index 9238c01..b5a96e4 100644 --- a/src/analysis/alpha050/stmnts.rs +++ b/src/analysis/alpha050/stmnts.rs @@ -1,21 +1,48 @@ use crate::{ analysis::{ - get_symbol_definition_info, insert_symbol_definition, insert_symbol_reference, - types::{make_union_type, matches_type, GenericsMap}, - BlockContext, Context, DataType, SymbolInfo, SymbolLocation, SymbolType, VariableSymbol, + get_symbol_definition_info, + insert_symbol_definition, + insert_symbol_reference, + types::{ + make_union_type, + matches_type, + GenericsMap, + }, + BlockContext, + Context, + DataType, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, + }, + files::{ + FileVersion, + Files, }, - files::{FileVersion, Files}, grammar::{ alpha050::{ - Block, Comment, ElseCondition, FailableHandler, FailureHandler, IfChainContent, - IfCondition, IterLoopVars, Statement, VariableInitType, + Block, + Comment, + ElseCondition, + FailableHandler, + FailureHandler, + IfChainContent, + IfCondition, + IterLoopVars, + Statement, + VariableInitType, }, - CommandModifier, Spanned, + CommandModifier, + Spanned, }, paths::FileId, }; -use super::exp::{analyze_exp, ExpAnalysisResult}; +use super::exp::{ + analyze_exp, + ExpAnalysisResult, +}; #[derive(Debug, Clone)] pub struct StmntAnalysisResult { diff --git a/src/analysis/mod.rs b/src/analysis/mod.rs index a2bd989..f4f3402 100644 --- a/src/analysis/mod.rs +++ b/src/analysis/mod.rs @@ -1,12 +1,32 @@ use rangemap::RangeInclusiveMap; -use std::{collections::HashMap, ops::RangeInclusive}; -use tower_lsp_server::{lsp_types::Uri, UriExt}; -use types::{DataType, GenericsMap}; +use std::{ + collections::HashMap, + ops::RangeInclusive, +}; +use tower_lsp_server::{ + lsp_types::Uri, + UriExt, +}; +use types::{ + DataType, + GenericsMap, +}; use crate::{ - backend::{AmberVersion, Backend}, - files::{FileVersion, Files}, - grammar::{CommandModifier, CompilerFlag, Span, Spanned}, + backend::{ + AmberVersion, + Backend, + }, + files::{ + FileVersion, + Files, + }, + grammar::{ + CommandModifier, + CompilerFlag, + Span, + Spanned, + }, paths::FileId, stdlib::resolve, }; diff --git a/src/analysis/types.rs b/src/analysis/types.rs index f9f2769..d981d16 100644 --- a/src/analysis/types.rs +++ b/src/analysis/types.rs @@ -1,11 +1,20 @@ -use std::fmt::{self, Display}; +use std::fmt::{ + self, + Display, +}; use std::sync::atomic::Ordering::SeqCst; -use std::{collections::HashSet, sync::atomic::AtomicUsize}; +use std::{ + collections::HashSet, + sync::atomic::AtomicUsize, +}; use crate::{ files::FileVersion, paths::FileId, - utils::{FastDashMap, FastDashSet}, + utils::{ + FastDashMap, + FastDashSet, + }, }; #[derive(PartialEq, Eq, Clone, Hash)] diff --git a/src/backend.rs b/src/backend.rs index f8dd812..37e9be0 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -5,20 +5,47 @@ use std::sync::Arc; use chumsky::container::Seq; use ropey::Rope; use tokio::sync::RwLock; -use tower_lsp_server::jsonrpc::{Error, Result}; +use tower_lsp_server::jsonrpc::{ + Error, + Result, +}; use tower_lsp_server::lsp_types::*; use tower_lsp_server::UriExt; -use tower_lsp_server::{Client, LanguageServer}; +use tower_lsp_server::{ + Client, + LanguageServer, +}; use crate::analysis::{ - self, get_symbol_definition_info, Context, FunctionSymbol, SymbolInfo, SymbolTable, SymbolType, + self, + get_symbol_definition_info, + Context, + FunctionSymbol, + SymbolInfo, + SymbolTable, + SymbolType, VariableSymbol, }; -use crate::files::{FileVersion, Files, DEFAULT_VERSION}; -use crate::fs::{LocalFs, FS}; -use crate::grammar::{self, Grammar, LSPAnalysis, ParserResponse}; +use crate::files::{ + FileVersion, + Files, + DEFAULT_VERSION, +}; +use crate::fs::{ + LocalFs, + FS, +}; +use crate::grammar::{ + self, + Grammar, + LSPAnalysis, + ParserResponse, +}; use crate::paths::FileId; -use crate::stdlib::{find_in_stdlib, save_resources}; +use crate::stdlib::{ + find_in_stdlib, + save_resources, +}; type PinnedFuture<'a, T> = Pin> + Send + 'a>>; diff --git a/src/files.rs b/src/files.rs index d4af875..3e45430 100644 --- a/src/files.rs +++ b/src/files.rs @@ -6,10 +6,20 @@ use tokio::sync::RwLock; use tower_lsp_server::lsp_types::Uri; use crate::{ - analysis::{types::GenericsMap, SymbolTable}, + analysis::{ + types::GenericsMap, + SymbolTable, + }, fs::FS, - grammar::{Grammar, Spanned, SpannedSemanticToken}, - paths::{FileId, PathInterner}, + grammar::{ + Grammar, + Spanned, + SpannedSemanticToken, + }, + paths::{ + FileId, + PathInterner, + }, utils::FastDashMap, }; diff --git a/src/fs.rs b/src/fs.rs index ce3b0ad..afcafbd 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -3,12 +3,24 @@ use std::{ fmt::Debug, future::Future, io::Result, - path::{Path, PathBuf}, + path::{ + Path, + PathBuf, + }, pin::Pin, - sync::{Arc, Mutex}, + sync::{ + Arc, + Mutex, + }, }; -use tokio::fs::{create_dir_all, metadata, read_dir, read_to_string, write}; +use tokio::fs::{ + create_dir_all, + metadata, + read_dir, + read_to_string, + write, +}; pub trait FS: Sync + Send + Debug { fn read<'a>( diff --git a/src/grammar/alpha034/expressions/and.rs b/src/grammar/alpha034/expressions/and.rs index ef7b095..3c2c020 100644 --- a/src/grammar/alpha034/expressions/and.rs +++ b/src/grammar/alpha034/expressions/and.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/expressions/atom/array.rs b/src/grammar/alpha034/expressions/atom/array.rs index 0c235ed..2ed68b6 100644 --- a/src/grammar/alpha034/expressions/atom/array.rs +++ b/src/grammar/alpha034/expressions/atom/array.rs @@ -1,7 +1,13 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha034::{lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned}, + grammar::alpha034::{ + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + }, T, }; diff --git a/src/grammar/alpha034/expressions/atom/bool.rs b/src/grammar/alpha034/expressions/atom/bool.rs index 1b0f86d..63f94d3 100644 --- a/src/grammar/alpha034/expressions/atom/bool.rs +++ b/src/grammar/alpha034/expressions/atom/bool.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha034::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha034::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha034/expressions/atom/call.rs b/src/grammar/alpha034/expressions/atom/call.rs index f78cbec..603b233 100644 --- a/src/grammar/alpha034/expressions/atom/call.rs +++ b/src/grammar/alpha034/expressions/atom/call.rs @@ -1,9 +1,18 @@ use crate::{ grammar::alpha034::{ lexer::Token, - parser::{default_recovery, ident}, - statements::{failed::failure_parser, modifiers::modifier_parser}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + statements::{ + failed::failure_parser, + modifiers::modifier_parser, + }, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/expressions/atom/command.rs b/src/grammar/alpha034/expressions/atom/command.rs index 06f9c5d..cd13c7a 100644 --- a/src/grammar/alpha034/expressions/atom/command.rs +++ b/src/grammar/alpha034/expressions/atom/command.rs @@ -4,8 +4,15 @@ use crate::{ grammar::alpha034::{ lexer::Token, parser::default_recovery, - statements::{failed::failure_parser, modifiers::modifier_parser}, - AmberParser, Expression, InterpolatedCommand, Spanned, Statement, + statements::{ + failed::failure_parser, + modifiers::modifier_parser, + }, + AmberParser, + Expression, + InterpolatedCommand, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/expressions/atom/mod.rs b/src/grammar/alpha034/expressions/atom/mod.rs index 100a1b3..8c8d9e9 100644 --- a/src/grammar/alpha034/expressions/atom/mod.rs +++ b/src/grammar/alpha034/expressions/atom/mod.rs @@ -1,4 +1,8 @@ -use crate::grammar::alpha034::{AmberParser, Spanned, Statement}; +use crate::grammar::alpha034::{ + AmberParser, + Spanned, + Statement, +}; use super::super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha034/expressions/atom/null.rs b/src/grammar/alpha034/expressions/atom/null.rs index 6aa908e..d1edf6a 100644 --- a/src/grammar/alpha034/expressions/atom/null.rs +++ b/src/grammar/alpha034/expressions/atom/null.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha034::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha034::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha034/expressions/atom/number.rs b/src/grammar/alpha034/expressions/atom/number.rs index 0a840ec..6f1e3bd 100644 --- a/src/grammar/alpha034/expressions/atom/number.rs +++ b/src/grammar/alpha034/expressions/atom/number.rs @@ -1,7 +1,11 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha034::{lexer::Token, AmberParser, Spanned}, + grammar::alpha034::{ + lexer::Token, + AmberParser, + Spanned, + }, T, }; diff --git a/src/grammar/alpha034/expressions/atom/parentheses.rs b/src/grammar/alpha034/expressions/atom/parentheses.rs index cee3411..055703a 100644 --- a/src/grammar/alpha034/expressions/atom/parentheses.rs +++ b/src/grammar/alpha034/expressions/atom/parentheses.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha034::{lexer::Token, parser::default_recovery, AmberParser, Spanned}, + grammar::alpha034::{ + lexer::Token, + parser::default_recovery, + AmberParser, + Spanned, + }, T, }; diff --git a/src/grammar/alpha034/expressions/atom/status.rs b/src/grammar/alpha034/expressions/atom/status.rs index 5a70e1a..47d23f4 100644 --- a/src/grammar/alpha034/expressions/atom/status.rs +++ b/src/grammar/alpha034/expressions/atom/status.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha034::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha034::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha034/expressions/atom/text.rs b/src/grammar/alpha034/expressions/atom/text.rs index ed51bfe..7993295 100644 --- a/src/grammar/alpha034/expressions/atom/text.rs +++ b/src/grammar/alpha034/expressions/atom/text.rs @@ -1,6 +1,11 @@ use crate::{ grammar::alpha034::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, InterpolatedText, Spanned, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + InterpolatedText, + Spanned, }, T, }; diff --git a/src/grammar/alpha034/expressions/atom/var.rs b/src/grammar/alpha034/expressions/atom/var.rs index 00c4b29..83779c9 100644 --- a/src/grammar/alpha034/expressions/atom/var.rs +++ b/src/grammar/alpha034/expressions/atom/var.rs @@ -1,4 +1,8 @@ -use crate::grammar::alpha034::{parser::ident, AmberParser, Spanned}; +use crate::grammar::alpha034::{ + parser::ident, + AmberParser, + Spanned, +}; use super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha034/expressions/cast.rs b/src/grammar/alpha034/expressions/cast.rs index 4d59fca..668442d 100644 --- a/src/grammar/alpha034/expressions/cast.rs +++ b/src/grammar/alpha034/expressions/cast.rs @@ -2,8 +2,14 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, - Expression, Spanned, Statement, + global::type_parser, + lexer::Token, + parser::default_recovery, + AmberParser, + DataType, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/expressions/comparison.rs b/src/grammar/alpha034/expressions/comparison.rs index 9932488..1a7447e 100644 --- a/src/grammar/alpha034/expressions/comparison.rs +++ b/src/grammar/alpha034/expressions/comparison.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/expressions/is.rs b/src/grammar/alpha034/expressions/is.rs index ce5b8ed..69a7856 100644 --- a/src/grammar/alpha034/expressions/is.rs +++ b/src/grammar/alpha034/expressions/is.rs @@ -2,8 +2,14 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, - Expression, Spanned, Statement, + global::type_parser, + lexer::Token, + parser::default_recovery, + AmberParser, + DataType, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/expressions/mod.rs b/src/grammar/alpha034/expressions/mod.rs index 71cb80b..ef862f3 100644 --- a/src/grammar/alpha034/expressions/mod.rs +++ b/src/grammar/alpha034/expressions/mod.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use super::{AmberParser, Expression, Spanned, Statement}; +use super::{ + AmberParser, + Expression, + Spanned, + Statement, +}; mod and; mod atom; diff --git a/src/grammar/alpha034/expressions/or.rs b/src/grammar/alpha034/expressions/or.rs index 0b90a52..cb0b27b 100644 --- a/src/grammar/alpha034/expressions/or.rs +++ b/src/grammar/alpha034/expressions/or.rs @@ -1,11 +1,20 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha034::{lexer::Token, parser::default_recovery, AmberParser, Spanned, Statement}, + grammar::alpha034::{ + lexer::Token, + parser::default_recovery, + AmberParser, + Spanned, + Statement, + }, T, }; -use super::{and::and_parser, Expression}; +use super::{ + and::and_parser, + Expression, +}; pub fn or_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha034/expressions/product.rs b/src/grammar/alpha034/expressions/product.rs index c7c1dd2..07e9f69 100644 --- a/src/grammar/alpha034/expressions/product.rs +++ b/src/grammar/alpha034/expressions/product.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/expressions/range.rs b/src/grammar/alpha034/expressions/range.rs index 977960d..9da71a0 100644 --- a/src/grammar/alpha034/expressions/range.rs +++ b/src/grammar/alpha034/expressions/range.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/expressions/sum.rs b/src/grammar/alpha034/expressions/sum.rs index eda764e..631981a 100644 --- a/src/grammar/alpha034/expressions/sum.rs +++ b/src/grammar/alpha034/expressions/sum.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/expressions/ternary.rs b/src/grammar/alpha034/expressions/ternary.rs index a418942..ac5e1ad 100644 --- a/src/grammar/alpha034/expressions/ternary.rs +++ b/src/grammar/alpha034/expressions/ternary.rs @@ -2,7 +2,11 @@ use chumsky::prelude::*; use crate::grammar::alpha034::lexer::Token; use crate::grammar::alpha034::parser::default_recovery; -use crate::grammar::alpha034::{AmberParser, Spanned, Statement}; +use crate::grammar::alpha034::{ + AmberParser, + Spanned, + Statement, +}; use crate::T; use super::range::range_parser; diff --git a/src/grammar/alpha034/expressions/unary.rs b/src/grammar/alpha034/expressions/unary.rs index 9c5b3f4..a369957 100644 --- a/src/grammar/alpha034/expressions/unary.rs +++ b/src/grammar/alpha034/expressions/unary.rs @@ -1,7 +1,13 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha034::{lexer::Token, AmberParser, Expression, Spanned, Statement}, + grammar::alpha034::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + Statement, + }, T, }; diff --git a/src/grammar/alpha034/global.rs b/src/grammar/alpha034/global.rs index 22a5ae0..a6802cd 100644 --- a/src/grammar/alpha034/global.rs +++ b/src/grammar/alpha034/global.rs @@ -1,12 +1,23 @@ use chumsky::prelude::*; -use crate::{analysis::types::DataType, T}; +use crate::{ + analysis::types::DataType, + T, +}; use super::{ lexer::Token, - parser::{default_recovery, ident}, + parser::{ + default_recovery, + ident, + }, statements::statement_parser, - AmberParser, CompilerFlag, FunctionArgument, GlobalStatement, ImportContent, Spanned, + AmberParser, + CompilerFlag, + FunctionArgument, + GlobalStatement, + ImportContent, + Spanned, Statement, }; diff --git a/src/grammar/alpha034/mod.rs b/src/grammar/alpha034/mod.rs index d9f3843..5d580fc 100644 --- a/src/grammar/alpha034/mod.rs +++ b/src/grammar/alpha034/mod.rs @@ -1,16 +1,29 @@ use crate::analysis::types::DataType; pub use super::Spanned; -use super::{CommandModifier, CompilerFlag, Grammar, LSPAnalysis, ParserResponse, Span}; +use super::{ + CommandModifier, + CompilerFlag, + Grammar, + LSPAnalysis, + ParserResponse, + Span, +}; use chumsky::{ error::Rich, extra::Err, - input::{Input, SpannedInput}, + input::{ + Input, + SpannedInput, + }, span::SimpleSpan, Parser, }; use heraclitus_compiler::prelude::*; -use lexer::{get_rules, Token}; +use lexer::{ + get_rules, + Token, +}; use prelude::lexer::Lexer; use semantic_tokens::semantic_tokens_from_ast; diff --git a/src/grammar/alpha034/parser.rs b/src/grammar/alpha034/parser.rs index 75df53f..6a84d27 100644 --- a/src/grammar/alpha034/parser.rs +++ b/src/grammar/alpha034/parser.rs @@ -2,7 +2,10 @@ use chumsky::prelude::*; use crate::T; -use super::{lexer::Token, AmberParser}; +use super::{ + lexer::Token, + AmberParser, +}; const KEYWORDS: &[&str] = &[ "if", "else", "loop", "in", "return", "break", "continue", "true", "false", "null", "fun", diff --git a/src/grammar/alpha034/statements/block.rs b/src/grammar/alpha034/statements/block.rs index 361b05e..d6b8303 100644 --- a/src/grammar/alpha034/statements/block.rs +++ b/src/grammar/alpha034/statements/block.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - lexer::Token, parser::default_recovery, AmberParser, Block, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Block, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/statements/comment.rs b/src/grammar/alpha034/statements/comment.rs index 2adc93e..21a67f3 100644 --- a/src/grammar/alpha034/statements/comment.rs +++ b/src/grammar/alpha034/statements/comment.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use crate::grammar::alpha034::{lexer::Token, AmberParser, Comment, Spanned}; +use crate::grammar::alpha034::{ + lexer::Token, + AmberParser, + Comment, + Spanned, +}; pub fn comment_parser<'a>() -> impl AmberParser<'a, Spanned> { any() diff --git a/src/grammar/alpha034/statements/const_init.rs b/src/grammar/alpha034/statements/const_init.rs index 9fb30fc..d016bbe 100644 --- a/src/grammar/alpha034/statements/const_init.rs +++ b/src/grammar/alpha034/statements/const_init.rs @@ -6,8 +6,13 @@ use crate::{ alpha034::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Spanned, + Statement, }, }, T, diff --git a/src/grammar/alpha034/statements/failed.rs b/src/grammar/alpha034/statements/failed.rs index fa1e2ab..6904018 100644 --- a/src/grammar/alpha034/statements/failed.rs +++ b/src/grammar/alpha034/statements/failed.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - lexer::Token, parser::default_recovery, AmberParser, FailureHandler, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + FailureHandler, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/statements/if_cond.rs b/src/grammar/alpha034/statements/if_cond.rs index 2671dba..c73c4fd 100644 --- a/src/grammar/alpha034/statements/if_cond.rs +++ b/src/grammar/alpha034/statements/if_cond.rs @@ -2,8 +2,17 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, statements::comment, - AmberParser, Comment, ElseCondition, IfChainContent, IfCondition, Spanned, Statement, + expressions::parse_expr, + lexer::Token, + parser::default_recovery, + statements::comment, + AmberParser, + Comment, + ElseCondition, + IfChainContent, + IfCondition, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/statements/keywords.rs b/src/grammar/alpha034/statements/keywords.rs index 085b2f6..1d1be2f 100644 --- a/src/grammar/alpha034/statements/keywords.rs +++ b/src/grammar/alpha034/statements/keywords.rs @@ -2,8 +2,13 @@ use chumsky::prelude::*; use crate::{ grammar::alpha034::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, AmberParser, Expression, - Spanned, Statement, + expressions::parse_expr, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/statements/loops.rs b/src/grammar/alpha034/statements/loops.rs index 914f07b..e86186b 100644 --- a/src/grammar/alpha034/statements/loops.rs +++ b/src/grammar/alpha034/statements/loops.rs @@ -4,8 +4,16 @@ use crate::{ grammar::alpha034::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Block, Expression, IterLoopVars, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Block, + Expression, + IterLoopVars, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/statements/mod.rs b/src/grammar/alpha034/statements/mod.rs index 6e2f12c..94c525a 100644 --- a/src/grammar/alpha034/statements/mod.rs +++ b/src/grammar/alpha034/statements/mod.rs @@ -1,8 +1,16 @@ use chumsky::prelude::*; -use crate::{grammar::Token, T}; +use crate::{ + grammar::Token, + T, +}; -use super::{expressions::parse_expr, AmberParser, Spanned, Statement}; +use super::{ + expressions::parse_expr, + AmberParser, + Spanned, + Statement, +}; pub mod block; pub mod comment; diff --git a/src/grammar/alpha034/statements/modifiers.rs b/src/grammar/alpha034/statements/modifiers.rs index 73f376d..551473e 100644 --- a/src/grammar/alpha034/statements/modifiers.rs +++ b/src/grammar/alpha034/statements/modifiers.rs @@ -1,7 +1,12 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha034::{lexer::Token, AmberParser, CommandModifier, Spanned}, + grammar::alpha034::{ + lexer::Token, + AmberParser, + CommandModifier, + Spanned, + }, T, }; diff --git a/src/grammar/alpha034/statements/shebang.rs b/src/grammar/alpha034/statements/shebang.rs index 17ce1fb..78a1ffd 100644 --- a/src/grammar/alpha034/statements/shebang.rs +++ b/src/grammar/alpha034/statements/shebang.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use crate::grammar::alpha034::{lexer::Token, AmberParser, Spanned, Statement}; +use crate::grammar::alpha034::{ + lexer::Token, + AmberParser, + Spanned, + Statement, +}; pub fn shebang_parser<'a>() -> impl AmberParser<'a, Spanned> { any() diff --git a/src/grammar/alpha034/statements/shorthands.rs b/src/grammar/alpha034/statements/shorthands.rs index edfa25b..ca163e6 100644 --- a/src/grammar/alpha034/statements/shorthands.rs +++ b/src/grammar/alpha034/statements/shorthands.rs @@ -4,8 +4,14 @@ use crate::{ grammar::alpha034::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha034/statements/var_init.rs b/src/grammar/alpha034/statements/var_init.rs index 13642aa..27b17ca 100644 --- a/src/grammar/alpha034/statements/var_init.rs +++ b/src/grammar/alpha034/statements/var_init.rs @@ -5,8 +5,14 @@ use crate::{ expressions::parse_expr, global::type_parser, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Spanned, Statement, VariableInitType, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Spanned, + Statement, + VariableInitType, }, T, }; diff --git a/src/grammar/alpha034/statements/var_set.rs b/src/grammar/alpha034/statements/var_set.rs index c2e1650..3b15d82 100644 --- a/src/grammar/alpha034/statements/var_set.rs +++ b/src/grammar/alpha034/statements/var_set.rs @@ -4,8 +4,14 @@ use crate::{ grammar::alpha034::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/and.rs b/src/grammar/alpha035/expressions/and.rs index c224d1b..9291f4a 100644 --- a/src/grammar/alpha035/expressions/and.rs +++ b/src/grammar/alpha035/expressions/and.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/atom/array.rs b/src/grammar/alpha035/expressions/atom/array.rs index b810887..0effca2 100644 --- a/src/grammar/alpha035/expressions/atom/array.rs +++ b/src/grammar/alpha035/expressions/atom/array.rs @@ -1,7 +1,13 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha035::{lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned}, + grammar::alpha035::{ + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + }, T, }; diff --git a/src/grammar/alpha035/expressions/atom/bool.rs b/src/grammar/alpha035/expressions/atom/bool.rs index 6df689e..efb8491 100644 --- a/src/grammar/alpha035/expressions/atom/bool.rs +++ b/src/grammar/alpha035/expressions/atom/bool.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha035::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha035::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha035/expressions/atom/call.rs b/src/grammar/alpha035/expressions/atom/call.rs index 2f155f6..9ff43c9 100644 --- a/src/grammar/alpha035/expressions/atom/call.rs +++ b/src/grammar/alpha035/expressions/atom/call.rs @@ -1,9 +1,18 @@ use crate::{ grammar::alpha035::{ lexer::Token, - parser::{default_recovery, ident}, - statements::{failed::failure_parser, modifiers::modifier_parser}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + statements::{ + failed::failure_parser, + modifiers::modifier_parser, + }, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/atom/command.rs b/src/grammar/alpha035/expressions/atom/command.rs index 3b02006..6ca8164 100644 --- a/src/grammar/alpha035/expressions/atom/command.rs +++ b/src/grammar/alpha035/expressions/atom/command.rs @@ -4,8 +4,15 @@ use crate::{ grammar::alpha035::{ lexer::Token, parser::default_recovery, - statements::{failed::failure_parser, modifiers::modifier_parser}, - AmberParser, Expression, InterpolatedCommand, Spanned, Statement, + statements::{ + failed::failure_parser, + modifiers::modifier_parser, + }, + AmberParser, + Expression, + InterpolatedCommand, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/atom/mod.rs b/src/grammar/alpha035/expressions/atom/mod.rs index 45e9d4c..cbce07c 100644 --- a/src/grammar/alpha035/expressions/atom/mod.rs +++ b/src/grammar/alpha035/expressions/atom/mod.rs @@ -1,4 +1,8 @@ -use crate::grammar::alpha035::{AmberParser, Spanned, Statement}; +use crate::grammar::alpha035::{ + AmberParser, + Spanned, + Statement, +}; use super::super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha035/expressions/atom/null.rs b/src/grammar/alpha035/expressions/atom/null.rs index 1c17405..2d245bf 100644 --- a/src/grammar/alpha035/expressions/atom/null.rs +++ b/src/grammar/alpha035/expressions/atom/null.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha035::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha035::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha035/expressions/atom/number.rs b/src/grammar/alpha035/expressions/atom/number.rs index 6dafdc5..85b3696 100644 --- a/src/grammar/alpha035/expressions/atom/number.rs +++ b/src/grammar/alpha035/expressions/atom/number.rs @@ -1,7 +1,11 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha035::{lexer::Token, AmberParser, Spanned}, + grammar::alpha035::{ + lexer::Token, + AmberParser, + Spanned, + }, T, }; diff --git a/src/grammar/alpha035/expressions/atom/parentheses.rs b/src/grammar/alpha035/expressions/atom/parentheses.rs index f1eb737..8280240 100644 --- a/src/grammar/alpha035/expressions/atom/parentheses.rs +++ b/src/grammar/alpha035/expressions/atom/parentheses.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha035::{lexer::Token, parser::default_recovery, AmberParser, Spanned}, + grammar::alpha035::{ + lexer::Token, + parser::default_recovery, + AmberParser, + Spanned, + }, T, }; diff --git a/src/grammar/alpha035/expressions/atom/status.rs b/src/grammar/alpha035/expressions/atom/status.rs index ba9ca82..ecc6638 100644 --- a/src/grammar/alpha035/expressions/atom/status.rs +++ b/src/grammar/alpha035/expressions/atom/status.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha035::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha035::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha035/expressions/atom/text.rs b/src/grammar/alpha035/expressions/atom/text.rs index 2b01be9..7e02ab3 100644 --- a/src/grammar/alpha035/expressions/atom/text.rs +++ b/src/grammar/alpha035/expressions/atom/text.rs @@ -1,6 +1,11 @@ use crate::{ grammar::alpha035::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, InterpolatedText, Spanned, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + InterpolatedText, + Spanned, }, T, }; diff --git a/src/grammar/alpha035/expressions/atom/var.rs b/src/grammar/alpha035/expressions/atom/var.rs index 77b486d..8cc85ed 100644 --- a/src/grammar/alpha035/expressions/atom/var.rs +++ b/src/grammar/alpha035/expressions/atom/var.rs @@ -1,4 +1,8 @@ -use crate::grammar::alpha035::{parser::ident, AmberParser, Spanned}; +use crate::grammar::alpha035::{ + parser::ident, + AmberParser, + Spanned, +}; use super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha035/expressions/cast.rs b/src/grammar/alpha035/expressions/cast.rs index 586219e..280a211 100644 --- a/src/grammar/alpha035/expressions/cast.rs +++ b/src/grammar/alpha035/expressions/cast.rs @@ -2,8 +2,14 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, - Expression, Spanned, Statement, + global::type_parser, + lexer::Token, + parser::default_recovery, + AmberParser, + DataType, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/comparison.rs b/src/grammar/alpha035/expressions/comparison.rs index 9d82489..18b5604 100644 --- a/src/grammar/alpha035/expressions/comparison.rs +++ b/src/grammar/alpha035/expressions/comparison.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/is.rs b/src/grammar/alpha035/expressions/is.rs index 2487d5e..da413c8 100644 --- a/src/grammar/alpha035/expressions/is.rs +++ b/src/grammar/alpha035/expressions/is.rs @@ -2,8 +2,14 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, - Expression, Spanned, Statement, + global::type_parser, + lexer::Token, + parser::default_recovery, + AmberParser, + DataType, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/mod.rs b/src/grammar/alpha035/expressions/mod.rs index 71cb80b..ef862f3 100644 --- a/src/grammar/alpha035/expressions/mod.rs +++ b/src/grammar/alpha035/expressions/mod.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use super::{AmberParser, Expression, Spanned, Statement}; +use super::{ + AmberParser, + Expression, + Spanned, + Statement, +}; mod and; mod atom; diff --git a/src/grammar/alpha035/expressions/or.rs b/src/grammar/alpha035/expressions/or.rs index 4017528..5cae8f5 100644 --- a/src/grammar/alpha035/expressions/or.rs +++ b/src/grammar/alpha035/expressions/or.rs @@ -1,11 +1,20 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha035::{lexer::Token, parser::default_recovery, AmberParser, Spanned, Statement}, + grammar::alpha035::{ + lexer::Token, + parser::default_recovery, + AmberParser, + Spanned, + Statement, + }, T, }; -use super::{and::and_parser, Expression}; +use super::{ + and::and_parser, + Expression, +}; pub fn or_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/expressions/product.rs b/src/grammar/alpha035/expressions/product.rs index 6c24bfb..a4baf89 100644 --- a/src/grammar/alpha035/expressions/product.rs +++ b/src/grammar/alpha035/expressions/product.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/range.rs b/src/grammar/alpha035/expressions/range.rs index c35f89f..ac51db7 100644 --- a/src/grammar/alpha035/expressions/range.rs +++ b/src/grammar/alpha035/expressions/range.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/sum.rs b/src/grammar/alpha035/expressions/sum.rs index e19a322..b799754 100644 --- a/src/grammar/alpha035/expressions/sum.rs +++ b/src/grammar/alpha035/expressions/sum.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/expressions/ternary.rs b/src/grammar/alpha035/expressions/ternary.rs index a2e86ec..4091515 100644 --- a/src/grammar/alpha035/expressions/ternary.rs +++ b/src/grammar/alpha035/expressions/ternary.rs @@ -2,7 +2,11 @@ use chumsky::prelude::*; use crate::grammar::alpha035::lexer::Token; use crate::grammar::alpha035::parser::default_recovery; -use crate::grammar::alpha035::{AmberParser, Spanned, Statement}; +use crate::grammar::alpha035::{ + AmberParser, + Spanned, + Statement, +}; use crate::T; use super::range::range_parser; diff --git a/src/grammar/alpha035/expressions/unary.rs b/src/grammar/alpha035/expressions/unary.rs index 0bda554..77d38f4 100644 --- a/src/grammar/alpha035/expressions/unary.rs +++ b/src/grammar/alpha035/expressions/unary.rs @@ -1,7 +1,13 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha035::{lexer::Token, AmberParser, Expression, Spanned, Statement}, + grammar::alpha035::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + Statement, + }, T, }; diff --git a/src/grammar/alpha035/global.rs b/src/grammar/alpha035/global.rs index c848182..4d7725c 100644 --- a/src/grammar/alpha035/global.rs +++ b/src/grammar/alpha035/global.rs @@ -5,10 +5,20 @@ use crate::T; use super::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, + parser::{ + default_recovery, + ident, + }, statements::statement_parser, - AmberParser, CompilerFlag, DataType, Expression, FunctionArgument, GlobalStatement, - ImportContent, Spanned, Statement, + AmberParser, + CompilerFlag, + DataType, + Expression, + FunctionArgument, + GlobalStatement, + ImportContent, + Spanned, + Statement, }; pub fn import_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha035/mod.rs b/src/grammar/alpha035/mod.rs index 037fa95..55b45a1 100644 --- a/src/grammar/alpha035/mod.rs +++ b/src/grammar/alpha035/mod.rs @@ -1,16 +1,29 @@ use crate::analysis::types::DataType; pub use super::Spanned; -use super::{CommandModifier, CompilerFlag, Grammar, LSPAnalysis, ParserResponse, Span}; +use super::{ + CommandModifier, + CompilerFlag, + Grammar, + LSPAnalysis, + ParserResponse, + Span, +}; use chumsky::{ error::Rich, extra::Err, - input::{Input, SpannedInput}, + input::{ + Input, + SpannedInput, + }, span::SimpleSpan, Parser, }; use heraclitus_compiler::prelude::*; -use lexer::{get_rules, Token}; +use lexer::{ + get_rules, + Token, +}; use prelude::lexer::Lexer; use semantic_tokens::semantic_tokens_from_ast; diff --git a/src/grammar/alpha035/parser.rs b/src/grammar/alpha035/parser.rs index 75df53f..6a84d27 100644 --- a/src/grammar/alpha035/parser.rs +++ b/src/grammar/alpha035/parser.rs @@ -2,7 +2,10 @@ use chumsky::prelude::*; use crate::T; -use super::{lexer::Token, AmberParser}; +use super::{ + lexer::Token, + AmberParser, +}; const KEYWORDS: &[&str] = &[ "if", "else", "loop", "in", "return", "break", "continue", "true", "false", "null", "fun", diff --git a/src/grammar/alpha035/statements/block.rs b/src/grammar/alpha035/statements/block.rs index 18bc636..1806ec9 100644 --- a/src/grammar/alpha035/statements/block.rs +++ b/src/grammar/alpha035/statements/block.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - lexer::Token, parser::default_recovery, AmberParser, Block, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Block, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/statements/comment.rs b/src/grammar/alpha035/statements/comment.rs index 84b725c..e8c5869 100644 --- a/src/grammar/alpha035/statements/comment.rs +++ b/src/grammar/alpha035/statements/comment.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use crate::grammar::alpha035::{lexer::Token, AmberParser, Comment, Spanned}; +use crate::grammar::alpha035::{ + lexer::Token, + AmberParser, + Comment, + Spanned, +}; pub fn comment_parser<'a>() -> impl AmberParser<'a, Spanned> { choice((doc_string_parser(), single_line_comment_parser())).boxed() diff --git a/src/grammar/alpha035/statements/const_init.rs b/src/grammar/alpha035/statements/const_init.rs index 7ed9b4e..5988b36 100644 --- a/src/grammar/alpha035/statements/const_init.rs +++ b/src/grammar/alpha035/statements/const_init.rs @@ -6,8 +6,13 @@ use crate::{ alpha035::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Spanned, + Statement, }, }, T, diff --git a/src/grammar/alpha035/statements/failed.rs b/src/grammar/alpha035/statements/failed.rs index b532ea6..0bc34ab 100644 --- a/src/grammar/alpha035/statements/failed.rs +++ b/src/grammar/alpha035/statements/failed.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - lexer::Token, parser::default_recovery, AmberParser, FailureHandler, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + FailureHandler, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/statements/if_cond.rs b/src/grammar/alpha035/statements/if_cond.rs index da402dc..74dd57b 100644 --- a/src/grammar/alpha035/statements/if_cond.rs +++ b/src/grammar/alpha035/statements/if_cond.rs @@ -2,8 +2,17 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, statements::comment, - AmberParser, Comment, ElseCondition, IfChainContent, IfCondition, Spanned, Statement, + expressions::parse_expr, + lexer::Token, + parser::default_recovery, + statements::comment, + AmberParser, + Comment, + ElseCondition, + IfChainContent, + IfCondition, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/statements/keywords.rs b/src/grammar/alpha035/statements/keywords.rs index ff84e43..3fa819b 100644 --- a/src/grammar/alpha035/statements/keywords.rs +++ b/src/grammar/alpha035/statements/keywords.rs @@ -2,8 +2,13 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, AmberParser, Expression, - Spanned, Statement, + expressions::parse_expr, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/statements/loops.rs b/src/grammar/alpha035/statements/loops.rs index 38737ca..66a8a97 100644 --- a/src/grammar/alpha035/statements/loops.rs +++ b/src/grammar/alpha035/statements/loops.rs @@ -4,8 +4,16 @@ use crate::{ grammar::alpha035::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Block, Expression, IterLoopVars, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Block, + Expression, + IterLoopVars, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/statements/mod.rs b/src/grammar/alpha035/statements/mod.rs index 6f2857b..e9cec3d 100644 --- a/src/grammar/alpha035/statements/mod.rs +++ b/src/grammar/alpha035/statements/mod.rs @@ -1,8 +1,16 @@ use chumsky::prelude::*; -use crate::{grammar::Token, T}; +use crate::{ + grammar::Token, + T, +}; -use super::{expressions::parse_expr, AmberParser, Spanned, Statement}; +use super::{ + expressions::parse_expr, + AmberParser, + Spanned, + Statement, +}; pub mod block; pub mod comment; diff --git a/src/grammar/alpha035/statements/modifiers.rs b/src/grammar/alpha035/statements/modifiers.rs index fade6e5..53fa195 100644 --- a/src/grammar/alpha035/statements/modifiers.rs +++ b/src/grammar/alpha035/statements/modifiers.rs @@ -1,7 +1,12 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha035::{lexer::Token, AmberParser, CommandModifier, Spanned}, + grammar::alpha035::{ + lexer::Token, + AmberParser, + CommandModifier, + Spanned, + }, T, }; diff --git a/src/grammar/alpha035/statements/move_files.rs b/src/grammar/alpha035/statements/move_files.rs index 936b978..927568a 100644 --- a/src/grammar/alpha035/statements/move_files.rs +++ b/src/grammar/alpha035/statements/move_files.rs @@ -2,13 +2,21 @@ use chumsky::prelude::*; use crate::{ grammar::alpha035::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, AmberParser, Expression, - Spanned, Statement, + expressions::parse_expr, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; -use super::{failed::failure_parser, modifiers::modifier_parser}; +use super::{ + failed::failure_parser, + modifiers::modifier_parser, +}; pub fn move_files_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/statements/shebang.rs b/src/grammar/alpha035/statements/shebang.rs index a330e68..2a62d6c 100644 --- a/src/grammar/alpha035/statements/shebang.rs +++ b/src/grammar/alpha035/statements/shebang.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use crate::grammar::alpha035::{lexer::Token, AmberParser, Spanned, Statement}; +use crate::grammar::alpha035::{ + lexer::Token, + AmberParser, + Spanned, + Statement, +}; pub fn shebang_parser<'a>() -> impl AmberParser<'a, Spanned> { any() diff --git a/src/grammar/alpha035/statements/shorthands.rs b/src/grammar/alpha035/statements/shorthands.rs index caf600e..466c837 100644 --- a/src/grammar/alpha035/statements/shorthands.rs +++ b/src/grammar/alpha035/statements/shorthands.rs @@ -4,8 +4,14 @@ use crate::{ grammar::alpha035::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha035/statements/var_init.rs b/src/grammar/alpha035/statements/var_init.rs index 66cf69f..407dd6f 100644 --- a/src/grammar/alpha035/statements/var_init.rs +++ b/src/grammar/alpha035/statements/var_init.rs @@ -5,8 +5,14 @@ use crate::{ expressions::parse_expr, global::type_parser, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Spanned, Statement, VariableInitType, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Spanned, + Statement, + VariableInitType, }, T, }; diff --git a/src/grammar/alpha035/statements/var_set.rs b/src/grammar/alpha035/statements/var_set.rs index 087c10e..4182622 100644 --- a/src/grammar/alpha035/statements/var_set.rs +++ b/src/grammar/alpha035/statements/var_set.rs @@ -4,8 +4,14 @@ use crate::{ grammar::alpha035::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/and.rs b/src/grammar/alpha040/expressions/and.rs index ed5c17e..2321032 100644 --- a/src/grammar/alpha040/expressions/and.rs +++ b/src/grammar/alpha040/expressions/and.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/atom/array.rs b/src/grammar/alpha040/expressions/atom/array.rs index 21d253c..1ee8b78 100644 --- a/src/grammar/alpha040/expressions/atom/array.rs +++ b/src/grammar/alpha040/expressions/atom/array.rs @@ -1,7 +1,13 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha040::{lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned}, + grammar::alpha040::{ + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + }, T, }; diff --git a/src/grammar/alpha040/expressions/atom/bool.rs b/src/grammar/alpha040/expressions/atom/bool.rs index 44f3a0b..2c18258 100644 --- a/src/grammar/alpha040/expressions/atom/bool.rs +++ b/src/grammar/alpha040/expressions/atom/bool.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha040::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha040::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha040/expressions/atom/call.rs b/src/grammar/alpha040/expressions/atom/call.rs index b4f01f1..291a014 100644 --- a/src/grammar/alpha040/expressions/atom/call.rs +++ b/src/grammar/alpha040/expressions/atom/call.rs @@ -1,9 +1,18 @@ use crate::{ grammar::alpha040::{ lexer::Token, - parser::{default_recovery, ident}, - statements::{failed::failure_parser, modifiers::modifier_parser}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + statements::{ + failed::failure_parser, + modifiers::modifier_parser, + }, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/atom/command.rs b/src/grammar/alpha040/expressions/atom/command.rs index 556572f..f7ad32f 100644 --- a/src/grammar/alpha040/expressions/atom/command.rs +++ b/src/grammar/alpha040/expressions/atom/command.rs @@ -4,8 +4,15 @@ use crate::{ grammar::alpha040::{ lexer::Token, parser::default_recovery, - statements::{failed::failure_parser, modifiers::modifier_parser}, - AmberParser, Expression, InterpolatedCommand, Spanned, Statement, + statements::{ + failed::failure_parser, + modifiers::modifier_parser, + }, + AmberParser, + Expression, + InterpolatedCommand, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/atom/exit.rs b/src/grammar/alpha040/expressions/atom/exit.rs index bb05138..11f8447 100644 --- a/src/grammar/alpha040/expressions/atom/exit.rs +++ b/src/grammar/alpha040/expressions/atom/exit.rs @@ -1,7 +1,12 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha040::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha040::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; diff --git a/src/grammar/alpha040/expressions/atom/mod.rs b/src/grammar/alpha040/expressions/atom/mod.rs index b6772cb..5eb0e77 100644 --- a/src/grammar/alpha040/expressions/atom/mod.rs +++ b/src/grammar/alpha040/expressions/atom/mod.rs @@ -1,7 +1,12 @@ use crate::{ grammar::{ alpha040::parser::default_recovery, - alpha040::{lexer::Token, AmberParser, Spanned, Statement}, + alpha040::{ + lexer::Token, + AmberParser, + Spanned, + Statement, + }, }, T, }; diff --git a/src/grammar/alpha040/expressions/atom/null.rs b/src/grammar/alpha040/expressions/atom/null.rs index 78ee03c..0ef5bc3 100644 --- a/src/grammar/alpha040/expressions/atom/null.rs +++ b/src/grammar/alpha040/expressions/atom/null.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha040::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha040::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha040/expressions/atom/number.rs b/src/grammar/alpha040/expressions/atom/number.rs index 9d51bca..569e8b6 100644 --- a/src/grammar/alpha040/expressions/atom/number.rs +++ b/src/grammar/alpha040/expressions/atom/number.rs @@ -1,7 +1,11 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha040::{lexer::Token, AmberParser, Spanned}, + grammar::alpha040::{ + lexer::Token, + AmberParser, + Spanned, + }, T, }; diff --git a/src/grammar/alpha040/expressions/atom/parentheses.rs b/src/grammar/alpha040/expressions/atom/parentheses.rs index ad0a831..122fd48 100644 --- a/src/grammar/alpha040/expressions/atom/parentheses.rs +++ b/src/grammar/alpha040/expressions/atom/parentheses.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha040::{lexer::Token, parser::default_recovery, AmberParser, Spanned}, + grammar::alpha040::{ + lexer::Token, + parser::default_recovery, + AmberParser, + Spanned, + }, T, }; diff --git a/src/grammar/alpha040/expressions/atom/status.rs b/src/grammar/alpha040/expressions/atom/status.rs index 4393dcb..315a691 100644 --- a/src/grammar/alpha040/expressions/atom/status.rs +++ b/src/grammar/alpha040/expressions/atom/status.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha040::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha040::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha040/expressions/atom/text.rs b/src/grammar/alpha040/expressions/atom/text.rs index 8c6bd60..2656549 100644 --- a/src/grammar/alpha040/expressions/atom/text.rs +++ b/src/grammar/alpha040/expressions/atom/text.rs @@ -1,6 +1,11 @@ use crate::{ grammar::alpha040::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, InterpolatedText, Spanned, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + InterpolatedText, + Spanned, }, T, }; diff --git a/src/grammar/alpha040/expressions/atom/var.rs b/src/grammar/alpha040/expressions/atom/var.rs index d48248f..81fc4aa 100644 --- a/src/grammar/alpha040/expressions/atom/var.rs +++ b/src/grammar/alpha040/expressions/atom/var.rs @@ -1,4 +1,8 @@ -use crate::grammar::alpha040::{parser::ident, AmberParser, Spanned}; +use crate::grammar::alpha040::{ + parser::ident, + AmberParser, + Spanned, +}; use super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha040/expressions/cast.rs b/src/grammar/alpha040/expressions/cast.rs index 2b3e00c..56a58f1 100644 --- a/src/grammar/alpha040/expressions/cast.rs +++ b/src/grammar/alpha040/expressions/cast.rs @@ -2,8 +2,14 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, - Expression, Spanned, Statement, + global::type_parser, + lexer::Token, + parser::default_recovery, + AmberParser, + DataType, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/comparison.rs b/src/grammar/alpha040/expressions/comparison.rs index b2e977b..5305f50 100644 --- a/src/grammar/alpha040/expressions/comparison.rs +++ b/src/grammar/alpha040/expressions/comparison.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/is.rs b/src/grammar/alpha040/expressions/is.rs index 76e718e..d3c5959 100644 --- a/src/grammar/alpha040/expressions/is.rs +++ b/src/grammar/alpha040/expressions/is.rs @@ -2,8 +2,14 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, - Expression, Spanned, Statement, + global::type_parser, + lexer::Token, + parser::default_recovery, + AmberParser, + DataType, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/mod.rs b/src/grammar/alpha040/expressions/mod.rs index 71cb80b..ef862f3 100644 --- a/src/grammar/alpha040/expressions/mod.rs +++ b/src/grammar/alpha040/expressions/mod.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use super::{AmberParser, Expression, Spanned, Statement}; +use super::{ + AmberParser, + Expression, + Spanned, + Statement, +}; mod and; mod atom; diff --git a/src/grammar/alpha040/expressions/or.rs b/src/grammar/alpha040/expressions/or.rs index 2f21572..1db885f 100644 --- a/src/grammar/alpha040/expressions/or.rs +++ b/src/grammar/alpha040/expressions/or.rs @@ -1,11 +1,20 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha040::{lexer::Token, parser::default_recovery, AmberParser, Spanned, Statement}, + grammar::alpha040::{ + lexer::Token, + parser::default_recovery, + AmberParser, + Spanned, + Statement, + }, T, }; -use super::{and::and_parser, Expression}; +use super::{ + and::and_parser, + Expression, +}; pub fn or_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/expressions/product.rs b/src/grammar/alpha040/expressions/product.rs index 3f24ba4..fcd1e6d 100644 --- a/src/grammar/alpha040/expressions/product.rs +++ b/src/grammar/alpha040/expressions/product.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/range.rs b/src/grammar/alpha040/expressions/range.rs index b5182c6..60df5e2 100644 --- a/src/grammar/alpha040/expressions/range.rs +++ b/src/grammar/alpha040/expressions/range.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/sum.rs b/src/grammar/alpha040/expressions/sum.rs index 4e56f00..47e11da 100644 --- a/src/grammar/alpha040/expressions/sum.rs +++ b/src/grammar/alpha040/expressions/sum.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/expressions/ternary.rs b/src/grammar/alpha040/expressions/ternary.rs index e1765ba..cc4dc24 100644 --- a/src/grammar/alpha040/expressions/ternary.rs +++ b/src/grammar/alpha040/expressions/ternary.rs @@ -2,7 +2,11 @@ use chumsky::prelude::*; use crate::grammar::alpha040::lexer::Token; use crate::grammar::alpha040::parser::default_recovery; -use crate::grammar::alpha040::{AmberParser, Spanned, Statement}; +use crate::grammar::alpha040::{ + AmberParser, + Spanned, + Statement, +}; use crate::T; use super::range::range_parser; diff --git a/src/grammar/alpha040/expressions/unary.rs b/src/grammar/alpha040/expressions/unary.rs index faa149a..cea6bc4 100644 --- a/src/grammar/alpha040/expressions/unary.rs +++ b/src/grammar/alpha040/expressions/unary.rs @@ -1,7 +1,13 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha040::{lexer::Token, AmberParser, Expression, Spanned, Statement}, + grammar::alpha040::{ + lexer::Token, + AmberParser, + Expression, + Spanned, + Statement, + }, T, }; diff --git a/src/grammar/alpha040/global.rs b/src/grammar/alpha040/global.rs index eaebeaf..bcb32a2 100644 --- a/src/grammar/alpha040/global.rs +++ b/src/grammar/alpha040/global.rs @@ -5,10 +5,20 @@ use crate::T; use super::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, + parser::{ + default_recovery, + ident, + }, statements::statement_parser, - AmberParser, CompilerFlag, DataType, Expression, FunctionArgument, GlobalStatement, - ImportContent, Spanned, Statement, + AmberParser, + CompilerFlag, + DataType, + Expression, + FunctionArgument, + GlobalStatement, + ImportContent, + Spanned, + Statement, }; pub fn import_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha040/mod.rs b/src/grammar/alpha040/mod.rs index 7f208ec..8db4017 100644 --- a/src/grammar/alpha040/mod.rs +++ b/src/grammar/alpha040/mod.rs @@ -1,16 +1,29 @@ use crate::analysis::types::DataType; pub use super::Spanned; -use super::{CommandModifier, CompilerFlag, Grammar, LSPAnalysis, ParserResponse, Span}; +use super::{ + CommandModifier, + CompilerFlag, + Grammar, + LSPAnalysis, + ParserResponse, + Span, +}; use chumsky::{ error::Rich, extra::Err, - input::{Input, SpannedInput}, + input::{ + Input, + SpannedInput, + }, span::SimpleSpan, Parser, }; use heraclitus_compiler::prelude::*; -use lexer::{get_rules, Token}; +use lexer::{ + get_rules, + Token, +}; use prelude::lexer::Lexer; use semantic_tokens::semantic_tokens_from_ast; diff --git a/src/grammar/alpha040/parser.rs b/src/grammar/alpha040/parser.rs index e76b58c..73be524 100644 --- a/src/grammar/alpha040/parser.rs +++ b/src/grammar/alpha040/parser.rs @@ -2,7 +2,10 @@ use chumsky::prelude::*; use crate::T; -use super::{lexer::Token, AmberParser}; +use super::{ + lexer::Token, + AmberParser, +}; const KEYWORDS: &[&str] = &[ "if", "else", "loop", "in", "return", "break", "continue", "true", "false", "null", "fun", diff --git a/src/grammar/alpha040/statements/block.rs b/src/grammar/alpha040/statements/block.rs index 52dc7b4..77e7725 100644 --- a/src/grammar/alpha040/statements/block.rs +++ b/src/grammar/alpha040/statements/block.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - lexer::Token, parser::default_recovery, AmberParser, Block, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + Block, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/statements/comment.rs b/src/grammar/alpha040/statements/comment.rs index 64f59b0..ed9f798 100644 --- a/src/grammar/alpha040/statements/comment.rs +++ b/src/grammar/alpha040/statements/comment.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use crate::grammar::alpha040::{lexer::Token, AmberParser, Comment, Spanned}; +use crate::grammar::alpha040::{ + lexer::Token, + AmberParser, + Comment, + Spanned, +}; pub fn comment_parser<'a>() -> impl AmberParser<'a, Spanned> { choice((doc_string_parser(), single_line_comment_parser())).boxed() diff --git a/src/grammar/alpha040/statements/const_init.rs b/src/grammar/alpha040/statements/const_init.rs index 650b757..893e7d3 100644 --- a/src/grammar/alpha040/statements/const_init.rs +++ b/src/grammar/alpha040/statements/const_init.rs @@ -6,8 +6,13 @@ use crate::{ alpha040::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Spanned, + Statement, }, }, T, diff --git a/src/grammar/alpha040/statements/failed.rs b/src/grammar/alpha040/statements/failed.rs index 36dd335..cf0e399 100644 --- a/src/grammar/alpha040/statements/failed.rs +++ b/src/grammar/alpha040/statements/failed.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - lexer::Token, parser::default_recovery, AmberParser, FailureHandler, Spanned, Statement, + lexer::Token, + parser::default_recovery, + AmberParser, + FailureHandler, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/statements/if_cond.rs b/src/grammar/alpha040/statements/if_cond.rs index 89ae22c..9d39fca 100644 --- a/src/grammar/alpha040/statements/if_cond.rs +++ b/src/grammar/alpha040/statements/if_cond.rs @@ -2,8 +2,17 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, statements::comment, - AmberParser, Comment, ElseCondition, IfChainContent, IfCondition, Spanned, Statement, + expressions::parse_expr, + lexer::Token, + parser::default_recovery, + statements::comment, + AmberParser, + Comment, + ElseCondition, + IfChainContent, + IfCondition, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/statements/keywords.rs b/src/grammar/alpha040/statements/keywords.rs index edac590..6c6a287 100644 --- a/src/grammar/alpha040/statements/keywords.rs +++ b/src/grammar/alpha040/statements/keywords.rs @@ -2,8 +2,13 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, AmberParser, Expression, - Spanned, Statement, + expressions::parse_expr, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/statements/loops.rs b/src/grammar/alpha040/statements/loops.rs index 8a162cf..690d5f2 100644 --- a/src/grammar/alpha040/statements/loops.rs +++ b/src/grammar/alpha040/statements/loops.rs @@ -4,8 +4,16 @@ use crate::{ grammar::alpha040::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Block, Expression, IterLoopVars, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Block, + Expression, + IterLoopVars, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/statements/mod.rs b/src/grammar/alpha040/statements/mod.rs index 6f2857b..e9cec3d 100644 --- a/src/grammar/alpha040/statements/mod.rs +++ b/src/grammar/alpha040/statements/mod.rs @@ -1,8 +1,16 @@ use chumsky::prelude::*; -use crate::{grammar::Token, T}; +use crate::{ + grammar::Token, + T, +}; -use super::{expressions::parse_expr, AmberParser, Spanned, Statement}; +use super::{ + expressions::parse_expr, + AmberParser, + Spanned, + Statement, +}; pub mod block; pub mod comment; diff --git a/src/grammar/alpha040/statements/modifiers.rs b/src/grammar/alpha040/statements/modifiers.rs index 809e6ae..384e3e5 100644 --- a/src/grammar/alpha040/statements/modifiers.rs +++ b/src/grammar/alpha040/statements/modifiers.rs @@ -1,7 +1,12 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha040::{lexer::Token, AmberParser, CommandModifier, Spanned}, + grammar::alpha040::{ + lexer::Token, + AmberParser, + CommandModifier, + Spanned, + }, T, }; diff --git a/src/grammar/alpha040/statements/move_files.rs b/src/grammar/alpha040/statements/move_files.rs index ba6d24e..71e132a 100644 --- a/src/grammar/alpha040/statements/move_files.rs +++ b/src/grammar/alpha040/statements/move_files.rs @@ -2,13 +2,21 @@ use chumsky::prelude::*; use crate::{ grammar::alpha040::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, AmberParser, Expression, - Spanned, Statement, + expressions::parse_expr, + lexer::Token, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; -use super::{failed::failure_parser, modifiers::modifier_parser}; +use super::{ + failed::failure_parser, + modifiers::modifier_parser, +}; pub fn move_files_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/statements/shebang.rs b/src/grammar/alpha040/statements/shebang.rs index 0b9b961..5532bcc 100644 --- a/src/grammar/alpha040/statements/shebang.rs +++ b/src/grammar/alpha040/statements/shebang.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use crate::grammar::alpha040::{lexer::Token, AmberParser, Spanned, Statement}; +use crate::grammar::alpha040::{ + lexer::Token, + AmberParser, + Spanned, + Statement, +}; pub fn shebang_parser<'a>() -> impl AmberParser<'a, Spanned> { any() diff --git a/src/grammar/alpha040/statements/shorthands.rs b/src/grammar/alpha040/statements/shorthands.rs index 24cd6de..b6f4cc1 100644 --- a/src/grammar/alpha040/statements/shorthands.rs +++ b/src/grammar/alpha040/statements/shorthands.rs @@ -4,8 +4,14 @@ use crate::{ grammar::alpha040::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha040/statements/var_init.rs b/src/grammar/alpha040/statements/var_init.rs index 521d857..40ff816 100644 --- a/src/grammar/alpha040/statements/var_init.rs +++ b/src/grammar/alpha040/statements/var_init.rs @@ -5,8 +5,14 @@ use crate::{ expressions::parse_expr, global::type_parser, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Spanned, Statement, VariableInitType, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Spanned, + Statement, + VariableInitType, }, T, }; diff --git a/src/grammar/alpha040/statements/var_set.rs b/src/grammar/alpha040/statements/var_set.rs index d75ccc4..09e6fc8 100644 --- a/src/grammar/alpha040/statements/var_set.rs +++ b/src/grammar/alpha040/statements/var_set.rs @@ -4,8 +4,14 @@ use crate::{ grammar::alpha040::{ expressions::parse_expr, lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Expression, + Spanned, + Statement, }, T, }; diff --git a/src/grammar/alpha050/expressions/and.rs b/src/grammar/alpha050/expressions/and.rs index ffef80f..a14c224 100644 --- a/src/grammar/alpha050/expressions/and.rs +++ b/src/grammar/alpha050/expressions/and.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/atom/array.rs b/src/grammar/alpha050/expressions/atom/array.rs index 973b182..baded24 100644 --- a/src/grammar/alpha050/expressions/atom/array.rs +++ b/src/grammar/alpha050/expressions/atom/array.rs @@ -1,7 +1,13 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha050::{lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned}, + grammar::alpha050::{ + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Token, + }, T, }; diff --git a/src/grammar/alpha050/expressions/atom/bool.rs b/src/grammar/alpha050/expressions/atom/bool.rs index e76af3c..e99426a 100644 --- a/src/grammar/alpha050/expressions/atom/bool.rs +++ b/src/grammar/alpha050/expressions/atom/bool.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Token, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha050/expressions/atom/call.rs b/src/grammar/alpha050/expressions/atom/call.rs index 4de585c..75a0e1f 100644 --- a/src/grammar/alpha050/expressions/atom/call.rs +++ b/src/grammar/alpha050/expressions/atom/call.rs @@ -1,9 +1,18 @@ use crate::{ grammar::alpha050::{ - lexer::Token, - parser::{default_recovery, ident}, - statements::{failable_handlers::failable_handlers_parser, modifiers::modifier_parser}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + statements::{ + failable_handlers::failable_handlers_parser, + modifiers::modifier_parser, + }, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/atom/command.rs b/src/grammar/alpha050/expressions/atom/command.rs index 4de1146..685e20e 100644 --- a/src/grammar/alpha050/expressions/atom/command.rs +++ b/src/grammar/alpha050/expressions/atom/command.rs @@ -2,10 +2,17 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - lexer::Token, parser::default_recovery, - statements::{failable_handlers::failable_handlers_parser, modifiers::modifier_parser}, - AmberParser, Expression, InterpolatedCommand, Spanned, Statement, + statements::{ + failable_handlers::failable_handlers_parser, + modifiers::modifier_parser, + }, + AmberParser, + Expression, + InterpolatedCommand, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/atom/exit.rs b/src/grammar/alpha050/expressions/atom/exit.rs index 0bde77a..f9f5ba3 100644 --- a/src/grammar/alpha050/expressions/atom/exit.rs +++ b/src/grammar/alpha050/expressions/atom/exit.rs @@ -1,7 +1,12 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Token, + }, T, }; diff --git a/src/grammar/alpha050/expressions/atom/int.rs b/src/grammar/alpha050/expressions/atom/int.rs index 2edfdc9..9b337a8 100644 --- a/src/grammar/alpha050/expressions/atom/int.rs +++ b/src/grammar/alpha050/expressions/atom/int.rs @@ -1,6 +1,10 @@ use chumsky::prelude::*; -use crate::grammar::alpha050::{lexer::Token, AmberParser, Spanned}; +use crate::grammar::alpha050::{ + AmberParser, + Spanned, + Token, +}; use super::Expression; diff --git a/src/grammar/alpha050/expressions/atom/mod.rs b/src/grammar/alpha050/expressions/atom/mod.rs index 949b42b..004fc34 100644 --- a/src/grammar/alpha050/expressions/atom/mod.rs +++ b/src/grammar/alpha050/expressions/atom/mod.rs @@ -1,7 +1,12 @@ use crate::{ grammar::{ alpha050::parser::default_recovery, - alpha050::{lexer::Token, AmberParser, Spanned, Statement}, + alpha050::{ + AmberParser, + Spanned, + Statement, + Token, + }, }, T, }; @@ -37,8 +42,8 @@ pub fn atom_parser<'a>( text::text_parser(expr.clone()), array::array_parser(expr.clone()), command::command_parser(stmnts.clone(), expr.clone()), - number::number_parser(), int::int_parser(), + number::number_parser(), )) .boxed() } diff --git a/src/grammar/alpha050/expressions/atom/null.rs b/src/grammar/alpha050/expressions/atom/null.rs index 80bfec7..4036cfe 100644 --- a/src/grammar/alpha050/expressions/atom/null.rs +++ b/src/grammar/alpha050/expressions/atom/null.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Token, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha050/expressions/atom/number.rs b/src/grammar/alpha050/expressions/atom/number.rs index 769c413..220ddbb 100644 --- a/src/grammar/alpha050/expressions/atom/number.rs +++ b/src/grammar/alpha050/expressions/atom/number.rs @@ -1,35 +1,36 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{lexer::Token, AmberParser, Spanned}, - T, +use crate::grammar::{ + alpha050::{ + AmberParser, + Expression, + }, + Spanned, + Token, }; -use super::Expression; - pub fn number_parser<'a>() -> impl AmberParser<'a, Spanned> { - let int = any().try_map(|token: Token, span| { - let word = token.to_string(); - - for char in word.chars() { - if !char.is_ascii_digit() { - return Err(Rich::custom(span, "int must contain only digits")); - } - } + // The Logos lexer now produces complete number tokens like "2.5", ".4", or "42" + // So we just need to parse the token string directly + any() + .try_map(|token: Token, span| { + let word = token.to_string(); - Ok(word) - }); + // Handle integers and floats in a single token + // Valid formats: "123", "123.456", ".456" + let num_str = if word.starts_with('.') { + // For numbers like ".4", prepend "0" to make "0.4" + format!("0{}", word) + } else { + word + }; - choice(( - int.then(just(T!['.']).ignore_then(int)) - .map(|(int, float)| format!("{int}.{float}")), - just(T!['.']) - .ignore_then(int) - .map(|float| format!("0.{float}")), - )) - .from_str::() - .unwrapped() - .map_with(|num, e| (Expression::Number((num, e.span())), e.span())) - .boxed() - .labelled("number") + // Parse as f32 + num_str + .parse::() + .map_err(|_| Rich::custom(span, format!("invalid number format: {}", num_str))) + }) + .map_with(|num, e| (Expression::Number((num, e.span())), e.span())) + .boxed() + .labelled("number") } diff --git a/src/grammar/alpha050/expressions/atom/parentheses.rs b/src/grammar/alpha050/expressions/atom/parentheses.rs index ab063e3..377f2e7 100644 --- a/src/grammar/alpha050/expressions/atom/parentheses.rs +++ b/src/grammar/alpha050/expressions/atom/parentheses.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha050::{lexer::Token, parser::default_recovery, AmberParser, Spanned}, + grammar::alpha050::{ + parser::default_recovery, + AmberParser, + Spanned, + Token, + }, T, }; diff --git a/src/grammar/alpha050/expressions/atom/status.rs b/src/grammar/alpha050/expressions/atom/status.rs index 7c20eee..a2290b5 100644 --- a/src/grammar/alpha050/expressions/atom/status.rs +++ b/src/grammar/alpha050/expressions/atom/status.rs @@ -1,5 +1,10 @@ use crate::{ - grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned}, + grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Token, + }, T, }; use chumsky::prelude::*; diff --git a/src/grammar/alpha050/expressions/atom/text.rs b/src/grammar/alpha050/expressions/atom/text.rs index c96dd03..e8bc7eb 100644 --- a/src/grammar/alpha050/expressions/atom/text.rs +++ b/src/grammar/alpha050/expressions/atom/text.rs @@ -1,6 +1,11 @@ use crate::{ grammar::alpha050::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, InterpolatedText, Spanned, + parser::default_recovery, + AmberParser, + Expression, + InterpolatedText, + Spanned, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/atom/var.rs b/src/grammar/alpha050/expressions/atom/var.rs index 03d61ae..6128a29 100644 --- a/src/grammar/alpha050/expressions/atom/var.rs +++ b/src/grammar/alpha050/expressions/atom/var.rs @@ -1,4 +1,8 @@ -use crate::grammar::alpha050::{parser::ident, AmberParser, Spanned}; +use crate::grammar::alpha050::{ + parser::ident, + AmberParser, + Spanned, +}; use super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha050/expressions/cast.rs b/src/grammar/alpha050/expressions/cast.rs index 22c2ede..dc826c8 100644 --- a/src/grammar/alpha050/expressions/cast.rs +++ b/src/grammar/alpha050/expressions/cast.rs @@ -2,8 +2,14 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, - Expression, Spanned, Statement, + global::type_parser, + parser::default_recovery, + AmberParser, + DataType, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/comparison.rs b/src/grammar/alpha050/expressions/comparison.rs index 92be98f..d06e35d 100644 --- a/src/grammar/alpha050/expressions/comparison.rs +++ b/src/grammar/alpha050/expressions/comparison.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/is.rs b/src/grammar/alpha050/expressions/is.rs index 5ee4bd4..87e3295 100644 --- a/src/grammar/alpha050/expressions/is.rs +++ b/src/grammar/alpha050/expressions/is.rs @@ -2,8 +2,14 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - global::type_parser, lexer::Token, parser::default_recovery, AmberParser, DataType, - Expression, Spanned, Statement, + global::type_parser, + parser::default_recovery, + AmberParser, + DataType, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/mod.rs b/src/grammar/alpha050/expressions/mod.rs index 71cb80b..ef862f3 100644 --- a/src/grammar/alpha050/expressions/mod.rs +++ b/src/grammar/alpha050/expressions/mod.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use super::{AmberParser, Expression, Spanned, Statement}; +use super::{ + AmberParser, + Expression, + Spanned, + Statement, +}; mod and; mod atom; diff --git a/src/grammar/alpha050/expressions/or.rs b/src/grammar/alpha050/expressions/or.rs index 364835d..03bb6f3 100644 --- a/src/grammar/alpha050/expressions/or.rs +++ b/src/grammar/alpha050/expressions/or.rs @@ -1,11 +1,20 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha050::{lexer::Token, parser::default_recovery, AmberParser, Spanned, Statement}, + grammar::alpha050::{ + parser::default_recovery, + AmberParser, + Spanned, + Statement, + Token, + }, T, }; -use super::{and::and_parser, Expression}; +use super::{ + and::and_parser, + Expression, +}; pub fn or_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/expressions/product.rs b/src/grammar/alpha050/expressions/product.rs index 5025d63..c80b87b 100644 --- a/src/grammar/alpha050/expressions/product.rs +++ b/src/grammar/alpha050/expressions/product.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/range.rs b/src/grammar/alpha050/expressions/range.rs index f4b4e64..a08a770 100644 --- a/src/grammar/alpha050/expressions/range.rs +++ b/src/grammar/alpha050/expressions/range.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/sum.rs b/src/grammar/alpha050/expressions/sum.rs index b36c8aa..922c384 100644 --- a/src/grammar/alpha050/expressions/sum.rs +++ b/src/grammar/alpha050/expressions/sum.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - lexer::Token, parser::default_recovery, AmberParser, Expression, Spanned, Statement, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/expressions/ternary.rs b/src/grammar/alpha050/expressions/ternary.rs index 1392746..c55c509 100644 --- a/src/grammar/alpha050/expressions/ternary.rs +++ b/src/grammar/alpha050/expressions/ternary.rs @@ -1,8 +1,12 @@ use chumsky::prelude::*; -use crate::grammar::alpha050::lexer::Token; use crate::grammar::alpha050::parser::default_recovery; -use crate::grammar::alpha050::{AmberParser, Spanned, Statement}; +use crate::grammar::alpha050::Token; +use crate::grammar::alpha050::{ + AmberParser, + Spanned, + Statement, +}; use crate::T; use super::range::range_parser; diff --git a/src/grammar/alpha050/expressions/unary.rs b/src/grammar/alpha050/expressions/unary.rs index 1d8ba97..302a68c 100644 --- a/src/grammar/alpha050/expressions/unary.rs +++ b/src/grammar/alpha050/expressions/unary.rs @@ -1,7 +1,13 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha050::{lexer::Token, AmberParser, Expression, Spanned, Statement}, + grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, + }, T, }; diff --git a/src/grammar/alpha050/global.rs b/src/grammar/alpha050/global.rs index a9f38ff..d7de0e3 100644 --- a/src/grammar/alpha050/global.rs +++ b/src/grammar/alpha050/global.rs @@ -1,17 +1,32 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha050::{statements::block::block_parser, Block}, + grammar::{ + alpha050::{ + statements::block::block_parser, + Block, + }, + Token, + }, T, }; use super::{ expressions::parse_expr, - lexer::Token, - parser::{default_recovery, ident}, + parser::{ + default_recovery, + ident, + }, statements::statement_parser, - AmberParser, CompilerFlag, DataType, Expression, FunctionArgument, GlobalStatement, - ImportContent, Spanned, Statement, + AmberParser, + CompilerFlag, + DataType, + Expression, + FunctionArgument, + GlobalStatement, + ImportContent, + Spanned, + Statement, }; pub fn import_parser<'a>() -> impl AmberParser<'a, Spanned> { @@ -125,8 +140,7 @@ pub fn type_parser<'a>() -> impl AmberParser<'a, Spanned> { } fn compiler_flag_parser<'a>() -> impl AmberParser<'a, Spanned> { - just(T!["#"]) - .ignore_then(just(T!["["])) + just(T!["#["]) .ignore_then( choice(( just(T!["allow_nested_if_else"]).to(CompilerFlag::AllowNestedIfElse), diff --git a/src/grammar/alpha050/lexer.rs b/src/grammar/alpha050/lexer.rs deleted file mode 100644 index 278aaef..0000000 --- a/src/grammar/alpha050/lexer.rs +++ /dev/null @@ -1,74 +0,0 @@ -use heraclitus_compiler::prelude::*; - -pub use crate::grammar::Token; - -pub fn get_rules() -> Rules { - let symbols = vec![ - '+', '-', '*', '/', '%', ';', ':', '(', ')', '[', ']', '{', '}', ',', '.', '<', '>', '=', - '!', '?', '\\', '"', '$', '\n', - ]; - let compounds = vec![ - ('<', '='), - ('>', '='), - ('!', '='), - ('=', '='), - ('+', '='), - ('-', '='), - ('*', '='), - ('/', '='), - ('%', '='), - ('.', '.'), - ('/', '/'), - ]; - let region = reg![ - reg!(string as "string literal" => { - begin: "\"", - end: "\"", - tokenize: true, - allow_unclosed_region: true - } => [ - reg!(str_interp as "string interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]), - reg!(command as "command literal" => { - begin: "$", - end: "$", - tokenize: true, - allow_unclosed_region: true - } => [ - reg!(com_interp as "command interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]), - reg!(cc_flag as "compiler flag" => { - begin: "#[", - end: "]", - tokenize: true, - allow_unclosed_region: true - }), - reg!(comment as "comment" => { - begin: "//", - end: "\n", - allow_unclosed_region: true - }), - reg!(comment as "shebang" => { - begin: "#!", - end: "\n", - allow_unclosed_region: true - }), - reg!(interp as "interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]; - Rules::new(symbols, compounds, region) -} diff --git a/src/grammar/alpha050/lexer_logos_v2.rs b/src/grammar/alpha050/lexer_logos_v2.rs new file mode 100644 index 0000000..6af100b --- /dev/null +++ b/src/grammar/alpha050/lexer_logos_v2.rs @@ -0,0 +1,999 @@ +use logos::Logos; + +use super::{ + Spanned, + Token, +}; +use crate::grammar::SimpleSpan; + +/// Main token context - general code +#[derive(Logos, Debug, Clone, PartialEq)] +#[logos(skip r"[ \t\r]+")] +pub enum TokenKind { + // Compound operators + #[token("<=")] + LessEquals, + #[token(">=")] + GreaterEquals, + #[token("!=")] + NotEquals, + #[token("==")] + EqualsEquals, + #[token("+=")] + PlusEquals, + #[token("-=")] + MinusEquals, + #[token("*=")] + MulEquals, + #[token("/=")] + DivEquals, + #[token("%=")] + ModEquals, + #[token("..")] + DotDot, + + // Single operators + #[token("+")] + Plus, + #[token("-")] + Minus, + #[token("*")] + Star, + #[token("/")] + Slash, + #[token("%")] + Percent, + #[token("<")] + Less, + #[token(">")] + Greater, + #[token("=")] + Equals, + #[token("!")] + Bang, + #[token("?")] + Question, + + // Delimiters + #[token("(")] + OpenParen, + #[token(")")] + CloseParen, + #[token("[")] + OpenBracket, + #[token("]")] + CloseBracket, + #[token("{")] + OpenBrace, + #[token("}")] + CloseBrace, + + // Punctuation + #[token(";")] + Semicolon, + #[token(":")] + Colon, + #[token(",")] + Comma, + #[token(".")] + Dot, + #[token("\\")] + Backslash, + + // String start (transition to StringContext) + #[token("\"")] + Quote, + + // Command start/end (transition to CommandContext) + #[token("$")] + Dollar, + + // Compiler flag start (transition to CompilerFlagContext) + #[token("#[")] + CompilerFlagStart, + + // Comments (include trailing newline to match Heraclitus behavior) + #[regex(r"//[^\n]*\n?", priority = 2)] + Comment, + #[regex(r"#![^\n]*\n?", priority = 2)] + Shebang, + + // Identifier + #[regex(r"[a-zA-Z_][a-zA-Z0-9_]*")] + Identifier, + + // Number + #[regex(r"([0-9]+(\.[0-9]+)?)|(\.[0-9]+)")] + Number, + + // Newline + #[token("\n")] + Newline, +} + +/// String content context - inside "..." +#[derive(Logos, Debug, Clone, PartialEq)] +pub enum StringContext { + // String end + #[token("\"")] + Quote, + + // Interpolation start + #[token("{")] + OpenBrace, + + // Text content (not quotes, backslashes, or braces) + #[regex(r#"[^"\\{]+"#)] + Content, + + // Escape sequence + #[regex(r#"\\."#)] + Escape, +} + +/// Command content context - inside $...$ +#[derive(Logos, Debug, Clone, PartialEq)] +pub enum CommandContext { + // Command end + #[token("$")] + Dollar, + + // Interpolation start + #[token("{")] + OpenBrace, + + // Text content (not $, backslash, or braces) + #[regex(r"[^$\\{]+")] + Content, + + // Escape sequence + #[regex(r#"\\."#)] + Escape, +} + +/// Compiler flag context - inside #[...] +#[derive(Logos, Debug, Clone, PartialEq)] +pub enum CompilerFlagContext { + // Compiler flag end + #[token("]")] + CloseBracket, + + // Content inside the flag + #[regex(r"[^\]]+")] + Content, +} + +/// Context stack to track where we are in parsing +#[derive(Debug, Clone, PartialEq)] +enum LexerContext { + Main, + String, + Command, + CompilerFlag, +} + +/// Stateful tokenizer that manages context switching +pub struct StatefulTokenizer<'source> { + source: &'source str, + position: usize, + context_stack: Vec, + brace_depth: usize, // Track brace nesting inside interpolations +} + +impl<'source> StatefulTokenizer<'source> { + fn new(source: &'source str) -> Self { + Self { + source, + position: 0, + context_stack: vec![LexerContext::Main], + brace_depth: 0, + } + } + + pub fn tokenize(source: &'source str) -> Vec> { + let mut tokenizer = Self::new(source); + let mut tokens = Vec::new(); + + while tokenizer.position < source.len() { + if let Some((token, span)) = tokenizer.next_token() { + tokens.push((token, span)); + } else { + break; + } + } + + // Filter out newline tokens - they're used for position tracking but not needed for parsing + tokens + .into_iter() + .filter(|(token, _)| token.0 != "\n") + .collect() + } + + fn next_token(&mut self) -> Option<(Token, SimpleSpan)> { + if self.position >= self.source.len() { + return None; + } + + let remaining = &self.source[self.position..]; + let context = self.context_stack.last()?.clone(); + + match context { + LexerContext::Main => self.lex_main_context(remaining), + LexerContext::String => self.lex_string_context(remaining), + LexerContext::Command => self.lex_command_context(remaining), + LexerContext::CompilerFlag => self.lex_compiler_flag_context(remaining), + } + } + + fn lex_main_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = TokenKind::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(TokenKind::Quote) => { + // Entering string context + self.context_stack.push(LexerContext::String); + Some((Token("\"".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::Dollar) => { + // Check if this starts a command. + // If the next char is another '$', do not start a command (this is the first of $$). + // If this is the second of a $$ (previous char was '$'), only start a command + // when the following char is not whitespace. Otherwise single $ starts a command. + let prev_is_dollar = start > 0 && self.source[start - 1..].starts_with('$'); + + let is_command_start = if span.end < remaining.len() { + // Look at the next char after this $ in the remaining slice + let mut next_chars = remaining[span.end..].chars(); + match next_chars.next() { + Some(next_ch) => { + if next_ch == '$' { + // next is a dollar -> this $ does not start a command + false + } else if prev_is_dollar { + // this is the second $ in $$ — only start a command if not followed by whitespace + !next_ch.is_whitespace() + } else { + // single $ (not followed by $) -> start a command + true + } + } + None => false, + } + } else { + false + }; + + if is_command_start { + // Entering command context + self.context_stack.push(LexerContext::Command); + } + Some((Token("$".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::CompilerFlagStart) => { + // Entering compiler flag context + self.context_stack.push(LexerContext::CompilerFlag); + Some((Token("#[".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::OpenBrace) => { + // Only track brace depth if we're inside an interpolation (context stack > 1) + if self.context_stack.len() > 1 { + self.brace_depth += 1; + } + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::CloseBrace) => { + // Only track brace depth if we're inside an interpolation + if self.context_stack.len() > 1 && self.brace_depth > 0 { + self.brace_depth -= 1; + if self.brace_depth == 0 { + // Exiting interpolation, pop back to string/command context + self.context_stack.pop(); + } + } + Some((Token("}".to_string()), SimpleSpan::new(start, end))) + } + Ok(kind) => { + let token_str = token_kind_to_string(&kind, slice); + Some((Token(token_str), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } + + fn lex_string_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = StringContext::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(StringContext::Quote) => { + // Exiting string context + self.context_stack.pop(); + Some((Token("\"".to_string()), SimpleSpan::new(start, end))) + } + Ok(StringContext::OpenBrace) => { + // Entering interpolation - switch back to main context + self.context_stack.push(LexerContext::Main); + self.brace_depth = 1; + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(StringContext::Content) | Ok(StringContext::Escape) => { + Some((Token(slice.to_string()), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } + + fn lex_command_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = CommandContext::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(CommandContext::Dollar) => { + // Exiting command context + self.context_stack.pop(); + Some((Token("$".to_string()), SimpleSpan::new(start, end))) + } + Ok(CommandContext::OpenBrace) => { + // Entering interpolation - switch back to main context + self.context_stack.push(LexerContext::Main); + self.brace_depth = 1; + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(CommandContext::Content) | Ok(CommandContext::Escape) => { + // If this command context was entered as the second `$` of `$$` and + // the content starts with whitespace (e.g. `$$ failed {`), trim the + // leading whitespace so the identifier/tokenization matches the + // parser's expectations (no leading spaces). + let token_text = if start > 0 && self.source[start - 1..].starts_with('$') { + // second of $$ - trim leading whitespace from content + slice.trim_start().to_string() + } else { + slice.to_string() + }; + Some((Token(token_text), SimpleSpan::new(start, end))) + } + Err(e) => { + eprintln!( + "CommandContext lexer error at pos {}: {:?}, slice: {:?}, remaining: {:?}", + self.position, + e, + slice, + &remaining[..remaining.len().min(50)] + ); + Some((Token(slice.to_string()), SimpleSpan::new(start, end))) + } + } + } + + fn lex_compiler_flag_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = CompilerFlagContext::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(CompilerFlagContext::CloseBracket) => { + // Exiting compiler flag context + self.context_stack.pop(); + Some((Token("]".to_string()), SimpleSpan::new(start, end))) + } + Ok(CompilerFlagContext::Content) => { + Some((Token(slice.to_string()), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } +} + +fn token_kind_to_string(kind: &TokenKind, slice: &str) -> String { + match kind { + TokenKind::LessEquals => "<=".to_string(), + TokenKind::GreaterEquals => ">=".to_string(), + TokenKind::NotEquals => "!=".to_string(), + TokenKind::EqualsEquals => "==".to_string(), + TokenKind::PlusEquals => "+=".to_string(), + TokenKind::MinusEquals => "-=".to_string(), + TokenKind::MulEquals => "*=".to_string(), + TokenKind::DivEquals => "/=".to_string(), + TokenKind::ModEquals => "%=".to_string(), + TokenKind::DotDot => "..".to_string(), + TokenKind::Plus => "+".to_string(), + TokenKind::Minus => "-".to_string(), + TokenKind::Star => "*".to_string(), + TokenKind::Slash => "/".to_string(), + TokenKind::Percent => "%".to_string(), + TokenKind::Less => "<".to_string(), + TokenKind::Greater => ">".to_string(), + TokenKind::Equals => "=".to_string(), + TokenKind::Bang => "!".to_string(), + TokenKind::Question => "?".to_string(), + TokenKind::OpenParen => "(".to_string(), + TokenKind::CloseParen => ")".to_string(), + TokenKind::OpenBracket => "[".to_string(), + TokenKind::CloseBracket => "]".to_string(), + TokenKind::OpenBrace => "{".to_string(), + TokenKind::CloseBrace => "}".to_string(), + TokenKind::Semicolon => ";".to_string(), + TokenKind::Colon => ":".to_string(), + TokenKind::Comma => ",".to_string(), + TokenKind::Dot => ".".to_string(), + TokenKind::Backslash => "\\".to_string(), + TokenKind::Quote => "\"".to_string(), + TokenKind::Dollar => "$".to_string(), + TokenKind::Newline => "\n".to_string(), + TokenKind::CompilerFlagStart => "#[".to_string(), + // For these, use the actual slice + TokenKind::Comment | TokenKind::Shebang | TokenKind::Identifier | TokenKind::Number => { + slice.to_string() + } + } +} + +/// Public tokenize function +pub fn tokenize(input: &str) -> Vec> { + StatefulTokenizer::tokenize(input) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_numbers() { + let input = r#".5 2.4 2"#; + let tokens = tokenize(input); + + assert_eq!(tokens[0].0 .0, ".5"); + assert_eq!(tokens[1].0 .0, "2.4"); + assert_eq!(tokens[2].0 .0, "2"); + } + + #[test] + fn test_simple_string() { + let input = r#""hello""#; + let tokens = tokenize(input); + assert_eq!(tokens.len(), 3); + assert_eq!(tokens[0].0 .0, "\""); + assert_eq!(tokens[1].0 .0, "hello"); + assert_eq!(tokens[2].0 .0, "\""); + } + + #[test] + fn test_string_with_interpolation() { + let input = r#""Hello {name}!""#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["\"", "Hello ", "{", "name", "}", "!", "\""] + ); + } + + #[test] + fn test_command() { + let input = r#"$echo test$"#; + let tokens = tokenize(input); + assert_eq!(tokens[0].0 .0, "$"); + assert_eq!(tokens[tokens.len() - 1].0 .0, "$"); + } + + #[test] + fn test_keywords() { + let input = "if else fun return"; + let tokens = tokenize(input); + assert_eq!(tokens.len(), 4); + assert_eq!(tokens[0].0 .0, "if"); + assert_eq!(tokens[1].0 .0, "else"); + } + + #[test] + fn test_nested_string_interpolation() { + let input = r#""outer {inner "nested {x}"}""#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["\"", "outer ", "{", "inner", "\"", "nested ", "{", "x", "}", "\"", "}", "\""] + ); + } + + #[test] + fn test_string_with_escape() { + let input = r#""hello \"world\"""#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["\"", "hello ", r#"\""#, "world", r#"\""#, "\""] + ); + } + + #[test] + fn test_string_with_multiple_interpolations() { + let input = r#""Hello {name}, you are {age} years old!""#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + println!("Actual tokens: {:?}", token_strs); + // After closing }, we should return to string context, not stay in main + // This is a bug - need to fix context management + assert_eq!( + token_strs, + vec![ + "\"", + "Hello ", + "{", + "name", + "}", + ", you are ", + "{", + "age", + "}", + " years old!", + "\"" + ] + ); + } + + #[test] + fn test_empty_string() { + let input = r#""""#; + let tokens = tokenize(input); + assert_eq!(tokens.len(), 2); + assert_eq!(tokens[0].0 .0, "\""); + assert_eq!(tokens[1].0 .0, "\""); + } + + #[test] + fn test_string_with_expression_interpolation() { + let input = r#""Result: {a + b}""#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["\"", "Result: ", "{", "a", "+", "b", "}", "\""] + ); + } + + #[test] + fn test_command_simple() { + let input = r#"$ls -la$"#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!(token_strs, vec!["$", "ls -la", "$"]); + } + + #[test] + fn test_command_with_interpolation() { + let input = r#"$echo {msg}$"#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!(token_strs, vec!["$", "echo ", "{", "msg", "}", "$"]); + } + + #[test] + fn test_command_with_multiple_interpolations() { + let input = r#"$cp {src} {dst}$"#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["$", "cp ", "{", "src", "}", " ", "{", "dst", "}", "$"] + ); + } + + #[test] + fn test_command_with_string_in_interpolation() { + let input = r#"$echo {"Hello World"}$"#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["$", "echo ", "{", "\"", "Hello World", "\"", "}", "$"] + ); + } + + #[test] + fn test_command_empty() { + let input = r#"$$"#; + let tokens = tokenize(input); + assert_eq!(tokens.len(), 2); + assert_eq!(tokens[0].0 .0, "$"); + assert_eq!(tokens[1].0 .0, "$"); + } + + #[test] + fn test_string_only_interpolation() { + let input = r#""{x}""#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!(token_strs, vec!["\"", "{", "x", "}", "\""]); + } + + #[test] + fn test_mixed_code_with_strings() { + let input = r#"let x = "hello {name}""#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["let", "x", "=", "\"", "hello ", "{", "name", "}", "\""] + ); + } + + #[test] + fn test_comment_tokenization() { + let input = "// this is a comment"; + let tokens = tokenize(input); + assert_eq!(tokens.len(), 1); + assert_eq!(tokens[0].0 .0, "// this is a comment"); + } + + #[test] + fn test_shebang_tokenization() { + let input = "#!/usr/bin/env amber"; + let tokens = tokenize(input); + assert_eq!(tokens.len(), 1); + assert_eq!(tokens[0].0 .0, "#!/usr/bin/env amber"); + } + + #[test] + fn test_compiler_flag() { + let input = "#[allow_nested_if_else]"; + let tokens = tokenize(input); + // Compiler flags are now split into: #[, content, ] + assert_eq!(tokens.len(), 3); + assert_eq!(tokens[0].0 .0, "#["); + assert_eq!(tokens[1].0 .0, "allow_nested_if_else"); + assert_eq!(tokens[2].0 .0, "]"); + } + + #[test] + fn test_operators_and_delimiters() { + let input = "a <= b and c >= d"; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!(token_strs, vec!["a", "<=", "b", "and", "c", ">=", "d"]); + } + + #[test] + fn test_array_with_range() { + let input = "[1..10]"; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!(token_strs, vec!["[", "1", "..", "10", "]"]); + } + + #[test] + fn test_function_call_with_string() { + let input = r#"echo("test {x}")"#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["echo", "(", "\"", "test ", "{", "x", "}", "\"", ")"] + ); + } + + #[test] + fn test_deeply_nested_braces() { + let input = r#""a {b {c {d}}}""#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["\"", "a ", "{", "b", "{", "c", "{", "d", "}", "}", "}", "\""] + ); + } + + #[test] + fn test_string_with_backslash_escape() { + let input = r#""path\\to\\file""#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!( + token_strs, + vec!["\"", "path", r#"\\"#, "to", r#"\\"#, "file", "\""] + ); + } + + #[test] + fn test_command_with_escape() { + let input = r#"$echo \$$"#; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!(token_strs, vec!["$", "echo ", r#"\$"#, "$"]); + } + + #[test] + fn test_numbers_integers_and_floats() { + let input = "42 3.14 100"; + let tokens = tokenize(input); + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + assert_eq!(token_strs, vec!["42", "3.14", "100"]); + } + + #[test] + fn test_span_accuracy() { + let input = r#""hello {name}""#; + let tokens = tokenize(input); + + // Verify spans are correct + assert_eq!(tokens[0].1, SimpleSpan::new(0, 1)); // " + assert_eq!(tokens[1].1, SimpleSpan::new(1, 7)); // hello + assert_eq!(tokens[2].1, SimpleSpan::new(7, 8)); // { + assert_eq!(tokens[3].1, SimpleSpan::new(8, 12)); // name + assert_eq!(tokens[4].1, SimpleSpan::new(12, 13)); // } + assert_eq!(tokens[5].1, SimpleSpan::new(13, 14)); // " + } + + #[test] + fn test_comment_with_newline() { + let input = "echo \"x\" // test comment\nif x"; + let tokens = tokenize(input); + + // Print for debugging + for (i, (token, span)) in tokens.iter().enumerate() { + eprintln!("{}: {:?} @ {:?}", i, token.0, span); + } + + let token_strs: Vec<&str> = tokens.iter().map(|(t, _)| t.0.as_str()).collect(); + // Should see: echo, ", x, ", comment, if, x + assert!(token_strs.contains(&"echo")); + assert!(token_strs.contains(&"if")); + } + + #[test] + fn test_logos_newline_directly() { + let input = "}\n\nif"; + let mut lex = TokenKind::lexer(input); + + let mut count = 0; + while let Some(result) = lex.next() { + eprintln!( + "Token {}: {:?} = {:?} @ {:?}", + count, + result, + lex.slice(), + lex.span() + ); + count += 1; + } + + eprintln!("Total: {} tokens", count); + assert!(count >= 4, "Expected at least 4 tokens from Logos directly"); + } + + #[test] + fn test_newlines_tokenization() { + let input = "}\n\nif"; + let tokens = tokenize(input); + + eprintln!("Total tokens: {}", tokens.len()); + for (i, (token, span)) in tokens.iter().enumerate() { + eprintln!( + "{}: {:?} (bytes: {:?}) @ {:?}", + i, + token.0, + token.0.as_bytes(), + span + ); + } + + // Newlines are filtered out, so should be: }, if + assert_eq!(tokens.len(), 2, "Expected 2 tokens (newlines filtered)"); + assert_eq!(tokens[0].0 .0, "}"); + assert_eq!(tokens[1].0 .0, "if"); + } + + #[test] + fn test_after_closing_brace() { + let input = "}\n\n if age"; + let tokens = tokenize(input); + + eprintln!("Total tokens: {}", tokens.len()); + for (i, (token, span)) in tokens.iter().enumerate() { + eprintln!("{}: {:?} @ {:?}", i, token.0, span); + } + + // Newlines are filtered out, so should be: }, if, age + assert_eq!(tokens.len(), 3, "Expected 3 tokens (newlines filtered)"); + assert_eq!(tokens[0].0 .0, "}"); + assert_eq!(tokens[1].0 .0, "if"); + assert_eq!(tokens[2].0 .0, "age"); + } + + #[test] + fn test_full_comments_in_ifs_tokenization() { + let input = r#" + #[test] + fn test_full_comments_in_ifs_tokenization() { + let input = r#" + if { + 1 == 2: echo "x" // test comment + // another comment + 2 == 2 { + echo "y" + } + // another + else: echo "z" // comment + // super comment + /// doc comment + } + + if age >= 16: echo "Welcome" // comment + // comment in between + else: echo "Entry not allowed" // another comment +"#; + eprintln!("Input length: {}", input.len()); + eprintln!( + "Input around position 233: {:?}", + &input.chars().skip(233).take(20).collect::() + ); + + let tokens = tokenize(input); + + eprintln!("Total tokens: {}", tokens.len()); + for (i, (token, span)) in tokens.iter().enumerate() { + eprintln!("{}: {:?} @ {:?}", i, token.0, span); + } + + // Should have more than 40 tokens for this input + assert!( + tokens.len() > 40, + "Expected more than 40 tokens, got {}", + tokens.len() + ); + } + + #[test] + fn test_compiler_flag_tokenization() { + let input = "#[allow_absurd_cast]\npub fun test() {}"; + let tokens = tokenize(input); + + eprintln!("Total tokens: {}", tokens.len()); + for (i, (token, span)) in tokens.iter().enumerate() { + eprintln!("{}: {:?} @ {:?}", i, token.0, span); + } + + assert!(!tokens.is_empty(), "Expected tokens"); + // Compiler flags are now split into tokens: #[, content, ] + assert_eq!(tokens[0].0 .0, "#["); + assert_eq!(tokens[1].0 .0, "allow_absurd_cast"); + assert_eq!(tokens[2].0 .0, "]"); + assert_eq!(tokens[3].0 .0, "pub"); + } + + #[test] + fn test_stdlib_math_full_file() { + use std::fs::read_to_string; + + let input = + read_to_string("resources/alpha050/std/math.ab").expect("Failed to read math.ab"); + + let tokens = tokenize(&input); + + eprintln!("Total tokens from full file: {}", tokens.len()); + eprintln!("First 30 tokens:"); + for (i, (token, span)) in tokens.iter().enumerate().take(30) { + eprintln!("{}: {:?} @ {:?}", i, token.0, span); + } + + // The file should have many tokens + assert!( + tokens.len() > 100, + "Expected more than 100 tokens, got {}", + tokens.len() + ); + } + + #[test] + fn test_command_with_single_quotes_and_dollar() { + let input = r#"trust $ echo "{text}" | sed -e 's/^[[:space:]]*//' $"#; + let tokens = tokenize(input); + + eprintln!("Total tokens: {}", tokens.len()); + for (i, (token, span)) in tokens.iter().enumerate() { + eprintln!("{}: {:?} @ {:?}", i, token.0, span); + } + + // The command should end with a separate $ token + let last_token = &tokens[tokens.len() - 1]; + assert_eq!( + last_token.0 .0, "$", + "Last token should be the closing $ of the command" + ); + + // Find the token before the last $ + let before_last = &tokens[tokens.len() - 2]; + assert!( + !before_last.0 .0.contains("$"), + "Token before last should not contain $, got: {:?}", + before_last.0 .0 + ); + } + + #[test] + fn test_command_context_regex_directly() { + use logos::Logos; + + // Test the CommandContext lexer directly with the problematic input + let input = " | sed -e 's/^[[:space:]]*//' "; + let mut lex = CommandContext::lexer(input); + + eprintln!("Testing CommandContext with: {:?}", input); + while let Some(result) = lex.next() { + eprintln!("Token: {:?} = {:?} @ {:?}", result, lex.slice(), lex.span()); + } + } + + #[test] + fn test_complete_if_blocks() { + let input = r#" + if { + 1 == 2: echo "x" // test comment + // another comment + 2 == 2 { + echo "y" + } + // another + else: echo "z" // comment + // super comment + /// doc comment + } + + if age >= 16: echo "Welcome" // comment + // comment in between + else: echo "Entry not allowed" // another comment +"#; + let tokens = tokenize(input); + + eprintln!("Total tokens: {}", tokens.len()); + for (i, (token, span)) in tokens.iter().enumerate() { + eprintln!("{}: {:?} @ {:?}", i, token.0, span); + } + + // Should tokenize the complete input + assert!( + tokens.len() >= 45, + "Expected at least 45 tokens, got {}", + tokens.len() + ); + + // Verify we have the second if statement + assert!( + tokens.iter().any(|(t, _)| t.0 == "age"), + "Should have 'age' identifier" + ); + assert!( + tokens.iter().any(|(t, _)| t.0 == "Entry not allowed"), + "Should have text from second if block" + ); + } +} diff --git a/src/grammar/alpha050/mod.rs b/src/grammar/alpha050/mod.rs index adc8e0a..f292b91 100644 --- a/src/grammar/alpha050/mod.rs +++ b/src/grammar/alpha050/mod.rs @@ -1,22 +1,29 @@ -use crate::analysis::types::DataType; - pub use super::Spanned; -use super::{CommandModifier, CompilerFlag, Grammar, LSPAnalysis, ParserResponse, Span}; +pub use super::Token; + +use super::{ + CommandModifier, + CompilerFlag, + Grammar, + LSPAnalysis, + ParserResponse, + Span, +}; +use crate::analysis::types::DataType; use chumsky::{ error::Rich, extra::Err, - input::{Input, SpannedInput}, - span::SimpleSpan, + input::{ + Input, + SpannedInput, + }, Parser, }; -use heraclitus_compiler::prelude::*; -use lexer::{get_rules, Token}; -use prelude::lexer::Lexer; use semantic_tokens::semantic_tokens_from_ast; pub mod expressions; pub mod global; -pub mod lexer; +pub mod lexer_logos_v2; pub mod parser; pub mod semantic_tokens; pub mod statements; @@ -259,9 +266,7 @@ pub enum GlobalStatement { } #[derive(Debug)] -pub struct AmberCompiler { - lexer: Lexer, -} +pub struct AmberCompiler {} impl Default for AmberCompiler { fn default() -> Self { @@ -271,9 +276,7 @@ impl Default for AmberCompiler { impl AmberCompiler { pub fn new() -> Self { - let lexer = Lexer::new(get_rules()); - - AmberCompiler { lexer } + AmberCompiler {} } pub fn parser<'a>(&self) -> impl AmberParser<'a, Vec>> { @@ -284,22 +287,9 @@ impl AmberCompiler { impl LSPAnalysis for AmberCompiler { #[tracing::instrument(skip_all)] fn tokenize(&self, input: &str) -> Vec> { - // It should never fail - self.lexer - .tokenize(&input.replace("\r\n", "\n").replace("\r", "\n")) - .expect("Failed to tokenize input") - .iter() - .filter_map(|t| { - if t.word == "\n" { - return None; - } - - Some(( - Token(t.word.clone()), - SimpleSpan::new(t.start, t.start + t.word.chars().count()), - )) - }) - .collect() + // Normalize line endings and use Logos v2 lexer with context morphing + let normalized = input.replace("\r\n", "\n").replace("\r", "\n"); + lexer_logos_v2::tokenize(&normalized) } #[tracing::instrument(skip_all)] diff --git a/src/grammar/alpha050/parser.rs b/src/grammar/alpha050/parser.rs index 6282afd..42e4211 100644 --- a/src/grammar/alpha050/parser.rs +++ b/src/grammar/alpha050/parser.rs @@ -1,8 +1,11 @@ use chumsky::prelude::*; -use crate::T; +use crate::{ + grammar::Token, + T, +}; -use super::{lexer::Token, AmberParser}; +use super::AmberParser; const KEYWORDS: &[&str] = &[ "if", diff --git a/src/grammar/alpha050/statements/block.rs b/src/grammar/alpha050/statements/block.rs index 9a8b2fc..c893285 100644 --- a/src/grammar/alpha050/statements/block.rs +++ b/src/grammar/alpha050/statements/block.rs @@ -2,7 +2,12 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - lexer::Token, parser::default_recovery, AmberParser, Block, Spanned, Statement, + parser::default_recovery, + AmberParser, + Block, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/statements/comment.rs b/src/grammar/alpha050/statements/comment.rs index 1e440ed..d3a1a38 100644 --- a/src/grammar/alpha050/statements/comment.rs +++ b/src/grammar/alpha050/statements/comment.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use crate::grammar::alpha050::{lexer::Token, AmberParser, Comment, Spanned}; +use crate::grammar::alpha050::{ + AmberParser, + Comment, + Spanned, + Token, +}; pub fn comment_parser<'a>() -> impl AmberParser<'a, Spanned> { choice((doc_string_parser(), single_line_comment_parser())).boxed() diff --git a/src/grammar/alpha050/statements/const_init.rs b/src/grammar/alpha050/statements/const_init.rs index eeca42e..349265c 100644 --- a/src/grammar/alpha050/statements/const_init.rs +++ b/src/grammar/alpha050/statements/const_init.rs @@ -1,14 +1,17 @@ use chumsky::prelude::*; use crate::{ - grammar::{ - alpha050::Expression, - alpha050::{ - expressions::parse_expr, - lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Spanned, Statement, + grammar::alpha050::{ + expressions::parse_expr, + parser::{ + default_recovery, + ident, }, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/statements/failable_handlers.rs b/src/grammar/alpha050/statements/failable_handlers.rs index 41df66e..c3657cd 100644 --- a/src/grammar/alpha050/statements/failable_handlers.rs +++ b/src/grammar/alpha050/statements/failable_handlers.rs @@ -2,10 +2,18 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - lexer::Token, - parser::{default_recovery, ident}, + parser::{ + default_recovery, + ident, + }, statements::block::block_parser, - AmberParser, Block, FailableHandler, FailureHandler, Spanned, Statement, + AmberParser, + Block, + FailableHandler, + FailureHandler, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/statements/if_cond.rs b/src/grammar/alpha050/statements/if_cond.rs index 6b8431f..aea4d57 100644 --- a/src/grammar/alpha050/statements/if_cond.rs +++ b/src/grammar/alpha050/statements/if_cond.rs @@ -2,8 +2,17 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, statements::comment, - AmberParser, Comment, ElseCondition, IfChainContent, IfCondition, Spanned, Statement, + expressions::parse_expr, + parser::default_recovery, + statements::comment, + AmberParser, + Comment, + ElseCondition, + IfChainContent, + IfCondition, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/statements/keywords.rs b/src/grammar/alpha050/statements/keywords.rs index 4defffa..ae567df 100644 --- a/src/grammar/alpha050/statements/keywords.rs +++ b/src/grammar/alpha050/statements/keywords.rs @@ -2,8 +2,13 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, AmberParser, Expression, - Spanned, Statement, + expressions::parse_expr, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/statements/loops.rs b/src/grammar/alpha050/statements/loops.rs index b935a2a..28804ef 100644 --- a/src/grammar/alpha050/statements/loops.rs +++ b/src/grammar/alpha050/statements/loops.rs @@ -3,9 +3,17 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ expressions::parse_expr, - lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Block, Expression, IterLoopVars, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Block, + Expression, + IterLoopVars, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/statements/mod.rs b/src/grammar/alpha050/statements/mod.rs index 7f3b9ae..5f68af0 100644 --- a/src/grammar/alpha050/statements/mod.rs +++ b/src/grammar/alpha050/statements/mod.rs @@ -1,8 +1,16 @@ use chumsky::prelude::*; -use crate::{grammar::Token, T}; +use crate::{ + grammar::Token, + T, +}; -use super::{expressions::parse_expr, AmberParser, Spanned, Statement}; +use super::{ + expressions::parse_expr, + AmberParser, + Spanned, + Statement, +}; pub mod block; pub mod comment; diff --git a/src/grammar/alpha050/statements/modifiers.rs b/src/grammar/alpha050/statements/modifiers.rs index c918e0e..5869460 100644 --- a/src/grammar/alpha050/statements/modifiers.rs +++ b/src/grammar/alpha050/statements/modifiers.rs @@ -1,7 +1,12 @@ use chumsky::prelude::*; use crate::{ - grammar::alpha050::{lexer::Token, AmberParser, CommandModifier, Spanned}, + grammar::alpha050::{ + AmberParser, + CommandModifier, + Spanned, + Token, + }, T, }; diff --git a/src/grammar/alpha050/statements/move_files.rs b/src/grammar/alpha050/statements/move_files.rs index 758a623..58a25c9 100644 --- a/src/grammar/alpha050/statements/move_files.rs +++ b/src/grammar/alpha050/statements/move_files.rs @@ -2,13 +2,21 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ - expressions::parse_expr, lexer::Token, parser::default_recovery, AmberParser, Expression, - Spanned, Statement, + expressions::parse_expr, + parser::default_recovery, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; -use super::{failable_handlers::failable_handlers_parser, modifiers::modifier_parser}; +use super::{ + failable_handlers::failable_handlers_parser, + modifiers::modifier_parser, +}; pub fn move_files_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/statements/shebang.rs b/src/grammar/alpha050/statements/shebang.rs index 5f30c88..4a16703 100644 --- a/src/grammar/alpha050/statements/shebang.rs +++ b/src/grammar/alpha050/statements/shebang.rs @@ -1,6 +1,11 @@ use chumsky::prelude::*; -use crate::grammar::alpha050::{lexer::Token, AmberParser, Spanned, Statement}; +use crate::grammar::alpha050::{ + AmberParser, + Spanned, + Statement, + Token, +}; pub fn shebang_parser<'a>() -> impl AmberParser<'a, Spanned> { any() diff --git a/src/grammar/alpha050/statements/shorthands.rs b/src/grammar/alpha050/statements/shorthands.rs index 5073327..66816ac 100644 --- a/src/grammar/alpha050/statements/shorthands.rs +++ b/src/grammar/alpha050/statements/shorthands.rs @@ -3,9 +3,15 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ expressions::parse_expr, - lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/alpha050/statements/var_init.rs b/src/grammar/alpha050/statements/var_init.rs index 39f6c2d..0440f92 100644 --- a/src/grammar/alpha050/statements/var_init.rs +++ b/src/grammar/alpha050/statements/var_init.rs @@ -4,9 +4,15 @@ use crate::{ grammar::alpha050::{ expressions::parse_expr, global::type_parser, - lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Spanned, Statement, VariableInitType, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Spanned, + Statement, + Token, + VariableInitType, }, T, }; diff --git a/src/grammar/alpha050/statements/var_set.rs b/src/grammar/alpha050/statements/var_set.rs index 8e6e65f..31b3321 100644 --- a/src/grammar/alpha050/statements/var_set.rs +++ b/src/grammar/alpha050/statements/var_set.rs @@ -3,9 +3,15 @@ use chumsky::prelude::*; use crate::{ grammar::alpha050::{ expressions::parse_expr, - lexer::Token, - parser::{default_recovery, ident}, - AmberParser, Expression, Spanned, Statement, + parser::{ + default_recovery, + ident, + }, + AmberParser, + Expression, + Spanned, + Statement, + Token, }, T, }; diff --git a/src/grammar/mod.rs b/src/grammar/mod.rs index ad5ee0a..f17cc40 100644 --- a/src/grammar/mod.rs +++ b/src/grammar/mod.rs @@ -1,5 +1,12 @@ -use chumsky::{error::Rich, span::SimpleSpan}; -use std::fmt::{self, Debug, Display}; +use chumsky::{ + error::Rich, + span::SimpleSpan, +}; +use std::fmt::{ + self, + Debug, + Display, +}; pub mod alpha034; pub mod alpha035; diff --git a/src/main.rs b/src/main.rs index 0c82716..096f8c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,24 @@ use std::{ env::temp_dir, - process::{Command, Stdio}, + process::{ + Command, + Stdio, + }, }; -use amber_lsp::backend::{AmberVersion, Backend}; -use clap::{builder::PossibleValue, Parser, ValueEnum}; -use tower_lsp_server::{LspService, Server}; +use amber_lsp::backend::{ + AmberVersion, + Backend, +}; +use clap::{ + builder::PossibleValue, + Parser, + ValueEnum, +}; +use tower_lsp_server::{ + LspService, + Server, +}; use tracing::subscriber; use tracing_subscriber::fmt::format::FmtSpan; diff --git a/src/paths.rs b/src/paths.rs index 857a5b2..1fa0965 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -1,4 +1,7 @@ -use std::sync::{Arc, Mutex}; +use std::sync::{ + Arc, + Mutex, +}; use indexmap::IndexSet; use tower_lsp_server::lsp_types::Uri; diff --git a/src/stdlib.rs b/src/stdlib.rs index 4914585..d3eee0a 100644 --- a/src/stdlib.rs +++ b/src/stdlib.rs @@ -1,16 +1,29 @@ use std::{ env::current_exe, future::Future, - path::{Path, PathBuf}, + path::{ + Path, + PathBuf, + }, pin::Pin, }; use clap::builder::OsStr; -use include_dir::{include_dir, Dir, DirEntry}; -use tower_lsp_server::{lsp_types::Uri, UriExt}; +use include_dir::{ + include_dir, + Dir, + DirEntry, +}; +use tower_lsp_server::{ + lsp_types::Uri, + UriExt, +}; use tracing::warn; -use crate::backend::{AmberVersion, Backend}; +use crate::backend::{ + AmberVersion, + Backend, +}; pub const STDLIB: Dir = include_dir!("$CARGO_MANIFEST_DIR/resources/"); diff --git a/src/utils.rs b/src/utils.rs index 094e0a4..23ac563 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,9 @@ use std::hash::BuildHasherDefault; -use dashmap::{DashMap, DashSet}; +use dashmap::{ + DashMap, + DashSet, +}; use rustc_hash::FxHasher; pub type FastDashMap = DashMap>; diff --git a/tests/analysis/alpha034.rs b/tests/analysis/alpha034.rs index 594af06..11fd2f9 100644 --- a/tests/analysis/alpha034.rs +++ b/tests/analysis/alpha034.rs @@ -1,13 +1,26 @@ -use std::{path::Path, sync::Arc}; +use std::{ + path::Path, + sync::Arc, +}; use amber_lsp::{ - analysis::{FunctionSymbol, SymbolType}, - backend::{AmberVersion, Backend}, + analysis::{ + FunctionSymbol, + SymbolType, + }, + backend::{ + AmberVersion, + Backend, + }, fs::MemoryFS, }; use insta::assert_debug_snapshot; use tokio::test; -use tower_lsp_server::{lsp_types::Uri, LspService, UriExt}; +use tower_lsp_server::{ + lsp_types::Uri, + LspService, + UriExt, +}; #[test] async fn test_function_definition() { diff --git a/tests/analysis/alpha050.rs b/tests/analysis/alpha050.rs index 004293c..f52bd92 100644 --- a/tests/analysis/alpha050.rs +++ b/tests/analysis/alpha050.rs @@ -1,12 +1,21 @@ -use std::{path::Path, sync::Arc}; +use std::{ + path::Path, + sync::Arc, +}; use amber_lsp::{ - backend::{AmberVersion, Backend}, + backend::{ + AmberVersion, + Backend, + }, fs::MemoryFS, }; use insta::assert_debug_snapshot; use tokio::test; -use tower_lsp_server::{lsp_types::Uri, UriExt}; +use tower_lsp_server::{ + lsp_types::Uri, + UriExt, +}; #[test] async fn test_simple_function() { diff --git a/tests/grammar/alpha034.rs b/tests/grammar/alpha034.rs index d29f208..c18aaf2 100644 --- a/tests/grammar/alpha034.rs +++ b/tests/grammar/alpha034.rs @@ -4,8 +4,14 @@ use chumsky::error::Rich; use insta::assert_debug_snapshot; use amber_lsp::grammar::{ - alpha034::{lexer::Token, semantic_tokens::semantic_tokens_from_ast, AmberCompiler, Spanned}, - LSPAnalysis, ParserResponse, + alpha034::{ + lexer::Token, + semantic_tokens::semantic_tokens_from_ast, + AmberCompiler, + Spanned, + }, + LSPAnalysis, + ParserResponse, }; fn tokenize(input: &str) -> Vec> { diff --git a/tests/grammar/alpha035.rs b/tests/grammar/alpha035.rs index dcfdc62..2e2fe1a 100644 --- a/tests/grammar/alpha035.rs +++ b/tests/grammar/alpha035.rs @@ -4,8 +4,14 @@ use chumsky::error::Rich; use insta::assert_debug_snapshot; use amber_lsp::grammar::{ - alpha035::{lexer::Token, AmberCompiler, GlobalStatement, Spanned}, - LSPAnalysis, ParserResponse, + alpha035::{ + lexer::Token, + AmberCompiler, + GlobalStatement, + Spanned, + }, + LSPAnalysis, + ParserResponse, }; fn tokenize(input: &str) -> Vec> { diff --git a/tests/grammar/alpha040.rs b/tests/grammar/alpha040.rs index e26edbb..db3c185 100644 --- a/tests/grammar/alpha040.rs +++ b/tests/grammar/alpha040.rs @@ -4,8 +4,14 @@ use chumsky::error::Rich; use insta::assert_debug_snapshot; use amber_lsp::grammar::{ - alpha040::{lexer::Token, AmberCompiler, GlobalStatement, Spanned}, - LSPAnalysis, ParserResponse, + alpha040::{ + lexer::Token, + AmberCompiler, + GlobalStatement, + Spanned, + }, + LSPAnalysis, + ParserResponse, }; fn tokenize(input: &str) -> Vec> { diff --git a/tests/grammar/alpha050.rs b/tests/grammar/alpha050.rs index f6884cb..5bfc34d 100644 --- a/tests/grammar/alpha050.rs +++ b/tests/grammar/alpha050.rs @@ -4,8 +4,14 @@ use chumsky::error::Rich; use insta::assert_debug_snapshot; use amber_lsp::grammar::{ - alpha050::{lexer::Token, AmberCompiler, GlobalStatement, Spanned}, - LSPAnalysis, ParserResponse, + alpha050::{ + AmberCompiler, + GlobalStatement, + Spanned, + Token, + }, + LSPAnalysis, + ParserResponse, }; fn tokenize(input: &str) -> Vec> { @@ -37,6 +43,17 @@ fn parse_unwrap(tokens: &[Spanned]) -> Vec> { ast.unwrap() } +#[test] +fn test_numbers() { + let input = r#" + 2 + 2.4 + .2 + "#; + + assert_debug_snapshot!(parse_unwrap(&tokenize(input))); +} + #[test] fn test_stdlib_array() { let stdlib = read_to_string("resources/alpha050/std/array.ab").unwrap(); diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__comments_in_ifs.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__comments_in_ifs.snap index 3a867fd..23da1e7 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__comments_in_ifs.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__comments_in_ifs.snap @@ -376,29 +376,11 @@ expression: parse(&tokenize(input)) ( Text( ( - "Entry", - 321..326, + "Entry not allowed", + 321..338, ), ), - 321..326, - ), - ( - Text( - ( - "not", - 327..330, - ), - ), - 327..330, - ), - ( - Text( - ( - "allowed", - 331..338, - ), - ), - 331..338, + 321..338, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__mv_files.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__mv_files.snap index 1f9b9eb..66165e1 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__mv_files.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__mv_files.snap @@ -18,38 +18,11 @@ expression: parse_unwrap(&tokenize(input)) ( Text( ( - "/", - 9..10, + "/tmp/a", + 9..15, ), ), - 9..10, - ), - ( - Text( - ( - "tmp", - 10..13, - ), - ), - 10..13, - ), - ( - Text( - ( - "/", - 13..14, - ), - ), - 13..14, - ), - ( - Text( - ( - "a", - 14..15, - ), - ), - 14..15, + 9..15, ), ], ), @@ -61,38 +34,11 @@ expression: parse_unwrap(&tokenize(input)) ( Text( ( - "/", - 18..19, - ), - ), - 18..19, - ), - ( - Text( - ( - "tmp", - 19..22, - ), - ), - 19..22, - ), - ( - Text( - ( - "/", - 22..23, - ), - ), - 22..23, - ), - ( - Text( - ( - "b", - 23..24, + "/tmp/b", + 18..24, ), ), - 23..24, + 18..24, ), ], ), @@ -125,38 +71,11 @@ expression: parse_unwrap(&tokenize(input)) ( Text( ( - "/", - 42..43, + "/tmp/a", + 42..48, ), ), - 42..43, - ), - ( - Text( - ( - "tmp", - 43..46, - ), - ), - 43..46, - ), - ( - Text( - ( - "/", - 46..47, - ), - ), - 46..47, - ), - ( - Text( - ( - "a", - 47..48, - ), - ), - 47..48, + 42..48, ), ], ), @@ -168,38 +87,11 @@ expression: parse_unwrap(&tokenize(input)) ( Text( ( - "/", - 51..52, - ), - ), - 51..52, - ), - ( - Text( - ( - "tmp", - 52..55, - ), - ), - 52..55, - ), - ( - Text( - ( - "/", - 55..56, - ), - ), - 55..56, - ), - ( - Text( - ( - "b", - 56..57, + "/tmp/b", + 51..57, ), ), - 56..57, + 51..57, ), ], ), @@ -227,38 +119,11 @@ expression: parse_unwrap(&tokenize(input)) ( Text( ( - "/", - 68..69, + "/tmp/a", + 68..74, ), ), - 68..69, - ), - ( - Text( - ( - "tmp", - 69..72, - ), - ), - 69..72, - ), - ( - Text( - ( - "/", - 72..73, - ), - ), - 72..73, - ), - ( - Text( - ( - "a", - 73..74, - ), - ), - 73..74, + 68..74, ), ], ), @@ -270,38 +135,11 @@ expression: parse_unwrap(&tokenize(input)) ( Text( ( - "/", - 77..78, - ), - ), - 77..78, - ), - ( - Text( - ( - "tmp", - 78..81, - ), - ), - 78..81, - ), - ( - Text( - ( - "/", - 81..82, - ), - ), - 81..82, - ), - ( - Text( - ( - "b", - 82..83, + "/tmp/b", + 77..83, ), ), - 82..83, + 77..83, ), ], ), @@ -389,38 +227,11 @@ expression: parse_unwrap(&tokenize(input)) ( Text( ( - "/", - 147..148, + "/tmp/a", + 147..153, ), ), - 147..148, - ), - ( - Text( - ( - "tmp", - 148..151, - ), - ), - 148..151, - ), - ( - Text( - ( - "/", - 151..152, - ), - ), - 151..152, - ), - ( - Text( - ( - "a", - 152..153, - ), - ), - 152..153, + 147..153, ), ], ), @@ -432,38 +243,11 @@ expression: parse_unwrap(&tokenize(input)) ( Text( ( - "/", - 156..157, - ), - ), - 156..157, - ), - ( - Text( - ( - "tmp", - 157..160, - ), - ), - 157..160, - ), - ( - Text( - ( - "/", - 160..161, - ), - ), - 160..161, - ), - ( - Text( - ( - "b", - 161..162, + "/tmp/b", + 156..162, ), ), - 161..162, + 156..162, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__numbers.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__numbers.snap new file mode 100644 index 0000000..7edaf2d --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__numbers.snap @@ -0,0 +1,63 @@ +--- +source: tests/grammar/alpha050.rs +expression: parse_unwrap(&tokenize(input)) +--- +[ + ( + Statement( + ( + Expression( + ( + Int( + ( + 2, + 5..6, + ), + ), + 5..6, + ), + ), + 5..6, + ), + ), + 5..6, + ), + ( + Statement( + ( + Expression( + ( + Number( + ( + 2.4, + 11..14, + ), + ), + 11..14, + ), + ), + 11..14, + ), + ), + 11..14, + ), + ( + Statement( + ( + Expression( + ( + Number( + ( + 0.2, + 19..21, + ), + ), + 19..21, + ), + ), + 19..21, + ), + ), + 19..21, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap index 2301fd6..f57443e 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap @@ -2382,67 +2382,67 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "is less than zero or not of type `Int`, an empty array is returned", + "is less than zero an empty array is returned", ), - 2596..2667, + 2596..2645, ), ), - 2596..2667, + 2596..2645, ), ), - 2596..2667, + 2596..2645, ), ( FunctionDefinition( [], ( true, - 2667..2670, + 2645..2648, ), ( "fun", - 2671..2674, + 2649..2652, ), ( "array_filled", - 2675..2687, + 2653..2665, ), [ ( Generic( ( false, - 2688..2688, + 2666..2666, ), ( "size", - 2688..2692, + 2666..2670, ), ), - 2688..2692, + 2666..2670, ), ( Optional( ( false, - 2694..2693, + 2672..2671, ), ( "value", - 2694..2699, + 2672..2677, ), None, ( Int( ( 0, - 2702..2703, + 2680..2681, ), ), - 2702..2703, + 2680..2681, ), ), - 2694..2703, + 2672..2681, ), ], None, @@ -2451,11 +2451,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 2711..2714, + 2689..2692, ), ( "array", - 2715..2720, + 2693..2698, ), ( Expression( @@ -2466,26 +2466,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "value", - 2724..2729, + 2702..2707, ), ), - 2724..2729, + 2702..2707, ), ], ), - 2723..2730, + 2701..2708, ), ), - 2723..2730, + 2701..2708, ), ), - 2711..2730, + 2689..2708, + ), + ( + Comment( + ( + Comment( + "Used for type casting array", + ), + 2709..2740, + ), + ), + 2709..2740, ), ( VariableSet( ( "array", - 2735..2740, + 2744..2749, ), ( ArrayIndex( @@ -2493,10 +2504,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 2743..2748, + 2752..2757, ), ), - 2743..2748, + 2752..2757, ), ( Range( @@ -2504,72 +2515,115 @@ expression: parse_unwrap(&tokenize(&stdlib)) Int( ( 0, - 2749..2750, + 2758..2759, ), ), - 2749..2750, + 2758..2759, ), ( Int( ( 0, - 2752..2753, + 2761..2762, ), ), - 2752..2753, + 2761..2762, ), ), - 2749..2753, + 2758..2762, ), ), - 2743..2753, + 2752..2762, + ), + ), + 2744..2763, + ), + ( + Comment( + ( + Comment( + "Resetting the array size to 0", + ), + 2764..2797, ), ), - 2735..2754, + 2764..2797, ), ( IfCondition( ( "if", - 2759..2761, + 2802..2804, ), ( IfCondition( ( - Not( + Or( ( - "not", - 2762..2765, + Le( + ( + Var( + ( + "size", + 2805..2809, + ), + ), + 2805..2809, + ), + ( + Int( + ( + 0, + 2813..2814, + ), + ), + 2813..2814, + ), + ), + 2805..2814, ), ( - Parentheses( + "or", + 2815..2817, + ), + ( + Not( ( - Is( + "not", + 2818..2821, + ), + ( + Parentheses( ( - Var( + Is( + ( + Var( + ( + "size", + 2823..2827, + ), + ), + 2823..2827, + ), ( - "size", - 2767..2771, + "is", + 2828..2830, + ), + ( + Int, + 2831..2834, ), ), - 2767..2771, - ), - ( - "is", - 2772..2774, - ), - ( - Int, - 2775..2778, + 2823..2834, ), ), - 2767..2778, + 2822..2835, ), ), - 2766..2779, + 2822..2835, ), ), - 2766..2779, + 2805..2835, ), ( Singleline( @@ -2577,51 +2631,51 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 2789..2795, + 2845..2851, ), Some( ( Var( ( "array", - 2796..2801, + 2852..2857, ), ), - 2796..2801, + 2852..2857, ), ), ), - 2789..2801, + 2845..2857, ), ), - 2779..2801, + 2835..2857, ), ), - 2762..2801, + 2805..2857, ), [], None, ), - 2759..2801, + 2802..2857, ), ( IterLoop( ( "for", - 2806..2809, + 2863..2866, ), ( Single( ( "_", - 2810..2811, + 2867..2868, ), ), - 2810..2811, + 2867..2868, ), ( "in", - 2812..2814, + 2869..2871, ), ( Range( @@ -2629,85 +2683,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Int( ( 0, - 2815..2816, + 2872..2873, ), ), - 2815..2816, + 2872..2873, ), ( - Parentheses( + Var( ( - Ternary( - ( - Ge( - ( - Cast( - ( - Var( - ( - "size", - 2819..2823, - ), - ), - 2819..2823, - ), - ( - "as", - 2824..2826, - ), - ( - Int, - 2827..2830, - ), - ), - 2819..2830, - ), - ( - Int( - ( - 0, - 2834..2835, - ), - ), - 2834..2835, - ), - ), - 2819..2835, - ), - ( - "then", - 2836..2840, - ), - ( - Var( - ( - "size", - 2841..2845, - ), - ), - 2841..2845, - ), - ( - "else", - 2846..2850, - ), - ( - Int( - ( - 0, - 2851..2852, - ), - ), - 2851..2852, - ), - ), - 2819..2852, + "size", + 2875..2879, ), ), - 2818..2853, + 2875..2879, ), ), - 2815..2853, + 2872..2879, ), ( Singleline( @@ -2715,7 +2706,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) ShorthandAdd( ( "array", - 2863..2868, + 2889..2894, ), ( Array( @@ -2724,46 +2715,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "value", - 2873..2878, + 2899..2904, ), ), - 2873..2878, + 2899..2904, ), ], ), - 2872..2879, + 2898..2905, ), ), - 2863..2879, + 2889..2905, ), ), - 2853..2879, + 2879..2905, ), ), - 2806..2879, + 2863..2905, ), ( Return( ( "return", - 2884..2890, + 2911..2917, ), Some( ( Var( ( "array", - 2891..2896, + 2918..2923, ), ), - 2891..2896, + 2918..2923, ), ), ), - 2884..2896, + 2911..2923, ), ], ), - 2667..2898, + 2645..2925, ), ] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap index 01fe922..5454773 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_date.snap @@ -410,38 +410,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 1101..1102, + "%F %T", + 1101..1106, ), ), - 1101..1102, - ), - ( - Text( - ( - "F", - 1102..1103, - ), - ), - 1102..1103, - ), - ( - Text( - ( - "%", - 1104..1105, - ), - ), - 1104..1105, - ), - ( - Text( - ( - "T", - 1105..1106, - ), - ), - 1105..1106, + 1101..1106, ), ], ), @@ -519,20 +492,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "-", - 1166..1167, - ), - ), - 1166..1167, - ), - ( - Text( - ( - "u", - 1167..1168, + "-u", + 1166..1168, ), ), - 1167..1168, + 1166..1168, ), ], ), @@ -587,9 +551,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", + "date ", ), - 1233..1237, + 1232..1238, ), ( Expression( @@ -605,23 +569,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 1238..1248, ), - ( - CommandOption( - "-d", - ), - 1249..1251, - ), ( Text( - "\"", + " -d \"@", ), - 1252..1253, - ), - ( - Text( - "@", - ), - 1253..1254, + 1248..1254, ), ( Expression( @@ -639,21 +591,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1260..1261, - ), - ( - Text( - "+", - ), - 1262..1263, - ), - ( - Text( - "\"", + "\" +\"", ), - 1263..1264, + 1260..1264, ), ( Expression( @@ -671,45 +611,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1272..1273, - ), - ( - Text( - "2", - ), - 1274..1275, - ), - ( - Text( - ">", - ), - 1275..1276, - ), - ( - Text( - "/", - ), - 1276..1277, - ), - ( - Text( - "dev", - ), - 1277..1280, - ), - ( - Text( - "/", - ), - 1280..1281, - ), - ( - Text( - "null", + "\" 2>/dev/null ", ), - 1281..1285, + 1272..1286, ), ( Text( @@ -762,9 +666,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", + "date ", ), - 1360..1364, + 1359..1365, ), ( Expression( @@ -780,23 +684,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 1365..1375, ), - ( - CommandOption( - "-j", - ), - 1376..1378, - ), - ( - CommandOption( - "-r", - ), - 1379..1381, - ), ( Text( - "\"", + " -j -r \"", ), - 1382..1383, + 1375..1383, ), ( Expression( @@ -814,21 +706,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" +\"", ), - 1389..1390, - ), - ( - Text( - "+", - ), - 1391..1392, - ), - ( - Text( - "\"", - ), - 1392..1393, + 1389..1393, ), ( Expression( @@ -846,9 +726,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 1401..1402, + 1401..1403, ), ( Text( @@ -1005,38 +885,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 1802..1803, - ), - ), - 1802..1803, - ), - ( - Text( - ( - "F", - 1803..1804, + "%F %T", + 1802..1807, ), ), - 1803..1804, - ), - ( - Text( - ( - "%", - 1805..1806, - ), - ), - 1805..1806, - ), - ( - Text( - ( - "T", - 1806..1807, - ), - ), - 1806..1807, + 1802..1807, ), ], ), @@ -1114,20 +967,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "-", - 1866..1867, - ), - ), - 1866..1867, - ), - ( - Text( - ( - "u", - 1867..1868, + "-u", + 1866..1868, ), ), - 1867..1868, + 1866..1868, ), ], ), @@ -1184,9 +1028,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", + "date ", ), - 1933..1937, + 1932..1938, ), ( Expression( @@ -1202,47 +1046,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 1938..1948, ), - ( - CommandOption( - "-d", - ), - 1949..1951, - ), - ( - Text( - "\"", - ), - 1952..1953, - ), - ( - Escape( - "$", - ), - 1953..1955, - ), ( Text( - "(", + " -d \"", ), - 1955..1956, + 1948..1953, ), ( Text( - "date", + "\\$", ), - 1956..1960, - ), - ( - CommandOption( - "-d", - ), - 1961..1963, + 1953..1955, ), ( Text( - "\"", + "(date -d \"", ), - 1964..1965, + 1955..1965, ), ( Expression( @@ -1260,21 +1080,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1971..1972, - ), - ( - Text( - "+", + "\" +\"", ), - 1973..1974, - ), - ( - Text( - "\"", - ), - 1974..1975, + 1971..1975, ), ( Expression( @@ -1292,111 +1100,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1983..1984, - ), - ( - Text( - "2", + "\" 2>/dev/null)\" +%s 2>/dev/null ", ), - 1985..1986, - ), - ( - Text( - ">", - ), - 1986..1987, - ), - ( - Text( - "/", - ), - 1987..1988, - ), - ( - Text( - "dev", - ), - 1988..1991, - ), - ( - Text( - "/", - ), - 1991..1992, - ), - ( - Text( - "null", - ), - 1992..1996, - ), - ( - Text( - ")", - ), - 1996..1997, - ), - ( - Text( - "\"", - ), - 1997..1998, - ), - ( - Text( - "+", - ), - 1999..2000, - ), - ( - Text( - "%", - ), - 2000..2001, - ), - ( - Text( - "s", - ), - 2001..2002, - ), - ( - Text( - "2", - ), - 2003..2004, - ), - ( - Text( - ">", - ), - 2004..2005, - ), - ( - Text( - "/", - ), - 2005..2006, - ), - ( - Text( - "dev", - ), - 2006..2009, - ), - ( - Text( - "/", - ), - 2009..2010, - ), - ( - Text( - "null", - ), - 2010..2014, + 1983..2015, ), ( Text( @@ -1451,9 +1157,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", + "date ", ), - 2089..2093, + 2088..2094, ), ( Expression( @@ -1469,23 +1175,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 2094..2104, ), - ( - CommandOption( - "-j", - ), - 2105..2107, - ), - ( - CommandOption( - "-f", - ), - 2108..2110, - ), ( Text( - "\"", + " -j -f \"", ), - 2111..2112, + 2104..2112, ), ( Expression( @@ -1503,15 +1197,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" \"", ), - 2120..2121, - ), - ( - Text( - "\"", - ), - 2122..2123, + 2120..2123, ), ( Expression( @@ -1529,27 +1217,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2129..2130, - ), - ( - Text( - "+", - ), - 2131..2132, - ), - ( - Text( - "%", - ), - 2132..2133, - ), - ( - Text( - "s", + "\" +%s ", ), - 2133..2134, + 2129..2135, ), ( Text( @@ -1690,27 +1360,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 2311..2315, - ), - ( - Text( - "+", - ), - 2316..2317, - ), - ( - Text( - "%", - ), - 2317..2318, - ), - ( - Text( - "s", + "date +%s ", ), - 2318..2319, + 2310..2320, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap index cbc8e8a..5244bb9 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_env.snap @@ -124,20 +124,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - ".", - 202..203, + ".env", + 202..206, ), ), - 202..203, - ), - ( - Text( - ( - "env", - 203..206, - ), - ), - 203..206, + 202..206, ), ], ), @@ -183,25 +174,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 240..244, + 239..246, ), ( Text( - "\"", - ), - 245..246, - ), - ( - Escape( - "$", + "\\$", ), 246..248, ), ( - Escape( - "{", + Text( + "\\{", ), 248..250, ), @@ -236,15 +221,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", - ), - 263..264, - ), - ( - Text( - "\"", + "}\" ", ), - 264..265, + 263..266, ), ( Text( @@ -380,15 +359,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "source", - ), - 358..364, - ), - ( - Text( - "\"", + "source \"", ), - 365..366, + 357..366, ), ( Expression( @@ -406,9 +379,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 372..373, + 372..374, ), ( Text( @@ -448,25 +421,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 399..403, + 398..405, ), ( Text( - "\"", - ), - 404..405, - ), - ( - Escape( - "$", + "\\$", ), 405..407, ), ( - Escape( - "{", + Text( + "\\{", ), 407..409, ), @@ -501,15 +468,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", + "}\" ", ), - 422..423, - ), - ( - Text( - "\"", - ), - 423..424, + 422..425, ), ( Text( @@ -613,20 +574,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - ".", - 545..546, - ), - ), - 545..546, - ), - ( - Text( - ( - "env", - 546..549, + ".env", + 545..549, ), ), - 546..549, + 545..549, ), ], ), @@ -662,39 +614,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "export", + "export \"", ), - 572..578, + 571..580, ), ( Text( - "\"", - ), - 579..580, - ), - ( - Escape( - "$", + "\\$", ), 580..582, ), ( Text( - "(", - ), - 582..583, - ), - ( - Text( - "xargs", - ), - 583..588, - ), - ( - Text( - "<", + "(xargs < ", ), - 589..590, + 582..591, ), ( Expression( @@ -712,45 +646,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - ")", - ), - 597..598, - ), - ( - Text( - "\"", - ), - 598..599, - ), - ( - Text( - ">", - ), - 600..601, - ), - ( - Text( - "/", - ), - 602..603, - ), - ( - Text( - "dev", - ), - 603..606, - ), - ( - Text( - "/", - ), - 606..607, - ), - ( - Text( - "null", + ")\" > /dev/null ", ), - 607..611, + 597..612, ), ( Text( @@ -841,37 +739,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 722..723, - ), - ( - Text( - "[", + "[[ ! -z ", ), - 723..724, + 721..730, ), ( Text( - "!", - ), - 725..726, - ), - ( - CommandOption( - "-z", - ), - 727..729, - ), - ( - Escape( - "$", + "\\$", ), 730..732, ), ( - Escape( - "{", + Text( + "\\{", ), 732..734, ), @@ -906,33 +786,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "+", - ), - 748..749, - ), - ( - Text( - "z", - ), - 749..750, - ), - ( - Text( - "}", - ), - 750..751, - ), - ( - Text( - "]", - ), - 752..753, - ), - ( - Text( - "]", + "+z} ]] ", ), - 753..754, + 748..755, ), ( Text( @@ -1104,13 +960,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "readonly", + "readonly ", ), - 918..926, + 917..927, ), ( - Escape( - "$", + Text( + "\\$", ), 927..929, ), @@ -1139,19 +995,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "=", + "=\"", ), - 942..943, + 942..944, ), ( Text( - "\"", - ), - 943..944, - ), - ( - Escape( - "$", + "\\$", ), 944..946, ), @@ -1180,45 +1030,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 958..959, - ), - ( - Text( - "2", - ), - 960..961, - ), - ( - Text( - ">", - ), - 961..962, - ), - ( - Text( - "/", - ), - 963..964, - ), - ( - Text( - "dev", - ), - 964..967, - ), - ( - Text( - "/", - ), - 967..968, - ), - ( - Text( - "null", + "\" 2> /dev/null ", ), - 968..972, + 958..973, ), ( Text( @@ -1324,19 +1138,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 1081..1085, + 1080..1086, ), ( - Escape( - "$", + Text( + "\\$", ), 1086..1088, ), ( - Escape( - "{", + Text( + "\\{", ), 1088..1090, ), @@ -1371,9 +1185,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", + "} ", ), - 1104..1105, + 1104..1106, ), ( Text( @@ -1492,13 +1306,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "export", + "export ", ), - 1216..1222, + 1215..1223, ), ( - Escape( - "$", + Text( + "\\$", ), 1223..1225, ), @@ -1527,19 +1341,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "=", + "=\"", ), - 1238..1239, + 1238..1240, ), ( Text( - "\"", - ), - 1239..1240, - ), - ( - Escape( - "$", + "\\$", ), 1240..1242, ), @@ -1568,45 +1376,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1254..1255, - ), - ( - Text( - "2", - ), - 1256..1257, - ), - ( - Text( - ">", - ), - 1257..1258, - ), - ( - Text( - "/", - ), - 1259..1260, - ), - ( - Text( - "dev", - ), - 1260..1263, - ), - ( - Text( - "/", - ), - 1263..1264, - ), - ( - Text( - "null", + "\" 2> /dev/null ", ), - 1264..1268, + 1254..1269, ), ( Text( @@ -1712,19 +1484,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 1375..1379, + 1374..1380, ), ( - Escape( - "$", + Text( + "\\$", ), 1380..1382, ), ( - Escape( - "{", + Text( + "\\{", ), 1382..1384, ), @@ -1759,9 +1531,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", + "} ", ), - 1398..1399, + 1398..1400, ), ( Text( @@ -1863,9 +1635,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "unset", + "unset ", ), - 1504..1509, + 1503..1510, ), ( Expression( @@ -1881,6 +1653,12 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 1510..1516, ), + ( + Text( + " ", + ), + 1516..1517, + ), ( Text( "$", @@ -1980,51 +1758,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 1603..1604, - ), - ( - CommandOption( - "-x", + "[ -x \"", ), - 1605..1607, + 1602..1609, ), ( Text( - "\"", - ), - 1608..1609, - ), - ( - Escape( - "$", + "\\$", ), 1609..1611, ), ( Text( - "(", + "(command -v \"", ), - 1611..1612, - ), - ( - Text( - "command", - ), - 1612..1619, - ), - ( - CommandOption( - "-v", - ), - 1620..1622, - ), - ( - Text( - "\"", - ), - 1623..1624, + 1611..1624, ), ( Expression( @@ -2042,27 +1790,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1633..1634, - ), - ( - Text( - ")", - ), - 1634..1635, - ), - ( - Text( - "\"", - ), - 1635..1636, - ), - ( - Text( - "]", + "\")\" ] ", ), - 1637..1638, + 1633..1639, ), ( Text( @@ -2222,25 +1952,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "read", - ), - 1795..1799, - ), - ( - CommandOption( - "-p", + "read -p \"", ), - 1800..1802, + 1794..1804, ), ( Text( - "\"", - ), - 1803..1804, - ), - ( - Escape( - "$", + "\\$", ), 1804..1806, ), @@ -2269,9 +1987,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 1821..1822, + 1821..1823, ), ( Text( @@ -2311,21 +2029,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 1844..1848, + 1843..1849, ), ( - Escape( - "$", + Text( + "\\$", ), 1849..1851, ), ( Text( - "REPLY", + "REPLY ", ), - 1851..1856, + 1851..1857, ), ( Text( @@ -2428,31 +2146,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "read", + "read -s -p \"", ), - 1993..1997, - ), - ( - CommandOption( - "-s", - ), - 1998..2000, - ), - ( - CommandOption( - "-p", - ), - 2001..2003, + 1992..2005, ), ( Text( - "\"", - ), - 2004..2005, - ), - ( - Escape( - "$", + "\\$", ), 2005..2007, ), @@ -2481,9 +2181,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 2022..2023, + 2022..2024, ), ( Text( @@ -2513,33 +2213,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 2036..2040, - ), - ( - Text( - "\"", - ), - 2041..2042, - ), - ( - Text( - "\"", - ), - 2042..2043, - ), - ( - Text( - ">", - ), - 2044..2045, - ), - ( - Text( - "&2", + "echo \"\" >&2 ", ), - 2045..2047, + 2035..2048, ), ( Text( @@ -2574,21 +2250,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 2067..2071, + 2066..2072, ), ( - Escape( - "$", + Text( + "\\$", ), 2072..2074, ), ( Text( - "REPLY", + "REPLY ", ), - 2074..2079, + 2074..2080, ), ( Text( @@ -2766,184 +2442,103 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "[", - 2373..2374, + " [", + 2372..2374, + ), + ), + 2372..2374, + ), + ( + Text( + ( + "\\x", + 2374..2376, ), ), - 2373..2374, + 2374..2376, ), ( - Escape( + Text( ( - "x1b", - 2374..2378, + "1b[1mY/", + 2376..2383, ), ), - 2374..2378, + 2376..2383, ), ( Text( ( - "[", - 2378..2379, + "\\x", + 2383..2385, ), ), - 2378..2379, + 2383..2385, ), ( Text( ( - "1mY", - 2379..2382, + "1b[0mn]", + 2385..2392, ), ), - 2379..2382, + 2385..2392, ), + ], + ), + 2371..2393, + ), + ( + "else", + 2394..2398, + ), + ( + Text( + [ ( Text( ( - "/", - 2382..2383, + " [y/", + 2400..2404, ), ), - 2382..2383, + 2400..2404, ), ( - Escape( + Text( ( - "x1b", - 2383..2387, + "\\x", + 2404..2406, ), ), - 2383..2387, + 2404..2406, ), ( Text( ( - "[", - 2387..2388, + "1b[1mN", + 2406..2412, ), ), - 2387..2388, + 2406..2412, ), ( Text( ( - "0mn", - 2388..2391, + "\\x", + 2412..2414, ), ), - 2388..2391, + 2412..2414, ), ( Text( ( - "]", - 2391..2392, + "1b[0m]", + 2414..2420, ), ), - 2391..2392, - ), - ], - ), - 2371..2393, - ), - ( - "else", - 2394..2398, - ), - ( - Text( - [ - ( - Text( - ( - "[", - 2401..2402, - ), - ), - 2401..2402, - ), - ( - Text( - ( - "y", - 2402..2403, - ), - ), - 2402..2403, - ), - ( - Text( - ( - "/", - 2403..2404, - ), - ), - 2403..2404, - ), - ( - Escape( - ( - "x1b", - 2404..2408, - ), - ), - 2404..2408, - ), - ( - Text( - ( - "[", - 2408..2409, - ), - ), - 2408..2409, - ), - ( - Text( - ( - "1mN", - 2409..2412, - ), - ), - 2409..2412, - ), - ( - Escape( - ( - "x1b", - 2412..2416, - ), - ), - 2412..2416, - ), - ( - Text( - ( - "[", - 2416..2417, - ), - ), - 2416..2417, - ), - ( - Text( - ( - "0m", - 2417..2419, - ), - ), - 2417..2419, - ), - ( - Text( - ( - "]", - 2419..2420, - ), - ), - 2419..2420, + 2414..2420, ), ], ), @@ -2983,33 +2578,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", - ), - 2444..2450, - ), - ( - Text( - "\"", + "printf \"", ), - 2451..2452, - ), - ( - Escape( - "x1b", - ), - 2452..2456, + 2443..2452, ), ( Text( - "[", + "\\x", ), - 2456..2457, + 2452..2454, ), ( Text( - "1m", + "1b[1m", ), - 2457..2459, + 2454..2459, ), ( Expression( @@ -3025,23 +2608,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 2459..2467, ), - ( - Escape( - "x1b", - ), - 2467..2471, - ), ( Text( - "[", + "\\x", ), - 2471..2472, + 2467..2469, ), ( Text( - "0m", + "1b[0m", ), - 2472..2474, + 2469..2474, ), ( Expression( @@ -3059,9 +2636,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 2490..2491, + 2490..2492, ), ( Text( @@ -3091,27 +2668,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "read", - ), - 2504..2508, - ), - ( - CommandOption( - "-s", - ), - 2509..2511, - ), - ( - CommandOption( - "-n", - ), - 2512..2514, - ), - ( - Text( - "1", + "read -s -n 1 ", ), - 2515..2516, + 2503..2517, ), ( Text( @@ -3141,27 +2700,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 2529..2535, + 2528..2537, ), ( Text( - "\"", - ), - 2536..2537, - ), - ( - Escape( - "n", + "\\n", ), 2537..2539, ), ( Text( - "\"", + "\" ", ), - 2539..2540, + 2539..2541, ), ( Text( @@ -3221,21 +2774,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 2584..2588, + 2583..2589, ), ( - Escape( - "$", + Text( + "\\$", ), 2589..2591, ), ( Text( - "REPLY", + "REPLY ", ), - 2591..2596, + 2591..2597, ), ( Text( @@ -3436,9 +2989,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "eval", + "eval ", ), - 2761..2765, + 2760..2766, ), ( Expression( @@ -3454,6 +3007,12 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 2766..2775, ), + ( + Text( + " ", + ), + 2775..2776, + ), ( Text( "$", @@ -3567,15 +3126,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "id", - ), - 2915..2917, - ), - ( - CommandOption( - "-u", + "id -u ", ), - 2918..2920, + 2914..2921, ), ( Text( @@ -3773,6 +3326,12 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3094..3095, ), + ( + Text( + "", + ), + 3095..3096, + ), ( Expression( ( @@ -3798,21 +3357,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "=", - ), - 3109..3110, - ), - ( - Text( - "(", - ), - 3110..3111, - ), - ( - Text( - "\"", + "=(\"", ), - 3111..3112, + 3109..3112, ), ( Expression( @@ -3830,25 +3377,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" \"", ), - 3120..3121, + 3120..3123, ), ( Text( - "\"", - ), - 3122..3123, - ), - ( - Escape( - "$", + "\\$", ), 3123..3125, ), ( - Escape( - "{", + Text( + "\\{", ), 3125..3127, ), @@ -3877,39 +3418,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 3140..3141, - ), - ( - Text( - "@", - ), - 3141..3142, - ), - ( - Text( - "]", - ), - 3142..3143, - ), - ( - Text( - "}", - ), - 3143..3144, - ), - ( - Text( - "\"", - ), - 3144..3145, - ), - ( - Text( - ")", + "[@]}\") ", ), - 3145..3146, + 3140..3147, ), ( Text( @@ -3944,25 +3455,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 3161..3167, + 3160..3169, ), ( Text( - "\"", - ), - 3168..3169, - ), - ( - Escape( - "$", + "\\$", ), 3169..3171, ), ( - Escape( - "{", + Text( + "\\{", ), 3171..3173, ), @@ -3991,33 +3496,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 3186..3187, - ), - ( - Text( - "@", - ), - 3187..3188, - ), - ( - Text( - "]", - ), - 3188..3189, - ), - ( - Text( - "}", - ), - 3189..3190, - ), - ( - Text( - "\"", + "[@]}\" ", ), - 3190..3191, + 3186..3192, ), ( Text( @@ -4118,13 +3599,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 3299..3303, + 3298..3304, ), ( - Escape( - "$", + Text( + "\\$", ), 3304..3306, ), @@ -4153,43 +3634,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "|", + " | sed -e 's/", ), - 3320..3321, + 3319..3332, ), ( Text( - "sed", - ), - 3322..3325, - ), - ( - CommandOption( - "-e", - ), - 3326..3328, - ), - ( - Text( - "'s", - ), - 3329..3331, - ), - ( - Text( - "/", - ), - 3331..3332, - ), - ( - Escape( - "\\", + "\\\\", ), 3332..3334, ), ( - Escape( - "\\", + Text( + "\\\\", ), 3334..3336, ), @@ -4199,107 +3656,35 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3336..3337, ), - ( - Escape( - "\\", - ), - 3337..3339, - ), - ( - Escape( - "\\", - ), - 3339..3341, - ), - ( - Escape( - "\\", - ), - 3341..3343, - ), - ( - Escape( - "\\", - ), - 3343..3345, - ), ( Text( - "/", - ), - 3345..3346, - ), - ( - Text( - "g'", - ), - 3346..3348, - ), - ( - CommandOption( - "-e", - ), - 3349..3351, - ), - ( - Text( - "\"", - ), - 3352..3353, - ), - ( - Text( - "s", - ), - 3353..3354, - ), - ( - Text( - "/", - ), - 3354..3355, - ), - ( - Text( - "%", - ), - 3355..3356, - ), - ( - Text( - "/", - ), - 3356..3357, - ), - ( - Text( - "%", + "\\\\", ), - 3357..3358, + 3337..3339, ), ( Text( - "%", + "\\\\", ), - 3358..3359, + 3339..3341, ), ( Text( - "/", + "\\\\", ), - 3359..3360, + 3341..3343, ), ( Text( - "g", + "\\\\", ), - 3360..3361, + 3343..3345, ), ( Text( - "\"", + "/g' -e \"s/%/%%/g\" ", ), - 3361..3362, + 3345..3363, ), ( Text( @@ -4439,22 +3824,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "x1b", - 3506..3510, + "\\x", + 3506..3508, ), ), - 3506..3510, + 3506..3508, ), ( Text( ( - "[", - 3510..3511, + "1b[", + 3508..3511, ), ), - 3510..3511, + 3508..3511, ), ( Expression( @@ -4552,32 +3937,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3529..3547, ), - ( - Escape( - ( - "x1b", - 3547..3551, - ), - ), - 3547..3551, - ), ( Text( ( - "[", - 3551..3552, + "\\x", + 3547..3549, ), ), - 3551..3552, + 3547..3549, ), ( Text( ( - "0m", - 3552..3554, + "1b[0m", + 3549..3554, ), ), - 3552..3554, + 3549..3554, ), ], ), @@ -4658,32 +4034,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3635..3639, - ), - ), - 3635..3639, - ), ( Text( ( - "[", - 3639..3640, + "\\x", + 3635..3637, ), ), - 3639..3640, + 3635..3637, ), ( Text( ( - "1m", - 3640..3642, + "1b[1m", + 3637..3642, ), ), - 3640..3642, + 3637..3642, ), ( Expression( @@ -4712,32 +4079,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3642..3660, ), - ( - Escape( - ( - "x1b", - 3660..3664, - ), - ), - 3660..3664, - ), ( Text( ( - "[", - 3664..3665, + "\\x", + 3660..3662, ), ), - 3664..3665, + 3660..3662, ), ( Text( ( - "0m", - 3665..3667, + "1b[0m", + 3662..3667, ), ), - 3665..3667, + 3662..3667, ), ], ), @@ -4818,32 +4176,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3752..3756, - ), - ), - 3752..3756, - ), ( Text( ( - "[", - 3756..3757, + "\\x", + 3752..3754, ), ), - 3756..3757, + 3752..3754, ), ( Text( ( - "3m", - 3757..3759, + "1b[3m", + 3754..3759, ), ), - 3757..3759, + 3754..3759, ), ( Expression( @@ -4873,31 +4222,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3759..3777, ), ( - Escape( + Text( ( - "x1b", - 3777..3781, + "\\x", + 3777..3779, ), ), - 3777..3781, + 3777..3779, ), ( Text( ( - "[", - 3781..3782, + "1b[0m", + 3779..3784, ), ), - 3781..3782, - ), - ( - Text( - ( - "0m", - 3782..3784, - ), - ), - 3782..3784, + 3779..3784, ), ], ), @@ -4978,32 +4318,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3877..3881, - ), - ), - 3877..3881, - ), ( Text( ( - "[", - 3881..3882, + "\\x", + 3877..3879, ), ), - 3881..3882, + 3877..3879, ), ( Text( ( - "4m", - 3882..3884, + "1b[4m", + 3879..3884, ), ), - 3882..3884, + 3879..3884, ), ( Expression( @@ -5032,32 +4363,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3884..3902, ), - ( - Escape( - ( - "x1b", - 3902..3906, - ), - ), - 3902..3906, - ), ( Text( ( - "[", - 3906..3907, + "\\x", + 3902..3904, ), ), - 3906..3907, + 3902..3904, ), ( Text( ( - "0m", - 3907..3909, + "1b[0m", + 3904..3909, ), ), - 3907..3909, + 3904..3909, ), ], ), @@ -5159,22 +4481,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "x1b", - 4024..4028, + "\\x", + 4024..4026, ), ), - 4024..4028, + 4024..4026, ), ( Text( ( - "[", - 4028..4029, + "1b[", + 4026..4029, ), ), - 4028..4029, + 4026..4029, ), ( Expression( @@ -5206,61 +4528,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "m", - 4044..4045, - ), - ), - 4044..4045, - ), - ( - Text( - ( - "%", - 4045..4046, + "m%s", + 4044..4047, ), ), - 4045..4046, + 4044..4047, ), ( Text( ( - "s", - 4046..4047, - ), - ), - 4046..4047, - ), - ( - Escape( - ( - "x1b", - 4047..4051, + "\\x", + 4047..4049, ), ), - 4047..4051, + 4047..4049, ), ( Text( ( - "[", - 4051..4052, + "1b[0m", + 4049..4054, ), ), - 4051..4052, + 4049..4054, ), ( Text( ( - "0m", - 4052..4054, - ), - ), - 4052..4054, - ), - ( - Escape( - ( - "n", + "\\n", 4054..4056, ), ), @@ -5368,136 +4663,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4163..4167, - ), - ), - 4163..4167, - ), - ( - Text( - ( - "[", - 4167..4168, - ), - ), - 4167..4168, - ), - ( - Text( - ( - "1", - 4168..4169, - ), - ), - 4168..4169, - ), - ( - Text( - ( - ";", - 4169..4170, - ), - ), - 4169..4170, - ), - ( - Text( - ( - "3", - 4170..4171, - ), - ), - 4170..4171, - ), - ( - Text( - ( - ";", - 4171..4172, - ), - ), - 4171..4172, - ), ( Text( ( - "97", - 4172..4174, + "\\x", + 4163..4165, ), ), - 4172..4174, + 4163..4165, ), ( Text( ( - ";", - 4174..4175, + "1b[1;3;97;44m%s", + 4165..4180, ), ), - 4174..4175, + 4165..4180, ), ( Text( ( - "44m", - 4175..4178, + "\\x", + 4180..4182, ), ), - 4175..4178, + 4180..4182, ), ( Text( ( - "%", - 4178..4179, + "1b[0m", + 4182..4187, ), ), - 4178..4179, + 4182..4187, ), ( Text( ( - "s", - 4179..4180, - ), - ), - 4179..4180, - ), - ( - Escape( - ( - "x1b", - 4180..4184, - ), - ), - 4180..4184, - ), - ( - Text( - ( - "[", - 4184..4185, - ), - ), - 4184..4185, - ), - ( - Text( - ( - "0m", - 4185..4187, - ), - ), - 4185..4187, - ), - ( - Escape( - ( - "n", + "\\n", 4187..4189, ), ), @@ -5605,136 +4810,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4302..4306, - ), - ), - 4302..4306, - ), - ( - Text( - ( - "[", - 4306..4307, - ), - ), - 4306..4307, - ), - ( - Text( - ( - "1", - 4307..4308, - ), - ), - 4307..4308, - ), - ( - Text( - ( - ";", - 4308..4309, - ), - ), - 4308..4309, - ), - ( - Text( - ( - "3", - 4309..4310, - ), - ), - 4309..4310, - ), ( Text( ( - ";", - 4310..4311, + "\\x", + 4302..4304, ), ), - 4310..4311, + 4302..4304, ), ( Text( ( - "97", - 4311..4313, + "1b[1;3;97;42m%s", + 4304..4319, ), ), - 4311..4313, + 4304..4319, ), ( Text( ( - ";", - 4313..4314, + "\\x", + 4319..4321, ), ), - 4313..4314, + 4319..4321, ), ( Text( ( - "42m", - 4314..4317, + "1b[0m", + 4321..4326, ), ), - 4314..4317, + 4321..4326, ), ( Text( ( - "%", - 4317..4318, - ), - ), - 4317..4318, - ), - ( - Text( - ( - "s", - 4318..4319, - ), - ), - 4318..4319, - ), - ( - Escape( - ( - "x1b", - 4319..4323, - ), - ), - 4319..4323, - ), - ( - Text( - ( - "[", - 4323..4324, - ), - ), - 4323..4324, - ), - ( - Text( - ( - "0m", - 4324..4326, - ), - ), - 4324..4326, - ), - ( - Escape( - ( - "n", + "\\n", 4326..4328, ), ), @@ -5842,136 +4957,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4441..4445, - ), - ), - 4441..4445, - ), - ( - Text( - ( - "[", - 4445..4446, - ), - ), - 4445..4446, - ), - ( - Text( - ( - "1", - 4446..4447, - ), - ), - 4446..4447, - ), - ( - Text( - ( - ";", - 4447..4448, - ), - ), - 4447..4448, - ), ( Text( ( - "3", - 4448..4449, + "\\x", + 4441..4443, ), ), - 4448..4449, + 4441..4443, ), ( Text( ( - ";", - 4449..4450, + "1b[1;3;97;43m%s", + 4443..4458, ), ), - 4449..4450, + 4443..4458, ), ( Text( ( - "97", - 4450..4452, + "\\x", + 4458..4460, ), ), - 4450..4452, + 4458..4460, ), ( Text( ( - ";", - 4452..4453, + "1b[0m", + 4460..4465, ), ), - 4452..4453, + 4460..4465, ), ( Text( ( - "43m", - 4453..4456, - ), - ), - 4453..4456, - ), - ( - Text( - ( - "%", - 4456..4457, - ), - ), - 4456..4457, - ), - ( - Text( - ( - "s", - 4457..4458, - ), - ), - 4457..4458, - ), - ( - Escape( - ( - "x1b", - 4458..4462, - ), - ), - 4458..4462, - ), - ( - Text( - ( - "[", - 4462..4463, - ), - ), - 4462..4463, - ), - ( - Text( - ( - "0m", - 4463..4465, - ), - ), - 4463..4465, - ), - ( - Escape( - ( - "n", + "\\n", 4465..4467, ), ), @@ -6107,136 +5132,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4635..4639, - ), - ), - 4635..4639, - ), ( Text( ( - "[", - 4639..4640, + "\\x", + 4635..4637, ), ), - 4639..4640, + 4635..4637, ), ( Text( ( - "1", - 4640..4641, + "1b[1;3;97;41m%s", + 4637..4652, ), ), - 4640..4641, + 4637..4652, ), ( Text( ( - ";", - 4641..4642, - ), - ), - 4641..4642, - ), - ( - Text( - ( - "3", - 4642..4643, - ), - ), - 4642..4643, - ), - ( - Text( - ( - ";", - 4643..4644, - ), - ), - 4643..4644, - ), - ( - Text( - ( - "97", - 4644..4646, - ), - ), - 4644..4646, - ), - ( - Text( - ( - ";", - 4646..4647, - ), - ), - 4646..4647, - ), - ( - Text( - ( - "41m", - 4647..4650, - ), - ), - 4647..4650, - ), - ( - Text( - ( - "%", - 4650..4651, - ), - ), - 4650..4651, - ), - ( - Text( - ( - "s", - 4651..4652, - ), - ), - 4651..4652, - ), - ( - Escape( - ( - "x1b", - 4652..4656, + "\\x", + 4652..4654, ), ), - 4652..4656, + 4652..4654, ), ( Text( ( - "[", - 4656..4657, + "1b[0m", + 4654..4659, ), ), - 4656..4657, + 4654..4659, ), ( Text( ( - "0m", - 4657..4659, - ), - ), - 4657..4659, - ), - ( - Escape( - ( - "n", + "\\n", 4659..4661, ), ), @@ -6423,63 +5358,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 4867..4871, + 4866..4873, ), ( Text( - "\"", - ), - 4872..4873, - ), - ( - Escape( - "$", + "\\$", ), 4873..4875, ), - ( - Escape( - "{", - ), - 4875..4877, - ), - ( - Text( - "BASH_VERSINFO", - ), - 4877..4890, - ), - ( - Text( - "[", - ), - 4890..4891, - ), - ( - Text( - "0", - ), - 4891..4892, - ), - ( - Text( - "]", - ), - 4892..4893, - ), ( Text( - "}", + "\\{", ), - 4893..4894, + 4875..4877, ), ( Text( - "\"", + "BASH_VERSINFO[0]}\" ", ), - 4894..4895, + 4877..4896, ), ( Text( @@ -6540,63 +5439,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 4929..4933, + 4928..4935, ), ( Text( - "\"", - ), - 4934..4935, - ), - ( - Escape( - "$", + "\\$", ), 4935..4937, ), - ( - Escape( - "{", - ), - 4937..4939, - ), ( Text( - "BASH_VERSINFO", + "\\{", ), - 4939..4952, - ), - ( - Text( - "[", - ), - 4952..4953, - ), - ( - Text( - "1", - ), - 4953..4954, - ), - ( - Text( - "]", - ), - 4954..4955, - ), - ( - Text( - "}", - ), - 4955..4956, + 4937..4939, ), ( Text( - "\"", + "BASH_VERSINFO[1]}\" ", ), - 4956..4957, + 4939..4958, ), ( Text( @@ -6657,63 +5520,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 4991..4995, + 4990..4997, ), ( Text( - "\"", - ), - 4996..4997, - ), - ( - Escape( - "$", + "\\$", ), 4997..4999, ), - ( - Escape( - "{", - ), - 4999..5001, - ), - ( - Text( - "BASH_VERSINFO", - ), - 5001..5014, - ), - ( - Text( - "[", - ), - 5014..5015, - ), - ( - Text( - "2", - ), - 5015..5016, - ), ( Text( - "]", + "\\{", ), - 5016..5017, - ), - ( - Text( - "}", - ), - 5017..5018, + 4999..5001, ), ( Text( - "\"", + "BASH_VERSINFO[2]}\" ", ), - 5018..5019, + 5001..5020, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap index f21ad0f..3656377 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_fs.snap @@ -127,21 +127,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", + "[ -d \"", ), - 159..160, - ), - ( - CommandOption( - "-d", - ), - 161..163, - ), - ( - Text( - "\"", - ), - 164..165, + 158..165, ), ( Expression( @@ -159,15 +147,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 171..172, - ), - ( - Text( - "]", + "\" ] ", ), - 173..174, + 171..175, ), ( Text( @@ -292,21 +274,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 284..285, - ), - ( - CommandOption( - "-f", - ), - 286..288, - ), - ( - Text( - "\"", + "[ -f \"", ), - 289..290, + 283..290, ), ( Expression( @@ -324,15 +294,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 296..297, - ), - ( - Text( - "]", + "\" ] ", ), - 298..299, + 296..300, ), ( Text( @@ -457,15 +421,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "<", - ), - 416..417, - ), - ( - Text( - "\"", + "< \"", ), - 418..419, + 415..419, ), ( Expression( @@ -483,9 +441,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 425..426, + 425..427, ), ( Text( @@ -625,15 +583,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 567..571, - ), - ( - Text( - "\"", + "echo \"", ), - 572..573, + 566..573, ), ( Expression( @@ -651,21 +603,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 582..583, - ), - ( - Text( - ">", - ), - 584..585, - ), - ( - Text( - "\"", + "\" > \"", ), - 586..587, + 582..587, ), ( Expression( @@ -683,9 +623,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 593..594, + 593..595, ), ( Text( @@ -841,15 +781,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 743..747, - ), - ( - Text( - "\"", + "echo \"", ), - 748..749, + 742..749, ), ( Expression( @@ -867,27 +801,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 758..759, - ), - ( - Text( - ">", - ), - 760..761, - ), - ( - Text( - ">", - ), - 761..762, - ), - ( - Text( - "\"", + "\" >> \"", ), - 763..764, + 758..764, ), ( Expression( @@ -905,9 +821,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 770..771, + 770..772, ), ( Text( @@ -1092,21 +1008,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "ln", - ), - 977..979, - ), - ( - CommandOption( - "-s", - ), - 980..982, - ), - ( - Text( - "\"", + "ln -s \"", ), - 983..984, + 976..984, ), ( Expression( @@ -1124,15 +1028,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 992..993, - ), - ( - Text( - "\"", + "\" \"", ), - 994..995, + 992..995, ), ( Expression( @@ -1150,9 +1048,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 1008..1009, + 1008..1010, ), ( Text( @@ -1217,20 +1115,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "The", - 1050..1053, - ), - ), - 1050..1053, - ), - ( - Text( - ( - "file", - 1054..1058, + "The file ", + 1050..1059, ), ), - 1054..1058, + 1050..1059, ), ( Expression( @@ -1249,29 +1138,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 1068..1075, - ), - ), - 1068..1075, - ), - ( - Text( - ( - "exist", - 1076..1081, - ), - ), - 1076..1081, - ), - ( - Text( - ( - "!", - 1081..1082, + " doesn't exist!", + 1067..1082, ), ), - 1081..1082, + 1067..1082, ), ], ), @@ -1418,21 +1289,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "mkdir", - ), - 1243..1248, - ), - ( - CommandOption( - "-p", - ), - 1249..1251, - ), - ( - Text( - "\"", + "mkdir -p \"", ), - 1252..1253, + 1242..1253, ), ( Expression( @@ -1450,9 +1309,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 1259..1260, + 1259..1261, ), ( Text( @@ -1563,15 +1422,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "mktemp", - ), - 1404..1410, - ), - ( - CommandOption( - "--version", + "mktemp --version ", ), - 1411..1420, + 1403..1421, ), ( Text( @@ -1725,29 +1578,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "tmp", - 1664..1667, - ), - ), - 1664..1667, - ), - ( - Text( - ( - ".", - 1667..1668, - ), - ), - 1667..1668, - ), - ( - Text( - ( - "XXXXXXXXXX", - 1668..1678, + "tmp.XXXXXXXXXX", + 1664..1678, ), ), - 1668..1678, + 1664..1678, ), ], ), @@ -1877,74 +1712,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "The", - 1798..1801, - ), - ), - 1798..1801, - ), - ( - Text( - ( - "template", - 1802..1810, - ), - ), - 1802..1810, - ), - ( - Text( - ( - "cannot", - 1811..1817, - ), - ), - 1811..1817, - ), - ( - Text( - ( - "be", - 1818..1820, - ), - ), - 1818..1820, - ), - ( - Text( - ( - "an", - 1821..1823, - ), - ), - 1821..1823, - ), - ( - Text( - ( - "empty", - 1824..1829, - ), - ), - 1824..1829, - ), - ( - Text( - ( - "string", - 1830..1836, - ), - ), - 1830..1836, - ), - ( - Text( - ( - "!", - 1836..1837, + "The template cannot be an empty string!", + 1798..1837, ), ), - 1836..1837, + 1798..1837, ), ], ), @@ -2073,51 +1845,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "mktemp", - ), - 2071..2077, - ), - ( - CommandOption( - "-d", - ), - 2078..2080, - ), - ( - CommandOption( - "-p", + "mktemp -d -p \"", ), - 2081..2083, + 2070..2085, ), ( Text( - "\"", - ), - 2084..2085, - ), - ( - Escape( - "$", + "\\$", ), 2085..2087, ), ( Text( - "TMPDIR", - ), - 2087..2093, - ), - ( - Text( - "\"", - ), - 2093..2094, - ), - ( - Text( - "\"", + "TMPDIR\" \"", ), - 2095..2096, + 2087..2096, ), ( Expression( @@ -2135,9 +1877,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 2106..2107, + 2106..2108, ), ( Text( @@ -2200,57 +1942,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "mktemp", - ), - 2145..2151, - ), - ( - CommandOption( - "-d", + "mktemp -d -p \"", ), - 2152..2154, - ), - ( - CommandOption( - "-p", - ), - 2155..2157, + 2144..2159, ), ( Text( - "\"", - ), - 2158..2159, - ), - ( - Escape( - "$", + "\\$", ), 2159..2161, ), ( Text( - "TMPDIR", - ), - 2161..2167, - ), - ( - Text( - "\"", - ), - 2167..2168, - ), - ( - CommandOption( - "-t", - ), - 2169..2171, - ), - ( - Text( - "\"", + "TMPDIR\" -t \"", ), - 2172..2173, + 2161..2173, ), ( Expression( @@ -2268,9 +1974,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 2183..2184, + 2183..2185, ), ( Text( @@ -2351,56 +2057,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "Failed", - 2232..2238, - ), - ), - 2232..2238, - ), - ( - Text( - ( - "to", - 2239..2241, + "Failed to make a temporary directory", + 2232..2268, ), ), - 2239..2241, - ), - ( - Text( - ( - "make", - 2242..2246, - ), - ), - 2242..2246, - ), - ( - Text( - ( - "a", - 2247..2248, - ), - ), - 2247..2248, - ), - ( - Text( - ( - "temporary", - 2249..2258, - ), - ), - 2249..2258, - ), - ( - Text( - ( - "directory", - 2259..2268, - ), - ), - 2259..2268, + 2232..2268, ), ], ), @@ -2497,21 +2158,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "trap", + "trap 'rm -rf ", ), - 2352..2356, - ), - ( - Text( - "'rm", - ), - 2357..2360, - ), - ( - CommandOption( - "-rf", - ), - 2361..2364, + 2351..2365, ), ( Expression( @@ -2529,15 +2178,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "'", - ), - 2375..2376, - ), - ( - Text( - "EXIT", + "' EXIT ", ), - 2377..2381, + 2375..2382, ), ( Text( @@ -2572,115 +2215,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "Setting", - 2415..2422, - ), - ), - 2415..2422, - ), - ( - Text( - ( - "auto", - 2423..2427, - ), - ), - 2423..2427, - ), - ( - Text( - ( - "deletion", - 2428..2436, + "Setting auto deletion fails. You must delete temporary dir ", + 2415..2474, ), ), - 2428..2436, + 2415..2474, ), ( - Text( + Expression( ( - "fails", - 2437..2442, + Var( + ( + "filename", + 2475..2483, + ), + ), + 2475..2483, ), ), - 2437..2442, + 2474..2484, ), ( Text( ( ".", - 2442..2443, + 2484..2485, ), ), - 2442..2443, - ), - ( - Text( - ( - "You", - 2444..2447, - ), - ), - 2444..2447, - ), - ( - Text( - ( - "must", - 2448..2452, - ), - ), - 2448..2452, - ), - ( - Text( - ( - "delete", - 2453..2459, - ), - ), - 2453..2459, - ), - ( - Text( - ( - "temporary", - 2460..2469, - ), - ), - 2460..2469, - ), - ( - Text( - ( - "dir", - 2470..2473, - ), - ), - 2470..2473, - ), - ( - Expression( - ( - Var( - ( - "filename", - 2475..2483, - ), - ), - 2475..2483, - ), - ), - 2474..2484, - ), - ( - Text( - ( - ".", - 2484..2485, - ), - ), - 2484..2485, + 2484..2485, ), ], ), @@ -2739,15 +2301,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "trap", + "trap 'rmdir ", ), - 2532..2536, - ), - ( - Text( - "'rmdir", - ), - 2537..2543, + 2531..2544, ), ( Expression( @@ -2765,15 +2321,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "'", - ), - 2554..2555, - ), - ( - Text( - "EXIT", + "' EXIT ", ), - 2556..2560, + 2554..2561, ), ( Text( @@ -2808,92 +2358,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "Setting", - 2594..2601, - ), - ), - 2594..2601, - ), - ( - Text( - ( - "auto", - 2602..2606, - ), - ), - 2602..2606, - ), - ( - Text( - ( - "deletion", - 2607..2615, - ), - ), - 2607..2615, - ), - ( - Text( - ( - "fails", - 2616..2621, - ), - ), - 2616..2621, - ), - ( - Text( - ( - ".", - 2621..2622, - ), - ), - 2621..2622, - ), - ( - Text( - ( - "You", - 2623..2626, - ), - ), - 2623..2626, - ), - ( - Text( - ( - "must", - 2627..2631, - ), - ), - 2627..2631, - ), - ( - Text( - ( - "delete", - 2632..2638, - ), - ), - 2632..2638, - ), - ( - Text( - ( - "temporary", - 2639..2648, - ), - ), - 2639..2648, - ), - ( - Text( - ( - "dir", - 2649..2652, + "Setting auto deletion fails. You must delete temporary dir ", + 2594..2653, ), ), - 2649..2652, + 2594..2653, ), ( Expression( @@ -3143,15 +2612,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "chmod", - ), - 2917..2922, - ), - ( - Text( - "\"", + "chmod \"", ), - 2923..2924, + 2916..2924, ), ( Expression( @@ -3169,15 +2632,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2930..2931, - ), - ( - Text( - "\"", + "\" \"", ), - 2932..2933, + 2930..2933, ), ( Expression( @@ -3195,9 +2652,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 2939..2940, + 2939..2941, ), ( Text( @@ -3262,20 +2719,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "The", - 2981..2984, - ), - ), - 2981..2984, - ), - ( - Text( - ( - "file", - 2985..2989, + "The file ", + 2981..2990, ), ), - 2985..2989, + 2981..2990, ), ( Expression( @@ -3294,29 +2742,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 2997..3004, - ), - ), - 2997..3004, - ), - ( - Text( - ( - "exist", - 3005..3010, - ), - ), - 3005..3010, - ), - ( - Text( - ( - "!", - 3010..3011, + " doesn't exist!", + 2996..3011, ), ), - 3010..3011, + 2996..3011, ), ], ), @@ -3534,21 +2964,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "chown", - ), - 3235..3240, - ), - ( - CommandOption( - "-R", - ), - 3241..3243, - ), - ( - Text( - "\"", + "chown -R \"", ), - 3244..3245, + 3234..3245, ), ( Expression( @@ -3566,15 +2984,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" \"", ), - 3251..3252, - ), - ( - Text( - "\"", - ), - 3253..3254, + 3251..3254, ), ( Expression( @@ -3592,9 +3004,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3260..3261, + 3260..3262, ), ( Text( @@ -3659,20 +3071,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "The", - 3302..3305, - ), - ), - 3302..3305, - ), - ( - Text( - ( - "file", - 3306..3310, + "The file ", + 3302..3311, ), ), - 3306..3310, + 3302..3311, ), ( Expression( @@ -3691,29 +3094,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 3318..3325, - ), - ), - 3318..3325, - ), - ( - Text( - ( - "exist", - 3326..3331, + " doesn't exist!", + 3317..3332, ), ), - 3326..3331, - ), - ( - Text( - ( - "!", - 3331..3332, - ), - ), - 3331..3332, + 3317..3332, ), ], ), @@ -3847,9 +3232,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "(", + "\\(", 3534..3536, ), ), @@ -3858,61 +3243,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "[", - 3536..3537, - ), - ), - 3536..3537, - ), - ( - Text( - ( - "^", - 3537..3538, - ), - ), - 3537..3538, - ), - ( - Text( - ( - "*", - 3538..3539, - ), - ), - 3538..3539, - ), - ( - Text( - ( - "?", - 3539..3540, - ), - ), - 3539..3540, - ), - ( - Text( - ( - "/", - 3540..3541, + "[^*?/]", + 3536..3542, ), ), - 3540..3541, + 3536..3542, ), ( Text( ( - "]", - 3541..3542, - ), - ), - 3541..3542, - ), - ( - Escape( - ( - ")", + "\\)", 3542..3544, ), ), @@ -3926,27 +3266,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "\\", + "\\\\", 3548..3550, ), ), 3548..3550, ), ( - Escape( + Text( ( - "\\", + "\\\\", 3550..3552, ), ), 3550..3552, ), ( - Escape( + Text( ( - "1", + "\\1", 3552..3554, ), ), @@ -4336,7 +3676,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - [], + [ + ( + Text( + ( + " ", + 4059..4060, + ), + ), + 4059..4060, + ), + ], ), 4058..4061, ), @@ -4383,33 +3733,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "eval", - ), - 4087..4091, - ), - ( - Text( - "\"", - ), - 4092..4093, - ), - ( - Text( - "for", - ), - 4093..4096, - ), - ( - Text( - "file", - ), - 4097..4101, - ), - ( - Text( - "in", + "eval \"for file in ", ), - 4102..4104, + 4086..4105, ), ( Expression( @@ -4427,31 +3753,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - ";", - ), - 4115..4116, - ), - ( - Text( - "do", + "; do [ -e ", ), - 4117..4119, + 4115..4125, ), ( Text( - "[", - ), - 4120..4121, - ), - ( - CommandOption( - "-e", - ), - 4122..4124, - ), - ( - Escape( - "\\", + "\\\\", ), 4125..4127, ), @@ -4462,14 +3770,14 @@ expression: parse_unwrap(&tokenize(&stdlib)) 4127..4128, ), ( - Escape( - "\\", + Text( + "\\\\", ), 4128..4130, ), ( - Escape( - "$", + Text( + "\\$", ), 4130..4132, ), @@ -4479,39 +3787,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 4132..4136, ), - ( - Escape( - "\\", - ), - 4136..4138, - ), - ( - Text( - "\"", - ), - 4138..4139, - ), ( Text( - "]", + "\\\\", ), - 4140..4141, + 4136..4138, ), ( Text( - "&&", + "\" ] && echo ", ), - 4142..4144, + 4138..4150, ), ( Text( - "echo", - ), - 4145..4149, - ), - ( - Escape( - "\\", + "\\\\", ), 4150..4152, ), @@ -4522,14 +3812,14 @@ expression: parse_unwrap(&tokenize(&stdlib)) 4152..4153, ), ( - Escape( - "\\", + Text( + "\\\\", ), 4153..4155, ), ( - Escape( - "$", + Text( + "\\$", ), 4155..4157, ), @@ -4540,40 +3830,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) 4157..4161, ), ( - Escape( - "\\", + Text( + "\\\\", ), 4161..4163, ), ( Text( - "\"", + "\"; done\" ", ), - 4163..4164, + 4163..4172, ), ( Text( - ";", + "$", ), - 4164..4165, - ), - ( - Text( - "done", - ), - 4166..4170, - ), - ( - Text( - "\"", - ), - 4170..4171, - ), - ( - Text( - "$", - ), - 4172..4173, + 4172..4173, ), ], [ @@ -4624,9 +3896,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "n", + "\\n", 4200..4202, ), ), @@ -4932,9 +4204,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 4675..4677, ), ), @@ -4943,25 +4215,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "(", - 4677..4678, + "(tar", + 4677..4681, ), ), - 4677..4678, + 4677..4681, ), ( Text( ( - "tar", - 4678..4681, - ), - ), - 4678..4681, - ), - ( - Escape( - ( - ".", + "\\.", 4681..4683, ), ), @@ -4970,29 +4233,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "bz2|tbz|tbz2", - 4683..4695, + "bz2|tbz|tbz2)$", + 4683..4697, ), ), - 4683..4695, - ), - ( - Text( - ( - ")", - 4695..4696, - ), - ), - 4695..4696, - ), - ( - Text( - ( - "$", - 4696..4697, - ), - ), - 4696..4697, + 4683..4697, ), ], ), @@ -5028,21 +4273,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "tar", - ), - 4709..4712, - ), - ( - Text( - "xvjf", + "tar xvjf \"", ), - 4713..4717, - ), - ( - Text( - "\"", - ), - 4718..4719, + 4708..4719, ), ( Expression( @@ -5060,21 +4293,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 4725..4726, - ), - ( - CommandOption( - "-C", - ), - 4727..4729, - ), - ( - Text( - "\"", + "\" -C \"", ), - 4730..4731, + 4725..4731, ), ( Expression( @@ -5092,9 +4313,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 4739..4740, + 4739..4741, ), ( Text( @@ -5154,9 +4375,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 4775..4777, ), ), @@ -5165,25 +4386,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "(", - 4777..4778, + "(tar", + 4777..4781, ), ), - 4777..4778, + 4777..4781, ), ( Text( ( - "tar", - 4778..4781, - ), - ), - 4778..4781, - ), - ( - Escape( - ( - ".", + "\\.", 4781..4783, ), ), @@ -5192,29 +4404,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "gz|tgz", - 4783..4789, + "gz|tgz)$", + 4783..4791, ), ), - 4783..4789, - ), - ( - Text( - ( - ")", - 4789..4790, - ), - ), - 4789..4790, - ), - ( - Text( - ( - "$", - 4790..4791, - ), - ), - 4790..4791, + 4783..4791, ), ], ), @@ -5250,21 +4444,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "tar", - ), - 4803..4806, - ), - ( - Text( - "xzf", - ), - 4807..4810, - ), - ( - Text( - "\"", + "tar xzf \"", ), - 4811..4812, + 4802..4812, ), ( Expression( @@ -5282,21 +4464,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" -C \"", ), - 4818..4819, - ), - ( - CommandOption( - "-C", - ), - 4820..4822, - ), - ( - Text( - "\"", - ), - 4823..4824, + 4818..4824, ), ( Expression( @@ -5314,9 +4484,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 4832..4833, + 4832..4834, ), ( Text( @@ -5376,9 +4546,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 4868..4870, ), ), @@ -5387,25 +4557,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "(", - 4870..4871, + "(tar", + 4870..4874, ), ), - 4870..4871, + 4870..4874, ), ( Text( ( - "tar", - 4871..4874, - ), - ), - 4871..4874, - ), - ( - Escape( - ( - ".", + "\\.", 4874..4876, ), ), @@ -5414,29 +4575,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "xz|txz", - 4876..4882, - ), - ), - 4876..4882, - ), - ( - Text( - ( - ")", - 4882..4883, - ), - ), - 4882..4883, - ), - ( - Text( - ( - "$", - 4883..4884, + "xz|txz)$", + 4876..4884, ), ), - 4883..4884, + 4876..4884, ), ], ), @@ -5472,21 +4615,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "tar", + "tar xJf \"", ), - 4896..4899, - ), - ( - Text( - "xJf", - ), - 4900..4903, - ), - ( - Text( - "\"", - ), - 4904..4905, + 4895..4905, ), ( Expression( @@ -5504,21 +4635,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 4911..4912, - ), - ( - CommandOption( - "-C", + "\" -C \"", ), - 4913..4915, - ), - ( - Text( - "\"", - ), - 4916..4917, + 4911..4917, ), ( Expression( @@ -5536,9 +4655,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 4925..4926, + 4925..4927, ), ( Text( @@ -5598,9 +4717,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 4961..4963, ), ), @@ -5609,20 +4728,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "bz2", - 4963..4966, + "bz2$", + 4963..4967, ), ), - 4963..4966, - ), - ( - Text( - ( - "$", - 4966..4967, - ), - ), - 4966..4967, + 4963..4967, ), ], ), @@ -5649,15 +4759,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "bunzip2", - ), - 4973..4980, - ), - ( - Text( - "\"", + "bunzip2 \"", ), - 4981..4982, + 4972..4982, ), ( Expression( @@ -5675,9 +4779,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 4988..4989, + 4988..4990, ), ( Text( @@ -5737,9 +4841,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 5024..5026, ), ), @@ -5748,20 +4852,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "deb", - 5026..5029, + "deb$", + 5026..5030, ), ), - 5026..5029, - ), - ( - Text( - ( - "$", - 5029..5030, - ), - ), - 5029..5030, + 5026..5030, ), ], ), @@ -5788,27 +4883,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "dpkg", - ), - 5036..5040, - ), - ( - CommandOption( - "-deb", + "dpkg-deb -xv \"", ), - 5040..5044, - ), - ( - CommandOption( - "-xv", - ), - 5045..5048, - ), - ( - Text( - "\"", - ), - 5049..5050, + 5035..5050, ), ( Expression( @@ -5826,15 +4903,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 5056..5057, - ), - ( - Text( - "\"", + "\" \"", ), - 5058..5059, + 5056..5059, ), ( Expression( @@ -5852,9 +4923,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 5067..5068, + 5067..5069, ), ( Text( @@ -5914,9 +4985,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 5103..5105, ), ), @@ -5925,20 +4996,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "gz", - 5105..5107, + "gz$", + 5105..5108, ), ), - 5105..5107, - ), - ( - Text( - ( - "$", - 5107..5108, - ), - ), - 5107..5108, + 5105..5108, ), ], ), @@ -5965,15 +5027,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "gunzip", + "gunzip \"", ), - 5114..5120, - ), - ( - Text( - "\"", - ), - 5121..5122, + 5113..5122, ), ( Expression( @@ -5991,9 +5047,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 5128..5129, + 5128..5130, ), ( Text( @@ -6053,9 +5109,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 5164..5166, ), ), @@ -6064,20 +5120,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "rar", - 5166..5169, - ), - ), - 5166..5169, - ), - ( - Text( - ( - "$", - 5169..5170, + "rar$", + 5166..5170, ), ), - 5169..5170, + 5166..5170, ), ], ), @@ -6104,21 +5151,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "unrar", + "unrar x \"", ), - 5176..5181, - ), - ( - Text( - "x", - ), - 5182..5183, - ), - ( - Text( - "\"", - ), - 5184..5185, + 5175..5185, ), ( Expression( @@ -6136,15 +5171,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 5191..5192, - ), - ( - Text( - "\"", + "\" \"", ), - 5193..5194, + 5191..5194, ), ( Expression( @@ -6162,9 +5191,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 5202..5203, + 5202..5204, ), ( Text( @@ -6224,9 +5253,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 5238..5240, ), ), @@ -6235,20 +5264,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "rpm", - 5240..5243, + "rpm$", + 5240..5244, ), ), - 5240..5243, - ), - ( - Text( - ( - "$", - 5243..5244, - ), - ), - 5243..5244, + 5240..5244, ), ], ), @@ -6275,15 +5295,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "rpm2cpio", + "rpm2cpio \"", ), - 5250..5258, - ), - ( - Text( - "\"", - ), - 5259..5260, + 5249..5260, ), ( Expression( @@ -6301,27 +5315,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 5266..5267, - ), - ( - Text( - "|", + "\" | cpio -idm ", ), - 5268..5269, - ), - ( - Text( - "cpio", - ), - 5270..5274, - ), - ( - CommandOption( - "-idm", - ), - 5275..5279, + 5266..5280, ), ( Text( @@ -6381,9 +5377,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 5314..5316, ), ), @@ -6392,20 +5388,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "tar", - 5316..5319, - ), - ), - 5316..5319, - ), - ( - Text( - ( - "$", - 5319..5320, + "tar$", + 5316..5320, ), ), - 5319..5320, + 5316..5320, ), ], ), @@ -6432,21 +5419,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "tar", + "tar xf \"", ), - 5326..5329, - ), - ( - Text( - "xf", - ), - 5330..5332, - ), - ( - Text( - "\"", - ), - 5333..5334, + 5325..5334, ), ( Expression( @@ -6464,21 +5439,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 5340..5341, - ), - ( - CommandOption( - "-C", - ), - 5342..5344, - ), - ( - Text( - "\"", + "\" -C \"", ), - 5345..5346, + 5340..5346, ), ( Expression( @@ -6496,9 +5459,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 5354..5355, + 5354..5356, ), ( Text( @@ -6558,9 +5521,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 5390..5392, ), ), @@ -6569,20 +5532,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "xz", - 5392..5394, + "xz$", + 5392..5395, ), ), - 5392..5394, - ), - ( - Text( - ( - "$", - 5394..5395, - ), - ), - 5394..5395, + 5392..5395, ), ], ), @@ -6609,21 +5563,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "xz", - ), - 5401..5403, - ), - ( - CommandOption( - "--decompress", + "xz --decompress \"", ), - 5404..5416, - ), - ( - Text( - "\"", - ), - 5417..5418, + 5400..5418, ), ( Expression( @@ -6641,9 +5583,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 5424..5425, + 5424..5426, ), ( Text( @@ -6703,9 +5645,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 5460..5462, ), ), @@ -6714,20 +5656,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "7z", - 5462..5464, + "7z$", + 5462..5465, ), ), - 5462..5464, - ), - ( - Text( - ( - "$", - 5464..5465, - ), - ), - 5464..5465, + 5462..5465, ), ], ), @@ -6754,21 +5687,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "7z", + "7z -y \"", ), - 5471..5473, - ), - ( - CommandOption( - "-y", - ), - 5474..5476, - ), - ( - Text( - "\"", - ), - 5477..5478, + 5470..5478, ), ( Expression( @@ -6786,21 +5707,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 5484..5485, - ), - ( - CommandOption( - "-o", + "\" -o \"", ), - 5486..5488, - ), - ( - Text( - "\"", - ), - 5489..5490, + 5484..5490, ), ( Expression( @@ -6818,9 +5727,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 5498..5499, + 5498..5500, ), ( Text( @@ -6880,18 +5789,18 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 5534..5536, ), ), 5534..5536, ), ( - Escape( + Text( ( - "(", + "\\(", 5536..5538, ), ), @@ -6907,27 +5816,45 @@ expression: parse_unwrap(&tokenize(&stdlib)) 5538..5541, ), ( - Escape( + Text( ( - "|war", - 5541..5546, + "\\|", + 5541..5543, ), ), - 5541..5546, + 5541..5543, ), ( - Escape( + Text( ( - "|jar", - 5546..5551, + "war", + 5543..5546, ), ), - 5546..5551, + 5543..5546, ), ( - Escape( + Text( ( - ")", + "\\|", + 5546..5548, + ), + ), + 5546..5548, + ), + ( + Text( + ( + "jar", + 5548..5551, + ), + ), + 5548..5551, + ), + ( + Text( + ( + "\\)", 5551..5553, ), ), @@ -6967,15 +5894,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "unzip", + "unzip \"", ), - 5560..5565, - ), - ( - Text( - "\"", - ), - 5566..5567, + 5559..5567, ), ( Expression( @@ -6993,21 +5914,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 5573..5574, - ), - ( - CommandOption( - "-d", + "\" -d \"", ), - 5575..5577, - ), - ( - Text( - "\"", - ), - 5578..5579, + 5573..5579, ), ( Expression( @@ -7025,9 +5934,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 5587..5588, + 5587..5589, ), ( Text( @@ -7086,47 +5995,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "Error", - 5633..5638, - ), - ), - 5633..5638, - ), - ( - Text( - ( - ":", - 5638..5639, + "Error: Unsupported file type", + 5633..5661, ), ), - 5638..5639, - ), - ( - Text( - ( - "Unsupported", - 5640..5651, - ), - ), - 5640..5651, - ), - ( - Text( - ( - "file", - 5652..5656, - ), - ), - 5652..5656, - ), - ( - Text( - ( - "type", - 5657..5661, - ), - ), - 5657..5661, + 5633..5661, ), ], ), @@ -7200,47 +6073,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "Error", - 5737..5742, - ), - ), - 5737..5742, - ), - ( - Text( - ( - ":", - 5742..5743, - ), - ), - 5742..5743, - ), - ( - Text( - ( - "File", - 5744..5748, - ), - ), - 5744..5748, - ), - ( - Text( - ( - "not", - 5749..5752, - ), - ), - 5749..5752, - ), - ( - Text( - ( - "found", - 5753..5758, + "Error: File not found", + 5737..5758, ), ), - 5753..5758, + 5737..5758, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap index 66c2be6..172c724 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_http.snap @@ -217,27 +217,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "curl", + "curl -L -o \"", ), - 479..483, - ), - ( - CommandOption( - "-L", - ), - 484..486, - ), - ( - CommandOption( - "-o", - ), - 487..489, - ), - ( - Text( - "\"", - ), - 490..491, + 478..491, ), ( Expression( @@ -255,15 +237,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 497..498, - ), - ( - Text( - "\"", + "\" \"", ), - 499..500, + 497..500, ), ( Expression( @@ -281,9 +257,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 505..506, + 505..507, ), ( Text( @@ -369,15 +345,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "wget", - ), - 575..579, - ), - ( - Text( - "\"", + "wget \"", ), - 580..581, + 574..581, ), ( Expression( @@ -395,21 +365,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" -P \"", ), - 586..587, - ), - ( - CommandOption( - "-P", - ), - 588..590, - ), - ( - Text( - "\"", - ), - 591..592, + 586..592, ), ( Expression( @@ -427,9 +385,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 598..599, + 598..600, ), ( Text( @@ -515,15 +473,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "aria2c", - ), - 670..676, - ), - ( - Text( - "\"", + "aria2c \"", ), - 677..678, + 669..678, ), ( Expression( @@ -541,21 +493,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 683..684, - ), - ( - CommandOption( - "-d", - ), - 685..687, - ), - ( - Text( - "\"", + "\" -d \"", ), - 688..689, + 683..689, ), ( Expression( @@ -573,9 +513,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 695..696, + 695..697, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap index 50afb09..1b1a9d3 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_math.snap @@ -284,21 +284,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"(", ), - 299..303, - ), - ( - Text( - "\"", - ), - 304..305, - ), - ( - Text( - "(", - ), - 305..306, + 298..306, ), ( Expression( @@ -316,63 +304,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "+", - ), - 314..315, - ), - ( - Text( - "0", + "+0.5)/1\" | bc ", ), - 315..316, - ), - ( - Text( - ".", - ), - 316..317, - ), - ( - Text( - "5", - ), - 317..318, - ), - ( - Text( - ")", - ), - 318..319, - ), - ( - Text( - "/", - ), - 319..320, - ), - ( - Text( - "1", - ), - 320..321, - ), - ( - Text( - "\"", - ), - 321..322, - ), - ( - Text( - "|", - ), - 323..324, - ), - ( - Text( - "bc", - ), - 325..327, + 314..328, ), ( Text( @@ -438,21 +372,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"(", ), - 363..367, - ), - ( - Text( - "\"", - ), - 368..369, - ), - ( - Text( - "(", - ), - 369..370, + 362..370, ), ( Expression( @@ -468,59 +390,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 370..378, ), - ( - CommandOption( - "-0", - ), - 378..380, - ), - ( - Text( - ".", - ), - 380..381, - ), - ( - Text( - "5", - ), - 381..382, - ), - ( - Text( - ")", - ), - 382..383, - ), ( Text( - "/", + "-0.5)/1\" | bc ", ), - 383..384, - ), - ( - Text( - "1", - ), - 384..385, - ), - ( - Text( - "\"", - ), - 385..386, - ), - ( - Text( - "|", - ), - 387..388, - ), - ( - Text( - "bc", - ), - 389..391, + 378..392, ), ( Text( @@ -640,15 +514,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 546..550, - ), - ( - Text( - "\"", - ), - 551..552, + 545..552, ), ( Expression( @@ -666,195 +534,57 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" | awk '", ), - 560..561, + 560..569, ), ( Text( - "|", - ), - 562..563, - ), - ( - Text( - "awk", - ), - 564..567, - ), - ( - Text( - "'", - ), - 568..569, - ), - ( - Escape( - "{", + "\\{", ), 569..571, ), ( Text( - "printf", - ), - 571..577, - ), - ( - Text( - "\"", - ), - 578..579, - ), - ( - Text( - "%", - ), - 579..580, - ), - ( - Text( - "d", - ), - 580..581, - ), - ( - Text( - "\"", + "printf \"%d\", (", ), - 581..582, + 571..585, ), ( Text( - ",", - ), - 582..583, - ), - ( - Text( - "(", - ), - 584..585, - ), - ( - Escape( - "$", + "\\$", ), 585..587, ), ( Text( - "1", - ), - 587..588, - ), - ( - Text( - "<", - ), - 589..590, - ), - ( - Text( - "0", - ), - 591..592, - ), - ( - Text( - "?", - ), - 593..594, - ), - ( - Text( - "int", + "1 < 0 ? int(", ), - 595..598, + 587..599, ), ( Text( - "(", - ), - 598..599, - ), - ( - Escape( - "$", + "\\$", ), 599..601, ), ( Text( - "1", - ), - 601..602, - ), - ( - Text( - ")", - ), - 602..603, - ), - ( - CommandOption( - "-1", - ), - 604..607, - ), - ( - Text( - ":", - ), - 608..609, - ), - ( - Text( - "int", + "1) - 1 : int(", ), - 610..613, + 601..614, ), ( Text( - "(", - ), - 613..614, - ), - ( - Escape( - "$", + "\\$", ), 614..616, ), ( Text( - "1", - ), - 616..617, - ), - ( - Text( - ")", - ), - 617..618, - ), - ( - Text( - ")", - ), - 618..619, - ), - ( - Text( - "}", - ), - 619..620, - ), - ( - Text( - "'", + "1))}' ", ), - 620..621, + 616..622, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap index 217b6fd..6e8290a 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text-2.snap @@ -94,63 +94,27 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", + "echo \"", ), - 281..285, + 280..287, ), ( Text( - "\"", - ), - 286..287, - ), - ( - Escape( - "$", + "\\$", ), 287..289, ), - ( - Escape( - "{", - ), - 289..291, - ), - ( - Text( - "BASH_VERSINFO", - ), - 291..304, - ), - ( - Text( - "[", - ), - 304..305, - ), ( Text( - "0", + "\\{", ), - 305..306, - ), - ( - Text( - "]", - ), - 306..307, - ), - ( - Text( - "}", - ), - 307..308, + 289..291, ), ( Text( - "\"", + "BASH_VERSINFO[0]}\" ", ), - 308..309, + 291..310, ), ( Text( @@ -211,63 +175,27 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", + "echo \"", ), - 343..347, + 342..349, ), ( Text( - "\"", - ), - 348..349, - ), - ( - Escape( - "$", + "\\$", ), 349..351, ), - ( - Escape( - "{", - ), - 351..353, - ), - ( - Text( - "BASH_VERSINFO", - ), - 353..366, - ), - ( - Text( - "[", - ), - 366..367, - ), - ( - Text( - "1", - ), - 367..368, - ), - ( - Text( - "]", - ), - 368..369, - ), ( Text( - "}", + "\\{", ), - 369..370, + 351..353, ), ( Text( - "\"", + "BASH_VERSINFO[1]}\" ", ), - 370..371, + 353..372, ), ( Text( @@ -328,63 +256,27 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", + "echo \"", ), - 405..409, + 404..411, ), ( Text( - "\"", - ), - 410..411, - ), - ( - Escape( - "$", + "\\$", ), 411..413, ), - ( - Escape( - "{", - ), - 413..415, - ), - ( - Text( - "BASH_VERSINFO", - ), - 415..428, - ), - ( - Text( - "[", - ), - 428..429, - ), - ( - Text( - "2", - ), - 429..430, - ), - ( - Text( - "]", - ), - 430..431, - ), ( Text( - "}", + "\\{", ), - 431..432, + 413..415, ), ( Text( - "\"", + "BASH_VERSINFO[2]}\" ", ), - 432..433, + 415..434, ), ( Text( @@ -643,6 +535,12 @@ expression: parse_unwrap(&tokens) ), 721..722, ), + ( + Text( + "", + ), + 722..723, + ), ( Expression( ( @@ -668,25 +566,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "=", + "=\"", ), - 738..739, + 738..740, ), ( Text( - "\"", - ), - 739..740, - ), - ( - Escape( - "$", + "\\$", ), 740..742, ), ( - Escape( - "{", + Text( + "\\{", ), 742..744, ), @@ -715,25 +607,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "//", + "//\"", ), - 759..761, + 759..762, ), ( Text( - "\"", - ), - 761..762, - ), - ( - Escape( - "$", + "\\$", ), 762..764, ), ( - Escape( - "{", + Text( + "\\{", ), 764..766, ), @@ -762,37 +648,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 781..782, - ), - ( - Text( - "\"", - ), - 782..783, - ), - ( - Text( - "/", + "}\"/\"", ), - 783..784, + 781..785, ), ( Text( - "\"", - ), - 784..785, - ), - ( - Escape( - "$", + "\\$", ), 785..787, ), ( - Escape( - "{", + Text( + "\\{", ), 787..789, ), @@ -821,27 +689,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 805..806, - ), - ( - Text( - "\"", - ), - 806..807, - ), - ( - Text( - "}", - ), - 807..808, - ), - ( - Text( - "\"", + "}\"}\" ", ), - 808..809, + 805..810, ), ( Text( @@ -893,6 +743,12 @@ expression: parse_unwrap(&tokens) ), 839..840, ), + ( + Text( + "", + ), + 840..841, + ), ( Expression( ( @@ -918,25 +774,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "=", + "=\"", ), - 856..857, + 856..858, ), ( Text( - "\"", - ), - 857..858, - ), - ( - Escape( - "$", + "\\$", ), 858..860, ), ( - Escape( - "{", + Text( + "\\{", ), 860..862, ), @@ -965,25 +815,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "//", + "//\"", ), - 877..879, + 877..880, ), ( Text( - "\"", - ), - 879..880, - ), - ( - Escape( - "$", + "\\$", ), 880..882, ), ( - Escape( - "{", + Text( + "\\{", ), 882..884, ), @@ -1012,31 +856,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 899..900, - ), - ( - Text( - "\"", + "}\"/", ), - 900..901, + 899..902, ), ( Text( - "/", - ), - 901..902, - ), - ( - Escape( - "$", + "\\$", ), 902..904, ), ( - Escape( - "{", + Text( + "\\{", ), 904..906, ), @@ -1065,21 +897,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 922..923, - ), - ( - Text( - "}", - ), - 923..924, - ), - ( - Text( - "\"", + "}}\" ", ), - 924..925, + 922..926, ), ( Text( @@ -1310,6 +1130,12 @@ expression: parse_unwrap(&tokens) ), 1206..1207, ), + ( + Text( + "", + ), + 1207..1208, + ), ( Expression( ( @@ -1335,25 +1161,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "=", + "=\"", ), - 1223..1224, + 1223..1225, ), ( Text( - "\"", - ), - 1224..1225, - ), - ( - Escape( - "$", + "\\$", ), 1225..1227, ), ( - Escape( - "{", + Text( + "\\{", ), 1227..1229, ), @@ -1382,25 +1202,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", + "/\"", ), - 1244..1245, + 1244..1246, ), ( Text( - "\"", - ), - 1245..1246, - ), - ( - Escape( - "$", + "\\$", ), 1246..1248, ), ( - Escape( - "{", + Text( + "\\{", ), 1248..1250, ), @@ -1429,37 +1243,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", + "}\"/\"", ), - 1265..1266, + 1265..1269, ), ( Text( - "\"", - ), - 1266..1267, - ), - ( - Text( - "/", - ), - 1267..1268, - ), - ( - Text( - "\"", - ), - 1268..1269, - ), - ( - Escape( - "$", + "\\$", ), 1269..1271, ), ( - Escape( - "{", + Text( + "\\{", ), 1271..1273, ), @@ -1488,27 +1284,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 1289..1290, - ), - ( - Text( - "\"", - ), - 1290..1291, - ), - ( - Text( - "}", - ), - 1291..1292, - ), - ( - Text( - "\"", + "}\"}\" ", ), - 1292..1293, + 1289..1294, ), ( Text( @@ -1560,6 +1338,12 @@ expression: parse_unwrap(&tokens) ), 1323..1324, ), + ( + Text( + "", + ), + 1324..1325, + ), ( Expression( ( @@ -1585,25 +1369,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "=", + "=\"", ), - 1340..1341, + 1340..1342, ), ( Text( - "\"", - ), - 1341..1342, - ), - ( - Escape( - "$", + "\\$", ), 1342..1344, ), ( - Escape( - "{", + Text( + "\\{", ), 1344..1346, ), @@ -1632,25 +1410,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", + "/\"", ), - 1361..1362, + 1361..1363, ), ( Text( - "\"", - ), - 1362..1363, - ), - ( - Escape( - "$", + "\\$", ), 1363..1365, ), ( - Escape( - "{", + Text( + "\\{", ), 1365..1367, ), @@ -1679,31 +1451,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 1382..1383, - ), - ( - Text( - "\"", + "}\"/", ), - 1383..1384, + 1382..1385, ), ( Text( - "/", - ), - 1384..1385, - ), - ( - Escape( - "$", + "\\$", ), 1385..1387, ), ( - Escape( - "{", + Text( + "\\{", ), 1387..1389, ), @@ -1732,21 +1492,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", + "}}\" ", ), - 1405..1406, - ), - ( - Text( - "}", - ), - 1406..1407, - ), - ( - Text( - "\"", - ), - 1407..1408, + 1405..1409, ), ( Text( @@ -1942,195 +1690,87 @@ expression: parse_unwrap(&tokens) ), ( Text( - "re", + "re='", ), - 1679..1681, + 1678..1683, ), ( Text( - "=", + "\\b", ), - 1681..1682, + 1683..1685, ), ( Text( - "'", + "Copyright", ), - 1682..1683, - ), - ( - Escape( - "bCopyright", - ), - 1683..1694, - ), - ( - Escape( - "b", - ), - 1694..1696, + 1685..1694, ), ( Text( - ".", + "\\b", ), - 1696..1697, + 1694..1696, ), ( Text( - "+", + ".+", ), - 1697..1698, - ), - ( - Escape( - "bFree", - ), - 1698..1704, + 1696..1698, ), ( Text( - "Software", + "\\b", ), - 1705..1713, + 1698..1700, ), ( Text( - "Foundation", - ), - 1714..1724, - ), - ( - Escape( - "b'", + "Free Software Foundation", ), - 1724..1727, + 1700..1724, ), ( Text( - ";", + "\\b", ), - 1727..1728, + 1724..1726, ), ( Text( - "[", + "'; [[ ", ), - 1729..1730, + 1726..1732, ), ( Text( - "[", - ), - 1730..1731, - ), - ( - Escape( - "$", + "\\$", ), 1732..1734, ), ( Text( - "(", - ), - 1734..1735, - ), - ( - Text( - "sed", - ), - 1735..1738, - ), - ( - CommandOption( - "--version", - ), - 1739..1748, - ), - ( - Text( - "2", - ), - 1749..1750, - ), - ( - Text( - ">", - ), - 1750..1751, - ), - ( - Text( - "/", + "(sed --version 2>/dev/null) =~ ", ), - 1751..1752, + 1734..1765, ), ( Text( - "dev", + "\\$", ), - 1752..1755, + 1765..1767, ), ( Text( - "/", + "re ]] ", ), - 1755..1756, + 1767..1773, ), ( Text( - "null", + "$", ), - 1756..1760, - ), - ( - Text( - ")", - ), - 1760..1761, - ), - ( - Text( - "=", - ), - 1762..1763, - ), - ( - Text( - "~", - ), - 1763..1764, - ), - ( - Escape( - "$", - ), - 1765..1767, - ), - ( - Text( - "re", - ), - 1767..1769, - ), - ( - Text( - "]", - ), - 1770..1771, - ), - ( - Text( - "]", - ), - 1771..1772, - ), - ( - Text( - "$", - ), - 1773..1774, + 1773..1774, ), ], [], @@ -2221,129 +1861,57 @@ expression: parse_unwrap(&tokens) ), ( Text( - "re", + "re='", ), - 1845..1847, + 1844..1849, ), ( Text( - "=", + "\\b", ), - 1847..1848, + 1849..1851, ), ( Text( - "'", - ), - 1848..1849, - ), - ( - Escape( - "bBusyBox", - ), - 1849..1858, - ), - ( - Escape( - "b'", + "BusyBox", ), - 1858..1861, + 1851..1858, ), ( Text( - ";", + "\\b", ), - 1861..1862, + 1858..1860, ), ( Text( - "[", + "'; [[ ", ), - 1863..1864, + 1860..1866, ), ( Text( - "[", - ), - 1864..1865, - ), - ( - Escape( - "$", + "\\$", ), 1866..1868, ), ( Text( - "(", - ), - 1868..1869, - ), - ( - Text( - "sed", - ), - 1869..1872, - ), - ( - Text( - "2", - ), - 1873..1874, - ), - ( - Text( - ">", - ), - 1874..1875, - ), - ( - Text( - "&1", - ), - 1875..1877, - ), - ( - Text( - ")", - ), - 1877..1878, - ), - ( - Text( - "=", + "(sed 2>&1) =~ ", ), - 1879..1880, + 1868..1882, ), ( Text( - "~", - ), - 1880..1881, - ), - ( - Escape( - "$", + "\\$", ), 1882..1884, ), ( Text( - "re", - ), - 1884..1886, - ), - ( - Text( - "]", - ), - 1887..1888, - ), - ( - Text( - "]", + "re ]] ", ), - 1888..1889, + 1884..1890, ), ( Text( @@ -2675,9 +2243,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "\\", + "\\\\", 2306..2308, ), ), @@ -2747,9 +2315,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "\\", + "\\\\", 2363..2365, ), ), @@ -2881,9 +2449,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "\\", + "\\\\", 2561..2563, ), ), @@ -2906,18 +2474,18 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "\\", + "\\\\", 2568..2570, ), ), 2568..2570, ), ( - Escape( + Text( ( - "b", + "\\b", 2570..2572, ), ), @@ -3044,15 +2612,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 2803..2807, - ), - ( - Text( - "\"", + "echo \"", ), - 2808..2809, + 2802..2809, ), ( Expression( @@ -3070,51 +2632,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 2817..2818, - ), - ( - Text( - "|", - ), - 2819..2820, - ), - ( - Text( - "sed", - ), - 2821..2824, - ), - ( - CommandOption( - "-r", - ), - 2825..2827, - ), - ( - CommandOption( - "-e", - ), - 2828..2830, - ), - ( - Text( - "\"", - ), - 2831..2832, - ), - ( - Text( - "s", - ), - 2832..2833, - ), - ( - Text( - "/", + "\" | sed -r -e \"s/", ), - 2833..2834, + 2817..2834, ), ( Expression( @@ -3152,21 +2672,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 2857..2858, - ), - ( - Text( - "g", - ), - 2858..2859, - ), - ( - Text( - "\"", + "/g\" ", ), - 2859..2860, + 2857..2861, ), ( Text( @@ -3221,15 +2729,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 2909..2913, - ), - ( - Text( - "\"", + "echo \"", ), - 2914..2915, + 2908..2915, ), ( Expression( @@ -3247,51 +2749,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 2923..2924, - ), - ( - Text( - "|", - ), - 2925..2926, - ), - ( - Text( - "sed", - ), - 2927..2930, - ), - ( - CommandOption( - "-E", - ), - 2931..2933, - ), - ( - CommandOption( - "-e", - ), - 2934..2936, - ), - ( - Text( - "\"", - ), - 2937..2938, - ), - ( - Text( - "s", - ), - 2938..2939, - ), - ( - Text( - "/", + "\" | sed -E -e \"s/", ), - 2939..2940, + 2923..2940, ), ( Expression( @@ -3329,21 +2789,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 2963..2964, - ), - ( - Text( - "g", - ), - 2964..2965, - ), - ( - Text( - "\"", + "/g\" ", ), - 2965..2966, + 2963..2967, ), ( Text( @@ -3495,9 +2943,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "|", + "\\|", 3231..3233, ), ), @@ -3562,15 +3010,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 3276..3280, - ), - ( - Text( - "\"", + "echo \"", ), - 3281..3282, + 3275..3282, ), ( Expression( @@ -3588,45 +3030,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 3290..3291, - ), - ( - Text( - "|", - ), - 3292..3293, - ), - ( - Text( - "sed", - ), - 3294..3297, - ), - ( - CommandOption( - "-e", - ), - 3298..3300, - ), - ( - Text( - "\"", - ), - 3301..3302, - ), - ( - Text( - "s", + "\" | sed -e \"s/", ), - 3302..3303, - ), - ( - Text( - "/", - ), - 3303..3304, + 3290..3304, ), ( Expression( @@ -3664,21 +3070,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 3327..3328, - ), - ( - Text( - "g", - ), - 3328..3329, - ), - ( - Text( - "\"", + "/g\" ", ), - 3329..3330, + 3327..3331, ), ( Text( @@ -3832,21 +3226,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "IFS", - ), - 3530..3533, - ), - ( - Text( - "=", - ), - 3533..3534, - ), - ( - Text( - "\"", + "IFS=\"", ), - 3534..3535, + 3529..3535, ), ( Expression( @@ -3864,33 +3246,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 3546..3547, - ), - ( - Text( - "read", - ), - 3548..3552, - ), - ( - CommandOption( - "-rd", - ), - 3553..3556, - ), - ( - Text( - "''", - ), - 3557..3559, - ), - ( - CommandOption( - "-a", + "\" read -rd '' -a ", ), - 3560..3562, + 3546..3563, ), ( Expression( @@ -3917,49 +3275,13 @@ expression: parse_unwrap(&tokens) ), ( Text( - "<", - ), - 3579..3580, - ), - ( - Text( - "<", - ), - 3581..3582, - ), - ( - Text( - "(", - ), - 3582..3583, - ), - ( - Text( - "printf", + " < <(printf %s \"", ), - 3583..3589, + 3578..3594, ), ( Text( - "%", - ), - 3590..3591, - ), - ( - Text( - "s", - ), - 3591..3592, - ), - ( - Text( - "\"", - ), - 3593..3594, - ), - ( - Escape( - "$", + "\\$", ), 3594..3596, ), @@ -3988,15 +3310,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 3609..3610, - ), - ( - Text( - ")", + "\") ", ), - 3610..3611, + 3609..3612, ), ( Text( @@ -4121,9 +3437,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "n", + "\\n", 3778..3780, ), ), @@ -4229,7 +3545,17 @@ expression: parse_unwrap(&tokens) ), ( Text( - [], + [ + ( + Text( + ( + " ", + 3926..3927, + ), + ), + 3926..3927, + ), + ], ), 3925..3928, ), @@ -4344,21 +3670,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "IFS", - ), - 4051..4054, - ), - ( - Text( - "=", - ), - 4054..4055, - ), - ( - Text( - "\"", + "IFS=\"", ), - 4055..4056, + 4050..4056, ), ( Expression( @@ -4376,37 +3690,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 4067..4068, - ), - ( - Text( - ";", - ), - 4069..4070, - ), - ( - Text( - "echo", + "\" ; echo \"", ), - 4071..4075, + 4067..4077, ), ( Text( - "\"", - ), - 4076..4077, - ), - ( - Escape( - "$", + "\\$", ), 4077..4079, ), ( - Escape( - "{", + Text( + "\\{", ), 4079..4081, ), @@ -4435,33 +3731,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "[", - ), - 4094..4095, - ), - ( - Text( - "*", - ), - 4095..4096, - ), - ( - Text( - "]", - ), - 4096..4097, - ), - ( - Text( - "}", - ), - 4097..4098, - ), - ( - Text( - "\"", + "[*]}\" ", ), - 4098..4099, + 4094..4100, ), ( Text( @@ -4563,15 +3835,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 4215..4219, - ), - ( - Text( - "\"", + "echo \"", ), - 4220..4221, + 4214..4221, ), ( Expression( @@ -4589,105 +3855,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 4227..4228, - ), - ( - Text( - "|", - ), - 4229..4230, - ), - ( - Text( - "sed", - ), - 4231..4234, - ), - ( - CommandOption( - "-e", - ), - 4235..4237, - ), - ( - Text( - "'s", - ), - 4238..4240, - ), - ( - Text( - "/", - ), - 4240..4241, - ), - ( - Text( - "^", - ), - 4241..4242, - ), - ( - Text( - "[", - ), - 4242..4243, - ), - ( - Text( - "[", - ), - 4243..4244, - ), - ( - Text( - ":", - ), - 4244..4245, - ), - ( - Text( - "space", - ), - 4245..4250, - ), - ( - Text( - ":", - ), - 4250..4251, - ), - ( - Text( - "]", - ), - 4251..4252, - ), - ( - Text( - "]", - ), - 4252..4253, - ), - ( - Text( - "*", - ), - 4253..4254, - ), - ( - Text( - "//", - ), - 4254..4256, - ), - ( - Text( - "'", + "\" | sed -e 's/^[[:space:]]*//' ", ), - 4256..4257, + 4227..4258, ), ( Text( @@ -4789,15 +3959,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 4374..4378, - ), - ( - Text( - "\"", + "echo \"", ), - 4379..4380, + 4373..4380, ), ( Expression( @@ -4815,105 +3979,21 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 4386..4387, - ), - ( - Text( - "|", - ), - 4388..4389, - ), - ( - Text( - "sed", - ), - 4390..4393, - ), - ( - CommandOption( - "-e", - ), - 4394..4396, - ), - ( - Text( - "'s", - ), - 4397..4399, - ), - ( - Text( - "/", - ), - 4399..4400, - ), - ( - Text( - "[", - ), - 4400..4401, - ), - ( - Text( - "[", - ), - 4401..4402, - ), - ( - Text( - ":", - ), - 4402..4403, - ), - ( - Text( - "space", - ), - 4403..4408, - ), - ( - Text( - ":", - ), - 4408..4409, - ), - ( - Text( - "]", - ), - 4409..4410, - ), - ( - Text( - "]", + "\" | sed -e 's/[[:space:]]*", ), - 4410..4411, + 4386..4412, ), ( Text( - "*", - ), - 4411..4412, - ), - ( - Escape( - "$", + "\\$", ), 4412..4414, ), ( Text( - "//", - ), - 4414..4416, - ), - ( - Text( - "'", + "//' ", ), - 4416..4417, + 4414..4418, ), ( Text( @@ -5122,15 +4202,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 4644..4648, - ), - ( - Text( - "\"", + "echo \"", ), - 4649..4650, + 4643..4650, ), ( Expression( @@ -5148,105 +4222,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 4656..4657, - ), - ( - Text( - "|", - ), - 4658..4659, - ), - ( - Text( - "tr", - ), - 4660..4662, - ), - ( - Text( - "'", - ), - 4663..4664, - ), - ( - Text( - "[", - ), - 4664..4665, - ), - ( - Text( - ":", - ), - 4665..4666, - ), - ( - Text( - "upper", - ), - 4666..4671, - ), - ( - Text( - ":", - ), - 4671..4672, - ), - ( - Text( - "]", - ), - 4672..4673, - ), - ( - Text( - "'", - ), - 4673..4674, - ), - ( - Text( - "'", - ), - 4675..4676, - ), - ( - Text( - "[", - ), - 4676..4677, - ), - ( - Text( - ":", - ), - 4677..4678, - ), - ( - Text( - "lower", - ), - 4678..4683, - ), - ( - Text( - ":", - ), - 4683..4684, - ), - ( - Text( - "]", - ), - 4684..4685, - ), - ( - Text( - "'", + "\" | tr '[:upper:]' '[:lower:]' ", ), - 4685..4686, + 4656..4687, ), ( Text( @@ -5348,15 +4326,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 4796..4800, - ), - ( - Text( - "\"", + "echo \"", ), - 4801..4802, + 4795..4802, ), ( Expression( @@ -5374,111 +4346,15 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 4808..4809, - ), - ( - Text( - "|", - ), - 4810..4811, - ), - ( - Text( - "tr", + "\" | tr '[:lower:]' '[:upper:]' ", ), - 4812..4814, + 4808..4839, ), ( Text( - "'", + "$", ), - 4815..4816, - ), - ( - Text( - "[", - ), - 4816..4817, - ), - ( - Text( - ":", - ), - 4817..4818, - ), - ( - Text( - "lower", - ), - 4818..4823, - ), - ( - Text( - ":", - ), - 4823..4824, - ), - ( - Text( - "]", - ), - 4824..4825, - ), - ( - Text( - "'", - ), - 4825..4826, - ), - ( - Text( - "'", - ), - 4827..4828, - ), - ( - Text( - "[", - ), - 4828..4829, - ), - ( - Text( - ":", - ), - 4829..4830, - ), - ( - Text( - "upper", - ), - 4830..4835, - ), - ( - Text( - ":", - ), - 4835..4836, - ), - ( - Text( - "]", - ), - 4836..4837, - ), - ( - Text( - "'", - ), - 4837..4838, - ), - ( - Text( - "$", - ), - 4839..4840, + 4839..4840, ), ], [], @@ -5569,21 +4445,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "[", + "[ -n \"", ), - 4966..4967, - ), - ( - CommandOption( - "-n", - ), - 4968..4970, - ), - ( - Text( - "\"", - ), - 4971..4972, + 4965..4972, ), ( Expression( @@ -5601,33 +4465,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 4978..4979, - ), - ( - Text( - "]", - ), - 4980..4981, - ), - ( - Text( - "&&", - ), - 4982..4984, - ), - ( - Text( - "[", + "\" ] && [ \"", ), - 4985..4986, - ), - ( - Text( - "\"", - ), - 4987..4988, + 4978..4988, ), ( Expression( @@ -5645,21 +4485,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", + "\" -eq \"", ), - 4994..4995, - ), - ( - CommandOption( - "-eq", - ), - 4996..4999, - ), - ( - Text( - "\"", - ), - 5000..5001, + 4994..5001, ), ( Expression( @@ -5677,51 +4505,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", + "\" ] 2>/dev/null ", ), - 5007..5008, - ), - ( - Text( - "]", - ), - 5009..5010, - ), - ( - Text( - "2", - ), - 5011..5012, - ), - ( - Text( - ">", - ), - 5012..5013, - ), - ( - Text( - "/", - ), - 5013..5014, - ), - ( - Text( - "dev", - ), - 5014..5017, - ), - ( - Text( - "/", - ), - 5017..5018, - ), - ( - Text( - "null", - ), - 5018..5022, + 5007..5023, ), ( Text( @@ -5864,92 +4650,11 @@ expression: parse_unwrap(&tokens) ( Text( ( - "^", - 5183..5184, - ), - ), - 5183..5184, - ), - ( - Text( - ( - "-", - 5184..5185, - ), - ), - 5184..5185, - ), - ( - Text( - ( - "?", - 5185..5186, + "^-?[0-9]+$", + 5183..5193, ), ), - 5185..5186, - ), - ( - Text( - ( - "[", - 5186..5187, - ), - ), - 5186..5187, - ), - ( - Text( - ( - "0", - 5187..5188, - ), - ), - 5187..5188, - ), - ( - Text( - ( - "-", - 5188..5189, - ), - ), - 5188..5189, - ), - ( - Text( - ( - "9", - 5189..5190, - ), - ), - 5189..5190, - ), - ( - Text( - ( - "]", - 5190..5191, - ), - ), - 5190..5191, - ), - ( - Text( - ( - "+", - 5191..5192, - ), - ), - 5191..5192, - ), - ( - Text( - ( - "$", - 5192..5193, - ), - ), - 5192..5193, + 5183..5193, ), ], ), @@ -5979,88 +4684,16 @@ expression: parse_unwrap(&tokens) ( Text( ( - "^", - 5213..5214, - ), - ), - 5213..5214, - ), - ( - Text( - ( - "-", - 5214..5215, - ), - ), - 5214..5215, - ), - ( - Text( - ( - "?", - 5215..5216, - ), - ), - 5215..5216, - ), - ( - Text( - ( - "[", - 5216..5217, - ), - ), - 5216..5217, - ), - ( - Text( - ( - "0", - 5217..5218, - ), - ), - 5217..5218, - ), - ( - Text( - ( - "-", - 5218..5219, + "^-?[0-9]*", + 5213..5222, ), ), - 5218..5219, + 5213..5222, ), ( Text( ( - "9", - 5219..5220, - ), - ), - 5219..5220, - ), - ( - Text( - ( - "]", - 5220..5221, - ), - ), - 5220..5221, - ), - ( - Text( - ( - "*", - 5221..5222, - ), - ), - 5221..5222, - ), - ( - Escape( - ( - ".", + "\\.", 5222..5224, ), ), @@ -6069,65 +4702,11 @@ expression: parse_unwrap(&tokens) ( Text( ( - "[", - 5224..5225, - ), - ), - 5224..5225, - ), - ( - Text( - ( - "0", - 5225..5226, - ), - ), - 5225..5226, - ), - ( - Text( - ( - "-", - 5226..5227, - ), - ), - 5226..5227, - ), - ( - Text( - ( - "9", - 5227..5228, - ), - ), - 5227..5228, - ), - ( - Text( - ( - "]", - 5228..5229, - ), - ), - 5228..5229, - ), - ( - Text( - ( - "+", - 5229..5230, - ), - ), - 5229..5230, - ), - ( - Text( - ( - "$", - 5230..5231, + "[0-9]+$", + 5224..5231, ), ), - 5230..5231, + 5224..5231, ), ], ), @@ -6153,15 +4732,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "[", - ), - 5240..5241, - ), - ( - Text( - "[", + "[[ ", ), - 5241..5242, + 5239..5243, ), ( Expression( @@ -6179,15 +4752,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "=", + " =~ ", ), - 5250..5251, - ), - ( - Text( - "~", - ), - 5251..5252, + 5249..5253, ), ( Expression( @@ -6205,33 +4772,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "]", - ), - 5262..5263, - ), - ( - Text( - "]", - ), - 5263..5264, - ), - ( - Text( - "||", - ), - 5265..5267, - ), - ( - Text( - "[", - ), - 5268..5269, - ), - ( - Text( - "[", + " ]] || [[ ", ), - 5269..5270, + 5261..5271, ), ( Expression( @@ -6249,15 +4792,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "=", + " =~ ", ), - 5278..5279, - ), - ( - Text( - "~", - ), - 5279..5280, + 5277..5281, ), ( Expression( @@ -6275,15 +4812,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "]", + " ]] ", ), - 5292..5293, - ), - ( - Text( - "]", - ), - 5293..5294, + 5291..5295, ), ( Text( @@ -6444,67 +4975,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "for", + "for ((i=0; i<", ), - 5459..5462, + 5458..5472, ), ( Text( - "(", - ), - 5463..5464, - ), - ( - Text( - "(", - ), - 5464..5465, - ), - ( - Text( - "i", - ), - 5465..5466, - ), - ( - Text( - "=", - ), - 5466..5467, - ), - ( - Text( - "0", - ), - 5467..5468, - ), - ( - Text( - ";", - ), - 5468..5469, - ), - ( - Text( - "i", - ), - 5470..5471, - ), - ( - Text( - "<", - ), - 5471..5472, - ), - ( - Escape( - "$", + "\\$", ), 5472..5474, ), ( - Escape( - "{", + Text( + "\\{", ), 5474..5476, ), @@ -6539,57 +5022,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 5490..5491, - ), - ( - Text( - ";", - ), - 5491..5492, - ), - ( - Text( - "i", - ), - 5493..5494, - ), - ( - Text( - "+", - ), - 5494..5495, - ), - ( - Text( - "+", - ), - 5495..5496, - ), - ( - Text( - ")", - ), - 5496..5497, - ), - ( - Text( - ")", - ), - 5497..5498, - ), - ( - Text( - ";", - ), - 5498..5499, - ), - ( - Text( - "do", + "}; i++)); do\n ", ), - 5500..5502, + 5490..5511, ), ( Expression( @@ -6616,31 +5051,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "+=", + "+=( \"", ), - 5525..5527, + 5525..5530, ), ( Text( - "(", - ), - 5527..5528, - ), - ( - Text( - "\"", - ), - 5529..5530, - ), - ( - Escape( - "$", + "\\$", ), 5530..5532, ), ( - Escape( - "{", + Text( + "\\{", ), 5532..5534, ), @@ -6657,75 +5080,33 @@ expression: parse_unwrap(&tokens) ( "text", 5542..5546, - ), - ), - 5542..5546, - ), - ), - 5542..5546, - ), - ), - 5534..5547, - ), - ( - Text( - ":", - ), - 5547..5548, - ), - ( - Escape( - "$", - ), - 5548..5550, - ), - ( - Text( - "i", - ), - 5550..5551, - ), - ( - Text( - ":", - ), - 5551..5552, - ), - ( - Text( - "1", - ), - 5552..5553, - ), - ( - Text( - "}", - ), - 5553..5554, - ), - ( - Text( - "\"", + ), + ), + 5542..5546, + ), + ), + 5542..5546, + ), ), - 5554..5555, + 5534..5547, ), ( Text( - ")", + ":", ), - 5556..5557, + 5547..5548, ), ( Text( - ";", + "\\$", ), - 5557..5558, + 5548..5550, ), ( Text( - "done", + "i:1}\" );\n done ", ), - 5563..5567, + 5550..5568, ), ( Text( @@ -6868,27 +5249,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "if", - ), - 5713..5715, - ), - ( - Text( - "[", - ), - 5716..5717, - ), - ( - Text( - "[", - ), - 5717..5718, - ), - ( - Text( - "\"", + "if [[ \"", ), - 5719..5720, + 5712..5720, ), ( Expression( @@ -6906,27 +5269,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 5728..5729, - ), - ( - Text( - "==", - ), - 5730..5732, - ), - ( - Text( - "*", - ), - 5733..5734, - ), - ( - Text( - "\"", + "\" == *\"", ), - 5734..5735, + 5728..5735, ), ( Expression( @@ -6944,57 +5289,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 5743..5744, - ), - ( - Text( - "*", - ), - 5744..5745, - ), - ( - Text( - "]", - ), - 5746..5747, - ), - ( - Text( - "]", - ), - 5747..5748, - ), - ( - Text( - ";", - ), - 5748..5749, - ), - ( - Text( - "then", - ), - 5750..5754, - ), - ( - Text( - "echo", - ), - 5759..5763, - ), - ( - Text( - "1", - ), - 5764..5765, - ), - ( - Text( - "fi", + "\"* ]]; then\n echo 1\n fi ", ), - 5768..5770, + 5743..5771, ), ( Text( @@ -7704,9 +6001,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "/", + "\\/", 6547..6549, ), ), @@ -7853,9 +6150,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "\\", + "\\\\", 6768..6770, ), ), @@ -7878,18 +6175,18 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "\\", + "\\\\", 6775..6777, ), ), 6775..6777, ), ( - Escape( + Text( ( - "b", + "\\b", 6777..6779, ), ), @@ -8035,9 +6332,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "b", + "\\b", 7089..7091, ), ), @@ -8051,9 +6348,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "\\", + "\\\\", 7095..7097, ), ), @@ -8098,15 +6395,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 7128..7132, - ), - ( - Text( - "\"", + "echo \"", ), - 7133..7134, + 7127..7134, ), ( Expression( @@ -8124,45 +6415,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 7142..7143, - ), - ( - Text( - "|", - ), - 7144..7145, - ), - ( - Text( - "sed", - ), - 7146..7149, - ), - ( - CommandOption( - "-r", - ), - 7150..7152, - ), - ( - CommandOption( - "-ne", - ), - 7153..7156, - ), - ( - Text( - "\"", - ), - 7157..7158, - ), - ( - Text( - "/", + "\" | sed -r -ne \"/", ), - 7158..7159, + 7142..7159, ), ( Expression( @@ -8180,21 +6435,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 7167..7168, - ), - ( - Text( - "p", - ), - 7168..7169, - ), - ( - Text( - "\"", + "/p\" ", ), - 7169..7170, + 7167..7171, ), ( Text( @@ -8247,15 +6490,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 7221..7225, - ), - ( - Text( - "\"", + "echo \"", ), - 7226..7227, + 7220..7227, ), ( Expression( @@ -8273,45 +6510,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 7235..7236, - ), - ( - Text( - "|", - ), - 7237..7238, - ), - ( - Text( - "sed", - ), - 7239..7242, - ), - ( - CommandOption( - "-E", - ), - 7243..7245, - ), - ( - CommandOption( - "-ne", - ), - 7246..7249, - ), - ( - Text( - "\"", - ), - 7250..7251, - ), - ( - Text( - "/", + "\" | sed -E -ne \"/", ), - 7251..7252, + 7235..7252, ), ( Expression( @@ -8329,21 +6530,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 7260..7261, - ), - ( - Text( - "p", - ), - 7261..7262, - ), - ( - Text( - "\"", + "/p\" ", ), - 7262..7263, + 7260..7264, ), ( Text( @@ -8494,9 +6683,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "|", + "\\|", 7528..7530, ), ), @@ -8560,15 +6749,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 7575..7579, - ), - ( - Text( - "\"", + "echo \"", ), - 7580..7581, + 7574..7581, ), ( Expression( @@ -8586,39 +6769,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 7589..7590, - ), - ( - Text( - "|", - ), - 7591..7592, - ), - ( - Text( - "sed", + "\" | sed -ne \"/", ), - 7593..7596, - ), - ( - CommandOption( - "-ne", - ), - 7597..7600, - ), - ( - Text( - "\"", - ), - 7601..7602, - ), - ( - Text( - "/", - ), - 7602..7603, + 7589..7603, ), ( Expression( @@ -8636,21 +6789,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 7611..7612, - ), - ( - Text( - "p", - ), - 7612..7613, - ), - ( - Text( - "\"", + "/p\" ", ), - 7613..7614, + 7611..7615, ), ( Text( @@ -9074,15 +7215,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 8059..8063, - ), - ( - Text( - "\"", + "echo \"", ), - 8064..8065, + 8058..8065, ), ( Expression( @@ -9100,21 +7235,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 8071..8072, - ), - ( - Text( - "|", - ), - 8073..8074, - ), - ( - Text( - "rev", + "\" | rev ", ), - 8075..8078, + 8071..8079, ), ( Text( @@ -9238,27 +7361,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "if", - ), - 8201..8203, - ), - ( - Text( - "[", - ), - 8204..8205, - ), - ( - Text( - "[", - ), - 8205..8206, - ), - ( - Text( - "\"", + "if [[ \"", ), - 8207..8208, + 8200..8208, ), ( Expression( @@ -9276,89 +7381,29 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 8214..8215, - ), - ( - Text( - "==", - ), - 8216..8218, - ), - ( - Text( - "\"", - ), - 8219..8220, - ), - ( - Expression( - ( - Var( - ( - "prefix", - 8221..8227, - ), - ), - 8221..8227, - ), - ), - 8220..8228, - ), - ( - Text( - "\"", - ), - 8228..8229, - ), - ( - Text( - "*", - ), - 8229..8230, - ), - ( - Text( - "]", - ), - 8231..8232, - ), - ( - Text( - "]", - ), - 8232..8233, - ), - ( - Text( - ";", - ), - 8233..8234, - ), - ( - Text( - "then", - ), - 8235..8239, - ), - ( - Text( - "echo", + "\" == \"", ), - 8244..8248, + 8214..8220, ), ( - Text( - "1", + Expression( + ( + Var( + ( + "prefix", + 8221..8227, + ), + ), + 8221..8227, + ), ), - 8249..8250, + 8220..8228, ), ( Text( - "fi", + "\"* ]]; then\n echo 1\n fi ", ), - 8253..8255, + 8228..8256, ), ( Text( @@ -9525,27 +7570,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "if", - ), - 8398..8400, - ), - ( - Text( - "[", - ), - 8401..8402, - ), - ( - Text( - "[", - ), - 8402..8403, - ), - ( - Text( - "\"", + "if [[ \"", ), - 8404..8405, + 8397..8405, ), ( Expression( @@ -9563,27 +7590,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 8411..8412, - ), - ( - Text( - "==", - ), - 8413..8415, - ), - ( - Text( - "*", - ), - 8416..8417, - ), - ( - Text( - "\"", + "\" == *\"", ), - 8417..8418, + 8411..8418, ), ( Expression( @@ -9601,51 +7610,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 8426..8427, - ), - ( - Text( - "]", - ), - 8428..8429, - ), - ( - Text( - "]", - ), - 8429..8430, - ), - ( - Text( - ";", - ), - 8430..8431, - ), - ( - Text( - "then", - ), - 8432..8436, - ), - ( - Text( - "echo", - ), - 8441..8445, - ), - ( - Text( - "1", - ), - 8446..8447, - ), - ( - Text( - "fi", + "\" ]]; then\n echo 1\n fi ", ), - 8450..8452, + 8426..8453, ), ( Text( @@ -10049,27 +8016,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "printf", - ), - 9012..9018, - ), - ( - Text( - "\"", - ), - 9019..9020, - ), - ( - Text( - "%", - ), - 9020..9021, - ), - ( - Text( - ".", + "printf \"%.", ), - 9021..9022, + 9011..9022, ), ( Expression( @@ -10087,45 +8036,27 @@ expression: parse_unwrap(&tokens) ), ( Text( - "s", - ), - 9030..9031, - ), - ( - Text( - "\"", + "s\" \"", ), - 9031..9032, + 9030..9034, ), ( Text( - "\"", - ), - 9033..9034, - ), - ( - Escape( - "$", + "\\$", ), 9034..9036, ), - ( - Escape( - "{", - ), - 9036..9038, - ), ( Text( - "text", + "\\{", ), - 9038..9042, + 9036..9038, ), ( Text( - ":", + "text: ", ), - 9042..9043, + 9038..9044, ), ( Expression( @@ -10143,15 +8074,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 9051..9052, - ), - ( - Text( - "\"", + "}\" ", ), - 9052..9053, + 9051..9054, ), ( Text( @@ -10302,69 +8227,27 @@ expression: parse_unwrap(&tokens) ), ( Text( - "printf", - ), - 9316..9322, - ), - ( - Text( - "\"", - ), - 9323..9324, - ), - ( - Text( - "%", - ), - 9324..9325, - ), - ( - Text( - ".", - ), - 9325..9326, - ), - ( - Text( - "1s", - ), - 9326..9328, - ), - ( - Text( - "\"", + "printf \"%.1s\" \"", ), - 9328..9329, + 9315..9331, ), ( Text( - "\"", - ), - 9330..9331, - ), - ( - Escape( - "$", + "\\$", ), 9331..9333, ), - ( - Escape( - "{", - ), - 9333..9335, - ), ( Text( - "text", + "\\{", ), - 9335..9339, + 9333..9335, ), ( Text( - ":", + "text: ", ), - 9339..9340, + 9335..9341, ), ( Expression( @@ -10382,15 +8265,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 9348..9349, - ), - ( - Text( - "\"", + "}\" ", ), - 9349..9350, + 9348..9351, ), ( Text( @@ -10628,25 +8505,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", + "echo \"", ), - 9600..9604, + 9599..9606, ), ( Text( - "\"", - ), - 9605..9606, - ), - ( - Escape( - "$", + "\\$", ), 9606..9608, ), ( - Escape( - "{", + Text( + "\\{", ), 9608..9610, ), @@ -10675,21 +8546,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "^", - ), - 9623..9624, - ), - ( - Text( - "}", + "^}\" ", ), - 9624..9625, - ), - ( - Text( - "\"", - ), - 9625..9626, + 9623..9627, ), ( Text( @@ -10786,15 +8645,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 9741..9745, - ), - ( - Text( - "\"", + "echo \"", ), - 9746..9747, + 9740..9747, ), ( Expression( @@ -10812,49 +8665,13 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 9753..9754, - ), - ( - Text( - "|", - ), - 9755..9756, - ), - ( - Text( - "sed", - ), - 9757..9760, - ), - ( - Text( - "\"", - ), - 9761..9762, - ), - ( - Text( - "s", + "\" | sed \"s/^", ), - 9762..9763, + 9753..9765, ), ( Text( - "/", - ), - 9763..9764, - ), - ( - Text( - "^", - ), - 9764..9765, - ), - ( - Escape( - "(", + "\\(", ), 9765..9767, ), @@ -10865,8 +8682,8 @@ expression: parse_unwrap(&tokens) 9767..9768, ), ( - Escape( - ")", + Text( + "\\)", ), 9768..9770, ), @@ -10877,28 +8694,22 @@ expression: parse_unwrap(&tokens) 9770..9771, ), ( - Escape( - "U", + Text( + "\\U", ), 9771..9773, ), - ( - Escape( - "1", - ), - 9773..9775, - ), ( Text( - "/", + "\\1", ), - 9775..9776, + 9773..9775, ), ( Text( - "\"", + "/\" ", ), - 9776..9777, + 9775..9778, ), ( Text( @@ -11287,21 +9098,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "printf", + "printf \"%", ), - 10146..10152, - ), - ( - Text( - "\"", - ), - 10153..10154, - ), - ( - Text( - "%", - ), - 10154..10155, + 10145..10155, ), ( Expression( @@ -11319,57 +9118,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "s", - ), - 10163..10164, - ), - ( - Text( - "\"", - ), - 10164..10165, - ), - ( - Text( - "\"", + "s\" \"\" | tr \" \" \"", ), - 10166..10167, - ), - ( - Text( - "\"", - ), - 10167..10168, - ), - ( - Text( - "|", - ), - 10169..10170, - ), - ( - Text( - "tr", - ), - 10171..10173, - ), - ( - Text( - "\"", - ), - 10174..10175, - ), - ( - Text( - "\"", - ), - 10176..10177, - ), - ( - Text( - "\"", - ), - 10178..10179, + 10163..10179, ), ( Expression( @@ -11387,9 +9138,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", + "\" ", ), - 10184..10185, + 10184..10186, ), ( Text( @@ -11679,21 +9430,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "printf", - ), - 10463..10469, - ), - ( - Text( - "\"", - ), - 10470..10471, - ), - ( - Text( - "%", + "printf \"%", ), - 10471..10472, + 10462..10472, ), ( Expression( @@ -11711,57 +9450,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "s", - ), - 10480..10481, - ), - ( - Text( - "\"", - ), - 10481..10482, - ), - ( - Text( - "\"", - ), - 10483..10484, - ), - ( - Text( - "\"", - ), - 10484..10485, - ), - ( - Text( - "|", - ), - 10486..10487, - ), - ( - Text( - "tr", - ), - 10488..10490, - ), - ( - Text( - "\"", - ), - 10491..10492, - ), - ( - Text( - "\"", - ), - 10493..10494, - ), - ( - Text( - "\"", + "s\" \"\" | tr \" \" \"", ), - 10495..10496, + 10480..10496, ), ( Expression( @@ -11779,9 +9470,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", + "\" ", ), - 10501..10502, + 10501..10503, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap index 5ee2d62..a3ec864 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_text.snap @@ -17,15 +17,9 @@ expression: tokens ), ( Token( - "#", - ), - 208..209, - ), - ( - Token( - "[", + "#[", ), - 209..210, + 208..210, ), ( Token( @@ -125,75 +119,27 @@ expression: tokens ), ( Token( - "echo", - ), - 281..285, - ), - ( - Token( - "\"", - ), - 286..287, - ), - ( - Token( - "\\", - ), - 287..288, - ), - ( - Token( - "$", - ), - 288..289, - ), - ( - Token( - "\\", - ), - 289..290, - ), - ( - Token( - "{", - ), - 290..291, - ), - ( - Token( - "BASH_VERSINFO", - ), - 291..304, - ), - ( - Token( - "[", - ), - 304..305, - ), - ( - Token( - "0", + "echo \"", ), - 305..306, + 280..287, ), ( Token( - "]", + "\\$", ), - 306..307, + 287..289, ), ( Token( - "}", + "\\{", ), - 307..308, + 289..291, ), ( Token( - "\"", + "BASH_VERSINFO[0]}\" ", ), - 308..309, + 291..310, ), ( Token( @@ -245,75 +191,27 @@ expression: tokens ), ( Token( - "echo", - ), - 343..347, - ), - ( - Token( - "\"", - ), - 348..349, - ), - ( - Token( - "\\", - ), - 349..350, - ), - ( - Token( - "$", - ), - 350..351, - ), - ( - Token( - "\\", + "echo \"", ), - 351..352, + 342..349, ), ( Token( - "{", - ), - 352..353, - ), - ( - Token( - "BASH_VERSINFO", - ), - 353..366, - ), - ( - Token( - "[", - ), - 366..367, - ), - ( - Token( - "1", - ), - 367..368, - ), - ( - Token( - "]", + "\\$", ), - 368..369, + 349..351, ), ( Token( - "}", + "\\{", ), - 369..370, + 351..353, ), ( Token( - "\"", + "BASH_VERSINFO[1]}\" ", ), - 370..371, + 353..372, ), ( Token( @@ -365,75 +263,27 @@ expression: tokens ), ( Token( - "echo", - ), - 405..409, - ), - ( - Token( - "\"", - ), - 410..411, - ), - ( - Token( - "\\", - ), - 411..412, - ), - ( - Token( - "$", - ), - 412..413, - ), - ( - Token( - "\\", - ), - 413..414, - ), - ( - Token( - "{", - ), - 414..415, - ), - ( - Token( - "BASH_VERSINFO", - ), - 415..428, - ), - ( - Token( - "[", - ), - 428..429, - ), - ( - Token( - "2", + "echo \"", ), - 429..430, + 404..411, ), ( Token( - "]", + "\\$", ), - 430..431, + 411..413, ), ( Token( - "}", + "\\{", ), - 431..432, + 413..415, ), ( Token( - "\"", + "BASH_VERSINFO[2]}\" ", ), - 432..433, + 415..434, ), ( Token( @@ -693,6 +543,12 @@ expression: tokens ), 721..722, ), + ( + Token( + "", + ), + 722..723, + ), ( Token( "{", @@ -719,39 +575,21 @@ expression: tokens ), ( Token( - "=", - ), - 738..739, - ), - ( - Token( - "\"", - ), - 739..740, - ), - ( - Token( - "\\", - ), - 740..741, - ), - ( - Token( - "$", + "=\"", ), - 741..742, + 738..740, ), ( Token( - "\\", + "\\$", ), - 742..743, + 740..742, ), ( Token( - "{", + "\\{", ), - 743..744, + 742..744, ), ( Token( @@ -779,39 +617,21 @@ expression: tokens ), ( Token( - "//", - ), - 759..761, - ), - ( - Token( - "\"", - ), - 761..762, - ), - ( - Token( - "\\", - ), - 762..763, - ), - ( - Token( - "$", + "//\"", ), - 763..764, + 759..762, ), ( Token( - "\\", + "\\$", ), - 764..765, + 762..764, ), ( Token( - "{", + "\\{", ), - 765..766, + 764..766, ), ( Token( @@ -839,51 +659,21 @@ expression: tokens ), ( Token( - "}", - ), - 781..782, - ), - ( - Token( - "\"", - ), - 782..783, - ), - ( - Token( - "/", - ), - 783..784, - ), - ( - Token( - "\"", - ), - 784..785, - ), - ( - Token( - "\\", - ), - 785..786, - ), - ( - Token( - "$", + "}\"/\"", ), - 786..787, + 781..785, ), ( Token( - "\\", + "\\$", ), - 787..788, + 785..787, ), ( Token( - "{", + "\\{", ), - 788..789, + 787..789, ), ( Token( @@ -911,27 +701,9 @@ expression: tokens ), ( Token( - "}", - ), - 805..806, - ), - ( - Token( - "\"", - ), - 806..807, - ), - ( - Token( - "}", - ), - 807..808, - ), - ( - Token( - "\"", + "}\"}\" ", ), - 808..809, + 805..810, ), ( Token( @@ -969,6 +741,12 @@ expression: tokens ), 839..840, ), + ( + Token( + "", + ), + 840..841, + ), ( Token( "{", @@ -995,39 +773,21 @@ expression: tokens ), ( Token( - "=", - ), - 856..857, - ), - ( - Token( - "\"", - ), - 857..858, - ), - ( - Token( - "\\", - ), - 858..859, - ), - ( - Token( - "$", + "=\"", ), - 859..860, + 856..858, ), ( Token( - "\\", + "\\$", ), - 860..861, + 858..860, ), ( Token( - "{", + "\\{", ), - 861..862, + 860..862, ), ( Token( @@ -1055,39 +815,21 @@ expression: tokens ), ( Token( - "//", - ), - 877..879, - ), - ( - Token( - "\"", - ), - 879..880, - ), - ( - Token( - "\\", + "//\"", ), - 880..881, + 877..880, ), ( Token( - "$", - ), - 881..882, - ), - ( - Token( - "\\", + "\\$", ), - 882..883, + 880..882, ), ( Token( - "{", + "\\{", ), - 883..884, + 882..884, ), ( Token( @@ -1115,91 +857,55 @@ expression: tokens ), ( Token( - "}", + "}\"/", ), - 899..900, + 899..902, ), ( Token( - "\"", + "\\$", ), - 900..901, + 902..904, ), ( Token( - "/", + "\\{", ), - 901..902, + 904..906, ), ( Token( - "\\", + "{", ), - 902..903, + 906..907, ), ( Token( - "$", + "nameof", ), - 903..904, + 907..913, ), ( Token( - "\\", + "replace", ), - 904..905, + 914..921, ), ( Token( - "{", + "}", ), - 905..906, + 921..922, ), ( Token( - "{", + "}}\" ", ), - 906..907, + 922..926, ), ( Token( - "nameof", - ), - 907..913, - ), - ( - Token( - "replace", - ), - 914..921, - ), - ( - Token( - "}", - ), - 921..922, - ), - ( - Token( - "}", - ), - 922..923, - ), - ( - Token( - "}", - ), - 923..924, - ), - ( - Token( - "\"", - ), - 924..925, - ), - ( - Token( - "$", + "$", ), 926..927, ), @@ -1413,6 +1119,12 @@ expression: tokens ), 1206..1207, ), + ( + Token( + "", + ), + 1207..1208, + ), ( Token( "{", @@ -1439,39 +1151,21 @@ expression: tokens ), ( Token( - "=", - ), - 1223..1224, - ), - ( - Token( - "\"", - ), - 1224..1225, - ), - ( - Token( - "\\", - ), - 1225..1226, - ), - ( - Token( - "$", + "=\"", ), - 1226..1227, + 1223..1225, ), ( Token( - "\\", + "\\$", ), - 1227..1228, + 1225..1227, ), ( Token( - "{", + "\\{", ), - 1228..1229, + 1227..1229, ), ( Token( @@ -1499,39 +1193,21 @@ expression: tokens ), ( Token( - "/", - ), - 1244..1245, - ), - ( - Token( - "\"", - ), - 1245..1246, - ), - ( - Token( - "\\", - ), - 1246..1247, - ), - ( - Token( - "$", + "/\"", ), - 1247..1248, + 1244..1246, ), ( Token( - "\\", + "\\$", ), - 1248..1249, + 1246..1248, ), ( Token( - "{", + "\\{", ), - 1249..1250, + 1248..1250, ), ( Token( @@ -1559,51 +1235,21 @@ expression: tokens ), ( Token( - "}", - ), - 1265..1266, - ), - ( - Token( - "\"", - ), - 1266..1267, - ), - ( - Token( - "/", - ), - 1267..1268, - ), - ( - Token( - "\"", - ), - 1268..1269, - ), - ( - Token( - "\\", + "}\"/\"", ), - 1269..1270, + 1265..1269, ), ( Token( - "$", - ), - 1270..1271, - ), - ( - Token( - "\\", + "\\$", ), - 1271..1272, + 1269..1271, ), ( Token( - "{", + "\\{", ), - 1272..1273, + 1271..1273, ), ( Token( @@ -1631,27 +1277,9 @@ expression: tokens ), ( Token( - "}", - ), - 1289..1290, - ), - ( - Token( - "\"", - ), - 1290..1291, - ), - ( - Token( - "}", - ), - 1291..1292, - ), - ( - Token( - "\"", + "}\"}\" ", ), - 1292..1293, + 1289..1294, ), ( Token( @@ -1689,6 +1317,12 @@ expression: tokens ), 1323..1324, ), + ( + Token( + "", + ), + 1324..1325, + ), ( Token( "{", @@ -1715,39 +1349,21 @@ expression: tokens ), ( Token( - "=", - ), - 1340..1341, - ), - ( - Token( - "\"", - ), - 1341..1342, - ), - ( - Token( - "\\", - ), - 1342..1343, - ), - ( - Token( - "$", + "=\"", ), - 1343..1344, + 1340..1342, ), ( Token( - "\\", + "\\$", ), - 1344..1345, + 1342..1344, ), ( Token( - "{", + "\\{", ), - 1345..1346, + 1344..1346, ), ( Token( @@ -1775,39 +1391,21 @@ expression: tokens ), ( Token( - "/", - ), - 1361..1362, - ), - ( - Token( - "\"", - ), - 1362..1363, - ), - ( - Token( - "\\", - ), - 1363..1364, - ), - ( - Token( - "$", + "/\"", ), - 1364..1365, + 1361..1363, ), ( Token( - "\\", + "\\$", ), - 1365..1366, + 1363..1365, ), ( Token( - "{", + "\\{", ), - 1366..1367, + 1365..1367, ), ( Token( @@ -1835,45 +1433,21 @@ expression: tokens ), ( Token( - "}", - ), - 1382..1383, - ), - ( - Token( - "\"", - ), - 1383..1384, - ), - ( - Token( - "/", - ), - 1384..1385, - ), - ( - Token( - "\\", - ), - 1385..1386, - ), - ( - Token( - "$", + "}\"/", ), - 1386..1387, + 1382..1385, ), ( Token( - "\\", + "\\$", ), - 1387..1388, + 1385..1387, ), ( Token( - "{", + "\\{", ), - 1388..1389, + 1387..1389, ), ( Token( @@ -1901,21 +1475,9 @@ expression: tokens ), ( Token( - "}", - ), - 1405..1406, - ), - ( - Token( - "}", - ), - 1406..1407, - ), - ( - Token( - "\"", + "}}\" ", ), - 1407..1408, + 1405..1409, ), ( Token( @@ -2087,529 +1649,277 @@ expression: tokens ), ( Token( - "re", + "re='", ), - 1679..1681, + 1678..1683, ), ( Token( - "=", + "\\b", ), - 1681..1682, + 1683..1685, ), ( Token( - "'", + "Copyright", ), - 1682..1683, + 1685..1694, ), ( Token( - "\\", + "\\b", ), - 1683..1684, + 1694..1696, ), ( Token( - "bCopyright", + ".+", ), - 1684..1694, + 1696..1698, ), ( Token( - "\\", + "\\b", ), - 1694..1695, + 1698..1700, ), ( Token( - "b", + "Free Software Foundation", ), - 1695..1696, + 1700..1724, ), ( Token( - ".", + "\\b", ), - 1696..1697, + 1724..1726, ), ( Token( - "+", + "'; [[ ", ), - 1697..1698, + 1726..1732, ), ( Token( - "\\", + "\\$", ), - 1698..1699, + 1732..1734, ), ( Token( - "bFree", + "(sed --version 2>/dev/null) =~ ", ), - 1699..1704, + 1734..1765, ), ( Token( - "Software", + "\\$", ), - 1705..1713, + 1765..1767, ), ( Token( - "Foundation", + "re ]] ", ), - 1714..1724, + 1767..1773, ), ( Token( - "\\", + "$", ), - 1724..1725, + 1773..1774, ), ( Token( - "b'", + "if", ), - 1725..1727, + 1779..1781, ), ( Token( - ";", + "status", ), - 1727..1728, + 1782..1788, ), ( Token( - "[", + "==", ), - 1729..1730, + 1789..1791, ), ( Token( - "[", + "0", ), - 1730..1731, + 1792..1793, ), ( Token( - "\\", + "{", ), - 1732..1733, + 1794..1795, ), ( Token( - "$", + "return", ), - 1733..1734, + 1804..1810, ), ( Token( - "(", + "SED_VERSION_GNU", ), - 1734..1735, + 1811..1826, ), ( Token( - "sed", + "}", ), - 1735..1738, + 1831..1832, ), ( Token( - "-", + "trust", ), - 1739..1740, + 1837..1842, ), ( Token( - "-", + "$", ), - 1740..1741, + 1843..1844, ), ( Token( - "version", + "re='", ), - 1741..1748, + 1844..1849, ), ( Token( - "2", + "\\b", ), - 1749..1750, + 1849..1851, ), ( Token( - ">", + "BusyBox", ), - 1750..1751, + 1851..1858, ), ( Token( - "/", + "\\b", ), - 1751..1752, + 1858..1860, ), ( Token( - "dev", + "'; [[ ", ), - 1752..1755, + 1860..1866, ), ( Token( - "/", + "\\$", ), - 1755..1756, + 1866..1868, ), ( Token( - "null", + "(sed 2>&1) =~ ", ), - 1756..1760, + 1868..1882, ), ( Token( - ")", + "\\$", ), - 1760..1761, + 1882..1884, ), ( Token( - "=", + "re ]] ", ), - 1762..1763, + 1884..1890, ), ( Token( - "~", + "$", ), - 1763..1764, + 1890..1891, ), ( Token( - "\\", + "if", ), - 1765..1766, + 1896..1898, ), ( Token( - "$", + "status", ), - 1766..1767, + 1899..1905, ), ( Token( - "re", + "==", ), - 1767..1769, + 1906..1908, ), ( Token( - "]", + "0", ), - 1770..1771, + 1909..1910, ), ( Token( - "]", + "{", ), - 1771..1772, + 1911..1912, ), ( Token( - "$", + "return", ), - 1773..1774, + 1921..1927, ), ( Token( - "if", + "SED_VERSION_BUSYBOX", ), - 1779..1781, + 1928..1947, ), ( Token( - "status", + "}", ), - 1782..1788, + 1952..1953, ), ( Token( - "==", + "return", ), - 1789..1791, + 1958..1964, ), ( Token( - "0", + "SED_VERSION_UNKNOWN", ), - 1792..1793, + 1965..1984, ), ( Token( - "{", + "}", ), - 1794..1795, + 1985..1986, ), ( Token( - "return", - ), - 1804..1810, - ), - ( - Token( - "SED_VERSION_GNU", - ), - 1811..1826, - ), - ( - Token( - "}", - ), - 1831..1832, - ), - ( - Token( - "trust", - ), - 1837..1842, - ), - ( - Token( - "$", - ), - 1843..1844, - ), - ( - Token( - "re", - ), - 1845..1847, - ), - ( - Token( - "=", - ), - 1847..1848, - ), - ( - Token( - "'", - ), - 1848..1849, - ), - ( - Token( - "\\", - ), - 1849..1850, - ), - ( - Token( - "bBusyBox", - ), - 1850..1858, - ), - ( - Token( - "\\", - ), - 1858..1859, - ), - ( - Token( - "b'", - ), - 1859..1861, - ), - ( - Token( - ";", - ), - 1861..1862, - ), - ( - Token( - "[", - ), - 1863..1864, - ), - ( - Token( - "[", - ), - 1864..1865, - ), - ( - Token( - "\\", - ), - 1866..1867, - ), - ( - Token( - "$", - ), - 1867..1868, - ), - ( - Token( - "(", - ), - 1868..1869, - ), - ( - Token( - "sed", - ), - 1869..1872, - ), - ( - Token( - "2", - ), - 1873..1874, - ), - ( - Token( - ">", - ), - 1874..1875, - ), - ( - Token( - "&1", - ), - 1875..1877, - ), - ( - Token( - ")", - ), - 1877..1878, - ), - ( - Token( - "=", - ), - 1879..1880, - ), - ( - Token( - "~", - ), - 1880..1881, - ), - ( - Token( - "\\", - ), - 1882..1883, - ), - ( - Token( - "$", - ), - 1883..1884, - ), - ( - Token( - "re", - ), - 1884..1886, - ), - ( - Token( - "]", - ), - 1887..1888, - ), - ( - Token( - "]", - ), - 1888..1889, - ), - ( - Token( - "$", - ), - 1890..1891, - ), - ( - Token( - "if", - ), - 1896..1898, - ), - ( - Token( - "status", - ), - 1899..1905, - ), - ( - Token( - "==", - ), - 1906..1908, - ), - ( - Token( - "0", - ), - 1909..1910, - ), - ( - Token( - "{", - ), - 1911..1912, - ), - ( - Token( - "return", - ), - 1921..1927, - ), - ( - Token( - "SED_VERSION_BUSYBOX", - ), - 1928..1947, - ), - ( - Token( - "}", - ), - 1952..1953, - ), - ( - Token( - "return", - ), - 1958..1964, - ), - ( - Token( - "SED_VERSION_UNKNOWN", - ), - 1965..1984, - ), - ( - Token( - "}", - ), - 1985..1986, - ), - ( - Token( - "/// Replaces all occurrences of a regex pattern in the content with the provided replace text.\n", + "/// Replaces all occurrences of a regex pattern in the content with the provided replace text.\n", ), 1988..2083, ), @@ -2891,15 +2201,9 @@ expression: tokens ), ( Token( - "\\", - ), - 2306..2307, - ), - ( - Token( - "\\", + "\\\\", ), - 2307..2308, + 2306..2308, ), ( Token( @@ -2987,15 +2291,9 @@ expression: tokens ), ( Token( - "\\", - ), - 2363..2364, - ), - ( - Token( - "\\", + "\\\\", ), - 2364..2365, + 2363..2365, ), ( Token( @@ -3119,15 +2417,9 @@ expression: tokens ), ( Token( - "\\", - ), - 2561..2562, - ), - ( - Token( - "\\", + "\\\\", ), - 2562..2563, + 2561..2563, ), ( Token( @@ -3155,27 +2447,15 @@ expression: tokens ), ( Token( - "\\", - ), - 2568..2569, - ), - ( - Token( - "\\", - ), - 2569..2570, - ), - ( - Token( - "\\", + "\\\\", ), - 2570..2571, + 2568..2570, ), ( Token( - "b", + "\\b", ), - 2571..2572, + 2570..2572, ), ( Token( @@ -3269,15 +2549,9 @@ expression: tokens ), ( Token( - "echo", - ), - 2803..2807, - ), - ( - Token( - "\"", + "echo \"", ), - 2808..2809, + 2802..2809, ), ( Token( @@ -3299,99 +2573,45 @@ expression: tokens ), ( Token( - "\"", + "\" | sed -r -e \"s/", ), - 2817..2818, + 2817..2834, ), ( Token( - "|", + "{", ), - 2819..2820, + 2834..2835, ), ( Token( - "sed", + "search", ), - 2821..2824, + 2835..2841, ), ( Token( - "-", + "}", ), - 2825..2826, + 2841..2842, ), ( Token( - "r", + "/", ), - 2826..2827, + 2842..2843, ), ( Token( - "-", + "{", ), - 2828..2829, + 2843..2844, ), ( Token( - "e", + "replace_text", ), - 2829..2830, - ), - ( - Token( - "\"", - ), - 2831..2832, - ), - ( - Token( - "s", - ), - 2832..2833, - ), - ( - Token( - "/", - ), - 2833..2834, - ), - ( - Token( - "{", - ), - 2834..2835, - ), - ( - Token( - "search", - ), - 2835..2841, - ), - ( - Token( - "}", - ), - 2841..2842, - ), - ( - Token( - "/", - ), - 2842..2843, - ), - ( - Token( - "{", - ), - 2843..2844, - ), - ( - Token( - "replace_text", - ), - 2844..2856, + 2844..2856, ), ( Token( @@ -3401,21 +2621,9 @@ expression: tokens ), ( Token( - "/", - ), - 2857..2858, - ), - ( - Token( - "g", - ), - 2858..2859, - ), - ( - Token( - "\"", + "/g\" ", ), - 2859..2860, + 2857..2861, ), ( Token( @@ -3455,15 +2663,9 @@ expression: tokens ), ( Token( - "echo", - ), - 2909..2913, - ), - ( - Token( - "\"", + "echo \"", ), - 2914..2915, + 2908..2915, ), ( Token( @@ -3485,63 +2687,9 @@ expression: tokens ), ( Token( - "\"", - ), - 2923..2924, - ), - ( - Token( - "|", - ), - 2925..2926, - ), - ( - Token( - "sed", - ), - 2927..2930, - ), - ( - Token( - "-", - ), - 2931..2932, - ), - ( - Token( - "E", - ), - 2932..2933, - ), - ( - Token( - "-", - ), - 2934..2935, - ), - ( - Token( - "e", - ), - 2935..2936, - ), - ( - Token( - "\"", - ), - 2937..2938, - ), - ( - Token( - "s", - ), - 2938..2939, - ), - ( - Token( - "/", + "\" | sed -E -e \"s/", ), - 2939..2940, + 2923..2940, ), ( Token( @@ -3587,21 +2735,9 @@ expression: tokens ), ( Token( - "/", - ), - 2963..2964, - ), - ( - Token( - "g", - ), - 2964..2965, - ), - ( - Token( - "\"", + "/g\" ", ), - 2965..2966, + 2963..2967, ), ( Token( @@ -3737,15 +2873,9 @@ expression: tokens ), ( Token( - "\\", - ), - 3231..3232, - ), - ( - Token( - "|", + "\\|", ), - 3232..3233, + 3231..3233, ), ( Token( @@ -3803,15 +2933,9 @@ expression: tokens ), ( Token( - "echo", - ), - 3276..3280, - ), - ( - Token( - "\"", + "echo \"", ), - 3281..3282, + 3275..3282, ), ( Token( @@ -3833,51 +2957,9 @@ expression: tokens ), ( Token( - "\"", - ), - 3290..3291, - ), - ( - Token( - "|", - ), - 3292..3293, - ), - ( - Token( - "sed", - ), - 3294..3297, - ), - ( - Token( - "-", - ), - 3298..3299, - ), - ( - Token( - "e", - ), - 3299..3300, - ), - ( - Token( - "\"", - ), - 3301..3302, - ), - ( - Token( - "s", - ), - 3302..3303, - ), - ( - Token( - "/", + "\" | sed -e \"s/", ), - 3303..3304, + 3290..3304, ), ( Token( @@ -3923,21 +3005,9 @@ expression: tokens ), ( Token( - "/", - ), - 3327..3328, - ), - ( - Token( - "g", - ), - 3328..3329, - ), - ( - Token( - "\"", + "/g\" ", ), - 3329..3330, + 3327..3331, ), ( Token( @@ -4121,21 +3191,9 @@ expression: tokens ), ( Token( - "IFS", - ), - 3530..3533, - ), - ( - Token( - "=", - ), - 3533..3534, - ), - ( - Token( - "\"", + "IFS=\"", ), - 3534..3535, + 3529..3535, ), ( Token( @@ -4157,45 +3215,9 @@ expression: tokens ), ( Token( - "\"", - ), - 3546..3547, - ), - ( - Token( - "read", - ), - 3548..3552, - ), - ( - Token( - "-", - ), - 3553..3554, - ), - ( - Token( - "rd", - ), - 3554..3556, - ), - ( - Token( - "''", - ), - 3557..3559, - ), - ( - Token( - "-", - ), - 3560..3561, - ), - ( - Token( - "a", + "\" read -rd '' -a ", ), - 3561..3562, + 3546..3563, ), ( Token( @@ -4223,57 +3245,15 @@ expression: tokens ), ( Token( - "<", - ), - 3579..3580, - ), - ( - Token( - "<", - ), - 3581..3582, - ), - ( - Token( - "(", - ), - 3582..3583, - ), - ( - Token( - "printf", - ), - 3583..3589, - ), - ( - Token( - "%", - ), - 3590..3591, - ), - ( - Token( - "s", - ), - 3591..3592, - ), - ( - Token( - "\"", - ), - 3593..3594, - ), - ( - Token( - "\\", + " < <(printf %s \"", ), - 3594..3595, + 3578..3594, ), ( Token( - "$", + "\\$", ), - 3595..3596, + 3594..3596, ), ( Token( @@ -4301,15 +3281,9 @@ expression: tokens ), ( Token( - "\"", - ), - 3609..3610, - ), - ( - Token( - ")", + "\") ", ), - 3610..3611, + 3609..3612, ), ( Token( @@ -4457,15 +3431,9 @@ expression: tokens ), ( Token( - "\\", - ), - 3778..3779, - ), - ( - Token( - "n", + "\\n", ), - 3779..3780, + 3778..3780, ), ( Token( @@ -4605,6 +3573,12 @@ expression: tokens ), 3925..3926, ), + ( + Token( + " ", + ), + 3926..3927, + ), ( Token( "\"", @@ -4751,31 +3725,19 @@ expression: tokens ), ( Token( - "IFS", + "IFS=\"", ), - 4051..4054, + 4050..4056, ), ( Token( - "=", + "{", ), - 4054..4055, + 4056..4057, ), ( Token( - "\"", - ), - 4055..4056, - ), - ( - Token( - "{", - ), - 4056..4057, - ), - ( - Token( - "delimiter", + "delimiter", ), 4057..4066, ), @@ -4787,51 +3749,21 @@ expression: tokens ), ( Token( - "\"", - ), - 4067..4068, - ), - ( - Token( - ";", - ), - 4069..4070, - ), - ( - Token( - "echo", - ), - 4071..4075, - ), - ( - Token( - "\"", - ), - 4076..4077, - ), - ( - Token( - "\\", - ), - 4077..4078, - ), - ( - Token( - "$", + "\" ; echo \"", ), - 4078..4079, + 4067..4077, ), ( Token( - "\\", + "\\$", ), - 4079..4080, + 4077..4079, ), ( Token( - "{", + "\\{", ), - 4080..4081, + 4079..4081, ), ( Token( @@ -4859,33 +3791,9 @@ expression: tokens ), ( Token( - "[", - ), - 4094..4095, - ), - ( - Token( - "*", - ), - 4095..4096, - ), - ( - Token( - "]", - ), - 4096..4097, - ), - ( - Token( - "}", - ), - 4097..4098, - ), - ( - Token( - "\"", + "[*]}\" ", ), - 4098..4099, + 4094..4100, ), ( Token( @@ -4991,15 +3899,9 @@ expression: tokens ), ( Token( - "echo", - ), - 4215..4219, - ), - ( - Token( - "\"", + "echo \"", ), - 4220..4221, + 4214..4221, ), ( Token( @@ -5021,111 +3923,9 @@ expression: tokens ), ( Token( - "\"", - ), - 4227..4228, - ), - ( - Token( - "|", - ), - 4229..4230, - ), - ( - Token( - "sed", - ), - 4231..4234, - ), - ( - Token( - "-", - ), - 4235..4236, - ), - ( - Token( - "e", - ), - 4236..4237, - ), - ( - Token( - "'s", - ), - 4238..4240, - ), - ( - Token( - "/", - ), - 4240..4241, - ), - ( - Token( - "^", - ), - 4241..4242, - ), - ( - Token( - "[", - ), - 4242..4243, - ), - ( - Token( - "[", - ), - 4243..4244, - ), - ( - Token( - ":", - ), - 4244..4245, - ), - ( - Token( - "space", - ), - 4245..4250, - ), - ( - Token( - ":", - ), - 4250..4251, - ), - ( - Token( - "]", - ), - 4251..4252, - ), - ( - Token( - "]", - ), - 4252..4253, - ), - ( - Token( - "*", - ), - 4253..4254, - ), - ( - Token( - "//", - ), - 4254..4256, - ), - ( - Token( - "'", + "\" | sed -e 's/^[[:space:]]*//' ", ), - 4256..4257, + 4227..4258, ), ( Token( @@ -5231,15 +4031,9 @@ expression: tokens ), ( Token( - "echo", - ), - 4374..4378, - ), - ( - Token( - "\"", + "echo \"", ), - 4379..4380, + 4373..4380, ), ( Token( @@ -5261,117 +4055,21 @@ expression: tokens ), ( Token( - "\"", - ), - 4386..4387, - ), - ( - Token( - "|", - ), - 4388..4389, - ), - ( - Token( - "sed", - ), - 4390..4393, - ), - ( - Token( - "-", - ), - 4394..4395, - ), - ( - Token( - "e", - ), - 4395..4396, - ), - ( - Token( - "'s", - ), - 4397..4399, - ), - ( - Token( - "/", - ), - 4399..4400, - ), - ( - Token( - "[", - ), - 4400..4401, - ), - ( - Token( - "[", - ), - 4401..4402, - ), - ( - Token( - ":", - ), - 4402..4403, - ), - ( - Token( - "space", - ), - 4403..4408, - ), - ( - Token( - ":", - ), - 4408..4409, - ), - ( - Token( - "]", - ), - 4409..4410, - ), - ( - Token( - "]", - ), - 4410..4411, - ), - ( - Token( - "*", - ), - 4411..4412, - ), - ( - Token( - "\\", - ), - 4412..4413, - ), - ( - Token( - "$", + "\" | sed -e 's/[[:space:]]*", ), - 4413..4414, + 4386..4412, ), ( Token( - "//", + "\\$", ), - 4414..4416, + 4412..4414, ), ( Token( - "'", + "//' ", ), - 4416..4417, + 4414..4418, ), ( Token( @@ -5603,15 +4301,9 @@ expression: tokens ), ( Token( - "echo", - ), - 4644..4648, - ), - ( - Token( - "\"", + "echo \"", ), - 4649..4650, + 4643..4650, ), ( Token( @@ -5633,1143 +4325,645 @@ expression: tokens ), ( Token( - "\"", + "\" | tr '[:upper:]' '[:lower:]' ", ), - 4656..4657, + 4656..4687, ), ( Token( - "|", + "$", ), - 4658..4659, + 4687..4688, ), ( Token( - "tr", + "}", ), - 4660..4662, + 4689..4690, ), ( Token( - "'", + "/// Makes the text input uppercase using `tr`.\n", ), - 4663..4664, + 4692..4739, ), ( Token( - "[", + "pub", ), - 4664..4665, + 4739..4742, ), ( Token( - ":", + "fun", ), - 4665..4666, + 4743..4746, ), ( Token( - "upper", + "uppercase", ), - 4666..4671, + 4747..4756, ), ( Token( - ":", + "(", ), - 4671..4672, + 4756..4757, ), ( Token( - "]", + "text", ), - 4672..4673, + 4757..4761, ), ( Token( - "'", + ":", ), - 4673..4674, + 4761..4762, ), ( Token( - "'", + "Text", ), - 4675..4676, + 4763..4767, ), ( Token( - "[", + ")", ), - 4676..4677, + 4767..4768, ), ( Token( ":", ), - 4677..4678, + 4768..4769, ), ( Token( - "lower", + "Text", ), - 4678..4683, + 4770..4774, ), ( Token( - ":", + "{", ), - 4683..4684, + 4775..4776, ), ( Token( - "]", + "return", ), - 4684..4685, + 4781..4787, ), ( Token( - "'", + "trust", ), - 4685..4686, + 4788..4793, ), ( Token( "$", ), - 4687..4688, + 4794..4795, + ), + ( + Token( + "echo \"", + ), + 4795..4802, + ), + ( + Token( + "{", + ), + 4802..4803, + ), + ( + Token( + "text", + ), + 4803..4807, ), ( Token( "}", ), - 4689..4690, + 4807..4808, ), ( Token( - "/// Makes the text input uppercase using `tr`.\n", + "\" | tr '[:lower:]' '[:upper:]' ", ), - 4692..4739, + 4808..4839, ), ( Token( - "pub", + "$", ), - 4739..4742, + 4839..4840, ), ( Token( - "fun", + "}", ), - 4743..4746, + 4841..4842, ), ( Token( - "uppercase", + "/// Attempts to parse a given text into an `Int` number.\n", ), - 4747..4756, + 4844..4901, ), ( Token( - "(", + "#[", ), - 4756..4757, + 4901..4903, ), ( Token( - "text", + "allow_absurd_cast", ), - 4757..4761, + 4903..4920, ), ( Token( - ":", + "]", ), - 4761..4762, + 4920..4921, ), ( Token( - "Text", + "pub", ), - 4763..4767, + 4922..4925, ), ( Token( - ")", + "fun", ), - 4767..4768, + 4926..4929, ), ( Token( - ":", + "parse_int", ), - 4768..4769, + 4930..4939, ), ( Token( - "Text", + "(", ), - 4770..4774, + 4939..4940, ), ( Token( - "{", + "text", ), - 4775..4776, + 4940..4944, ), ( Token( - "return", + ":", ), - 4781..4787, + 4944..4945, ), ( Token( - "trust", + "Text", ), - 4788..4793, + 4946..4950, ), ( Token( - "$", + ")", ), - 4794..4795, + 4950..4951, ), ( Token( - "echo", + ":", ), - 4796..4800, + 4951..4952, ), ( Token( - "\"", + "Int", ), - 4801..4802, + 4953..4956, ), ( Token( - "{", + "?", ), - 4802..4803, + 4956..4957, ), ( Token( - "text", + "{", ), - 4803..4807, + 4958..4959, ), ( Token( - "}", + "$", ), - 4807..4808, + 4964..4965, ), ( Token( - "\"", + "[ -n \"", ), - 4808..4809, + 4965..4972, ), ( Token( - "|", + "{", ), - 4810..4811, + 4972..4973, ), ( Token( - "tr", + "text", ), - 4812..4814, + 4973..4977, ), ( Token( - "'", + "}", ), - 4815..4816, + 4977..4978, ), ( Token( - "[", + "\" ] && [ \"", ), - 4816..4817, + 4978..4988, ), ( Token( - ":", + "{", ), - 4817..4818, + 4988..4989, ), ( Token( - "lower", + "text", ), - 4818..4823, + 4989..4993, ), ( Token( - ":", + "}", ), - 4823..4824, + 4993..4994, ), ( Token( - "]", + "\" -eq \"", ), - 4824..4825, + 4994..5001, ), ( Token( - "'", + "{", ), - 4825..4826, + 5001..5002, ), ( Token( - "'", + "text", ), - 4827..4828, + 5002..5006, ), ( Token( - "[", + "}", ), - 4828..4829, + 5006..5007, ), ( Token( - ":", + "\" ] 2>/dev/null ", ), - 4829..4830, + 5007..5023, ), ( Token( - "upper", + "$", ), - 4830..4835, + 5023..5024, ), ( Token( - ":", + "?", ), - 4835..4836, + 5024..5025, ), ( Token( - "]", + "return", ), - 4836..4837, + 5030..5036, ), ( Token( - "'", + "text", ), - 4837..4838, + 5037..5041, ), ( Token( - "$", + "as", ), - 4839..4840, + 5042..5044, ), ( Token( - "}", + "Int", ), - 4841..4842, + 5045..5048, ), ( Token( - "/// Attempts to parse a given text into an `Int` number.\n", + "}", ), - 4844..4901, + 5049..5050, ), ( Token( - "#", + "/// Attempts to parse a given text into a `Num` number.\n", ), - 4901..4902, + 5052..5108, ), ( Token( - "[", + "#[", ), - 4902..4903, + 5108..5110, ), ( Token( "allow_absurd_cast", ), - 4903..4920, + 5110..5127, ), ( Token( "]", ), - 4920..4921, + 5127..5128, ), ( Token( "pub", ), - 4922..4925, + 5129..5132, ), ( Token( "fun", ), - 4926..4929, + 5133..5136, ), ( Token( - "parse_int", + "parse_num", ), - 4930..4939, + 5137..5146, ), ( Token( "(", ), - 4939..4940, + 5146..5147, ), ( Token( "text", ), - 4940..4944, + 5147..5151, ), ( Token( ":", ), - 4944..4945, + 5151..5152, ), ( Token( "Text", ), - 4946..4950, + 5153..5157, ), ( Token( ")", ), - 4950..4951, + 5157..5158, ), ( Token( ":", ), - 4951..4952, + 5158..5159, ), ( Token( - "Int", + "Num", ), - 4953..4956, + 5160..5163, ), ( Token( "?", ), - 4956..4957, + 5163..5164, ), ( Token( "{", ), - 4958..4959, + 5165..5166, ), ( Token( - "$", + "let", ), - 4964..4965, + 5171..5174, ), ( Token( - "[", + "re_int", ), - 4966..4967, + 5175..5181, ), ( Token( - "-", + "=", ), - 4968..4969, + 5181..5182, ), ( Token( - "n", + "\"", ), - 4969..4970, + 5182..5183, ), ( Token( - "\"", + "^-?[0-9]+$", ), - 4971..4972, + 5183..5193, ), ( Token( - "{", + "\"", ), - 4972..4973, + 5193..5194, ), ( Token( - "text", + "let", ), - 4973..4977, + 5199..5202, ), ( Token( - "}", + "re_float", ), - 4977..4978, + 5203..5211, ), ( Token( - "\"", + "=", ), - 4978..4979, + 5211..5212, ), ( Token( - "]", + "\"", ), - 4980..4981, + 5212..5213, ), ( Token( - "&&", + "^-?[0-9]*", ), - 4982..4984, + 5213..5222, ), ( Token( - "[", + "\\.", ), - 4985..4986, + 5222..5224, ), ( Token( - "\"", + "[0-9]+$", ), - 4987..4988, + 5224..5231, ), ( Token( - "{", + "\"", ), - 4988..4989, + 5231..5232, ), ( Token( - "text", + "$", ), - 4989..4993, + 5238..5239, ), ( Token( - "}", + "[[ ", ), - 4993..4994, + 5239..5243, ), ( Token( - "\"", + "{", ), - 4994..4995, + 5243..5244, ), ( Token( - "-", + "text", ), - 4996..4997, + 5244..5248, ), ( Token( - "eq", + "}", ), - 4997..4999, + 5248..5249, ), ( Token( - "\"", + " =~ ", ), - 5000..5001, + 5249..5253, ), ( Token( "{", ), - 5001..5002, + 5253..5254, ), ( Token( - "text", + "re_int", ), - 5002..5006, + 5254..5260, ), ( Token( "}", ), - 5006..5007, + 5260..5261, ), ( Token( - "\"", + " ]] || [[ ", ), - 5007..5008, + 5261..5271, ), ( Token( - "]", + "{", ), - 5009..5010, + 5271..5272, ), ( Token( - "2", + "text", ), - 5011..5012, + 5272..5276, ), ( Token( - ">", + "}", ), - 5012..5013, + 5276..5277, ), ( Token( - "/", + " =~ ", ), - 5013..5014, + 5277..5281, ), ( Token( - "dev", + "{", ), - 5014..5017, - ), - ( - Token( - "/", - ), - 5017..5018, - ), - ( - Token( - "null", - ), - 5018..5022, - ), - ( - Token( - "$", - ), - 5023..5024, - ), - ( - Token( - "?", - ), - 5024..5025, - ), - ( - Token( - "return", - ), - 5030..5036, - ), - ( - Token( - "text", - ), - 5037..5041, - ), - ( - Token( - "as", - ), - 5042..5044, - ), - ( - Token( - "Int", - ), - 5045..5048, - ), - ( - Token( - "}", - ), - 5049..5050, - ), - ( - Token( - "/// Attempts to parse a given text into a `Num` number.\n", - ), - 5052..5108, - ), - ( - Token( - "#", - ), - 5108..5109, - ), - ( - Token( - "[", - ), - 5109..5110, - ), - ( - Token( - "allow_absurd_cast", - ), - 5110..5127, - ), - ( - Token( - "]", - ), - 5127..5128, - ), - ( - Token( - "pub", - ), - 5129..5132, - ), - ( - Token( - "fun", - ), - 5133..5136, - ), - ( - Token( - "parse_num", - ), - 5137..5146, - ), - ( - Token( - "(", - ), - 5146..5147, - ), - ( - Token( - "text", - ), - 5147..5151, - ), - ( - Token( - ":", - ), - 5151..5152, - ), - ( - Token( - "Text", - ), - 5153..5157, - ), - ( - Token( - ")", - ), - 5157..5158, - ), - ( - Token( - ":", - ), - 5158..5159, - ), - ( - Token( - "Num", - ), - 5160..5163, - ), - ( - Token( - "?", - ), - 5163..5164, - ), - ( - Token( - "{", - ), - 5165..5166, - ), - ( - Token( - "let", - ), - 5171..5174, - ), - ( - Token( - "re_int", - ), - 5175..5181, - ), - ( - Token( - "=", - ), - 5181..5182, - ), - ( - Token( - "\"", - ), - 5182..5183, - ), - ( - Token( - "^", - ), - 5183..5184, - ), - ( - Token( - "-", - ), - 5184..5185, - ), - ( - Token( - "?", - ), - 5185..5186, - ), - ( - Token( - "[", - ), - 5186..5187, - ), - ( - Token( - "0", - ), - 5187..5188, - ), - ( - Token( - "-", - ), - 5188..5189, - ), - ( - Token( - "9", - ), - 5189..5190, - ), - ( - Token( - "]", - ), - 5190..5191, - ), - ( - Token( - "+", - ), - 5191..5192, - ), - ( - Token( - "$", - ), - 5192..5193, - ), - ( - Token( - "\"", - ), - 5193..5194, - ), - ( - Token( - "let", - ), - 5199..5202, - ), - ( - Token( - "re_float", - ), - 5203..5211, - ), - ( - Token( - "=", - ), - 5211..5212, - ), - ( - Token( - "\"", - ), - 5212..5213, - ), - ( - Token( - "^", - ), - 5213..5214, - ), - ( - Token( - "-", - ), - 5214..5215, - ), - ( - Token( - "?", - ), - 5215..5216, - ), - ( - Token( - "[", - ), - 5216..5217, - ), - ( - Token( - "0", - ), - 5217..5218, - ), - ( - Token( - "-", - ), - 5218..5219, - ), - ( - Token( - "9", - ), - 5219..5220, - ), - ( - Token( - "]", - ), - 5220..5221, - ), - ( - Token( - "*", - ), - 5221..5222, - ), - ( - Token( - "\\", - ), - 5222..5223, - ), - ( - Token( - ".", - ), - 5223..5224, - ), - ( - Token( - "[", - ), - 5224..5225, - ), - ( - Token( - "0", - ), - 5225..5226, - ), - ( - Token( - "-", - ), - 5226..5227, - ), - ( - Token( - "9", - ), - 5227..5228, - ), - ( - Token( - "]", - ), - 5228..5229, - ), - ( - Token( - "+", - ), - 5229..5230, - ), - ( - Token( - "$", - ), - 5230..5231, - ), - ( - Token( - "\"", - ), - 5231..5232, - ), - ( - Token( - "$", - ), - 5238..5239, - ), - ( - Token( - "[", - ), - 5240..5241, - ), - ( - Token( - "[", - ), - 5241..5242, - ), - ( - Token( - "{", - ), - 5243..5244, - ), - ( - Token( - "text", - ), - 5244..5248, - ), - ( - Token( - "}", - ), - 5248..5249, - ), - ( - Token( - "=", - ), - 5250..5251, - ), - ( - Token( - "~", - ), - 5251..5252, - ), - ( - Token( - "{", - ), - 5253..5254, - ), - ( - Token( - "re_int", - ), - 5254..5260, - ), - ( - Token( - "}", - ), - 5260..5261, - ), - ( - Token( - "]", - ), - 5262..5263, - ), - ( - Token( - "]", - ), - 5263..5264, - ), - ( - Token( - "||", - ), - 5265..5267, - ), - ( - Token( - "[", - ), - 5268..5269, - ), - ( - Token( - "[", - ), - 5269..5270, - ), - ( - Token( - "{", - ), - 5271..5272, - ), - ( - Token( - "text", - ), - 5272..5276, - ), - ( - Token( - "}", - ), - 5276..5277, - ), - ( - Token( - "=", - ), - 5278..5279, - ), - ( - Token( - "~", - ), - 5279..5280, - ), - ( - Token( - "{", - ), - 5281..5282, + 5281..5282, ), ( Token( @@ -6785,15 +4979,9 @@ expression: tokens ), ( Token( - "]", - ), - 5292..5293, - ), - ( - Token( - "]", + " ]] ", ), - 5293..5294, + 5291..5295, ), ( Token( @@ -6949,343 +5137,163 @@ expression: tokens Token( "Text", ), - 5441..5445, - ), - ( - Token( - "]", - ), - 5445..5446, - ), - ( - Token( - "trust", - ), - 5451..5456, - ), - ( - Token( - "$", - ), - 5457..5458, - ), - ( - Token( - "for", - ), - 5459..5462, - ), - ( - Token( - "(", - ), - 5463..5464, - ), - ( - Token( - "(", - ), - 5464..5465, - ), - ( - Token( - "i", - ), - 5465..5466, - ), - ( - Token( - "=", - ), - 5466..5467, - ), - ( - Token( - "0", - ), - 5467..5468, - ), - ( - Token( - ";", - ), - 5468..5469, - ), - ( - Token( - "i", - ), - 5470..5471, - ), - ( - Token( - "<", - ), - 5471..5472, - ), - ( - Token( - "\\", - ), - 5472..5473, - ), - ( - Token( - "$", - ), - 5473..5474, - ), - ( - Token( - "\\", - ), - 5474..5475, - ), - ( - Token( - "{", - ), - 5475..5476, - ), - ( - Token( - "#", - ), - 5476..5477, - ), - ( - Token( - "{", - ), - 5477..5478, - ), - ( - Token( - "nameof", - ), - 5478..5484, - ), - ( - Token( - "text", - ), - 5485..5489, - ), - ( - Token( - "}", - ), - 5489..5490, - ), - ( - Token( - "}", - ), - 5490..5491, - ), - ( - Token( - ";", - ), - 5491..5492, - ), - ( - Token( - "i", - ), - 5493..5494, - ), - ( - Token( - "+", - ), - 5494..5495, - ), - ( - Token( - "+", - ), - 5495..5496, - ), - ( - Token( - ")", - ), - 5496..5497, - ), - ( - Token( - ")", - ), - 5497..5498, - ), - ( - Token( - ";", - ), - 5498..5499, + 5441..5445, ), ( Token( - "do", + "]", ), - 5500..5502, + 5445..5446, ), ( Token( - "{", + "trust", ), - 5511..5512, + 5451..5456, ), ( Token( - "nameof", + "$", ), - 5512..5518, + 5457..5458, ), ( Token( - "chars", + "for ((i=0; i<", ), - 5519..5524, + 5458..5472, ), ( Token( - "}", + "\\$", ), - 5524..5525, + 5472..5474, ), ( Token( - "+=", + "\\{", ), - 5525..5527, + 5474..5476, ), ( Token( - "(", + "#", ), - 5527..5528, + 5476..5477, ), ( Token( - "\"", + "{", ), - 5529..5530, + 5477..5478, ), ( Token( - "\\", + "nameof", ), - 5530..5531, + 5478..5484, ), ( Token( - "$", + "text", ), - 5531..5532, + 5485..5489, ), ( Token( - "\\", + "}", ), - 5532..5533, + 5489..5490, ), ( Token( - "{", + "}; i++)); do\n ", ), - 5533..5534, + 5490..5511, ), ( Token( "{", ), - 5534..5535, + 5511..5512, ), ( Token( "nameof", ), - 5535..5541, + 5512..5518, ), ( Token( - "text", + "chars", ), - 5542..5546, + 5519..5524, ), ( Token( "}", ), - 5546..5547, + 5524..5525, ), ( Token( - ":", + "+=( \"", ), - 5547..5548, + 5525..5530, ), ( Token( - "\\", + "\\$", ), - 5548..5549, + 5530..5532, ), ( Token( - "$", + "\\{", ), - 5549..5550, + 5532..5534, ), ( Token( - "i", + "{", ), - 5550..5551, + 5534..5535, ), ( Token( - ":", + "nameof", ), - 5551..5552, + 5535..5541, ), ( Token( - "1", + "text", ), - 5552..5553, + 5542..5546, ), ( Token( "}", ), - 5553..5554, - ), - ( - Token( - "\"", - ), - 5554..5555, + 5546..5547, ), ( Token( - ")", + ":", ), - 5556..5557, + 5547..5548, ), ( Token( - ";", + "\\$", ), - 5557..5558, + 5548..5550, ), ( Token( - "done", + "i:1}\" );\n done ", ), - 5563..5567, + 5550..5568, ), ( Token( @@ -7439,27 +5447,9 @@ expression: tokens ), ( Token( - "if", - ), - 5713..5715, - ), - ( - Token( - "[", - ), - 5716..5717, - ), - ( - Token( - "[", - ), - 5717..5718, - ), - ( - Token( - "\"", + "if [[ \"", ), - 5719..5720, + 5712..5720, ), ( Token( @@ -7481,27 +5471,9 @@ expression: tokens ), ( Token( - "\"", - ), - 5728..5729, - ), - ( - Token( - "==", - ), - 5730..5732, - ), - ( - Token( - "*", - ), - 5733..5734, - ), - ( - Token( - "\"", + "\" == *\"", ), - 5734..5735, + 5728..5735, ), ( Token( @@ -7523,57 +5495,9 @@ expression: tokens ), ( Token( - "\"", - ), - 5743..5744, - ), - ( - Token( - "*", - ), - 5744..5745, - ), - ( - Token( - "]", - ), - 5746..5747, - ), - ( - Token( - "]", - ), - 5747..5748, - ), - ( - Token( - ";", - ), - 5748..5749, - ), - ( - Token( - "then", - ), - 5750..5754, - ), - ( - Token( - "echo", - ), - 5759..5763, - ), - ( - Token( - "1", - ), - 5764..5765, - ), - ( - Token( - "fi", + "\"* ]]; then\n echo 1\n fi ", ), - 5768..5770, + 5743..5771, ), ( Token( @@ -8345,15 +6269,9 @@ expression: tokens ), ( Token( - "\\", - ), - 6547..6548, - ), - ( - Token( - "/", + "\\/", ), - 6548..6549, + 6547..6549, ), ( Token( @@ -8501,15 +6419,9 @@ expression: tokens ), ( Token( - "\\", - ), - 6768..6769, - ), - ( - Token( - "\\", + "\\\\", ), - 6769..6770, + 6768..6770, ), ( Token( @@ -8537,27 +6449,15 @@ expression: tokens ), ( Token( - "\\", - ), - 6775..6776, - ), - ( - Token( - "\\", - ), - 6776..6777, - ), - ( - Token( - "\\", + "\\\\", ), - 6777..6778, + 6775..6777, ), ( Token( - "b", + "\\b", ), - 6778..6779, + 6777..6779, ), ( Token( @@ -8687,15 +6587,9 @@ expression: tokens ), ( Token( - "\\", + "\\b", ), - 7089..7090, - ), - ( - Token( - "b", - ), - 7090..7091, + 7089..7091, ), ( Token( @@ -8717,15 +6611,9 @@ expression: tokens ), ( Token( - "\\", - ), - 7095..7096, - ), - ( - Token( - "\\", + "\\\\", ), - 7096..7097, + 7095..7097, ), ( Token( @@ -8765,15 +6653,9 @@ expression: tokens ), ( Token( - "echo", - ), - 7128..7132, - ), - ( - Token( - "\"", + "echo \"", ), - 7133..7134, + 7127..7134, ), ( Token( @@ -8795,57 +6677,9 @@ expression: tokens ), ( Token( - "\"", - ), - 7142..7143, - ), - ( - Token( - "|", - ), - 7144..7145, - ), - ( - Token( - "sed", - ), - 7146..7149, - ), - ( - Token( - "-", - ), - 7150..7151, - ), - ( - Token( - "r", - ), - 7151..7152, - ), - ( - Token( - "-", - ), - 7153..7154, - ), - ( - Token( - "ne", - ), - 7154..7156, - ), - ( - Token( - "\"", - ), - 7157..7158, - ), - ( - Token( - "/", + "\" | sed -r -ne \"/", ), - 7158..7159, + 7142..7159, ), ( Token( @@ -8867,21 +6701,9 @@ expression: tokens ), ( Token( - "/", - ), - 7167..7168, - ), - ( - Token( - "p", - ), - 7168..7169, - ), - ( - Token( - "\"", + "/p\" ", ), - 7169..7170, + 7167..7171, ), ( Token( @@ -8911,103 +6733,49 @@ expression: tokens Token( "output", ), - 7210..7216, - ), - ( - Token( - "=", - ), - 7217..7218, - ), - ( - Token( - "$", - ), - 7219..7220, - ), - ( - Token( - "echo", - ), - 7221..7225, - ), - ( - Token( - "\"", - ), - 7226..7227, - ), - ( - Token( - "{", - ), - 7227..7228, - ), - ( - Token( - "source", - ), - 7228..7234, - ), - ( - Token( - "}", - ), - 7234..7235, - ), - ( - Token( - "\"", - ), - 7235..7236, - ), - ( - Token( - "|", - ), - 7237..7238, + 7210..7216, ), ( Token( - "sed", + "=", ), - 7239..7242, + 7217..7218, ), ( Token( - "-", + "$", ), - 7243..7244, + 7219..7220, ), ( Token( - "E", + "echo \"", ), - 7244..7245, + 7220..7227, ), ( Token( - "-", + "{", ), - 7246..7247, + 7227..7228, ), ( Token( - "ne", + "source", ), - 7247..7249, + 7228..7234, ), ( Token( - "\"", + "}", ), - 7250..7251, + 7234..7235, ), ( Token( - "/", + "\" | sed -E -ne \"/", ), - 7251..7252, + 7235..7252, ), ( Token( @@ -9029,21 +6797,9 @@ expression: tokens ), ( Token( - "/", - ), - 7260..7261, - ), - ( - Token( - "p", - ), - 7261..7262, - ), - ( - Token( - "\"", + "/p\" ", ), - 7262..7263, + 7260..7264, ), ( Token( @@ -9179,15 +6935,9 @@ expression: tokens ), ( Token( - "\\", - ), - 7528..7529, - ), - ( - Token( - "|", + "\\|", ), - 7529..7530, + 7528..7530, ), ( Token( @@ -9251,15 +7001,9 @@ expression: tokens ), ( Token( - "echo", - ), - 7575..7579, - ), - ( - Token( - "\"", + "echo \"", ), - 7580..7581, + 7574..7581, ), ( Token( @@ -9281,45 +7025,9 @@ expression: tokens ), ( Token( - "\"", - ), - 7589..7590, - ), - ( - Token( - "|", - ), - 7591..7592, - ), - ( - Token( - "sed", - ), - 7593..7596, - ), - ( - Token( - "-", - ), - 7597..7598, - ), - ( - Token( - "ne", - ), - 7598..7600, - ), - ( - Token( - "\"", - ), - 7601..7602, - ), - ( - Token( - "/", + "\" | sed -ne \"/", ), - 7602..7603, + 7589..7603, ), ( Token( @@ -9341,21 +7049,9 @@ expression: tokens ), ( Token( - "/", - ), - 7611..7612, - ), - ( - Token( - "p", - ), - 7612..7613, - ), - ( - Token( - "\"", + "/p\" ", ), - 7613..7614, + 7611..7615, ), ( Token( @@ -9779,15 +7475,9 @@ expression: tokens ), ( Token( - "echo", - ), - 8059..8063, - ), - ( - Token( - "\"", + "echo \"", ), - 8064..8065, + 8058..8065, ), ( Token( @@ -9809,21 +7499,9 @@ expression: tokens ), ( Token( - "\"", - ), - 8071..8072, - ), - ( - Token( - "|", - ), - 8073..8074, - ), - ( - Token( - "rev", + "\" | rev ", ), - 8075..8078, + 8071..8079, ), ( Token( @@ -9965,27 +7643,9 @@ expression: tokens ), ( Token( - "if", - ), - 8201..8203, - ), - ( - Token( - "[", - ), - 8204..8205, - ), - ( - Token( - "[", - ), - 8205..8206, - ), - ( - Token( - "\"", + "if [[ \"", ), - 8207..8208, + 8200..8208, ), ( Token( @@ -10007,21 +7667,9 @@ expression: tokens ), ( Token( - "\"", - ), - 8214..8215, - ), - ( - Token( - "==", - ), - 8216..8218, - ), - ( - Token( - "\"", + "\" == \"", ), - 8219..8220, + 8214..8220, ), ( Token( @@ -10043,57 +7691,9 @@ expression: tokens ), ( Token( - "\"", - ), - 8228..8229, - ), - ( - Token( - "*", - ), - 8229..8230, - ), - ( - Token( - "]", - ), - 8231..8232, - ), - ( - Token( - "]", - ), - 8232..8233, - ), - ( - Token( - ";", - ), - 8233..8234, - ), - ( - Token( - "then", - ), - 8235..8239, - ), - ( - Token( - "echo", - ), - 8244..8248, - ), - ( - Token( - "1", - ), - 8249..8250, - ), - ( - Token( - "fi", + "\"* ]]; then\n echo 1\n fi ", ), - 8253..8255, + 8228..8256, ), ( Token( @@ -10271,27 +7871,9 @@ expression: tokens ), ( Token( - "if", - ), - 8398..8400, - ), - ( - Token( - "[", - ), - 8401..8402, - ), - ( - Token( - "[", - ), - 8402..8403, - ), - ( - Token( - "\"", + "if [[ \"", ), - 8404..8405, + 8397..8405, ), ( Token( @@ -10313,27 +7895,9 @@ expression: tokens ), ( Token( - "\"", - ), - 8411..8412, - ), - ( - Token( - "==", - ), - 8413..8415, - ), - ( - Token( - "*", - ), - 8416..8417, - ), - ( - Token( - "\"", + "\" == *\"", ), - 8417..8418, + 8411..8418, ), ( Token( @@ -10355,51 +7919,9 @@ expression: tokens ), ( Token( - "\"", - ), - 8426..8427, - ), - ( - Token( - "]", - ), - 8428..8429, - ), - ( - Token( - "]", - ), - 8429..8430, - ), - ( - Token( - ";", - ), - 8430..8431, - ), - ( - Token( - "then", - ), - 8432..8436, - ), - ( - Token( - "echo", - ), - 8441..8445, - ), - ( - Token( - "1", - ), - 8446..8447, - ), - ( - Token( - "fi", + "\" ]]; then\n echo 1\n fi ", ), - 8450..8452, + 8426..8453, ), ( Token( @@ -10747,103 +8269,55 @@ expression: tokens Token( "$", ), - 9010..9011, - ), - ( - Token( - "printf", - ), - 9012..9018, - ), - ( - Token( - "\"", - ), - 9019..9020, - ), - ( - Token( - "%", - ), - 9020..9021, - ), - ( - Token( - ".", - ), - 9021..9022, - ), - ( - Token( - "{", - ), - 9022..9023, - ), - ( - Token( - "length", - ), - 9023..9029, - ), - ( - Token( - "}", - ), - 9029..9030, - ), - ( - Token( - "s", - ), - 9030..9031, + 9010..9011, ), ( Token( - "\"", + "printf \"%.", ), - 9031..9032, + 9011..9022, ), ( Token( - "\"", + "{", ), - 9033..9034, + 9022..9023, ), ( Token( - "\\", + "length", ), - 9034..9035, + 9023..9029, ), ( Token( - "$", + "}", ), - 9035..9036, + 9029..9030, ), ( Token( - "\\", + "s\" \"", ), - 9036..9037, + 9030..9034, ), ( Token( - "{", + "\\$", ), - 9037..9038, + 9034..9036, ), ( Token( - "text", + "\\{", ), - 9038..9042, + 9036..9038, ), ( Token( - ":", + "text: ", ), - 9042..9043, + 9038..9044, ), ( Token( @@ -10865,15 +8339,9 @@ expression: tokens ), ( Token( - "}", - ), - 9051..9052, - ), - ( - Token( - "\"", + "}\" ", ), - 9052..9053, + 9051..9054, ), ( Token( @@ -11015,81 +8483,27 @@ expression: tokens ), ( Token( - "printf", - ), - 9316..9322, - ), - ( - Token( - "\"", - ), - 9323..9324, - ), - ( - Token( - "%", - ), - 9324..9325, - ), - ( - Token( - ".", - ), - 9325..9326, - ), - ( - Token( - "1s", - ), - 9326..9328, - ), - ( - Token( - "\"", - ), - 9328..9329, - ), - ( - Token( - "\"", - ), - 9330..9331, - ), - ( - Token( - "\\", - ), - 9331..9332, - ), - ( - Token( - "$", + "printf \"%.1s\" \"", ), - 9332..9333, + 9315..9331, ), ( Token( - "\\", + "\\$", ), - 9333..9334, + 9331..9333, ), ( Token( - "{", - ), - 9334..9335, - ), - ( - Token( - "text", + "\\{", ), - 9335..9339, + 9333..9335, ), ( Token( - ":", + "text: ", ), - 9339..9340, + 9335..9341, ), ( Token( @@ -11111,15 +8525,9 @@ expression: tokens ), ( Token( - "}", - ), - 9348..9349, - ), - ( - Token( - "\"", + "}\" ", ), - 9349..9350, + 9348..9351, ), ( Token( @@ -11141,15 +8549,9 @@ expression: tokens ), ( Token( - "#", - ), - 9409..9410, - ), - ( - Token( - "[", + "#[", ), - 9410..9411, + 9409..9411, ), ( Token( @@ -11375,39 +8777,21 @@ expression: tokens ), ( Token( - "echo", - ), - 9600..9604, - ), - ( - Token( - "\"", - ), - 9605..9606, - ), - ( - Token( - "\\", - ), - 9606..9607, - ), - ( - Token( - "$", + "echo \"", ), - 9607..9608, + 9599..9606, ), ( Token( - "\\", + "\\$", ), - 9608..9609, + 9606..9608, ), ( Token( - "{", + "\\{", ), - 9609..9610, + 9608..9610, ), ( Token( @@ -11435,21 +8819,9 @@ expression: tokens ), ( Token( - "^", - ), - 9623..9624, - ), - ( - Token( - "}", - ), - 9624..9625, - ), - ( - Token( - "\"", + "^}\" ", ), - 9625..9626, + 9623..9627, ), ( Token( @@ -11525,15 +8897,9 @@ expression: tokens ), ( Token( - "echo", - ), - 9741..9745, - ), - ( - Token( - "\"", + "echo \"", ), - 9746..9747, + 9740..9747, ), ( Token( @@ -11555,57 +8921,15 @@ expression: tokens ), ( Token( - "\"", - ), - 9753..9754, - ), - ( - Token( - "|", - ), - 9755..9756, - ), - ( - Token( - "sed", - ), - 9757..9760, - ), - ( - Token( - "\"", - ), - 9761..9762, - ), - ( - Token( - "s", - ), - 9762..9763, - ), - ( - Token( - "/", - ), - 9763..9764, - ), - ( - Token( - "^", - ), - 9764..9765, - ), - ( - Token( - "\\", + "\" | sed \"s/^", ), - 9765..9766, + 9753..9765, ), ( Token( - "(", + "\\(", ), - 9766..9767, + 9765..9767, ), ( Token( @@ -11615,15 +8939,9 @@ expression: tokens ), ( Token( - "\\", - ), - 9768..9769, - ), - ( - Token( - ")", + "\\)", ), - 9769..9770, + 9768..9770, ), ( Token( @@ -11633,39 +8951,21 @@ expression: tokens ), ( Token( - "\\", - ), - 9771..9772, - ), - ( - Token( - "U", - ), - 9772..9773, - ), - ( - Token( - "\\", - ), - 9773..9774, - ), - ( - Token( - "1", + "\\U", ), - 9774..9775, + 9771..9773, ), ( Token( - "/", + "\\1", ), - 9775..9776, + 9773..9775, ), ( Token( - "\"", + "/\" ", ), - 9776..9777, + 9775..9778, ), ( Token( @@ -12071,21 +9371,9 @@ expression: tokens ), ( Token( - "printf", - ), - 10146..10152, - ), - ( - Token( - "\"", - ), - 10153..10154, - ), - ( - Token( - "%", + "printf \"%", ), - 10154..10155, + 10145..10155, ), ( Token( @@ -12107,57 +9395,9 @@ expression: tokens ), ( Token( - "s", - ), - 10163..10164, - ), - ( - Token( - "\"", - ), - 10164..10165, - ), - ( - Token( - "\"", - ), - 10166..10167, - ), - ( - Token( - "\"", - ), - 10167..10168, - ), - ( - Token( - "|", - ), - 10169..10170, - ), - ( - Token( - "tr", - ), - 10171..10173, - ), - ( - Token( - "\"", - ), - 10174..10175, - ), - ( - Token( - "\"", - ), - 10176..10177, - ), - ( - Token( - "\"", + "s\" \"\" | tr \" \" \"", ), - 10178..10179, + 10163..10179, ), ( Token( @@ -12179,9 +9419,9 @@ expression: tokens ), ( Token( - "\"", + "\" ", ), - 10184..10185, + 10184..10186, ), ( Token( @@ -12473,21 +9713,9 @@ expression: tokens ), ( Token( - "printf", - ), - 10463..10469, - ), - ( - Token( - "\"", - ), - 10470..10471, - ), - ( - Token( - "%", + "printf \"%", ), - 10471..10472, + 10462..10472, ), ( Token( @@ -12509,57 +9737,9 @@ expression: tokens ), ( Token( - "s", - ), - 10480..10481, - ), - ( - Token( - "\"", - ), - 10481..10482, - ), - ( - Token( - "\"", - ), - 10483..10484, - ), - ( - Token( - "\"", - ), - 10484..10485, - ), - ( - Token( - "|", - ), - 10486..10487, - ), - ( - Token( - "tr", + "s\" \"\" | tr \" \" \"", ), - 10488..10490, - ), - ( - Token( - "\"", - ), - 10491..10492, - ), - ( - Token( - "\"", - ), - 10493..10494, - ), - ( - Token( - "\"", - ), - 10495..10496, + 10480..10496, ), ( Token( @@ -12581,9 +9761,9 @@ expression: tokens ), ( Token( - "\"", + "\" ", ), - 10501..10502, + 10501..10503, ), ( Token( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call-2.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call-2.snap index 3bf4af5..a8d8792 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call-2.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call-2.snap @@ -242,29 +242,11 @@ expression: result ( Text( ( - "text", - 165..169, + "text.txt", + 165..173, ), ), - 165..169, - ), - ( - Text( - ( - ".", - 169..170, - ), - ), - 169..170, - ), - ( - Text( - ( - "txt", - 170..173, - ), - ), - 170..173, + 165..173, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call.snap index e76b58b..86c1267 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__unfinished_function_call.snap @@ -41,21 +41,9 @@ expression: tokens ), ( Token( - "std", + "std/array", ), - 37..40, - ), - ( - Token( - "/", - ), - 40..41, - ), - ( - Token( - "array", - ), - 41..46, + 37..46, ), ( Token( @@ -263,21 +251,9 @@ expression: tokens ), ( Token( - "text", - ), - 165..169, - ), - ( - Token( - ".", - ), - 169..170, - ), - ( - Token( - "txt", + "text.txt", ), - 170..173, + 165..173, ), ( Token( From 1ee9bb2145a559dbea1a342a69bc6bc1786969df Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sun, 9 Nov 2025 18:40:37 +0100 Subject: [PATCH 09/19] Added lexer to other versions --- rustfmt.toml | 1 + src/analysis/alpha034/exp.rs | 58 +- src/analysis/alpha034/global.rs | 60 +- src/analysis/alpha034/stmnts.rs | 50 +- src/analysis/alpha035/exp.rs | 64 +- src/analysis/alpha035/global.rs | 70 +- src/analysis/alpha035/stmnts.rs | 74 +- src/analysis/alpha040/exp.rs | 64 +- src/analysis/alpha040/global.rs | 72 +- src/analysis/alpha040/stmnts.rs | 74 +- src/analysis/alpha050/exp.rs | 66 +- src/analysis/alpha050/global.rs | 76 +- src/analysis/alpha050/stmnts.rs | 76 +- src/analysis/mod.rs | 44 +- src/analysis/types.rs | 18 +- src/backend.rs | 2 +- src/files.rs | 28 +- src/fs.rs | 26 +- src/grammar/alpha034/expressions/and.rs | 18 +- .../alpha034/expressions/atom/array.rs | 16 +- src/grammar/alpha034/expressions/atom/bool.rs | 14 +- src/grammar/alpha034/expressions/atom/call.rs | 30 +- .../alpha034/expressions/atom/command.rs | 26 +- src/grammar/alpha034/expressions/atom/null.rs | 14 +- .../alpha034/expressions/atom/number.rs | 56 +- .../alpha034/expressions/atom/parentheses.rs | 14 +- .../alpha034/expressions/atom/status.rs | 14 +- src/grammar/alpha034/expressions/atom/text.rs | 18 +- src/grammar/alpha034/expressions/atom/var.rs | 2 +- src/grammar/alpha034/expressions/cast.rs | 22 +- .../alpha034/expressions/comparison.rs | 18 +- src/grammar/alpha034/expressions/is.rs | 22 +- src/grammar/alpha034/expressions/or.rs | 22 +- src/grammar/alpha034/expressions/product.rs | 18 +- src/grammar/alpha034/expressions/range.rs | 18 +- src/grammar/alpha034/expressions/sum.rs | 18 +- src/grammar/alpha034/expressions/ternary.rs | 2 +- src/grammar/alpha034/expressions/unary.rs | 16 +- src/grammar/alpha034/global.rs | 21 +- src/grammar/alpha034/lexer.rs | 482 +- src/grammar/alpha034/mod.rs | 48 +- src/grammar/alpha034/parser.rs | 6 +- src/grammar/alpha034/statements/block.rs | 18 +- src/grammar/alpha034/statements/comment.rs | 2 +- src/grammar/alpha034/statements/const_init.rs | 28 +- src/grammar/alpha034/statements/failed.rs | 18 +- src/grammar/alpha034/statements/if_cond.rs | 28 +- src/grammar/alpha034/statements/keywords.rs | 20 +- src/grammar/alpha034/statements/loops.rs | 30 +- src/grammar/alpha034/statements/mod.rs | 8 +- src/grammar/alpha034/statements/modifiers.rs | 14 +- src/grammar/alpha034/statements/shebang.rs | 2 +- src/grammar/alpha034/statements/shorthands.rs | 26 +- src/grammar/alpha034/statements/var_init.rs | 28 +- src/grammar/alpha034/statements/var_set.rs | 26 +- src/grammar/alpha035/expressions/and.rs | 18 +- .../alpha035/expressions/atom/array.rs | 16 +- src/grammar/alpha035/expressions/atom/bool.rs | 14 +- src/grammar/alpha035/expressions/atom/call.rs | 30 +- .../alpha035/expressions/atom/command.rs | 26 +- src/grammar/alpha035/expressions/atom/null.rs | 14 +- .../alpha035/expressions/atom/number.rs | 56 +- .../alpha035/expressions/atom/parentheses.rs | 14 +- .../alpha035/expressions/atom/status.rs | 14 +- src/grammar/alpha035/expressions/atom/text.rs | 18 +- src/grammar/alpha035/expressions/atom/var.rs | 2 +- src/grammar/alpha035/expressions/cast.rs | 22 +- .../alpha035/expressions/comparison.rs | 18 +- src/grammar/alpha035/expressions/is.rs | 22 +- src/grammar/alpha035/expressions/or.rs | 22 +- src/grammar/alpha035/expressions/product.rs | 18 +- src/grammar/alpha035/expressions/range.rs | 18 +- src/grammar/alpha035/expressions/sum.rs | 18 +- src/grammar/alpha035/expressions/ternary.rs | 2 +- src/grammar/alpha035/expressions/unary.rs | 16 +- src/grammar/alpha035/global.rs | 17 +- src/grammar/alpha035/lexer.rs | 474 +- src/grammar/alpha035/mod.rs | 48 +- src/grammar/alpha035/parser.rs | 6 +- src/grammar/alpha035/statements/block.rs | 18 +- src/grammar/alpha035/statements/comment.rs | 2 +- src/grammar/alpha035/statements/const_init.rs | 28 +- src/grammar/alpha035/statements/failed.rs | 18 +- src/grammar/alpha035/statements/if_cond.rs | 28 +- src/grammar/alpha035/statements/keywords.rs | 20 +- src/grammar/alpha035/statements/loops.rs | 30 +- src/grammar/alpha035/statements/mod.rs | 8 +- src/grammar/alpha035/statements/modifiers.rs | 14 +- src/grammar/alpha035/statements/move_files.rs | 26 +- src/grammar/alpha035/statements/shebang.rs | 2 +- src/grammar/alpha035/statements/shorthands.rs | 26 +- src/grammar/alpha035/statements/var_init.rs | 28 +- src/grammar/alpha035/statements/var_set.rs | 26 +- src/grammar/alpha040/expressions/and.rs | 18 +- .../alpha040/expressions/atom/array.rs | 16 +- src/grammar/alpha040/expressions/atom/bool.rs | 14 +- src/grammar/alpha040/expressions/atom/call.rs | 30 +- .../alpha040/expressions/atom/command.rs | 26 +- src/grammar/alpha040/expressions/atom/exit.rs | 14 +- src/grammar/alpha040/expressions/atom/mod.rs | 18 +- src/grammar/alpha040/expressions/atom/null.rs | 14 +- .../alpha040/expressions/atom/number.rs | 56 +- .../alpha040/expressions/atom/parentheses.rs | 14 +- .../alpha040/expressions/atom/status.rs | 14 +- src/grammar/alpha040/expressions/atom/text.rs | 18 +- src/grammar/alpha040/expressions/atom/var.rs | 2 +- src/grammar/alpha040/expressions/cast.rs | 22 +- .../alpha040/expressions/comparison.rs | 18 +- src/grammar/alpha040/expressions/is.rs | 22 +- src/grammar/alpha040/expressions/or.rs | 22 +- src/grammar/alpha040/expressions/product.rs | 18 +- src/grammar/alpha040/expressions/range.rs | 18 +- src/grammar/alpha040/expressions/sum.rs | 18 +- src/grammar/alpha040/expressions/ternary.rs | 2 +- src/grammar/alpha040/expressions/unary.rs | 16 +- src/grammar/alpha040/global.rs | 17 +- src/grammar/alpha040/lexer.rs | 482 +- src/grammar/alpha040/mod.rs | 48 +- src/grammar/alpha040/parser.rs | 6 +- src/grammar/alpha040/statements/block.rs | 18 +- src/grammar/alpha040/statements/comment.rs | 2 +- src/grammar/alpha040/statements/const_init.rs | 28 +- src/grammar/alpha040/statements/failed.rs | 18 +- src/grammar/alpha040/statements/if_cond.rs | 28 +- src/grammar/alpha040/statements/keywords.rs | 20 +- src/grammar/alpha040/statements/loops.rs | 30 +- src/grammar/alpha040/statements/mod.rs | 8 +- src/grammar/alpha040/statements/modifiers.rs | 14 +- src/grammar/alpha040/statements/move_files.rs | 26 +- src/grammar/alpha040/statements/shebang.rs | 2 +- src/grammar/alpha040/statements/shorthands.rs | 26 +- src/grammar/alpha040/statements/var_init.rs | 28 +- src/grammar/alpha040/statements/var_set.rs | 26 +- src/grammar/alpha050/expressions/and.rs | 18 +- .../alpha050/expressions/atom/array.rs | 16 +- src/grammar/alpha050/expressions/atom/bool.rs | 14 +- src/grammar/alpha050/expressions/atom/call.rs | 30 +- .../alpha050/expressions/atom/command.rs | 26 +- src/grammar/alpha050/expressions/atom/exit.rs | 14 +- src/grammar/alpha050/expressions/atom/mod.rs | 18 +- src/grammar/alpha050/expressions/atom/null.rs | 14 +- .../alpha050/expressions/atom/number.rs | 12 +- .../alpha050/expressions/atom/parentheses.rs | 14 +- .../alpha050/expressions/atom/status.rs | 14 +- src/grammar/alpha050/expressions/atom/text.rs | 18 +- src/grammar/alpha050/expressions/atom/var.rs | 2 +- src/grammar/alpha050/expressions/cast.rs | 22 +- .../alpha050/expressions/comparison.rs | 18 +- src/grammar/alpha050/expressions/is.rs | 22 +- src/grammar/alpha050/expressions/or.rs | 22 +- src/grammar/alpha050/expressions/product.rs | 18 +- src/grammar/alpha050/expressions/range.rs | 18 +- src/grammar/alpha050/expressions/sum.rs | 18 +- src/grammar/alpha050/expressions/ternary.rs | 2 +- src/grammar/alpha050/expressions/unary.rs | 16 +- src/grammar/alpha050/global.rs | 26 +- .../alpha050/{lexer_logos_v2.rs => lexer.rs} | 43 - src/grammar/alpha050/mod.rs | 24 +- src/grammar/alpha050/parser.rs | 6 +- src/grammar/alpha050/statements/block.rs | 18 +- src/grammar/alpha050/statements/const_init.rs | 26 +- .../alpha050/statements/failable_handlers.rs | 30 +- src/grammar/alpha050/statements/if_cond.rs | 28 +- src/grammar/alpha050/statements/keywords.rs | 20 +- src/grammar/alpha050/statements/loops.rs | 30 +- src/grammar/alpha050/statements/mod.rs | 8 +- src/grammar/alpha050/statements/modifiers.rs | 14 +- src/grammar/alpha050/statements/move_files.rs | 26 +- src/grammar/alpha050/statements/shorthands.rs | 26 +- src/grammar/alpha050/statements/var_init.rs | 28 +- src/grammar/alpha050/statements/var_set.rs | 26 +- src/grammar/mod.rs | 6 +- src/main.rs | 12 +- src/stdlib.rs | 20 +- tests/analysis/alpha034.rs | 26 +- tests/analysis/alpha050.rs | 22 +- tests/grammar/alpha034.rs | 12 +- tests/grammar/alpha035.rs | 12 +- tests/grammar/alpha040.rs | 12 +- tests/grammar/alpha050.rs | 12 +- .../r#mod__grammar__alpha034__array-10.snap | 4 +- .../r#mod__grammar__alpha034__array-11.snap | 2 +- .../r#mod__grammar__alpha034__array-5.snap | 2 +- .../r#mod__grammar__alpha034__array-8.snap | 2 +- .../r#mod__grammar__alpha034__array-9.snap | 4 +- .../r#mod__grammar__alpha034__command-2.snap | 32 +- .../r#mod__grammar__alpha034__command-3.snap | 16 +- .../r#mod__grammar__alpha034__command-4.snap | 10 +- .../r#mod__grammar__alpha034__command-5.snap | 16 +- .../r#mod__grammar__alpha034__command-6.snap | 4 +- .../r#mod__grammar__alpha034__command-7.snap | 34 +- .../r#mod__grammar__alpha034__command-8.snap | 4 +- .../r#mod__grammar__alpha034__command-9.snap | 4 +- .../r#mod__grammar__alpha034__command.snap | 32 +- ...mmar__alpha034__function_invocation-5.snap | 2 +- ...mmar__alpha034__function_invocation-7.snap | 4 +- ...mmar__alpha034__function_invocation-8.snap | 4 +- ...mmar__alpha034__function_invocation-9.snap | 2 +- .../r#mod__grammar__alpha034__lexer.snap | 98 +- ...mod__grammar__alpha034__parentheses-3.snap | 2 +- ...mod__grammar__alpha034__parentheses-4.snap | 2 +- .../r#mod__grammar__alpha034__recovery-4.snap | 14 +- .../r#mod__grammar__alpha034__recovery-5.snap | 41 +- .../r#mod__grammar__alpha034__stdlib.snap | 2350 +------ .../r#mod__grammar__alpha034__ternary-5.snap | 2 +- .../r#mod__grammar__alpha034__text-2.snap | 17 +- .../r#mod__grammar__alpha034__text-3.snap | 59 +- .../r#mod__grammar__alpha034__text-4.snap | 37 +- .../r#mod__grammar__alpha034__text-8.snap | 4 +- .../r#mod__grammar__alpha034__text.snap | 35 +- ...r#mod__grammar__alpha035__stdlib_date.snap | 337 +- .../r#mod__grammar__alpha035__stdlib_env.snap | 1629 +---- .../r#mod__grammar__alpha035__stdlib_fs.snap | 288 +- ...r#mod__grammar__alpha035__stdlib_http.snap | 84 +- ...r#mod__grammar__alpha035__stdlib_math.snap | 506 +- ...r#mod__grammar__alpha035__stdlib_text.snap | 1758 +---- ...d__grammar__alpha040__comments_in_ifs.snap | 24 +- ...r#mod__grammar__alpha040__stdlib_date.snap | 345 +- .../r#mod__grammar__alpha040__stdlib_env.snap | 1731 +---- .../r#mod__grammar__alpha040__stdlib_fs.snap | 1315 +--- ...r#mod__grammar__alpha040__stdlib_http.snap | 96 +- ...r#mod__grammar__alpha040__stdlib_math.snap | 506 +- ...mod__grammar__alpha040__stdlib_text-2.snap | 2576 +------ ...r#mod__grammar__alpha040__stdlib_text.snap | 5980 +++++------------ ..._alpha040__unfinished_function_call-2.snap | 24 +- ...r__alpha040__unfinished_function_call.snap | 32 +- 226 files changed, 6960 insertions(+), 18529 deletions(-) rename src/grammar/alpha050/{lexer_logos_v2.rs => lexer.rs} (95%) diff --git a/rustfmt.toml b/rustfmt.toml index 27f8fd6..bb5db29 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1 +1,2 @@ imports_layout="Vertical" +imports_granularity="Module" diff --git a/src/analysis/alpha034/exp.rs b/src/analysis/alpha034/exp.rs index da02dbb..e54ec38 100644 --- a/src/analysis/alpha034/exp.rs +++ b/src/analysis/alpha034/exp.rs @@ -2,38 +2,34 @@ use std::vec; use chumsky::span::SimpleSpan; -use crate::{ - analysis::{ - get_symbol_definition_info, - insert_symbol_reference, - types::{ - make_union_type, - matches_type, - DataType, - GenericsMap, - }, - Context, - FunctionArgument, - FunctionSymbol, - SymbolInfo, - SymbolLocation, - SymbolType, - VariableSymbol, - }, - files::{ - FileVersion, - Files, - }, - grammar::{ - alpha034::{ - Expression, - InterpolatedCommand, - InterpolatedText, - }, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + DataType, + GenericsMap, }; +use crate::analysis::{ + get_symbol_definition_info, + insert_symbol_reference, + Context, + FunctionArgument, + FunctionSymbol, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, +}; +use crate::files::{ + FileVersion, + Files, +}; +use crate::grammar::alpha034::{ + Expression, + InterpolatedCommand, + InterpolatedText, +}; +use crate::grammar::Spanned; +use crate::paths::FileId; use super::stmnts::analyze_failure_handler; diff --git a/src/analysis/alpha034/global.rs b/src/analysis/alpha034/global.rs index d1c2a81..a8bc501 100644 --- a/src/analysis/alpha034/global.rs +++ b/src/analysis/alpha034/global.rs @@ -1,35 +1,33 @@ -use crate::{ - analysis::{ - self, - import_symbol, - insert_symbol_definition, - map_import_path, - types::{ - make_union_type, - matches_type, - DataType, - }, - Context, - FunctionContext, - FunctionSymbol, - ImportContext, - SymbolInfo, - SymbolType, - VariableSymbol, - }, - backend::Backend, - files::FileVersion, - grammar::{ - alpha034::{ - FunctionArgument, - GlobalStatement, - ImportContent, - }, - Span, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + DataType, }; +use crate::analysis::{ + self, + import_symbol, + insert_symbol_definition, + map_import_path, + Context, + FunctionContext, + FunctionSymbol, + ImportContext, + SymbolInfo, + SymbolType, + VariableSymbol, +}; +use crate::backend::Backend; +use crate::files::FileVersion; +use crate::grammar::alpha034::{ + FunctionArgument, + GlobalStatement, + ImportContent, +}; +use crate::grammar::{ + Span, + Spanned, +}; +use crate::paths::FileId; use super::stmnts::analyze_stmnt; diff --git a/src/analysis/alpha034/stmnts.rs b/src/analysis/alpha034/stmnts.rs index 37ae7e3..fc31391 100644 --- a/src/analysis/alpha034/stmnts.rs +++ b/src/analysis/alpha034/stmnts.rs @@ -1,31 +1,27 @@ -use crate::{ - analysis::{ - get_symbol_definition_info, - insert_symbol_definition, - insert_symbol_reference, - types::{ - make_union_type, - matches_type, - GenericsMap, - }, - BlockContext, - Context, - DataType, - SymbolInfo, - SymbolLocation, - SymbolType, - VariableSymbol, - }, - files::{ - FileVersion, - Files, - }, - grammar::{ - alpha034::*, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + GenericsMap, }; +use crate::analysis::{ + get_symbol_definition_info, + insert_symbol_definition, + insert_symbol_reference, + BlockContext, + Context, + DataType, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, +}; +use crate::files::{ + FileVersion, + Files, +}; +use crate::grammar::alpha034::*; +use crate::grammar::Spanned; +use crate::paths::FileId; use super::exp::analyze_exp; diff --git a/src/analysis/alpha035/exp.rs b/src/analysis/alpha035/exp.rs index bd25a91..8a8b7ed 100644 --- a/src/analysis/alpha035/exp.rs +++ b/src/analysis/alpha035/exp.rs @@ -2,40 +2,38 @@ use std::vec; use chumsky::span::SimpleSpan; -use crate::{ - analysis::{ - get_symbol_definition_info, - insert_symbol_reference, - types::{ - make_union_type, - matches_type, - DataType, - GenericsMap, - }, - BlockContext, - Context, - FunctionArgument, - FunctionSymbol, - SymbolInfo, - SymbolLocation, - SymbolType, - VariableSymbol, - }, - files::{ - FileVersion, - Files, - }, - grammar::{ - alpha035::{ - Expression, - InterpolatedCommand, - InterpolatedText, - }, - CommandModifier, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + DataType, + GenericsMap, +}; +use crate::analysis::{ + get_symbol_definition_info, + insert_symbol_reference, + BlockContext, + Context, + FunctionArgument, + FunctionSymbol, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, +}; +use crate::files::{ + FileVersion, + Files, +}; +use crate::grammar::alpha035::{ + Expression, + InterpolatedCommand, + InterpolatedText, +}; +use crate::grammar::{ + CommandModifier, + Spanned, }; +use crate::paths::FileId; use super::stmnts::{ analyze_failure_handler, diff --git a/src/analysis/alpha035/global.rs b/src/analysis/alpha035/global.rs index 06181dd..4c0fd15 100644 --- a/src/analysis/alpha035/global.rs +++ b/src/analysis/alpha035/global.rs @@ -1,42 +1,38 @@ -use crate::{ - analysis::{ - self, - import_symbol, - insert_symbol_definition, - map_import_path, - types::{ - make_union_type, - matches_type, - DataType, - }, - Context, - FunctionContext, - FunctionSymbol, - ImportContext, - SymbolInfo, - SymbolType, - VariableSymbol, - }, - backend::Backend, - files::FileVersion, - grammar::{ - alpha035::{ - FunctionArgument, - GlobalStatement, - ImportContent, - }, - Span, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + DataType, }; +use crate::analysis::{ + self, + import_symbol, + insert_symbol_definition, + map_import_path, + Context, + FunctionContext, + FunctionSymbol, + ImportContext, + SymbolInfo, + SymbolType, + VariableSymbol, +}; +use crate::backend::Backend; +use crate::files::FileVersion; +use crate::grammar::alpha035::{ + FunctionArgument, + GlobalStatement, + ImportContent, +}; +use crate::grammar::{ + Span, + Spanned, +}; +use crate::paths::FileId; -use super::{ - exp::analyze_exp, - stmnts::{ - analyze_stmnt, - StmntAnalysisResult, - }, +use super::exp::analyze_exp; +use super::stmnts::{ + analyze_stmnt, + StmntAnalysisResult, }; #[tracing::instrument(skip_all)] diff --git a/src/analysis/alpha035/stmnts.rs b/src/analysis/alpha035/stmnts.rs index edb9b9e..b3ef1b8 100644 --- a/src/analysis/alpha035/stmnts.rs +++ b/src/analysis/alpha035/stmnts.rs @@ -1,42 +1,40 @@ -use crate::{ - analysis::{ - get_symbol_definition_info, - insert_symbol_definition, - insert_symbol_reference, - types::{ - make_union_type, - matches_type, - GenericsMap, - }, - BlockContext, - Context, - DataType, - SymbolInfo, - SymbolLocation, - SymbolType, - VariableSymbol, - }, - files::{ - FileVersion, - Files, - }, - grammar::{ - alpha035::{ - Block, - Comment, - ElseCondition, - FailureHandler, - IfChainContent, - IfCondition, - IterLoopVars, - Statement, - VariableInitType, - }, - CommandModifier, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + GenericsMap, +}; +use crate::analysis::{ + get_symbol_definition_info, + insert_symbol_definition, + insert_symbol_reference, + BlockContext, + Context, + DataType, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, +}; +use crate::files::{ + FileVersion, + Files, +}; +use crate::grammar::alpha035::{ + Block, + Comment, + ElseCondition, + FailureHandler, + IfChainContent, + IfCondition, + IterLoopVars, + Statement, + VariableInitType, +}; +use crate::grammar::{ + CommandModifier, + Spanned, }; +use crate::paths::FileId; use super::exp::{ analyze_exp, diff --git a/src/analysis/alpha040/exp.rs b/src/analysis/alpha040/exp.rs index 480afe1..2d2c50b 100644 --- a/src/analysis/alpha040/exp.rs +++ b/src/analysis/alpha040/exp.rs @@ -2,40 +2,38 @@ use std::vec; use chumsky::span::SimpleSpan; -use crate::{ - analysis::{ - get_symbol_definition_info, - insert_symbol_reference, - types::{ - make_union_type, - matches_type, - DataType, - GenericsMap, - }, - BlockContext, - Context, - FunctionArgument, - FunctionSymbol, - SymbolInfo, - SymbolLocation, - SymbolType, - VariableSymbol, - }, - files::{ - FileVersion, - Files, - }, - grammar::{ - alpha040::{ - Expression, - InterpolatedCommand, - InterpolatedText, - }, - CommandModifier, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + DataType, + GenericsMap, +}; +use crate::analysis::{ + get_symbol_definition_info, + insert_symbol_reference, + BlockContext, + Context, + FunctionArgument, + FunctionSymbol, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, +}; +use crate::files::{ + FileVersion, + Files, +}; +use crate::grammar::alpha040::{ + Expression, + InterpolatedCommand, + InterpolatedText, +}; +use crate::grammar::{ + CommandModifier, + Spanned, }; +use crate::paths::FileId; use super::stmnts::{ analyze_failure_handler, diff --git a/src/analysis/alpha040/global.rs b/src/analysis/alpha040/global.rs index 1c9d1a4..de92fd7 100644 --- a/src/analysis/alpha040/global.rs +++ b/src/analysis/alpha040/global.rs @@ -1,43 +1,39 @@ -use crate::{ - analysis::{ - self, - import_symbol, - insert_symbol_definition, - map_import_path, - types::{ - make_union_type, - matches_type, - DataType, - }, - Context, - FunctionContext, - FunctionSymbol, - ImportContext, - SymbolInfo, - SymbolType, - VariableSymbol, - }, - backend::Backend, - files::FileVersion, - grammar::{ - alpha040::{ - FunctionArgument, - GlobalStatement, - ImportContent, - }, - Span, - Spanned, - }, - paths::FileId, - stdlib::is_builtin_file, +use crate::analysis::types::{ + make_union_type, + matches_type, + DataType, }; +use crate::analysis::{ + self, + import_symbol, + insert_symbol_definition, + map_import_path, + Context, + FunctionContext, + FunctionSymbol, + ImportContext, + SymbolInfo, + SymbolType, + VariableSymbol, +}; +use crate::backend::Backend; +use crate::files::FileVersion; +use crate::grammar::alpha040::{ + FunctionArgument, + GlobalStatement, + ImportContent, +}; +use crate::grammar::{ + Span, + Spanned, +}; +use crate::paths::FileId; +use crate::stdlib::is_builtin_file; -use super::{ - exp::analyze_exp, - stmnts::{ - analyze_stmnt, - StmntAnalysisResult, - }, +use super::exp::analyze_exp; +use super::stmnts::{ + analyze_stmnt, + StmntAnalysisResult, }; #[tracing::instrument(skip_all)] diff --git a/src/analysis/alpha040/stmnts.rs b/src/analysis/alpha040/stmnts.rs index 013a657..ee51344 100644 --- a/src/analysis/alpha040/stmnts.rs +++ b/src/analysis/alpha040/stmnts.rs @@ -1,42 +1,40 @@ -use crate::{ - analysis::{ - get_symbol_definition_info, - insert_symbol_definition, - insert_symbol_reference, - types::{ - make_union_type, - matches_type, - GenericsMap, - }, - BlockContext, - Context, - DataType, - SymbolInfo, - SymbolLocation, - SymbolType, - VariableSymbol, - }, - files::{ - FileVersion, - Files, - }, - grammar::{ - alpha040::{ - Block, - Comment, - ElseCondition, - FailureHandler, - IfChainContent, - IfCondition, - IterLoopVars, - Statement, - VariableInitType, - }, - CommandModifier, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + GenericsMap, +}; +use crate::analysis::{ + get_symbol_definition_info, + insert_symbol_definition, + insert_symbol_reference, + BlockContext, + Context, + DataType, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, +}; +use crate::files::{ + FileVersion, + Files, +}; +use crate::grammar::alpha040::{ + Block, + Comment, + ElseCondition, + FailureHandler, + IfChainContent, + IfCondition, + IterLoopVars, + Statement, + VariableInitType, +}; +use crate::grammar::{ + CommandModifier, + Spanned, }; +use crate::paths::FileId; use super::exp::{ analyze_exp, diff --git a/src/analysis/alpha050/exp.rs b/src/analysis/alpha050/exp.rs index 68cd99f..78b8301 100644 --- a/src/analysis/alpha050/exp.rs +++ b/src/analysis/alpha050/exp.rs @@ -2,41 +2,39 @@ use std::vec; use chumsky::span::SimpleSpan; -use crate::{ - analysis::{ - get_symbol_definition_info, - insert_symbol_reference, - types::{ - make_union_type, - matches_type, - DataType, - GenericsMap, - }, - BlockContext, - Context, - FunctionArgument, - FunctionSymbol, - SymbolInfo, - SymbolLocation, - SymbolType, - VariableSymbol, - }, - files::{ - FileVersion, - Files, - }, - grammar::{ - alpha050::{ - Expression, - FailableHandler, - InterpolatedCommand, - InterpolatedText, - }, - CommandModifier, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + DataType, + GenericsMap, +}; +use crate::analysis::{ + get_symbol_definition_info, + insert_symbol_reference, + BlockContext, + Context, + FunctionArgument, + FunctionSymbol, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, +}; +use crate::files::{ + FileVersion, + Files, +}; +use crate::grammar::alpha050::{ + Expression, + FailableHandler, + InterpolatedCommand, + InterpolatedText, +}; +use crate::grammar::{ + CommandModifier, + Spanned, }; +use crate::paths::FileId; use super::stmnts::{ analyze_failable_handlers, diff --git a/src/analysis/alpha050/global.rs b/src/analysis/alpha050/global.rs index ba40ad9..f0023ad 100644 --- a/src/analysis/alpha050/global.rs +++ b/src/analysis/alpha050/global.rs @@ -1,45 +1,41 @@ -use crate::{ - analysis::{ - self, - import_symbol, - insert_symbol_definition, - map_import_path, - types::{ - make_union_type, - matches_type, - DataType, - }, - Context, - FunctionContext, - FunctionSymbol, - ImportContext, - SymbolInfo, - SymbolType, - VariableSymbol, - }, - backend::Backend, - files::FileVersion, - grammar::{ - alpha050::{ - Block, - FunctionArgument, - GlobalStatement, - ImportContent, - Statement, - }, - Span, - Spanned, - }, - paths::FileId, - stdlib::is_builtin_file, +use crate::analysis::types::{ + make_union_type, + matches_type, + DataType, }; +use crate::analysis::{ + self, + import_symbol, + insert_symbol_definition, + map_import_path, + Context, + FunctionContext, + FunctionSymbol, + ImportContext, + SymbolInfo, + SymbolType, + VariableSymbol, +}; +use crate::backend::Backend; +use crate::files::FileVersion; +use crate::grammar::alpha050::{ + Block, + FunctionArgument, + GlobalStatement, + ImportContent, + Statement, +}; +use crate::grammar::{ + Span, + Spanned, +}; +use crate::paths::FileId; +use crate::stdlib::is_builtin_file; -use super::{ - exp::analyze_exp, - stmnts::{ - analyze_stmnt, - StmntAnalysisResult, - }, +use super::exp::analyze_exp; +use super::stmnts::{ + analyze_stmnt, + StmntAnalysisResult, }; #[tracing::instrument(skip_all)] diff --git a/src/analysis/alpha050/stmnts.rs b/src/analysis/alpha050/stmnts.rs index b5a96e4..25cdc47 100644 --- a/src/analysis/alpha050/stmnts.rs +++ b/src/analysis/alpha050/stmnts.rs @@ -1,43 +1,41 @@ -use crate::{ - analysis::{ - get_symbol_definition_info, - insert_symbol_definition, - insert_symbol_reference, - types::{ - make_union_type, - matches_type, - GenericsMap, - }, - BlockContext, - Context, - DataType, - SymbolInfo, - SymbolLocation, - SymbolType, - VariableSymbol, - }, - files::{ - FileVersion, - Files, - }, - grammar::{ - alpha050::{ - Block, - Comment, - ElseCondition, - FailableHandler, - FailureHandler, - IfChainContent, - IfCondition, - IterLoopVars, - Statement, - VariableInitType, - }, - CommandModifier, - Spanned, - }, - paths::FileId, +use crate::analysis::types::{ + make_union_type, + matches_type, + GenericsMap, +}; +use crate::analysis::{ + get_symbol_definition_info, + insert_symbol_definition, + insert_symbol_reference, + BlockContext, + Context, + DataType, + SymbolInfo, + SymbolLocation, + SymbolType, + VariableSymbol, +}; +use crate::files::{ + FileVersion, + Files, +}; +use crate::grammar::alpha050::{ + Block, + Comment, + ElseCondition, + FailableHandler, + FailureHandler, + IfChainContent, + IfCondition, + IterLoopVars, + Statement, + VariableInitType, +}; +use crate::grammar::{ + CommandModifier, + Spanned, }; +use crate::paths::FileId; use super::exp::{ analyze_exp, diff --git a/src/analysis/mod.rs b/src/analysis/mod.rs index f4f3402..f04cb16 100644 --- a/src/analysis/mod.rs +++ b/src/analysis/mod.rs @@ -1,35 +1,29 @@ use rangemap::RangeInclusiveMap; -use std::{ - collections::HashMap, - ops::RangeInclusive, -}; -use tower_lsp_server::{ - lsp_types::Uri, - UriExt, -}; +use std::collections::HashMap; +use std::ops::RangeInclusive; +use tower_lsp_server::lsp_types::Uri; +use tower_lsp_server::UriExt; use types::{ DataType, GenericsMap, }; -use crate::{ - backend::{ - AmberVersion, - Backend, - }, - files::{ - FileVersion, - Files, - }, - grammar::{ - CommandModifier, - CompilerFlag, - Span, - Spanned, - }, - paths::FileId, - stdlib::resolve, +use crate::backend::{ + AmberVersion, + Backend, +}; +use crate::files::{ + FileVersion, + Files, +}; +use crate::grammar::{ + CommandModifier, + CompilerFlag, + Span, + Spanned, }; +use crate::paths::FileId; +use crate::stdlib::resolve; pub mod alpha034; pub mod alpha035; diff --git a/src/analysis/types.rs b/src/analysis/types.rs index d981d16..5696ddd 100644 --- a/src/analysis/types.rs +++ b/src/analysis/types.rs @@ -1,20 +1,16 @@ +use std::collections::HashSet; use std::fmt::{ self, Display, }; +use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering::SeqCst; -use std::{ - collections::HashSet, - sync::atomic::AtomicUsize, -}; -use crate::{ - files::FileVersion, - paths::FileId, - utils::{ - FastDashMap, - FastDashSet, - }, +use crate::files::FileVersion; +use crate::paths::FileId; +use crate::utils::{ + FastDashMap, + FastDashSet, }; #[derive(PartialEq, Eq, Clone, Hash)] diff --git a/src/backend.rs b/src/backend.rs index 37e9be0..0464092 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -10,10 +10,10 @@ use tower_lsp_server::jsonrpc::{ Result, }; use tower_lsp_server::lsp_types::*; -use tower_lsp_server::UriExt; use tower_lsp_server::{ Client, LanguageServer, + UriExt, }; use crate::analysis::{ diff --git a/src/files.rs b/src/files.rs index 3e45430..5586e0b 100644 --- a/src/files.rs +++ b/src/files.rs @@ -5,23 +5,19 @@ use ropey::Rope; use tokio::sync::RwLock; use tower_lsp_server::lsp_types::Uri; -use crate::{ - analysis::{ - types::GenericsMap, - SymbolTable, - }, - fs::FS, - grammar::{ - Grammar, - Spanned, - SpannedSemanticToken, - }, - paths::{ - FileId, - PathInterner, - }, - utils::FastDashMap, +use crate::analysis::types::GenericsMap; +use crate::analysis::SymbolTable; +use crate::fs::FS; +use crate::grammar::{ + Grammar, + Spanned, + SpannedSemanticToken, }; +use crate::paths::{ + FileId, + PathInterner, +}; +use crate::utils::FastDashMap; #[derive(Copy, Debug, Clone, PartialEq, Eq, Hash)] pub struct FileVersion(pub i32); diff --git a/src/fs.rs b/src/fs.rs index afcafbd..144cf7c 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -1,17 +1,15 @@ -use std::{ - collections::HashMap, - fmt::Debug, - future::Future, - io::Result, - path::{ - Path, - PathBuf, - }, - pin::Pin, - sync::{ - Arc, - Mutex, - }, +use std::collections::HashMap; +use std::fmt::Debug; +use std::future::Future; +use std::io::Result; +use std::path::{ + Path, + PathBuf, +}; +use std::pin::Pin; +use std::sync::{ + Arc, + Mutex, }; use tokio::fs::{ diff --git a/src/grammar/alpha034/expressions/and.rs b/src/grammar/alpha034/expressions/and.rs index 3c2c020..7dfcaa8 100644 --- a/src/grammar/alpha034/expressions/and.rs +++ b/src/grammar/alpha034/expressions/and.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::comparison::comparison_parser; diff --git a/src/grammar/alpha034/expressions/atom/array.rs b/src/grammar/alpha034/expressions/atom/array.rs index 2ed68b6..40deb3c 100644 --- a/src/grammar/alpha034/expressions/atom/array.rs +++ b/src/grammar/alpha034/expressions/atom/array.rs @@ -1,15 +1,13 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; pub fn array_parser<'a>( expr: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha034/expressions/atom/bool.rs b/src/grammar/alpha034/expressions/atom/bool.rs index 63f94d3..5f04256 100644 --- a/src/grammar/alpha034/expressions/atom/bool.rs +++ b/src/grammar/alpha034/expressions/atom/bool.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha034::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn bool_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha034/expressions/atom/call.rs b/src/grammar/alpha034/expressions/atom/call.rs index 603b233..90c603a 100644 --- a/src/grammar/alpha034/expressions/atom/call.rs +++ b/src/grammar/alpha034/expressions/atom/call.rs @@ -1,21 +1,17 @@ -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::{ - default_recovery, - ident, - }, - statements::{ - failed::failure_parser, - modifiers::modifier_parser, - }, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha034::statements::failed::failure_parser; +use crate::grammar::alpha034::statements::modifiers::modifier_parser; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn function_call_parser<'a>( diff --git a/src/grammar/alpha034/expressions/atom/command.rs b/src/grammar/alpha034/expressions/atom/command.rs index cd13c7a..98e0ec4 100644 --- a/src/grammar/alpha034/expressions/atom/command.rs +++ b/src/grammar/alpha034/expressions/atom/command.rs @@ -1,21 +1,17 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - statements::{ - failed::failure_parser, - modifiers::modifier_parser, - }, - AmberParser, - Expression, - InterpolatedCommand, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::statements::failed::failure_parser; +use crate::grammar::alpha034::statements::modifiers::modifier_parser; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + InterpolatedCommand, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; pub fn command_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha034/expressions/atom/null.rs b/src/grammar/alpha034/expressions/atom/null.rs index d1edf6a..991a0db 100644 --- a/src/grammar/alpha034/expressions/atom/null.rs +++ b/src/grammar/alpha034/expressions/atom/null.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha034::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn null_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha034/expressions/atom/number.rs b/src/grammar/alpha034/expressions/atom/number.rs index 6f1e3bd..ecaa769 100644 --- a/src/grammar/alpha034/expressions/atom/number.rs +++ b/src/grammar/alpha034/expressions/atom/number.rs @@ -1,40 +1,32 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - AmberParser, - Spanned, - }, - T, +use crate::grammar::alpha034::{ + AmberParser, + Expression, +}; +use crate::grammar::{ + Spanned, + Token, }; - -use super::Expression; pub fn number_parser<'a>() -> impl AmberParser<'a, Spanned> { - let int = any().try_map(|token: Token, span| { - let word = token.to_string(); - - for char in word.chars() { - if !char.is_ascii_digit() { - return Err(Rich::custom(span, "int must contain only digits")); - } - } + any() + .try_map(|token: Token, span| { + let word = token.to_string(); - Ok(word) - }); + let num_str = if word.starts_with('.') { + // For numbers like ".4", prepend "0" to make "0.4" + format!("0{}", word) + } else { + word + }; - choice(( - int.then(just(T!['.']).ignore_then(int)) - .map(|(int, float)| format!("{int}.{float}")), - just(T!['.']) - .ignore_then(int) - .map(|float| format!("0.{float}")), - int.map(|int| format!("{int}.0")), - )) - .from_str::() - .unwrapped() - .map_with(|num, e| (Expression::Number((num, e.span())), e.span())) - .boxed() - .labelled("number") + // Parse as f32 + num_str + .parse::() + .map_err(|_| Rich::custom(span, format!("invalid number format: {}", num_str))) + }) + .map_with(|num, e| (Expression::Number((num, e.span())), e.span())) + .boxed() + .labelled("number") } diff --git a/src/grammar/alpha034/expressions/atom/parentheses.rs b/src/grammar/alpha034/expressions/atom/parentheses.rs index 055703a..726cd31 100644 --- a/src/grammar/alpha034/expressions/atom/parentheses.rs +++ b/src/grammar/alpha034/expressions/atom/parentheses.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Spanned, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Spanned, }; +use crate::grammar::Token; +use crate::T; use super::super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha034/expressions/atom/status.rs b/src/grammar/alpha034/expressions/atom/status.rs index 47d23f4..b9efeef 100644 --- a/src/grammar/alpha034/expressions/atom/status.rs +++ b/src/grammar/alpha034/expressions/atom/status.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha034::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn status_var_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha034/expressions/atom/text.rs b/src/grammar/alpha034/expressions/atom/text.rs index 7993295..62e689c 100644 --- a/src/grammar/alpha034/expressions/atom/text.rs +++ b/src/grammar/alpha034/expressions/atom/text.rs @@ -1,14 +1,12 @@ -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - InterpolatedText, - Spanned, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + InterpolatedText, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn text_parser<'a>( diff --git a/src/grammar/alpha034/expressions/atom/var.rs b/src/grammar/alpha034/expressions/atom/var.rs index 83779c9..6f68ca9 100644 --- a/src/grammar/alpha034/expressions/atom/var.rs +++ b/src/grammar/alpha034/expressions/atom/var.rs @@ -1,5 +1,5 @@ +use crate::grammar::alpha034::parser::ident; use crate::grammar::alpha034::{ - parser::ident, AmberParser, Spanned, }; diff --git a/src/grammar/alpha034/expressions/cast.rs b/src/grammar/alpha034/expressions/cast.rs index 668442d..8ccefc0 100644 --- a/src/grammar/alpha034/expressions/cast.rs +++ b/src/grammar/alpha034/expressions/cast.rs @@ -1,18 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - global::type_parser, - lexer::Token, - parser::default_recovery, - AmberParser, - DataType, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::global::type_parser; +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + DataType, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::unary::unary_parser; diff --git a/src/grammar/alpha034/expressions/comparison.rs b/src/grammar/alpha034/expressions/comparison.rs index 1a7447e..ba54b53 100644 --- a/src/grammar/alpha034/expressions/comparison.rs +++ b/src/grammar/alpha034/expressions/comparison.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::sum::sum_parser; diff --git a/src/grammar/alpha034/expressions/is.rs b/src/grammar/alpha034/expressions/is.rs index 69a7856..7aa33b3 100644 --- a/src/grammar/alpha034/expressions/is.rs +++ b/src/grammar/alpha034/expressions/is.rs @@ -1,18 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - global::type_parser, - lexer::Token, - parser::default_recovery, - AmberParser, - DataType, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::global::type_parser; +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + DataType, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::cast::cast_parser; diff --git a/src/grammar/alpha034/expressions/or.rs b/src/grammar/alpha034/expressions/or.rs index cb0b27b..29343db 100644 --- a/src/grammar/alpha034/expressions/or.rs +++ b/src/grammar/alpha034/expressions/or.rs @@ -1,20 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; -use super::{ - and::and_parser, - Expression, -}; +use super::and::and_parser; +use super::Expression; pub fn or_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha034/expressions/product.rs b/src/grammar/alpha034/expressions/product.rs index 07e9f69..1c7fdf2 100644 --- a/src/grammar/alpha034/expressions/product.rs +++ b/src/grammar/alpha034/expressions/product.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::is::is_parser; diff --git a/src/grammar/alpha034/expressions/range.rs b/src/grammar/alpha034/expressions/range.rs index 9da71a0..0026623 100644 --- a/src/grammar/alpha034/expressions/range.rs +++ b/src/grammar/alpha034/expressions/range.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::or::or_parser; diff --git a/src/grammar/alpha034/expressions/sum.rs b/src/grammar/alpha034/expressions/sum.rs index 631981a..3becbf6 100644 --- a/src/grammar/alpha034/expressions/sum.rs +++ b/src/grammar/alpha034/expressions/sum.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::product::product_parser; diff --git a/src/grammar/alpha034/expressions/ternary.rs b/src/grammar/alpha034/expressions/ternary.rs index ac5e1ad..552102d 100644 --- a/src/grammar/alpha034/expressions/ternary.rs +++ b/src/grammar/alpha034/expressions/ternary.rs @@ -1,12 +1,12 @@ use chumsky::prelude::*; -use crate::grammar::alpha034::lexer::Token; use crate::grammar::alpha034::parser::default_recovery; use crate::grammar::alpha034::{ AmberParser, Spanned, Statement, }; +use crate::grammar::Token; use crate::T; use super::range::range_parser; diff --git a/src/grammar/alpha034/expressions/unary.rs b/src/grammar/alpha034/expressions/unary.rs index a369957..932be42 100644 --- a/src/grammar/alpha034/expressions/unary.rs +++ b/src/grammar/alpha034/expressions/unary.rs @@ -1,15 +1,13 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::atom::atom_parser; diff --git a/src/grammar/alpha034/global.rs b/src/grammar/alpha034/global.rs index a6802cd..a100578 100644 --- a/src/grammar/alpha034/global.rs +++ b/src/grammar/alpha034/global.rs @@ -1,17 +1,15 @@ use chumsky::prelude::*; -use crate::{ - analysis::types::DataType, - T, -}; +use crate::analysis::types::DataType; +use crate::grammar::Token; +use crate::T; +use super::parser::{ + default_recovery, + ident, +}; +use super::statements::statement_parser; use super::{ - lexer::Token, - parser::{ - default_recovery, - ident, - }, - statements::statement_parser, AmberParser, CompilerFlag, FunctionArgument, @@ -116,8 +114,7 @@ pub fn type_parser<'a>() -> impl AmberParser<'a, Spanned> { } fn compiler_flag_parser<'a>() -> impl AmberParser<'a, Spanned> { - just(T!["#"]) - .ignore_then(just(T!["["])) + just(T!["#["]) .ignore_then( choice(( just(T!["allow_nested_if_else"]).to(CompilerFlag::AllowNestedIfElse), diff --git a/src/grammar/alpha034/lexer.rs b/src/grammar/alpha034/lexer.rs index 278aaef..720bdac 100644 --- a/src/grammar/alpha034/lexer.rs +++ b/src/grammar/alpha034/lexer.rs @@ -1,74 +1,410 @@ -use heraclitus_compiler::prelude::*; - -pub use crate::grammar::Token; - -pub fn get_rules() -> Rules { - let symbols = vec![ - '+', '-', '*', '/', '%', ';', ':', '(', ')', '[', ']', '{', '}', ',', '.', '<', '>', '=', - '!', '?', '\\', '"', '$', '\n', - ]; - let compounds = vec![ - ('<', '='), - ('>', '='), - ('!', '='), - ('=', '='), - ('+', '='), - ('-', '='), - ('*', '='), - ('/', '='), - ('%', '='), - ('.', '.'), - ('/', '/'), - ]; - let region = reg![ - reg!(string as "string literal" => { - begin: "\"", - end: "\"", - tokenize: true, - allow_unclosed_region: true - } => [ - reg!(str_interp as "string interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]), - reg!(command as "command literal" => { - begin: "$", - end: "$", - tokenize: true, - allow_unclosed_region: true - } => [ - reg!(com_interp as "command interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]), - reg!(cc_flag as "compiler flag" => { - begin: "#[", - end: "]", - tokenize: true, - allow_unclosed_region: true - }), - reg!(comment as "comment" => { - begin: "//", - end: "\n", - allow_unclosed_region: true - }), - reg!(comment as "shebang" => { - begin: "#!", - end: "\n", - allow_unclosed_region: true - }), - reg!(interp as "interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]; - Rules::new(symbols, compounds, region) +use logos::Logos; + +use super::Spanned; +use crate::grammar::{ + SimpleSpan, + Token, +}; + +/// Main token context - general code +#[derive(Logos, Debug, Clone, PartialEq)] +#[logos(skip r"[ \t\r]+")] +pub enum TokenKind { + // Compound operators + #[token("<=")] + LessEquals, + #[token(">=")] + GreaterEquals, + #[token("!=")] + NotEquals, + #[token("==")] + EqualsEquals, + #[token("+=")] + PlusEquals, + #[token("-=")] + MinusEquals, + #[token("*=")] + MulEquals, + #[token("/=")] + DivEquals, + #[token("%=")] + ModEquals, + #[token("..")] + DotDot, + + // Single operators + #[token("+")] + Plus, + #[token("-")] + Minus, + #[token("*")] + Star, + #[token("/")] + Slash, + #[token("%")] + Percent, + #[token("<")] + Less, + #[token(">")] + Greater, + #[token("=")] + Equals, + #[token("!")] + Bang, + #[token("?")] + Question, + + // Delimiters + #[token("(")] + OpenParen, + #[token(")")] + CloseParen, + #[token("[")] + OpenBracket, + #[token("]")] + CloseBracket, + #[token("{")] + OpenBrace, + #[token("}")] + CloseBrace, + + // Punctuation + #[token(";")] + Semicolon, + #[token(":")] + Colon, + #[token(",")] + Comma, + #[token(".")] + Dot, + #[token("\\")] + Backslash, + + // String start (transition to StringContext) + #[token("\"")] + Quote, + + // Command start/end (transition to CommandContext) + #[token("$")] + Dollar, + + // Compiler flag start (transition to CompilerFlagContext) + #[token("#[")] + CompilerFlagStart, + + // Comments (include trailing newline to match Heraclitus behavior) + #[regex(r"//[^\n]*\n?", priority = 2)] + Comment, + #[regex(r"#![^\n]*\n?", priority = 2)] + Shebang, + + // Identifier + #[regex(r"[a-zA-Z_][a-zA-Z0-9_]*")] + Identifier, + + // Number + #[regex(r"([0-9]+(\.[0-9]+)?)|(\.[0-9]+)")] + Number, + + // Newline + #[token("\n")] + Newline, +} + +/// String content context - inside "..." +#[derive(Logos, Debug, Clone, PartialEq)] +pub enum StringContext { + // String end + #[token("\"")] + Quote, + + // Interpolation start + #[token("{")] + OpenBrace, + + // Text content (not quotes, backslashes, or braces) + #[regex(r#"[^"\\{]+"#)] + Content, + + // Escape sequence + #[regex(r#"\\."#)] + Escape, +} + +/// Command content context - inside $...$ +#[derive(Logos, Debug, Clone, PartialEq)] +pub enum CommandContext { + // Command end + #[token("$")] + Dollar, + + // Interpolation start + #[token("{")] + OpenBrace, + + // Text content (not $, backslash, or braces) + #[regex(r"[^$\\{]+")] + Content, + + // Escape sequence + #[regex(r#"\\."#)] + Escape, +} + +/// Context stack to track where we are in parsing +#[derive(Debug, Clone, PartialEq)] +enum LexerContext { + Main, + String, + Command, +} + +/// Stateful tokenizer that manages context switching +pub struct StatefulTokenizer<'source> { + source: &'source str, + position: usize, + context_stack: Vec, + brace_depth: usize, // Track brace nesting inside interpolations +} + +impl<'source> StatefulTokenizer<'source> { + fn new(source: &'source str) -> Self { + Self { + source, + position: 0, + context_stack: vec![LexerContext::Main], + brace_depth: 0, + } + } + + pub fn tokenize(source: &'source str) -> Vec> { + let mut tokenizer = Self::new(source); + let mut tokens = Vec::new(); + + while tokenizer.position < source.len() { + if let Some((token, span)) = tokenizer.next_token() { + tokens.push((token, span)); + } else { + break; + } + } + + // Filter out newline tokens - they're used for position tracking but not needed for parsing + tokens + .into_iter() + .filter(|(token, _)| token.0 != "\n") + .collect() + } + + fn next_token(&mut self) -> Option<(Token, SimpleSpan)> { + if self.position >= self.source.len() { + return None; + } + + let remaining = &self.source[self.position..]; + let context = self.context_stack.last()?.clone(); + + match context { + LexerContext::Main => self.lex_main_context(remaining), + LexerContext::String => self.lex_string_context(remaining), + LexerContext::Command => self.lex_command_context(remaining), + } + } + + fn lex_main_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = TokenKind::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(TokenKind::Quote) => { + // Entering string context + self.context_stack.push(LexerContext::String); + Some((Token("\"".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::Dollar) => { + // Check if this starts a command. + // If the next char is another '$', do not start a command (this is the first of $$). + // If this is the second of a $$ (previous char was '$'), only start a command + // when the following char is not whitespace. Otherwise single $ starts a command. + let prev_is_dollar = start > 0 && self.source[start - 1..].starts_with('$'); + + let is_command_start = if span.end < remaining.len() { + // Look at the next char after this $ in the remaining slice + let mut next_chars = remaining[span.end..].chars(); + match next_chars.next() { + Some(next_ch) => { + if next_ch == '$' { + // next is a dollar -> this $ does not start a command + false + } else if prev_is_dollar { + // this is the second $ in $$ — only start a command if not followed by whitespace + !next_ch.is_whitespace() + } else { + // single $ (not followed by $) -> start a command + true + } + } + None => false, + } + } else { + false + }; + + if is_command_start { + // Entering command context + self.context_stack.push(LexerContext::Command); + } + Some((Token("$".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::OpenBrace) => { + // Only track brace depth if we're inside an interpolation (context stack > 1) + if self.context_stack.len() > 1 { + self.brace_depth += 1; + } + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::CloseBrace) => { + // Only track brace depth if we're inside an interpolation + if self.context_stack.len() > 1 && self.brace_depth > 0 { + self.brace_depth -= 1; + if self.brace_depth == 0 { + // Exiting interpolation, pop back to string/command context + self.context_stack.pop(); + } + } + Some((Token("}".to_string()), SimpleSpan::new(start, end))) + } + Ok(kind) => { + let token_str = token_kind_to_string(&kind, slice); + Some((Token(token_str), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } + + fn lex_string_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = StringContext::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(StringContext::Quote) => { + // Exiting string context + self.context_stack.pop(); + Some((Token("\"".to_string()), SimpleSpan::new(start, end))) + } + Ok(StringContext::OpenBrace) => { + // Entering interpolation - switch back to main context + self.context_stack.push(LexerContext::Main); + self.brace_depth = 1; + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(StringContext::Content) | Ok(StringContext::Escape) => { + Some((Token(slice.to_string()), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } + + fn lex_command_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = CommandContext::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(CommandContext::Dollar) => { + // Exiting command context + self.context_stack.pop(); + Some((Token("$".to_string()), SimpleSpan::new(start, end))) + } + Ok(CommandContext::OpenBrace) => { + // Entering interpolation - switch back to main context + self.context_stack.push(LexerContext::Main); + self.brace_depth = 1; + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(CommandContext::Content) | Ok(CommandContext::Escape) => { + // If this command context was entered as the second `$` of `$$` and + // the content starts with whitespace (e.g. `$$ failed {`), trim the + // leading whitespace so the identifier/tokenization matches the + // parser's expectations (no leading spaces). + let token_text = if start > 0 && self.source[start - 1..].starts_with('$') { + // second of $$ - trim leading whitespace from content + slice.trim_start().to_string() + } else { + slice.to_string() + }; + Some((Token(token_text), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } +} + +fn token_kind_to_string(kind: &TokenKind, slice: &str) -> String { + match kind { + TokenKind::LessEquals => "<=".to_string(), + TokenKind::GreaterEquals => ">=".to_string(), + TokenKind::NotEquals => "!=".to_string(), + TokenKind::EqualsEquals => "==".to_string(), + TokenKind::PlusEquals => "+=".to_string(), + TokenKind::MinusEquals => "-=".to_string(), + TokenKind::MulEquals => "*=".to_string(), + TokenKind::DivEquals => "/=".to_string(), + TokenKind::ModEquals => "%=".to_string(), + TokenKind::DotDot => "..".to_string(), + TokenKind::Plus => "+".to_string(), + TokenKind::Minus => "-".to_string(), + TokenKind::Star => "*".to_string(), + TokenKind::Slash => "/".to_string(), + TokenKind::Percent => "%".to_string(), + TokenKind::Less => "<".to_string(), + TokenKind::Greater => ">".to_string(), + TokenKind::Equals => "=".to_string(), + TokenKind::Bang => "!".to_string(), + TokenKind::Question => "?".to_string(), + TokenKind::OpenParen => "(".to_string(), + TokenKind::CloseParen => ")".to_string(), + TokenKind::OpenBracket => "[".to_string(), + TokenKind::CloseBracket => "]".to_string(), + TokenKind::OpenBrace => "{".to_string(), + TokenKind::CloseBrace => "}".to_string(), + TokenKind::Semicolon => ";".to_string(), + TokenKind::Colon => ":".to_string(), + TokenKind::Comma => ",".to_string(), + TokenKind::Dot => ".".to_string(), + TokenKind::Backslash => "\\".to_string(), + TokenKind::Quote => "\"".to_string(), + TokenKind::Dollar => "$".to_string(), + TokenKind::Newline => "\n".to_string(), + TokenKind::CompilerFlagStart => "#[".to_string(), + // For these, use the actual slice + TokenKind::Comment | TokenKind::Shebang | TokenKind::Identifier | TokenKind::Number => { + slice.to_string() + } + } +} + +/// Public tokenize function +pub fn tokenize(input: &str) -> Vec> { + StatefulTokenizer::tokenize(input) } diff --git a/src/grammar/alpha034/mod.rs b/src/grammar/alpha034/mod.rs index 5d580fc..d52b50e 100644 --- a/src/grammar/alpha034/mod.rs +++ b/src/grammar/alpha034/mod.rs @@ -9,22 +9,14 @@ use super::{ ParserResponse, Span, }; -use chumsky::{ - error::Rich, - extra::Err, - input::{ - Input, - SpannedInput, - }, - span::SimpleSpan, - Parser, +use crate::grammar::Token; +use chumsky::error::Rich; +use chumsky::extra::Err; +use chumsky::input::{ + Input, + SpannedInput, }; -use heraclitus_compiler::prelude::*; -use lexer::{ - get_rules, - Token, -}; -use prelude::lexer::Lexer; +use chumsky::Parser; use semantic_tokens::semantic_tokens_from_ast; pub mod expressions; @@ -242,9 +234,7 @@ pub enum GlobalStatement { } #[derive(Debug)] -pub struct AmberCompiler { - lexer: Lexer, -} +pub struct AmberCompiler {} impl Default for AmberCompiler { fn default() -> Self { @@ -254,9 +244,7 @@ impl Default for AmberCompiler { impl AmberCompiler { pub fn new() -> Self { - let lexer = Lexer::new(get_rules()); - - AmberCompiler { lexer } + AmberCompiler {} } pub fn parser<'a>(&self) -> impl AmberParser<'a, Vec>> { @@ -267,22 +255,8 @@ impl AmberCompiler { impl LSPAnalysis for AmberCompiler { #[tracing::instrument(skip_all)] fn tokenize(&self, input: &str) -> Vec> { - // It should never fail - self.lexer - .tokenize(&input.replace("\r\n", "\n").replace("\r", "\n")) - .expect("Failed to tokenize input") - .iter() - .filter_map(|t| { - if t.word == "\n" { - return None; - } - - Some(( - Token(t.word.clone()), - SimpleSpan::new(t.start, t.start + t.word.chars().count()), - )) - }) - .collect() + // Use Logos lexer instead of Heraclitus + lexer::tokenize(&input.replace("\r\n", "\n").replace("\r", "\n")) } #[tracing::instrument(skip_all)] diff --git a/src/grammar/alpha034/parser.rs b/src/grammar/alpha034/parser.rs index 6a84d27..010d849 100644 --- a/src/grammar/alpha034/parser.rs +++ b/src/grammar/alpha034/parser.rs @@ -2,10 +2,8 @@ use chumsky::prelude::*; use crate::T; -use super::{ - lexer::Token, - AmberParser, -}; +use super::AmberParser; +use crate::grammar::Token; const KEYWORDS: &[&str] = &[ "if", "else", "loop", "in", "return", "break", "continue", "true", "false", "null", "fun", diff --git a/src/grammar/alpha034/statements/block.rs b/src/grammar/alpha034/statements/block.rs index d6b8303..d832238 100644 --- a/src/grammar/alpha034/statements/block.rs +++ b/src/grammar/alpha034/statements/block.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Block, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Block, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::modifiers::modifier_parser; diff --git a/src/grammar/alpha034/statements/comment.rs b/src/grammar/alpha034/statements/comment.rs index 21a67f3..66f20f9 100644 --- a/src/grammar/alpha034/statements/comment.rs +++ b/src/grammar/alpha034/statements/comment.rs @@ -1,11 +1,11 @@ use chumsky::prelude::*; use crate::grammar::alpha034::{ - lexer::Token, AmberParser, Comment, Spanned, }; +use crate::grammar::Token; pub fn comment_parser<'a>() -> impl AmberParser<'a, Spanned> { any() diff --git a/src/grammar/alpha034/statements/const_init.rs b/src/grammar/alpha034/statements/const_init.rs index d016bbe..4e1d979 100644 --- a/src/grammar/alpha034/statements/const_init.rs +++ b/src/grammar/alpha034/statements/const_init.rs @@ -1,22 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::{ - alpha034::Expression, - alpha034::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Spanned, - Statement, - }, - }, - T, +use crate::grammar::alpha034::expressions::parse_expr; +use crate::grammar::alpha034::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; pub fn const_init_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha034/statements/failed.rs b/src/grammar/alpha034/statements/failed.rs index 6904018..3c98f95 100644 --- a/src/grammar/alpha034/statements/failed.rs +++ b/src/grammar/alpha034/statements/failed.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - parser::default_recovery, - AmberParser, - FailureHandler, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + FailureHandler, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; pub fn failure_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha034/statements/if_cond.rs b/src/grammar/alpha034/statements/if_cond.rs index c73c4fd..2763c58 100644 --- a/src/grammar/alpha034/statements/if_cond.rs +++ b/src/grammar/alpha034/statements/if_cond.rs @@ -1,21 +1,19 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - expressions::parse_expr, - lexer::Token, - parser::default_recovery, - statements::comment, - AmberParser, - Comment, - ElseCondition, - IfChainContent, - IfCondition, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::expressions::parse_expr; +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::statements::comment; +use crate::grammar::alpha034::{ + AmberParser, + Comment, + ElseCondition, + IfChainContent, + IfCondition, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::block::block_parser; diff --git a/src/grammar/alpha034/statements/keywords.rs b/src/grammar/alpha034/statements/keywords.rs index 1d1be2f..c9dd6e4 100644 --- a/src/grammar/alpha034/statements/keywords.rs +++ b/src/grammar/alpha034/statements/keywords.rs @@ -1,17 +1,15 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - expressions::parse_expr, - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::expressions::parse_expr; +use crate::grammar::alpha034::parser::default_recovery; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; pub fn keywords_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha034/statements/loops.rs b/src/grammar/alpha034/statements/loops.rs index e86186b..ddf234b 100644 --- a/src/grammar/alpha034/statements/loops.rs +++ b/src/grammar/alpha034/statements/loops.rs @@ -1,22 +1,20 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Block, - Expression, - IterLoopVars, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::expressions::parse_expr; +use crate::grammar::alpha034::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha034::{ + AmberParser, + Block, + Expression, + IterLoopVars, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; use super::block::block_parser; diff --git a/src/grammar/alpha034/statements/mod.rs b/src/grammar/alpha034/statements/mod.rs index 94c525a..4049c1f 100644 --- a/src/grammar/alpha034/statements/mod.rs +++ b/src/grammar/alpha034/statements/mod.rs @@ -1,12 +1,10 @@ use chumsky::prelude::*; -use crate::{ - grammar::Token, - T, -}; +use crate::grammar::Token; +use crate::T; +use super::expressions::parse_expr; use super::{ - expressions::parse_expr, AmberParser, Spanned, Statement, diff --git a/src/grammar/alpha034/statements/modifiers.rs b/src/grammar/alpha034/statements/modifiers.rs index 551473e..b852aaf 100644 --- a/src/grammar/alpha034/statements/modifiers.rs +++ b/src/grammar/alpha034/statements/modifiers.rs @@ -1,14 +1,12 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - lexer::Token, - AmberParser, - CommandModifier, - Spanned, - }, - T, +use crate::grammar::alpha034::{ + AmberParser, + CommandModifier, + Spanned, }; +use crate::grammar::Token; +use crate::T; pub fn modifier_parser<'a>() -> impl AmberParser<'a, Spanned> { choice(( diff --git a/src/grammar/alpha034/statements/shebang.rs b/src/grammar/alpha034/statements/shebang.rs index 78a1ffd..5fd0644 100644 --- a/src/grammar/alpha034/statements/shebang.rs +++ b/src/grammar/alpha034/statements/shebang.rs @@ -1,11 +1,11 @@ use chumsky::prelude::*; use crate::grammar::alpha034::{ - lexer::Token, AmberParser, Spanned, Statement, }; +use crate::grammar::Token; pub fn shebang_parser<'a>() -> impl AmberParser<'a, Spanned> { any() diff --git a/src/grammar/alpha034/statements/shorthands.rs b/src/grammar/alpha034/statements/shorthands.rs index ca163e6..0f3b067 100644 --- a/src/grammar/alpha034/statements/shorthands.rs +++ b/src/grammar/alpha034/statements/shorthands.rs @@ -1,20 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::expressions::parse_expr; +use crate::grammar::alpha034::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; pub fn shorthand_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha034/statements/var_init.rs b/src/grammar/alpha034/statements/var_init.rs index 27b17ca..c66f0d6 100644 --- a/src/grammar/alpha034/statements/var_init.rs +++ b/src/grammar/alpha034/statements/var_init.rs @@ -1,21 +1,19 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - expressions::parse_expr, - global::type_parser, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Spanned, - Statement, - VariableInitType, - }, - T, +use crate::grammar::alpha034::expressions::parse_expr; +use crate::grammar::alpha034::global::type_parser; +use crate::grammar::alpha034::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha034::{ + AmberParser, + Spanned, + Statement, + VariableInitType, +}; +use crate::grammar::Token; +use crate::T; pub fn var_init_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha034/statements/var_set.rs b/src/grammar/alpha034/statements/var_set.rs index 3b15d82..8c936a6 100644 --- a/src/grammar/alpha034/statements/var_set.rs +++ b/src/grammar/alpha034/statements/var_set.rs @@ -1,20 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha034::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha034::expressions::parse_expr; +use crate::grammar::alpha034::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha034::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; pub fn var_set_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/expressions/and.rs b/src/grammar/alpha035/expressions/and.rs index 9291f4a..a6e446e 100644 --- a/src/grammar/alpha035/expressions/and.rs +++ b/src/grammar/alpha035/expressions/and.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::comparison::comparison_parser; diff --git a/src/grammar/alpha035/expressions/atom/array.rs b/src/grammar/alpha035/expressions/atom/array.rs index 0effca2..9cd370c 100644 --- a/src/grammar/alpha035/expressions/atom/array.rs +++ b/src/grammar/alpha035/expressions/atom/array.rs @@ -1,15 +1,13 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; pub fn array_parser<'a>( expr: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/expressions/atom/bool.rs b/src/grammar/alpha035/expressions/atom/bool.rs index efb8491..58ef536 100644 --- a/src/grammar/alpha035/expressions/atom/bool.rs +++ b/src/grammar/alpha035/expressions/atom/bool.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha035::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn bool_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha035/expressions/atom/call.rs b/src/grammar/alpha035/expressions/atom/call.rs index 9ff43c9..a30f558 100644 --- a/src/grammar/alpha035/expressions/atom/call.rs +++ b/src/grammar/alpha035/expressions/atom/call.rs @@ -1,21 +1,17 @@ -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::{ - default_recovery, - ident, - }, - statements::{ - failed::failure_parser, - modifiers::modifier_parser, - }, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha035::statements::failed::failure_parser; +use crate::grammar::alpha035::statements::modifiers::modifier_parser; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn function_call_parser<'a>( diff --git a/src/grammar/alpha035/expressions/atom/command.rs b/src/grammar/alpha035/expressions/atom/command.rs index 6ca8164..5fa2d57 100644 --- a/src/grammar/alpha035/expressions/atom/command.rs +++ b/src/grammar/alpha035/expressions/atom/command.rs @@ -1,21 +1,17 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - statements::{ - failed::failure_parser, - modifiers::modifier_parser, - }, - AmberParser, - Expression, - InterpolatedCommand, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::statements::failed::failure_parser; +use crate::grammar::alpha035::statements::modifiers::modifier_parser; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + InterpolatedCommand, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; pub fn command_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/expressions/atom/null.rs b/src/grammar/alpha035/expressions/atom/null.rs index 2d245bf..1a1144a 100644 --- a/src/grammar/alpha035/expressions/atom/null.rs +++ b/src/grammar/alpha035/expressions/atom/null.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha035::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn null_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha035/expressions/atom/number.rs b/src/grammar/alpha035/expressions/atom/number.rs index 85b3696..07d2c29 100644 --- a/src/grammar/alpha035/expressions/atom/number.rs +++ b/src/grammar/alpha035/expressions/atom/number.rs @@ -1,40 +1,32 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - AmberParser, - Spanned, - }, - T, +use crate::grammar::alpha035::{ + AmberParser, + Expression, +}; +use crate::grammar::{ + Spanned, + Token, }; - -use super::Expression; pub fn number_parser<'a>() -> impl AmberParser<'a, Spanned> { - let int = any().try_map(|token: Token, span| { - let word = token.to_string(); - - for char in word.chars() { - if !char.is_ascii_digit() { - return Err(Rich::custom(span, "int must contain only digits")); - } - } + any() + .try_map(|token: Token, span| { + let word = token.to_string(); - Ok(word) - }); + let num_str = if word.starts_with('.') { + // For numbers like ".4", prepend "0" to make "0.4" + format!("0{}", word) + } else { + word + }; - choice(( - int.then(just(T!['.']).ignore_then(int)) - .map(|(int, float)| format!("{int}.{float}")), - just(T!['.']) - .ignore_then(int) - .map(|float| format!("0.{float}")), - int.map(|int| format!("{int}.0")), - )) - .from_str::() - .unwrapped() - .map_with(|num, e| (Expression::Number((num, e.span())), e.span())) - .boxed() - .labelled("number") + // Parse as f32 + num_str + .parse::() + .map_err(|_| Rich::custom(span, format!("invalid number format: {}", num_str))) + }) + .map_with(|num, e| (Expression::Number((num, e.span())), e.span())) + .boxed() + .labelled("number") } diff --git a/src/grammar/alpha035/expressions/atom/parentheses.rs b/src/grammar/alpha035/expressions/atom/parentheses.rs index 8280240..d6e25c3 100644 --- a/src/grammar/alpha035/expressions/atom/parentheses.rs +++ b/src/grammar/alpha035/expressions/atom/parentheses.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Spanned, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Spanned, }; +use crate::grammar::Token; +use crate::T; use super::super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha035/expressions/atom/status.rs b/src/grammar/alpha035/expressions/atom/status.rs index ecc6638..1bab52f 100644 --- a/src/grammar/alpha035/expressions/atom/status.rs +++ b/src/grammar/alpha035/expressions/atom/status.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha035::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn status_var_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha035/expressions/atom/text.rs b/src/grammar/alpha035/expressions/atom/text.rs index 7e02ab3..1a2d4d7 100644 --- a/src/grammar/alpha035/expressions/atom/text.rs +++ b/src/grammar/alpha035/expressions/atom/text.rs @@ -1,14 +1,12 @@ -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - InterpolatedText, - Spanned, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + InterpolatedText, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn text_parser<'a>( diff --git a/src/grammar/alpha035/expressions/atom/var.rs b/src/grammar/alpha035/expressions/atom/var.rs index 8cc85ed..41006e3 100644 --- a/src/grammar/alpha035/expressions/atom/var.rs +++ b/src/grammar/alpha035/expressions/atom/var.rs @@ -1,5 +1,5 @@ +use crate::grammar::alpha035::parser::ident; use crate::grammar::alpha035::{ - parser::ident, AmberParser, Spanned, }; diff --git a/src/grammar/alpha035/expressions/cast.rs b/src/grammar/alpha035/expressions/cast.rs index 280a211..79c15fe 100644 --- a/src/grammar/alpha035/expressions/cast.rs +++ b/src/grammar/alpha035/expressions/cast.rs @@ -1,18 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - global::type_parser, - lexer::Token, - parser::default_recovery, - AmberParser, - DataType, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::global::type_parser; +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + DataType, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::unary::unary_parser; diff --git a/src/grammar/alpha035/expressions/comparison.rs b/src/grammar/alpha035/expressions/comparison.rs index 18b5604..1bc2771 100644 --- a/src/grammar/alpha035/expressions/comparison.rs +++ b/src/grammar/alpha035/expressions/comparison.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::sum::sum_parser; diff --git a/src/grammar/alpha035/expressions/is.rs b/src/grammar/alpha035/expressions/is.rs index da413c8..d8bcfc7 100644 --- a/src/grammar/alpha035/expressions/is.rs +++ b/src/grammar/alpha035/expressions/is.rs @@ -1,18 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - global::type_parser, - lexer::Token, - parser::default_recovery, - AmberParser, - DataType, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::global::type_parser; +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + DataType, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::cast::cast_parser; diff --git a/src/grammar/alpha035/expressions/or.rs b/src/grammar/alpha035/expressions/or.rs index 5cae8f5..c120756 100644 --- a/src/grammar/alpha035/expressions/or.rs +++ b/src/grammar/alpha035/expressions/or.rs @@ -1,20 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; -use super::{ - and::and_parser, - Expression, -}; +use super::and::and_parser; +use super::Expression; pub fn or_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/expressions/product.rs b/src/grammar/alpha035/expressions/product.rs index a4baf89..1b0116a 100644 --- a/src/grammar/alpha035/expressions/product.rs +++ b/src/grammar/alpha035/expressions/product.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::is::is_parser; diff --git a/src/grammar/alpha035/expressions/range.rs b/src/grammar/alpha035/expressions/range.rs index ac51db7..e53ae80 100644 --- a/src/grammar/alpha035/expressions/range.rs +++ b/src/grammar/alpha035/expressions/range.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::or::or_parser; diff --git a/src/grammar/alpha035/expressions/sum.rs b/src/grammar/alpha035/expressions/sum.rs index b799754..439442a 100644 --- a/src/grammar/alpha035/expressions/sum.rs +++ b/src/grammar/alpha035/expressions/sum.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::product::product_parser; diff --git a/src/grammar/alpha035/expressions/ternary.rs b/src/grammar/alpha035/expressions/ternary.rs index 4091515..068826d 100644 --- a/src/grammar/alpha035/expressions/ternary.rs +++ b/src/grammar/alpha035/expressions/ternary.rs @@ -1,12 +1,12 @@ use chumsky::prelude::*; -use crate::grammar::alpha035::lexer::Token; use crate::grammar::alpha035::parser::default_recovery; use crate::grammar::alpha035::{ AmberParser, Spanned, Statement, }; +use crate::grammar::Token; use crate::T; use super::range::range_parser; diff --git a/src/grammar/alpha035/expressions/unary.rs b/src/grammar/alpha035/expressions/unary.rs index 77d38f4..39f0eb5 100644 --- a/src/grammar/alpha035/expressions/unary.rs +++ b/src/grammar/alpha035/expressions/unary.rs @@ -1,15 +1,13 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::atom::atom_parser; diff --git a/src/grammar/alpha035/global.rs b/src/grammar/alpha035/global.rs index 4d7725c..3598bb4 100644 --- a/src/grammar/alpha035/global.rs +++ b/src/grammar/alpha035/global.rs @@ -2,14 +2,13 @@ use chumsky::prelude::*; use crate::T; +use super::expressions::parse_expr; +use super::parser::{ + default_recovery, + ident, +}; +use super::statements::statement_parser; use super::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - statements::statement_parser, AmberParser, CompilerFlag, DataType, @@ -20,6 +19,7 @@ use super::{ Spanned, Statement, }; +use crate::grammar::Token; pub fn import_parser<'a>() -> impl AmberParser<'a, Spanned> { let import_all_parser = just(T!["*"]).map_with(|_, e| (ImportContent::ImportAll, e.span())); @@ -129,8 +129,7 @@ pub fn type_parser<'a>() -> impl AmberParser<'a, Spanned> { } fn compiler_flag_parser<'a>() -> impl AmberParser<'a, Spanned> { - just(T!["#"]) - .ignore_then(just(T!["["])) + just(T!["#["]) .ignore_then( choice(( just(T!["allow_nested_if_else"]).to(CompilerFlag::AllowNestedIfElse), diff --git a/src/grammar/alpha035/lexer.rs b/src/grammar/alpha035/lexer.rs index 278aaef..9182994 100644 --- a/src/grammar/alpha035/lexer.rs +++ b/src/grammar/alpha035/lexer.rs @@ -1,74 +1,408 @@ -use heraclitus_compiler::prelude::*; +use logos::Logos; +use super::Spanned; +use crate::grammar::SimpleSpan; pub use crate::grammar::Token; -pub fn get_rules() -> Rules { - let symbols = vec![ - '+', '-', '*', '/', '%', ';', ':', '(', ')', '[', ']', '{', '}', ',', '.', '<', '>', '=', - '!', '?', '\\', '"', '$', '\n', - ]; - let compounds = vec![ - ('<', '='), - ('>', '='), - ('!', '='), - ('=', '='), - ('+', '='), - ('-', '='), - ('*', '='), - ('/', '='), - ('%', '='), - ('.', '.'), - ('/', '/'), - ]; - let region = reg![ - reg!(string as "string literal" => { - begin: "\"", - end: "\"", - tokenize: true, - allow_unclosed_region: true - } => [ - reg!(str_interp as "string interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]), - reg!(command as "command literal" => { - begin: "$", - end: "$", - tokenize: true, - allow_unclosed_region: true - } => [ - reg!(com_interp as "command interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]), - reg!(cc_flag as "compiler flag" => { - begin: "#[", - end: "]", - tokenize: true, - allow_unclosed_region: true - }), - reg!(comment as "comment" => { - begin: "//", - end: "\n", - allow_unclosed_region: true - }), - reg!(comment as "shebang" => { - begin: "#!", - end: "\n", - allow_unclosed_region: true - }), - reg!(interp as "interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]; - Rules::new(symbols, compounds, region) +/// Main token context - general code +#[derive(Logos, Debug, Clone, PartialEq)] +#[logos(skip r"[ \t\r]+")] +pub enum TokenKind { + // Compound operators + #[token("<=")] + LessEquals, + #[token(">=")] + GreaterEquals, + #[token("!=")] + NotEquals, + #[token("==")] + EqualsEquals, + #[token("+=")] + PlusEquals, + #[token("-=")] + MinusEquals, + #[token("*=")] + MulEquals, + #[token("/=")] + DivEquals, + #[token("%=")] + ModEquals, + #[token("..")] + DotDot, + + // Single operators + #[token("+")] + Plus, + #[token("-")] + Minus, + #[token("*")] + Star, + #[token("/")] + Slash, + #[token("%")] + Percent, + #[token("<")] + Less, + #[token(">")] + Greater, + #[token("=")] + Equals, + #[token("!")] + Bang, + #[token("?")] + Question, + + // Delimiters + #[token("(")] + OpenParen, + #[token(")")] + CloseParen, + #[token("[")] + OpenBracket, + #[token("]")] + CloseBracket, + #[token("{")] + OpenBrace, + #[token("}")] + CloseBrace, + + // Punctuation + #[token(";")] + Semicolon, + #[token(":")] + Colon, + #[token(",")] + Comma, + #[token(".")] + Dot, + #[token("\\")] + Backslash, + + // String start (transition to StringContext) + #[token("\"")] + Quote, + + // Command start/end (transition to CommandContext) + #[token("$")] + Dollar, + + // Compiler flag start (transition to CompilerFlagContext) + #[token("#[")] + CompilerFlagStart, + + // Comments (include trailing newline to match Heraclitus behavior) + #[regex(r"//[^\n]*\n?", priority = 2)] + Comment, + #[regex(r"#![^\n]*\n?", priority = 2)] + Shebang, + + // Identifier + #[regex(r"[a-zA-Z_][a-zA-Z0-9_]*")] + Identifier, + + // Number + #[regex(r"([0-9]+(\.[0-9]+)?)|(\.[0-9]+)")] + Number, + + // Newline + #[token("\n")] + Newline, +} + +/// String content context - inside "..." +#[derive(Logos, Debug, Clone, PartialEq)] +pub enum StringContext { + // String end + #[token("\"")] + Quote, + + // Interpolation start + #[token("{")] + OpenBrace, + + // Text content (not quotes, backslashes, or braces) + #[regex(r#"[^"\\{]+"#)] + Content, + + // Escape sequence + #[regex(r#"\\."#)] + Escape, +} + +/// Command content context - inside $...$ +#[derive(Logos, Debug, Clone, PartialEq)] +pub enum CommandContext { + // Command end + #[token("$")] + Dollar, + + // Interpolation start + #[token("{")] + OpenBrace, + + // Text content (not $, backslash, or braces) + #[regex(r"[^$\\{]+")] + Content, + + // Escape sequence + #[regex(r#"\\."#)] + Escape, +} + +/// Context stack to track where we are in parsing +#[derive(Debug, Clone, PartialEq)] +enum LexerContext { + Main, + String, + Command, +} + +/// Stateful tokenizer that manages context switching +pub struct StatefulTokenizer<'source> { + source: &'source str, + position: usize, + context_stack: Vec, + brace_depth: usize, // Track brace nesting inside interpolations +} + +impl<'source> StatefulTokenizer<'source> { + fn new(source: &'source str) -> Self { + Self { + source, + position: 0, + context_stack: vec![LexerContext::Main], + brace_depth: 0, + } + } + + pub fn tokenize(source: &'source str) -> Vec> { + let mut tokenizer = Self::new(source); + let mut tokens = Vec::new(); + + while tokenizer.position < source.len() { + if let Some((token, span)) = tokenizer.next_token() { + tokens.push((token, span)); + } else { + break; + } + } + + // Filter out newline tokens - they're used for position tracking but not needed for parsing + tokens + .into_iter() + .filter(|(token, _)| token.0 != "\n") + .collect() + } + + fn next_token(&mut self) -> Option<(Token, SimpleSpan)> { + if self.position >= self.source.len() { + return None; + } + + let remaining = &self.source[self.position..]; + let context = self.context_stack.last()?.clone(); + + match context { + LexerContext::Main => self.lex_main_context(remaining), + LexerContext::String => self.lex_string_context(remaining), + LexerContext::Command => self.lex_command_context(remaining), + } + } + + fn lex_main_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = TokenKind::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(TokenKind::Quote) => { + // Entering string context + self.context_stack.push(LexerContext::String); + Some((Token("\"".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::Dollar) => { + // Check if this starts a command. + // If the next char is another '$', do not start a command (this is the first of $$). + // If this is the second of a $$ (previous char was '$'), only start a command + // when the following char is not whitespace. Otherwise single $ starts a command. + let prev_is_dollar = start > 0 && self.source[start - 1..].starts_with('$'); + + let is_command_start = if span.end < remaining.len() { + // Look at the next char after this $ in the remaining slice + let mut next_chars = remaining[span.end..].chars(); + match next_chars.next() { + Some(next_ch) => { + if next_ch == '$' { + // next is a dollar -> this $ does not start a command + false + } else if prev_is_dollar { + // this is the second $ in $$ — only start a command if not followed by whitespace + !next_ch.is_whitespace() + } else { + // single $ (not followed by $) -> start a command + true + } + } + None => false, + } + } else { + false + }; + + if is_command_start { + // Entering command context + self.context_stack.push(LexerContext::Command); + } + Some((Token("$".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::OpenBrace) => { + // Only track brace depth if we're inside an interpolation (context stack > 1) + if self.context_stack.len() > 1 { + self.brace_depth += 1; + } + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::CloseBrace) => { + // Only track brace depth if we're inside an interpolation + if self.context_stack.len() > 1 && self.brace_depth > 0 { + self.brace_depth -= 1; + if self.brace_depth == 0 { + // Exiting interpolation, pop back to string/command context + self.context_stack.pop(); + } + } + Some((Token("}".to_string()), SimpleSpan::new(start, end))) + } + Ok(kind) => { + let token_str = token_kind_to_string(&kind, slice); + Some((Token(token_str), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } + + fn lex_string_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = StringContext::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(StringContext::Quote) => { + // Exiting string context + self.context_stack.pop(); + Some((Token("\"".to_string()), SimpleSpan::new(start, end))) + } + Ok(StringContext::OpenBrace) => { + // Entering interpolation - switch back to main context + self.context_stack.push(LexerContext::Main); + self.brace_depth = 1; + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(StringContext::Content) | Ok(StringContext::Escape) => { + Some((Token(slice.to_string()), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } + + fn lex_command_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = CommandContext::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(CommandContext::Dollar) => { + // Exiting command context + self.context_stack.pop(); + Some((Token("$".to_string()), SimpleSpan::new(start, end))) + } + Ok(CommandContext::OpenBrace) => { + // Entering interpolation - switch back to main context + self.context_stack.push(LexerContext::Main); + self.brace_depth = 1; + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(CommandContext::Content) | Ok(CommandContext::Escape) => { + // If this command context was entered as the second `$` of `$$` and + // the content starts with whitespace (e.g. `$$ failed {`), trim the + // leading whitespace so the identifier/tokenization matches the + // parser's expectations (no leading spaces). + let token_text = if start > 0 && self.source[start - 1..].starts_with('$') { + // second of $$ - trim leading whitespace from content + slice.trim_start().to_string() + } else { + slice.to_string() + }; + Some((Token(token_text), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } +} + +fn token_kind_to_string(kind: &TokenKind, slice: &str) -> String { + match kind { + TokenKind::LessEquals => "<=".to_string(), + TokenKind::GreaterEquals => ">=".to_string(), + TokenKind::NotEquals => "!=".to_string(), + TokenKind::EqualsEquals => "==".to_string(), + TokenKind::PlusEquals => "+=".to_string(), + TokenKind::MinusEquals => "-=".to_string(), + TokenKind::MulEquals => "*=".to_string(), + TokenKind::DivEquals => "/=".to_string(), + TokenKind::ModEquals => "%=".to_string(), + TokenKind::DotDot => "..".to_string(), + TokenKind::Plus => "+".to_string(), + TokenKind::Minus => "-".to_string(), + TokenKind::Star => "*".to_string(), + TokenKind::Slash => "/".to_string(), + TokenKind::Percent => "%".to_string(), + TokenKind::Less => "<".to_string(), + TokenKind::Greater => ">".to_string(), + TokenKind::Equals => "=".to_string(), + TokenKind::Bang => "!".to_string(), + TokenKind::Question => "?".to_string(), + TokenKind::OpenParen => "(".to_string(), + TokenKind::CloseParen => ")".to_string(), + TokenKind::OpenBracket => "[".to_string(), + TokenKind::CloseBracket => "]".to_string(), + TokenKind::OpenBrace => "{".to_string(), + TokenKind::CloseBrace => "}".to_string(), + TokenKind::Semicolon => ";".to_string(), + TokenKind::Colon => ":".to_string(), + TokenKind::Comma => ",".to_string(), + TokenKind::Dot => ".".to_string(), + TokenKind::Backslash => "\\".to_string(), + TokenKind::Quote => "\"".to_string(), + TokenKind::Dollar => "$".to_string(), + TokenKind::Newline => "\n".to_string(), + TokenKind::CompilerFlagStart => "#[".to_string(), + // For these, use the actual slice + TokenKind::Comment | TokenKind::Shebang | TokenKind::Identifier | TokenKind::Number => { + slice.to_string() + } + } +} + +/// Public tokenize function +pub fn tokenize(input: &str) -> Vec> { + StatefulTokenizer::tokenize(input) } diff --git a/src/grammar/alpha035/mod.rs b/src/grammar/alpha035/mod.rs index 55b45a1..0511bfe 100644 --- a/src/grammar/alpha035/mod.rs +++ b/src/grammar/alpha035/mod.rs @@ -9,22 +9,14 @@ use super::{ ParserResponse, Span, }; -use chumsky::{ - error::Rich, - extra::Err, - input::{ - Input, - SpannedInput, - }, - span::SimpleSpan, - Parser, +use crate::grammar::Token; +use chumsky::error::Rich; +use chumsky::extra::Err; +use chumsky::input::{ + Input, + SpannedInput, }; -use heraclitus_compiler::prelude::*; -use lexer::{ - get_rules, - Token, -}; -use prelude::lexer::Lexer; +use chumsky::Parser; use semantic_tokens::semantic_tokens_from_ast; pub mod expressions; @@ -257,9 +249,7 @@ pub enum GlobalStatement { } #[derive(Debug)] -pub struct AmberCompiler { - lexer: Lexer, -} +pub struct AmberCompiler {} impl Default for AmberCompiler { fn default() -> Self { @@ -269,9 +259,7 @@ impl Default for AmberCompiler { impl AmberCompiler { pub fn new() -> Self { - let lexer = Lexer::new(get_rules()); - - AmberCompiler { lexer } + AmberCompiler {} } pub fn parser<'a>(&self) -> impl AmberParser<'a, Vec>> { @@ -282,22 +270,8 @@ impl AmberCompiler { impl LSPAnalysis for AmberCompiler { #[tracing::instrument(skip_all)] fn tokenize(&self, input: &str) -> Vec> { - // It should never fail - self.lexer - .tokenize(&input.replace("\r\n", "\n").replace("\r", "\n")) - .expect("Failed to tokenize input") - .iter() - .filter_map(|t| { - if t.word == "\n" { - return None; - } - - Some(( - Token(t.word.clone()), - SimpleSpan::new(t.start, t.start + t.word.chars().count()), - )) - }) - .collect() + // Use Logos lexer instead of Heraclitus + lexer::tokenize(&input.replace("\r\n", "\n").replace("\r", "\n")) } #[tracing::instrument(skip_all)] diff --git a/src/grammar/alpha035/parser.rs b/src/grammar/alpha035/parser.rs index 6a84d27..010d849 100644 --- a/src/grammar/alpha035/parser.rs +++ b/src/grammar/alpha035/parser.rs @@ -2,10 +2,8 @@ use chumsky::prelude::*; use crate::T; -use super::{ - lexer::Token, - AmberParser, -}; +use super::AmberParser; +use crate::grammar::Token; const KEYWORDS: &[&str] = &[ "if", "else", "loop", "in", "return", "break", "continue", "true", "false", "null", "fun", diff --git a/src/grammar/alpha035/statements/block.rs b/src/grammar/alpha035/statements/block.rs index 1806ec9..2f83d31 100644 --- a/src/grammar/alpha035/statements/block.rs +++ b/src/grammar/alpha035/statements/block.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Block, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Block, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::modifiers::modifier_parser; diff --git a/src/grammar/alpha035/statements/comment.rs b/src/grammar/alpha035/statements/comment.rs index e8c5869..b23ae77 100644 --- a/src/grammar/alpha035/statements/comment.rs +++ b/src/grammar/alpha035/statements/comment.rs @@ -1,11 +1,11 @@ use chumsky::prelude::*; use crate::grammar::alpha035::{ - lexer::Token, AmberParser, Comment, Spanned, }; +use crate::grammar::Token; pub fn comment_parser<'a>() -> impl AmberParser<'a, Spanned> { choice((doc_string_parser(), single_line_comment_parser())).boxed() diff --git a/src/grammar/alpha035/statements/const_init.rs b/src/grammar/alpha035/statements/const_init.rs index 5988b36..fb567c0 100644 --- a/src/grammar/alpha035/statements/const_init.rs +++ b/src/grammar/alpha035/statements/const_init.rs @@ -1,22 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::{ - alpha035::Expression, - alpha035::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Spanned, - Statement, - }, - }, - T, +use crate::grammar::alpha035::expressions::parse_expr; +use crate::grammar::alpha035::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; pub fn const_init_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/statements/failed.rs b/src/grammar/alpha035/statements/failed.rs index 0bc34ab..41bae72 100644 --- a/src/grammar/alpha035/statements/failed.rs +++ b/src/grammar/alpha035/statements/failed.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - parser::default_recovery, - AmberParser, - FailureHandler, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + FailureHandler, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; pub fn failure_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/statements/if_cond.rs b/src/grammar/alpha035/statements/if_cond.rs index 74dd57b..cf67b0d 100644 --- a/src/grammar/alpha035/statements/if_cond.rs +++ b/src/grammar/alpha035/statements/if_cond.rs @@ -1,21 +1,19 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - expressions::parse_expr, - lexer::Token, - parser::default_recovery, - statements::comment, - AmberParser, - Comment, - ElseCondition, - IfChainContent, - IfCondition, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::expressions::parse_expr; +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::statements::comment; +use crate::grammar::alpha035::{ + AmberParser, + Comment, + ElseCondition, + IfChainContent, + IfCondition, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::block::block_parser; diff --git a/src/grammar/alpha035/statements/keywords.rs b/src/grammar/alpha035/statements/keywords.rs index 3fa819b..688de92 100644 --- a/src/grammar/alpha035/statements/keywords.rs +++ b/src/grammar/alpha035/statements/keywords.rs @@ -1,17 +1,15 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - expressions::parse_expr, - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::expressions::parse_expr; +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; pub fn keywords_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/statements/loops.rs b/src/grammar/alpha035/statements/loops.rs index 66a8a97..b5bb6c8 100644 --- a/src/grammar/alpha035/statements/loops.rs +++ b/src/grammar/alpha035/statements/loops.rs @@ -1,22 +1,20 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Block, - Expression, - IterLoopVars, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::expressions::parse_expr; +use crate::grammar::alpha035::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha035::{ + AmberParser, + Block, + Expression, + IterLoopVars, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; use super::block::block_parser; diff --git a/src/grammar/alpha035/statements/mod.rs b/src/grammar/alpha035/statements/mod.rs index e9cec3d..9c7f98d 100644 --- a/src/grammar/alpha035/statements/mod.rs +++ b/src/grammar/alpha035/statements/mod.rs @@ -1,12 +1,10 @@ use chumsky::prelude::*; -use crate::{ - grammar::Token, - T, -}; +use crate::grammar::Token; +use crate::T; +use super::expressions::parse_expr; use super::{ - expressions::parse_expr, AmberParser, Spanned, Statement, diff --git a/src/grammar/alpha035/statements/modifiers.rs b/src/grammar/alpha035/statements/modifiers.rs index 53fa195..22b7c0f 100644 --- a/src/grammar/alpha035/statements/modifiers.rs +++ b/src/grammar/alpha035/statements/modifiers.rs @@ -1,14 +1,12 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - lexer::Token, - AmberParser, - CommandModifier, - Spanned, - }, - T, +use crate::grammar::alpha035::{ + AmberParser, + CommandModifier, + Spanned, }; +use crate::grammar::Token; +use crate::T; pub fn modifier_parser<'a>() -> impl AmberParser<'a, Spanned> { choice(( diff --git a/src/grammar/alpha035/statements/move_files.rs b/src/grammar/alpha035/statements/move_files.rs index 927568a..2760496 100644 --- a/src/grammar/alpha035/statements/move_files.rs +++ b/src/grammar/alpha035/statements/move_files.rs @@ -1,22 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - expressions::parse_expr, - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::expressions::parse_expr; +use crate::grammar::alpha035::parser::default_recovery; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; -use super::{ - failed::failure_parser, - modifiers::modifier_parser, -}; +use super::failed::failure_parser; +use super::modifiers::modifier_parser; pub fn move_files_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/statements/shebang.rs b/src/grammar/alpha035/statements/shebang.rs index 2a62d6c..b3289c6 100644 --- a/src/grammar/alpha035/statements/shebang.rs +++ b/src/grammar/alpha035/statements/shebang.rs @@ -1,11 +1,11 @@ use chumsky::prelude::*; use crate::grammar::alpha035::{ - lexer::Token, AmberParser, Spanned, Statement, }; +use crate::grammar::Token; pub fn shebang_parser<'a>() -> impl AmberParser<'a, Spanned> { any() diff --git a/src/grammar/alpha035/statements/shorthands.rs b/src/grammar/alpha035/statements/shorthands.rs index 466c837..a453fc7 100644 --- a/src/grammar/alpha035/statements/shorthands.rs +++ b/src/grammar/alpha035/statements/shorthands.rs @@ -1,20 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::expressions::parse_expr; +use crate::grammar::alpha035::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; pub fn shorthand_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/statements/var_init.rs b/src/grammar/alpha035/statements/var_init.rs index 407dd6f..2193b06 100644 --- a/src/grammar/alpha035/statements/var_init.rs +++ b/src/grammar/alpha035/statements/var_init.rs @@ -1,21 +1,19 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - expressions::parse_expr, - global::type_parser, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Spanned, - Statement, - VariableInitType, - }, - T, +use crate::grammar::alpha035::expressions::parse_expr; +use crate::grammar::alpha035::global::type_parser; +use crate::grammar::alpha035::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha035::{ + AmberParser, + Spanned, + Statement, + VariableInitType, +}; +use crate::grammar::Token; +use crate::T; pub fn var_init_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha035/statements/var_set.rs b/src/grammar/alpha035/statements/var_set.rs index 4182622..f8cd050 100644 --- a/src/grammar/alpha035/statements/var_set.rs +++ b/src/grammar/alpha035/statements/var_set.rs @@ -1,20 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha035::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha035::expressions::parse_expr; +use crate::grammar::alpha035::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha035::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; pub fn var_set_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/expressions/and.rs b/src/grammar/alpha040/expressions/and.rs index 2321032..e788af4 100644 --- a/src/grammar/alpha040/expressions/and.rs +++ b/src/grammar/alpha040/expressions/and.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::comparison::comparison_parser; diff --git a/src/grammar/alpha040/expressions/atom/array.rs b/src/grammar/alpha040/expressions/atom/array.rs index 1ee8b78..718de8c 100644 --- a/src/grammar/alpha040/expressions/atom/array.rs +++ b/src/grammar/alpha040/expressions/atom/array.rs @@ -1,15 +1,13 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; pub fn array_parser<'a>( expr: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/expressions/atom/bool.rs b/src/grammar/alpha040/expressions/atom/bool.rs index 2c18258..77b5a38 100644 --- a/src/grammar/alpha040/expressions/atom/bool.rs +++ b/src/grammar/alpha040/expressions/atom/bool.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha040::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn bool_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha040/expressions/atom/call.rs b/src/grammar/alpha040/expressions/atom/call.rs index 291a014..b79282a 100644 --- a/src/grammar/alpha040/expressions/atom/call.rs +++ b/src/grammar/alpha040/expressions/atom/call.rs @@ -1,21 +1,17 @@ -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::{ - default_recovery, - ident, - }, - statements::{ - failed::failure_parser, - modifiers::modifier_parser, - }, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha040::statements::failed::failure_parser; +use crate::grammar::alpha040::statements::modifiers::modifier_parser; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn function_call_parser<'a>( diff --git a/src/grammar/alpha040/expressions/atom/command.rs b/src/grammar/alpha040/expressions/atom/command.rs index f7ad32f..639127e 100644 --- a/src/grammar/alpha040/expressions/atom/command.rs +++ b/src/grammar/alpha040/expressions/atom/command.rs @@ -1,21 +1,17 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - statements::{ - failed::failure_parser, - modifiers::modifier_parser, - }, - AmberParser, - Expression, - InterpolatedCommand, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::statements::failed::failure_parser; +use crate::grammar::alpha040::statements::modifiers::modifier_parser; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + InterpolatedCommand, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; pub fn command_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/expressions/atom/exit.rs b/src/grammar/alpha040/expressions/atom/exit.rs index 11f8447..9aaaaf5 100644 --- a/src/grammar/alpha040/expressions/atom/exit.rs +++ b/src/grammar/alpha040/expressions/atom/exit.rs @@ -1,14 +1,12 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; pub fn exit_parser<'a>( exp: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/expressions/atom/mod.rs b/src/grammar/alpha040/expressions/atom/mod.rs index 5eb0e77..96bbaab 100644 --- a/src/grammar/alpha040/expressions/atom/mod.rs +++ b/src/grammar/alpha040/expressions/atom/mod.rs @@ -1,15 +1,11 @@ -use crate::{ - grammar::{ - alpha040::parser::default_recovery, - alpha040::{ - lexer::Token, - AmberParser, - Spanned, - Statement, - }, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha040/expressions/atom/null.rs b/src/grammar/alpha040/expressions/atom/null.rs index 0ef5bc3..2d58232 100644 --- a/src/grammar/alpha040/expressions/atom/null.rs +++ b/src/grammar/alpha040/expressions/atom/null.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha040::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn null_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha040/expressions/atom/number.rs b/src/grammar/alpha040/expressions/atom/number.rs index 569e8b6..b828d98 100644 --- a/src/grammar/alpha040/expressions/atom/number.rs +++ b/src/grammar/alpha040/expressions/atom/number.rs @@ -1,40 +1,32 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - AmberParser, - Spanned, - }, - T, +use crate::grammar::alpha040::{ + AmberParser, + Expression, +}; +use crate::grammar::{ + Spanned, + Token, }; - -use super::Expression; pub fn number_parser<'a>() -> impl AmberParser<'a, Spanned> { - let int = any().try_map(|token: Token, span| { - let word = token.to_string(); - - for char in word.chars() { - if !char.is_ascii_digit() { - return Err(Rich::custom(span, "int must contain only digits")); - } - } + any() + .try_map(|token: Token, span| { + let word = token.to_string(); - Ok(word) - }); + let num_str = if word.starts_with('.') { + // For numbers like ".4", prepend "0" to make "0.4" + format!("0{}", word) + } else { + word + }; - choice(( - int.then(just(T!['.']).ignore_then(int)) - .map(|(int, float)| format!("{int}.{float}")), - just(T!['.']) - .ignore_then(int) - .map(|float| format!("0.{float}")), - int.map(|int| format!("{int}.0")), - )) - .from_str::() - .unwrapped() - .map_with(|num, e| (Expression::Number((num, e.span())), e.span())) - .boxed() - .labelled("number") + // Parse as f32 + num_str + .parse::() + .map_err(|_| Rich::custom(span, format!("invalid number format: {}", num_str))) + }) + .map_with(|num, e| (Expression::Number((num, e.span())), e.span())) + .boxed() + .labelled("number") } diff --git a/src/grammar/alpha040/expressions/atom/parentheses.rs b/src/grammar/alpha040/expressions/atom/parentheses.rs index 122fd48..a69b1d7 100644 --- a/src/grammar/alpha040/expressions/atom/parentheses.rs +++ b/src/grammar/alpha040/expressions/atom/parentheses.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Spanned, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Spanned, }; +use crate::grammar::Token; +use crate::T; use super::super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha040/expressions/atom/status.rs b/src/grammar/alpha040/expressions/atom/status.rs index 315a691..24dab1f 100644 --- a/src/grammar/alpha040/expressions/atom/status.rs +++ b/src/grammar/alpha040/expressions/atom/status.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha040::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - }, - T, +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn status_var_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha040/expressions/atom/text.rs b/src/grammar/alpha040/expressions/atom/text.rs index 2656549..882dc85 100644 --- a/src/grammar/alpha040/expressions/atom/text.rs +++ b/src/grammar/alpha040/expressions/atom/text.rs @@ -1,14 +1,12 @@ -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - InterpolatedText, - Spanned, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + InterpolatedText, + Spanned, }; +use crate::grammar::Token; +use crate::T; use chumsky::prelude::*; pub fn text_parser<'a>( diff --git a/src/grammar/alpha040/expressions/atom/var.rs b/src/grammar/alpha040/expressions/atom/var.rs index 81fc4aa..bd629b4 100644 --- a/src/grammar/alpha040/expressions/atom/var.rs +++ b/src/grammar/alpha040/expressions/atom/var.rs @@ -1,5 +1,5 @@ +use crate::grammar::alpha040::parser::ident; use crate::grammar::alpha040::{ - parser::ident, AmberParser, Spanned, }; diff --git a/src/grammar/alpha040/expressions/cast.rs b/src/grammar/alpha040/expressions/cast.rs index 56a58f1..f6a8fd0 100644 --- a/src/grammar/alpha040/expressions/cast.rs +++ b/src/grammar/alpha040/expressions/cast.rs @@ -1,18 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - global::type_parser, - lexer::Token, - parser::default_recovery, - AmberParser, - DataType, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::global::type_parser; +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + DataType, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::unary::unary_parser; diff --git a/src/grammar/alpha040/expressions/comparison.rs b/src/grammar/alpha040/expressions/comparison.rs index 5305f50..ab91582 100644 --- a/src/grammar/alpha040/expressions/comparison.rs +++ b/src/grammar/alpha040/expressions/comparison.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::sum::sum_parser; diff --git a/src/grammar/alpha040/expressions/is.rs b/src/grammar/alpha040/expressions/is.rs index d3c5959..f69ba4c 100644 --- a/src/grammar/alpha040/expressions/is.rs +++ b/src/grammar/alpha040/expressions/is.rs @@ -1,18 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - global::type_parser, - lexer::Token, - parser::default_recovery, - AmberParser, - DataType, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::global::type_parser; +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + DataType, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::cast::cast_parser; diff --git a/src/grammar/alpha040/expressions/or.rs b/src/grammar/alpha040/expressions/or.rs index 1db885f..4860903 100644 --- a/src/grammar/alpha040/expressions/or.rs +++ b/src/grammar/alpha040/expressions/or.rs @@ -1,20 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; -use super::{ - and::and_parser, - Expression, -}; +use super::and::and_parser; +use super::Expression; pub fn or_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/expressions/product.rs b/src/grammar/alpha040/expressions/product.rs index fcd1e6d..23f0245 100644 --- a/src/grammar/alpha040/expressions/product.rs +++ b/src/grammar/alpha040/expressions/product.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::is::is_parser; diff --git a/src/grammar/alpha040/expressions/range.rs b/src/grammar/alpha040/expressions/range.rs index 60df5e2..c690128 100644 --- a/src/grammar/alpha040/expressions/range.rs +++ b/src/grammar/alpha040/expressions/range.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::or::or_parser; diff --git a/src/grammar/alpha040/expressions/sum.rs b/src/grammar/alpha040/expressions/sum.rs index 47e11da..ef5ae6b 100644 --- a/src/grammar/alpha040/expressions/sum.rs +++ b/src/grammar/alpha040/expressions/sum.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::product::product_parser; diff --git a/src/grammar/alpha040/expressions/ternary.rs b/src/grammar/alpha040/expressions/ternary.rs index cc4dc24..161451b 100644 --- a/src/grammar/alpha040/expressions/ternary.rs +++ b/src/grammar/alpha040/expressions/ternary.rs @@ -1,12 +1,12 @@ use chumsky::prelude::*; -use crate::grammar::alpha040::lexer::Token; use crate::grammar::alpha040::parser::default_recovery; use crate::grammar::alpha040::{ AmberParser, Spanned, Statement, }; +use crate::grammar::Token; use crate::T; use super::range::range_parser; diff --git a/src/grammar/alpha040/expressions/unary.rs b/src/grammar/alpha040/expressions/unary.rs index cea6bc4..0711935 100644 --- a/src/grammar/alpha040/expressions/unary.rs +++ b/src/grammar/alpha040/expressions/unary.rs @@ -1,15 +1,13 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::atom::array_index_parser; diff --git a/src/grammar/alpha040/global.rs b/src/grammar/alpha040/global.rs index bcb32a2..d32e03f 100644 --- a/src/grammar/alpha040/global.rs +++ b/src/grammar/alpha040/global.rs @@ -2,14 +2,13 @@ use chumsky::prelude::*; use crate::T; +use super::expressions::parse_expr; +use super::parser::{ + default_recovery, + ident, +}; +use super::statements::statement_parser; use super::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - statements::statement_parser, AmberParser, CompilerFlag, DataType, @@ -20,6 +19,7 @@ use super::{ Spanned, Statement, }; +use crate::grammar::Token; pub fn import_parser<'a>() -> impl AmberParser<'a, Spanned> { let import_all_parser = just(T!["*"]).map_with(|_, e| (ImportContent::ImportAll, e.span())); @@ -131,8 +131,7 @@ pub fn type_parser<'a>() -> impl AmberParser<'a, Spanned> { } fn compiler_flag_parser<'a>() -> impl AmberParser<'a, Spanned> { - just(T!["#"]) - .ignore_then(just(T!["["])) + just(T!["#["]) .ignore_then( choice(( just(T!["allow_nested_if_else"]).to(CompilerFlag::AllowNestedIfElse), diff --git a/src/grammar/alpha040/lexer.rs b/src/grammar/alpha040/lexer.rs index 278aaef..e5817db 100644 --- a/src/grammar/alpha040/lexer.rs +++ b/src/grammar/alpha040/lexer.rs @@ -1,74 +1,410 @@ -use heraclitus_compiler::prelude::*; - -pub use crate::grammar::Token; - -pub fn get_rules() -> Rules { - let symbols = vec![ - '+', '-', '*', '/', '%', ';', ':', '(', ')', '[', ']', '{', '}', ',', '.', '<', '>', '=', - '!', '?', '\\', '"', '$', '\n', - ]; - let compounds = vec![ - ('<', '='), - ('>', '='), - ('!', '='), - ('=', '='), - ('+', '='), - ('-', '='), - ('*', '='), - ('/', '='), - ('%', '='), - ('.', '.'), - ('/', '/'), - ]; - let region = reg![ - reg!(string as "string literal" => { - begin: "\"", - end: "\"", - tokenize: true, - allow_unclosed_region: true - } => [ - reg!(str_interp as "string interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]), - reg!(command as "command literal" => { - begin: "$", - end: "$", - tokenize: true, - allow_unclosed_region: true - } => [ - reg!(com_interp as "command interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]), - reg!(cc_flag as "compiler flag" => { - begin: "#[", - end: "]", - tokenize: true, - allow_unclosed_region: true - }), - reg!(comment as "comment" => { - begin: "//", - end: "\n", - allow_unclosed_region: true - }), - reg!(comment as "shebang" => { - begin: "#!", - end: "\n", - allow_unclosed_region: true - }), - reg!(interp as "interpolation" => { - begin: "{", - end: "}", - tokenize: true, - allow_unclosed_region: true - } ref global) - ]; - Rules::new(symbols, compounds, region) +use logos::Logos; + +use super::{ + Spanned, + Token, +}; +use crate::grammar::SimpleSpan; + +/// Main token context - general code +#[derive(Logos, Debug, Clone, PartialEq)] +#[logos(skip r"[ \t\r]+")] +pub enum TokenKind { + // Compound operators + #[token("<=")] + LessEquals, + #[token(">=")] + GreaterEquals, + #[token("!=")] + NotEquals, + #[token("==")] + EqualsEquals, + #[token("+=")] + PlusEquals, + #[token("-=")] + MinusEquals, + #[token("*=")] + MulEquals, + #[token("/=")] + DivEquals, + #[token("%=")] + ModEquals, + #[token("..")] + DotDot, + + // Single operators + #[token("+")] + Plus, + #[token("-")] + Minus, + #[token("*")] + Star, + #[token("/")] + Slash, + #[token("%")] + Percent, + #[token("<")] + Less, + #[token(">")] + Greater, + #[token("=")] + Equals, + #[token("!")] + Bang, + #[token("?")] + Question, + + // Delimiters + #[token("(")] + OpenParen, + #[token(")")] + CloseParen, + #[token("[")] + OpenBracket, + #[token("]")] + CloseBracket, + #[token("{")] + OpenBrace, + #[token("}")] + CloseBrace, + + // Punctuation + #[token(";")] + Semicolon, + #[token(":")] + Colon, + #[token(",")] + Comma, + #[token(".")] + Dot, + #[token("\\")] + Backslash, + + // String start (transition to StringContext) + #[token("\"")] + Quote, + + // Command start/end (transition to CommandContext) + #[token("$")] + Dollar, + + // Compiler flag start (transition to CompilerFlagContext) + #[token("#[")] + CompilerFlagStart, + + // Comments (include trailing newline to match Heraclitus behavior) + #[regex(r"//[^\n]*\n?", priority = 2)] + Comment, + #[regex(r"#![^\n]*\n?", priority = 2)] + Shebang, + + // Identifier + #[regex(r"[a-zA-Z_][a-zA-Z0-9_]*")] + Identifier, + + // Number + #[regex(r"([0-9]+(\.[0-9]+)?)|(\.[0-9]+)")] + Number, + + // Newline + #[token("\n")] + Newline, +} + +/// String content context - inside "..." +#[derive(Logos, Debug, Clone, PartialEq)] +pub enum StringContext { + // String end + #[token("\"")] + Quote, + + // Interpolation start + #[token("{")] + OpenBrace, + + // Text content (not quotes, backslashes, or braces) + #[regex(r#"[^"\\{]+"#)] + Content, + + // Escape sequence + #[regex(r#"\\."#)] + Escape, +} + +/// Command content context - inside $...$ +#[derive(Logos, Debug, Clone, PartialEq)] +pub enum CommandContext { + // Command end + #[token("$")] + Dollar, + + // Interpolation start + #[token("{")] + OpenBrace, + + // Text content (not $, backslash, or braces) + #[regex(r"[^$\\{]+")] + Content, + + // Escape sequence + #[regex(r#"\\."#)] + Escape, +} + +/// Context stack to track where we are in parsing +#[derive(Debug, Clone, PartialEq)] +enum LexerContext { + Main, + String, + Command, +} + +/// Stateful tokenizer that manages context switching +pub struct StatefulTokenizer<'source> { + source: &'source str, + position: usize, + context_stack: Vec, + brace_depth: usize, // Track brace nesting inside interpolations +} + +impl<'source> StatefulTokenizer<'source> { + fn new(source: &'source str) -> Self { + Self { + source, + position: 0, + context_stack: vec![LexerContext::Main], + brace_depth: 0, + } + } + + pub fn tokenize(source: &'source str) -> Vec> { + let mut tokenizer = Self::new(source); + let mut tokens = Vec::new(); + + while tokenizer.position < source.len() { + if let Some((token, span)) = tokenizer.next_token() { + tokens.push((token, span)); + } else { + break; + } + } + + // Filter out newline tokens - they're used for position tracking but not needed for parsing + tokens + .into_iter() + .filter(|(token, _)| token.0 != "\n") + .collect() + } + + fn next_token(&mut self) -> Option<(Token, SimpleSpan)> { + if self.position >= self.source.len() { + return None; + } + + let remaining = &self.source[self.position..]; + let context = self.context_stack.last()?.clone(); + + match context { + LexerContext::Main => self.lex_main_context(remaining), + LexerContext::String => self.lex_string_context(remaining), + LexerContext::Command => self.lex_command_context(remaining), + } + } + + fn lex_main_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = TokenKind::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(TokenKind::Quote) => { + // Entering string context + self.context_stack.push(LexerContext::String); + Some((Token("\"".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::Dollar) => { + // Check if this starts a command. + // If the next char is another '$', do not start a command (this is the first of $$). + // If this is the second of a $$ (previous char was '$'), only start a command + // when the following char is not whitespace. Otherwise single $ starts a command. + let prev_is_dollar = start > 0 && self.source[start - 1..].starts_with('$'); + + let is_command_start = if span.end < remaining.len() { + // Look at the next char after this $ in the remaining slice + let mut next_chars = remaining[span.end..].chars(); + match next_chars.next() { + Some(next_ch) => { + if next_ch == '$' { + // next is a dollar -> this $ does not start a command + false + } else if prev_is_dollar { + // this is the second $ in $$ — only start a command if not followed by whitespace + !next_ch.is_whitespace() + } else { + // single $ (not followed by $) -> start a command + true + } + } + None => false, + } + } else { + false + }; + + if is_command_start { + // Entering command context + self.context_stack.push(LexerContext::Command); + } + Some((Token("$".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::OpenBrace) => { + // Only track brace depth if we're inside an interpolation (context stack > 1) + if self.context_stack.len() > 1 { + self.brace_depth += 1; + } + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(TokenKind::CloseBrace) => { + // Only track brace depth if we're inside an interpolation + if self.context_stack.len() > 1 && self.brace_depth > 0 { + self.brace_depth -= 1; + if self.brace_depth == 0 { + // Exiting interpolation, pop back to string/command context + self.context_stack.pop(); + } + } + Some((Token("}".to_string()), SimpleSpan::new(start, end))) + } + Ok(kind) => { + let token_str = token_kind_to_string(&kind, slice); + Some((Token(token_str), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } + + fn lex_string_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = StringContext::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(StringContext::Quote) => { + // Exiting string context + self.context_stack.pop(); + Some((Token("\"".to_string()), SimpleSpan::new(start, end))) + } + Ok(StringContext::OpenBrace) => { + // Entering interpolation - switch back to main context + self.context_stack.push(LexerContext::Main); + self.brace_depth = 1; + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(StringContext::Content) | Ok(StringContext::Escape) => { + Some((Token(slice.to_string()), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } + + fn lex_command_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { + let mut lex = CommandContext::lexer(remaining); + let token_result = lex.next()?; + let span = lex.span(); + let slice = lex.slice(); + + // span is relative to `remaining`, so add current position to get absolute + let start = self.position + span.start; + let end = self.position + span.end; + self.position = end; + + match token_result { + Ok(CommandContext::Dollar) => { + // Exiting command context + self.context_stack.pop(); + Some((Token("$".to_string()), SimpleSpan::new(start, end))) + } + Ok(CommandContext::OpenBrace) => { + // Entering interpolation - switch back to main context + self.context_stack.push(LexerContext::Main); + self.brace_depth = 1; + Some((Token("{".to_string()), SimpleSpan::new(start, end))) + } + Ok(CommandContext::Content) | Ok(CommandContext::Escape) => { + // If this command context was entered as the second `$` of `$$` and + // the content starts with whitespace (e.g. `$$ failed {`), trim the + // leading whitespace so the identifier/tokenization matches the + // parser's expectations (no leading spaces). + let token_text = if start > 0 && self.source[start - 1..].starts_with('$') { + // second of $$ - trim leading whitespace from content + slice.trim_start().to_string() + } else { + slice.to_string() + }; + Some((Token(token_text), SimpleSpan::new(start, end))) + } + Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), + } + } +} + +fn token_kind_to_string(kind: &TokenKind, slice: &str) -> String { + match kind { + TokenKind::LessEquals => "<=".to_string(), + TokenKind::GreaterEquals => ">=".to_string(), + TokenKind::NotEquals => "!=".to_string(), + TokenKind::EqualsEquals => "==".to_string(), + TokenKind::PlusEquals => "+=".to_string(), + TokenKind::MinusEquals => "-=".to_string(), + TokenKind::MulEquals => "*=".to_string(), + TokenKind::DivEquals => "/=".to_string(), + TokenKind::ModEquals => "%=".to_string(), + TokenKind::DotDot => "..".to_string(), + TokenKind::Plus => "+".to_string(), + TokenKind::Minus => "-".to_string(), + TokenKind::Star => "*".to_string(), + TokenKind::Slash => "/".to_string(), + TokenKind::Percent => "%".to_string(), + TokenKind::Less => "<".to_string(), + TokenKind::Greater => ">".to_string(), + TokenKind::Equals => "=".to_string(), + TokenKind::Bang => "!".to_string(), + TokenKind::Question => "?".to_string(), + TokenKind::OpenParen => "(".to_string(), + TokenKind::CloseParen => ")".to_string(), + TokenKind::OpenBracket => "[".to_string(), + TokenKind::CloseBracket => "]".to_string(), + TokenKind::OpenBrace => "{".to_string(), + TokenKind::CloseBrace => "}".to_string(), + TokenKind::Semicolon => ";".to_string(), + TokenKind::Colon => ":".to_string(), + TokenKind::Comma => ",".to_string(), + TokenKind::Dot => ".".to_string(), + TokenKind::Backslash => "\\".to_string(), + TokenKind::Quote => "\"".to_string(), + TokenKind::Dollar => "$".to_string(), + TokenKind::Newline => "\n".to_string(), + TokenKind::CompilerFlagStart => "#[".to_string(), + // For these, use the actual slice + TokenKind::Comment | TokenKind::Shebang | TokenKind::Identifier | TokenKind::Number => { + slice.to_string() + } + } +} + +/// Public tokenize function +pub fn tokenize(input: &str) -> Vec> { + StatefulTokenizer::tokenize(input) } diff --git a/src/grammar/alpha040/mod.rs b/src/grammar/alpha040/mod.rs index 8db4017..46ff4b3 100644 --- a/src/grammar/alpha040/mod.rs +++ b/src/grammar/alpha040/mod.rs @@ -8,23 +8,15 @@ use super::{ LSPAnalysis, ParserResponse, Span, -}; -use chumsky::{ - error::Rich, - extra::Err, - input::{ - Input, - SpannedInput, - }, - span::SimpleSpan, - Parser, -}; -use heraclitus_compiler::prelude::*; -use lexer::{ - get_rules, Token, }; -use prelude::lexer::Lexer; +use chumsky::error::Rich; +use chumsky::extra::Err; +use chumsky::input::{ + Input, + SpannedInput, +}; +use chumsky::Parser; use semantic_tokens::semantic_tokens_from_ast; pub mod expressions; @@ -259,9 +251,7 @@ pub enum GlobalStatement { } #[derive(Debug)] -pub struct AmberCompiler { - lexer: Lexer, -} +pub struct AmberCompiler {} impl Default for AmberCompiler { fn default() -> Self { @@ -271,9 +261,7 @@ impl Default for AmberCompiler { impl AmberCompiler { pub fn new() -> Self { - let lexer = Lexer::new(get_rules()); - - AmberCompiler { lexer } + AmberCompiler {} } pub fn parser<'a>(&self) -> impl AmberParser<'a, Vec>> { @@ -284,22 +272,8 @@ impl AmberCompiler { impl LSPAnalysis for AmberCompiler { #[tracing::instrument(skip_all)] fn tokenize(&self, input: &str) -> Vec> { - // It should never fail - self.lexer - .tokenize(&input.replace("\r\n", "\n").replace("\r", "\n")) - .expect("Failed to tokenize input") - .iter() - .filter_map(|t| { - if t.word == "\n" { - return None; - } - - Some(( - Token(t.word.clone()), - SimpleSpan::new(t.start, t.start + t.word.chars().count()), - )) - }) - .collect() + // Use Logos lexer instead of Heraclitus + lexer::tokenize(&input.replace("\r\n", "\n").replace("\r", "\n")) } #[tracing::instrument(skip_all)] diff --git a/src/grammar/alpha040/parser.rs b/src/grammar/alpha040/parser.rs index 73be524..3c0c01f 100644 --- a/src/grammar/alpha040/parser.rs +++ b/src/grammar/alpha040/parser.rs @@ -2,10 +2,8 @@ use chumsky::prelude::*; use crate::T; -use super::{ - lexer::Token, - AmberParser, -}; +use super::AmberParser; +use crate::grammar::Token; const KEYWORDS: &[&str] = &[ "if", "else", "loop", "in", "return", "break", "continue", "true", "false", "null", "fun", diff --git a/src/grammar/alpha040/statements/block.rs b/src/grammar/alpha040/statements/block.rs index 77e7725..271a88e 100644 --- a/src/grammar/alpha040/statements/block.rs +++ b/src/grammar/alpha040/statements/block.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - Block, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Block, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::modifiers::modifier_parser; diff --git a/src/grammar/alpha040/statements/comment.rs b/src/grammar/alpha040/statements/comment.rs index ed9f798..e155402 100644 --- a/src/grammar/alpha040/statements/comment.rs +++ b/src/grammar/alpha040/statements/comment.rs @@ -1,11 +1,11 @@ use chumsky::prelude::*; use crate::grammar::alpha040::{ - lexer::Token, AmberParser, Comment, Spanned, }; +use crate::grammar::Token; pub fn comment_parser<'a>() -> impl AmberParser<'a, Spanned> { choice((doc_string_parser(), single_line_comment_parser())).boxed() diff --git a/src/grammar/alpha040/statements/const_init.rs b/src/grammar/alpha040/statements/const_init.rs index 893e7d3..7ed521f 100644 --- a/src/grammar/alpha040/statements/const_init.rs +++ b/src/grammar/alpha040/statements/const_init.rs @@ -1,22 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::{ - alpha040::Expression, - alpha040::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Spanned, - Statement, - }, - }, - T, +use crate::grammar::alpha040::expressions::parse_expr; +use crate::grammar::alpha040::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; pub fn const_init_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/statements/failed.rs b/src/grammar/alpha040/statements/failed.rs index cf0e399..ad5c28b 100644 --- a/src/grammar/alpha040/statements/failed.rs +++ b/src/grammar/alpha040/statements/failed.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - parser::default_recovery, - AmberParser, - FailureHandler, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + FailureHandler, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; pub fn failure_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/statements/if_cond.rs b/src/grammar/alpha040/statements/if_cond.rs index 9d39fca..067bfe8 100644 --- a/src/grammar/alpha040/statements/if_cond.rs +++ b/src/grammar/alpha040/statements/if_cond.rs @@ -1,21 +1,19 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - expressions::parse_expr, - lexer::Token, - parser::default_recovery, - statements::comment, - AmberParser, - Comment, - ElseCondition, - IfChainContent, - IfCondition, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::expressions::parse_expr; +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::statements::comment; +use crate::grammar::alpha040::{ + AmberParser, + Comment, + ElseCondition, + IfChainContent, + IfCondition, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; use super::block::block_parser; diff --git a/src/grammar/alpha040/statements/keywords.rs b/src/grammar/alpha040/statements/keywords.rs index 6c6a287..8e22e01 100644 --- a/src/grammar/alpha040/statements/keywords.rs +++ b/src/grammar/alpha040/statements/keywords.rs @@ -1,17 +1,15 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - expressions::parse_expr, - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::expressions::parse_expr; +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; pub fn keywords_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/statements/loops.rs b/src/grammar/alpha040/statements/loops.rs index 690d5f2..431b263 100644 --- a/src/grammar/alpha040/statements/loops.rs +++ b/src/grammar/alpha040/statements/loops.rs @@ -1,22 +1,20 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Block, - Expression, - IterLoopVars, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::expressions::parse_expr; +use crate::grammar::alpha040::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha040::{ + AmberParser, + Block, + Expression, + IterLoopVars, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; use super::block::block_parser; diff --git a/src/grammar/alpha040/statements/mod.rs b/src/grammar/alpha040/statements/mod.rs index e9cec3d..9c7f98d 100644 --- a/src/grammar/alpha040/statements/mod.rs +++ b/src/grammar/alpha040/statements/mod.rs @@ -1,12 +1,10 @@ use chumsky::prelude::*; -use crate::{ - grammar::Token, - T, -}; +use crate::grammar::Token; +use crate::T; +use super::expressions::parse_expr; use super::{ - expressions::parse_expr, AmberParser, Spanned, Statement, diff --git a/src/grammar/alpha040/statements/modifiers.rs b/src/grammar/alpha040/statements/modifiers.rs index 384e3e5..72d13dc 100644 --- a/src/grammar/alpha040/statements/modifiers.rs +++ b/src/grammar/alpha040/statements/modifiers.rs @@ -1,14 +1,12 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - lexer::Token, - AmberParser, - CommandModifier, - Spanned, - }, - T, +use crate::grammar::alpha040::{ + AmberParser, + CommandModifier, + Spanned, }; +use crate::grammar::Token; +use crate::T; pub fn modifier_parser<'a>() -> impl AmberParser<'a, Spanned> { choice(( diff --git a/src/grammar/alpha040/statements/move_files.rs b/src/grammar/alpha040/statements/move_files.rs index 71e132a..5160a93 100644 --- a/src/grammar/alpha040/statements/move_files.rs +++ b/src/grammar/alpha040/statements/move_files.rs @@ -1,22 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - expressions::parse_expr, - lexer::Token, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::expressions::parse_expr; +use crate::grammar::alpha040::parser::default_recovery; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, }; +use crate::grammar::Token; +use crate::T; -use super::{ - failed::failure_parser, - modifiers::modifier_parser, -}; +use super::failed::failure_parser; +use super::modifiers::modifier_parser; pub fn move_files_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/statements/shebang.rs b/src/grammar/alpha040/statements/shebang.rs index 5532bcc..90aef1f 100644 --- a/src/grammar/alpha040/statements/shebang.rs +++ b/src/grammar/alpha040/statements/shebang.rs @@ -1,11 +1,11 @@ use chumsky::prelude::*; use crate::grammar::alpha040::{ - lexer::Token, AmberParser, Spanned, Statement, }; +use crate::grammar::Token; pub fn shebang_parser<'a>() -> impl AmberParser<'a, Spanned> { any() diff --git a/src/grammar/alpha040/statements/shorthands.rs b/src/grammar/alpha040/statements/shorthands.rs index b6f4cc1..1eaed4c 100644 --- a/src/grammar/alpha040/statements/shorthands.rs +++ b/src/grammar/alpha040/statements/shorthands.rs @@ -1,20 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::expressions::parse_expr; +use crate::grammar::alpha040::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; pub fn shorthand_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/statements/var_init.rs b/src/grammar/alpha040/statements/var_init.rs index 40ff816..6bc98f1 100644 --- a/src/grammar/alpha040/statements/var_init.rs +++ b/src/grammar/alpha040/statements/var_init.rs @@ -1,21 +1,19 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - expressions::parse_expr, - global::type_parser, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Spanned, - Statement, - VariableInitType, - }, - T, +use crate::grammar::alpha040::expressions::parse_expr; +use crate::grammar::alpha040::global::type_parser; +use crate::grammar::alpha040::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha040::{ + AmberParser, + Spanned, + Statement, + VariableInitType, +}; +use crate::grammar::Token; +use crate::T; pub fn var_init_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha040/statements/var_set.rs b/src/grammar/alpha040/statements/var_set.rs index 09e6fc8..047e4d7 100644 --- a/src/grammar/alpha040/statements/var_set.rs +++ b/src/grammar/alpha040/statements/var_set.rs @@ -1,20 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha040::{ - expressions::parse_expr, - lexer::Token, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Expression, - Spanned, - Statement, - }, - T, +use crate::grammar::alpha040::expressions::parse_expr; +use crate::grammar::alpha040::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha040::{ + AmberParser, + Expression, + Spanned, + Statement, +}; +use crate::grammar::Token; +use crate::T; pub fn var_set_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/expressions/and.rs b/src/grammar/alpha050/expressions/and.rs index a14c224..1a6b367 100644 --- a/src/grammar/alpha050/expressions/and.rs +++ b/src/grammar/alpha050/expressions/and.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; use super::comparison::comparison_parser; diff --git a/src/grammar/alpha050/expressions/atom/array.rs b/src/grammar/alpha050/expressions/atom/array.rs index baded24..11b2f96 100644 --- a/src/grammar/alpha050/expressions/atom/array.rs +++ b/src/grammar/alpha050/expressions/atom/array.rs @@ -1,15 +1,13 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Token, }; +use crate::T; pub fn array_parser<'a>( expr: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/expressions/atom/bool.rs b/src/grammar/alpha050/expressions/atom/bool.rs index e99426a..f709d24 100644 --- a/src/grammar/alpha050/expressions/atom/bool.rs +++ b/src/grammar/alpha050/expressions/atom/bool.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha050::{ - AmberParser, - Expression, - Spanned, - Token, - }, - T, +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Token, }; +use crate::T; use chumsky::prelude::*; pub fn bool_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha050/expressions/atom/call.rs b/src/grammar/alpha050/expressions/atom/call.rs index 75a0e1f..63cd63a 100644 --- a/src/grammar/alpha050/expressions/atom/call.rs +++ b/src/grammar/alpha050/expressions/atom/call.rs @@ -1,21 +1,17 @@ -use crate::{ - grammar::alpha050::{ - parser::{ - default_recovery, - ident, - }, - statements::{ - failable_handlers::failable_handlers_parser, - modifiers::modifier_parser, - }, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha050::statements::failable_handlers::failable_handlers_parser; +use crate::grammar::alpha050::statements::modifiers::modifier_parser; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, +}; +use crate::T; use chumsky::prelude::*; pub fn function_call_parser<'a>( diff --git a/src/grammar/alpha050/expressions/atom/command.rs b/src/grammar/alpha050/expressions/atom/command.rs index 685e20e..71e474e 100644 --- a/src/grammar/alpha050/expressions/atom/command.rs +++ b/src/grammar/alpha050/expressions/atom/command.rs @@ -1,21 +1,17 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - statements::{ - failable_handlers::failable_handlers_parser, - modifiers::modifier_parser, - }, - AmberParser, - Expression, - InterpolatedCommand, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::statements::failable_handlers::failable_handlers_parser; +use crate::grammar::alpha050::statements::modifiers::modifier_parser; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + InterpolatedCommand, + Spanned, + Statement, + Token, }; +use crate::T; pub fn command_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/expressions/atom/exit.rs b/src/grammar/alpha050/expressions/atom/exit.rs index f9f5ba3..ddd32b0 100644 --- a/src/grammar/alpha050/expressions/atom/exit.rs +++ b/src/grammar/alpha050/expressions/atom/exit.rs @@ -1,14 +1,12 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - AmberParser, - Expression, - Spanned, - Token, - }, - T, +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Token, }; +use crate::T; pub fn exit_parser<'a>( exp: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/expressions/atom/mod.rs b/src/grammar/alpha050/expressions/atom/mod.rs index 004fc34..63f4b9a 100644 --- a/src/grammar/alpha050/expressions/atom/mod.rs +++ b/src/grammar/alpha050/expressions/atom/mod.rs @@ -1,15 +1,11 @@ -use crate::{ - grammar::{ - alpha050::parser::default_recovery, - alpha050::{ - AmberParser, - Spanned, - Statement, - Token, - }, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Spanned, + Statement, + Token, }; +use crate::T; use super::super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha050/expressions/atom/null.rs b/src/grammar/alpha050/expressions/atom/null.rs index 4036cfe..b5040e9 100644 --- a/src/grammar/alpha050/expressions/atom/null.rs +++ b/src/grammar/alpha050/expressions/atom/null.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha050::{ - AmberParser, - Expression, - Spanned, - Token, - }, - T, +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Token, }; +use crate::T; use chumsky::prelude::*; pub fn null_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha050/expressions/atom/number.rs b/src/grammar/alpha050/expressions/atom/number.rs index 220ddbb..55d9b7f 100644 --- a/src/grammar/alpha050/expressions/atom/number.rs +++ b/src/grammar/alpha050/expressions/atom/number.rs @@ -1,23 +1,19 @@ use chumsky::prelude::*; +use crate::grammar::alpha050::{ + AmberParser, + Expression, +}; use crate::grammar::{ - alpha050::{ - AmberParser, - Expression, - }, Spanned, Token, }; pub fn number_parser<'a>() -> impl AmberParser<'a, Spanned> { - // The Logos lexer now produces complete number tokens like "2.5", ".4", or "42" - // So we just need to parse the token string directly any() .try_map(|token: Token, span| { let word = token.to_string(); - // Handle integers and floats in a single token - // Valid formats: "123", "123.456", ".456" let num_str = if word.starts_with('.') { // For numbers like ".4", prepend "0" to make "0.4" format!("0{}", word) diff --git a/src/grammar/alpha050/expressions/atom/parentheses.rs b/src/grammar/alpha050/expressions/atom/parentheses.rs index 377f2e7..7368de6 100644 --- a/src/grammar/alpha050/expressions/atom/parentheses.rs +++ b/src/grammar/alpha050/expressions/atom/parentheses.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Spanned, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Spanned, + Token, }; +use crate::T; use super::super::Expression; use chumsky::prelude::*; diff --git a/src/grammar/alpha050/expressions/atom/status.rs b/src/grammar/alpha050/expressions/atom/status.rs index a2290b5..9e67ce7 100644 --- a/src/grammar/alpha050/expressions/atom/status.rs +++ b/src/grammar/alpha050/expressions/atom/status.rs @@ -1,12 +1,10 @@ -use crate::{ - grammar::alpha050::{ - AmberParser, - Expression, - Spanned, - Token, - }, - T, +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Token, }; +use crate::T; use chumsky::prelude::*; pub fn status_var_parser<'a>() -> impl AmberParser<'a, Spanned> { diff --git a/src/grammar/alpha050/expressions/atom/text.rs b/src/grammar/alpha050/expressions/atom/text.rs index e8bc7eb..fe78299 100644 --- a/src/grammar/alpha050/expressions/atom/text.rs +++ b/src/grammar/alpha050/expressions/atom/text.rs @@ -1,14 +1,12 @@ -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Expression, - InterpolatedText, - Spanned, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + InterpolatedText, + Spanned, + Token, }; +use crate::T; use chumsky::prelude::*; pub fn text_parser<'a>( diff --git a/src/grammar/alpha050/expressions/atom/var.rs b/src/grammar/alpha050/expressions/atom/var.rs index 6128a29..bbbcd65 100644 --- a/src/grammar/alpha050/expressions/atom/var.rs +++ b/src/grammar/alpha050/expressions/atom/var.rs @@ -1,5 +1,5 @@ +use crate::grammar::alpha050::parser::ident; use crate::grammar::alpha050::{ - parser::ident, AmberParser, Spanned, }; diff --git a/src/grammar/alpha050/expressions/cast.rs b/src/grammar/alpha050/expressions/cast.rs index dc826c8..4eda2f9 100644 --- a/src/grammar/alpha050/expressions/cast.rs +++ b/src/grammar/alpha050/expressions/cast.rs @@ -1,18 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - global::type_parser, - parser::default_recovery, - AmberParser, - DataType, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::global::type_parser; +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + DataType, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; use super::unary::unary_parser; diff --git a/src/grammar/alpha050/expressions/comparison.rs b/src/grammar/alpha050/expressions/comparison.rs index d06e35d..cb193c7 100644 --- a/src/grammar/alpha050/expressions/comparison.rs +++ b/src/grammar/alpha050/expressions/comparison.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; use super::sum::sum_parser; diff --git a/src/grammar/alpha050/expressions/is.rs b/src/grammar/alpha050/expressions/is.rs index 87e3295..c1e7e97 100644 --- a/src/grammar/alpha050/expressions/is.rs +++ b/src/grammar/alpha050/expressions/is.rs @@ -1,18 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - global::type_parser, - parser::default_recovery, - AmberParser, - DataType, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::global::type_parser; +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + DataType, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; use super::cast::cast_parser; diff --git a/src/grammar/alpha050/expressions/or.rs b/src/grammar/alpha050/expressions/or.rs index 03bb6f3..0a2e922 100644 --- a/src/grammar/alpha050/expressions/or.rs +++ b/src/grammar/alpha050/expressions/or.rs @@ -1,20 +1,16 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Spanned, + Statement, + Token, }; +use crate::T; -use super::{ - and::and_parser, - Expression, -}; +use super::and::and_parser; +use super::Expression; pub fn or_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/expressions/product.rs b/src/grammar/alpha050/expressions/product.rs index c80b87b..c6c218f 100644 --- a/src/grammar/alpha050/expressions/product.rs +++ b/src/grammar/alpha050/expressions/product.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; use super::is::is_parser; diff --git a/src/grammar/alpha050/expressions/range.rs b/src/grammar/alpha050/expressions/range.rs index a08a770..6b953ba 100644 --- a/src/grammar/alpha050/expressions/range.rs +++ b/src/grammar/alpha050/expressions/range.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; use super::or::or_parser; diff --git a/src/grammar/alpha050/expressions/sum.rs b/src/grammar/alpha050/expressions/sum.rs index 922c384..f34a9f9 100644 --- a/src/grammar/alpha050/expressions/sum.rs +++ b/src/grammar/alpha050/expressions/sum.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; use super::product::product_parser; diff --git a/src/grammar/alpha050/expressions/ternary.rs b/src/grammar/alpha050/expressions/ternary.rs index c55c509..1c33925 100644 --- a/src/grammar/alpha050/expressions/ternary.rs +++ b/src/grammar/alpha050/expressions/ternary.rs @@ -1,11 +1,11 @@ use chumsky::prelude::*; use crate::grammar::alpha050::parser::default_recovery; -use crate::grammar::alpha050::Token; use crate::grammar::alpha050::{ AmberParser, Spanned, Statement, + Token, }; use crate::T; diff --git a/src/grammar/alpha050/expressions/unary.rs b/src/grammar/alpha050/expressions/unary.rs index 302a68c..511962f 100644 --- a/src/grammar/alpha050/expressions/unary.rs +++ b/src/grammar/alpha050/expressions/unary.rs @@ -1,15 +1,13 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; use super::atom::array_index_parser; diff --git a/src/grammar/alpha050/global.rs b/src/grammar/alpha050/global.rs index d7de0e3..b30f3e4 100644 --- a/src/grammar/alpha050/global.rs +++ b/src/grammar/alpha050/global.rs @@ -1,23 +1,17 @@ use chumsky::prelude::*; -use crate::{ - grammar::{ - alpha050::{ - statements::block::block_parser, - Block, - }, - Token, - }, - T, -}; +use crate::grammar::alpha050::statements::block::block_parser; +use crate::grammar::alpha050::Block; +use crate::grammar::Token; +use crate::T; +use super::expressions::parse_expr; +use super::parser::{ + default_recovery, + ident, +}; +use super::statements::statement_parser; use super::{ - expressions::parse_expr, - parser::{ - default_recovery, - ident, - }, - statements::statement_parser, AmberParser, CompilerFlag, DataType, diff --git a/src/grammar/alpha050/lexer_logos_v2.rs b/src/grammar/alpha050/lexer.rs similarity index 95% rename from src/grammar/alpha050/lexer_logos_v2.rs rename to src/grammar/alpha050/lexer.rs index 6af100b..4074b46 100644 --- a/src/grammar/alpha050/lexer_logos_v2.rs +++ b/src/grammar/alpha050/lexer.rs @@ -151,25 +151,12 @@ pub enum CommandContext { Escape, } -/// Compiler flag context - inside #[...] -#[derive(Logos, Debug, Clone, PartialEq)] -pub enum CompilerFlagContext { - // Compiler flag end - #[token("]")] - CloseBracket, - - // Content inside the flag - #[regex(r"[^\]]+")] - Content, -} - /// Context stack to track where we are in parsing #[derive(Debug, Clone, PartialEq)] enum LexerContext { Main, String, Command, - CompilerFlag, } /// Stateful tokenizer that manages context switching @@ -221,7 +208,6 @@ impl<'source> StatefulTokenizer<'source> { LexerContext::Main => self.lex_main_context(remaining), LexerContext::String => self.lex_string_context(remaining), LexerContext::Command => self.lex_command_context(remaining), - LexerContext::CompilerFlag => self.lex_compiler_flag_context(remaining), } } @@ -277,11 +263,6 @@ impl<'source> StatefulTokenizer<'source> { } Some((Token("$".to_string()), SimpleSpan::new(start, end))) } - Ok(TokenKind::CompilerFlagStart) => { - // Entering compiler flag context - self.context_stack.push(LexerContext::CompilerFlag); - Some((Token("#[".to_string()), SimpleSpan::new(start, end))) - } Ok(TokenKind::OpenBrace) => { // Only track brace depth if we're inside an interpolation (context stack > 1) if self.context_stack.len() > 1 { @@ -386,30 +367,6 @@ impl<'source> StatefulTokenizer<'source> { } } } - - fn lex_compiler_flag_context(&mut self, remaining: &str) -> Option<(Token, SimpleSpan)> { - let mut lex = CompilerFlagContext::lexer(remaining); - let token_result = lex.next()?; - let span = lex.span(); - let slice = lex.slice(); - - // span is relative to `remaining`, so add current position to get absolute - let start = self.position + span.start; - let end = self.position + span.end; - self.position = end; - - match token_result { - Ok(CompilerFlagContext::CloseBracket) => { - // Exiting compiler flag context - self.context_stack.pop(); - Some((Token("]".to_string()), SimpleSpan::new(start, end))) - } - Ok(CompilerFlagContext::Content) => { - Some((Token(slice.to_string()), SimpleSpan::new(start, end))) - } - Err(_) => Some((Token(slice.to_string()), SimpleSpan::new(start, end))), - } - } } fn token_kind_to_string(kind: &TokenKind, slice: &str) -> String { diff --git a/src/grammar/alpha050/mod.rs b/src/grammar/alpha050/mod.rs index f292b91..b864c8b 100644 --- a/src/grammar/alpha050/mod.rs +++ b/src/grammar/alpha050/mod.rs @@ -1,5 +1,7 @@ -pub use super::Spanned; -pub use super::Token; +pub use super::{ + Spanned, + Token, +}; use super::{ CommandModifier, @@ -10,20 +12,18 @@ use super::{ Span, }; use crate::analysis::types::DataType; -use chumsky::{ - error::Rich, - extra::Err, - input::{ - Input, - SpannedInput, - }, - Parser, +use chumsky::error::Rich; +use chumsky::extra::Err; +use chumsky::input::{ + Input, + SpannedInput, }; +use chumsky::Parser; use semantic_tokens::semantic_tokens_from_ast; pub mod expressions; pub mod global; -pub mod lexer_logos_v2; +pub mod lexer; pub mod parser; pub mod semantic_tokens; pub mod statements; @@ -289,7 +289,7 @@ impl LSPAnalysis for AmberCompiler { fn tokenize(&self, input: &str) -> Vec> { // Normalize line endings and use Logos v2 lexer with context morphing let normalized = input.replace("\r\n", "\n").replace("\r", "\n"); - lexer_logos_v2::tokenize(&normalized) + lexer::tokenize(&normalized) } #[tracing::instrument(skip_all)] diff --git a/src/grammar/alpha050/parser.rs b/src/grammar/alpha050/parser.rs index 42e4211..5a332ca 100644 --- a/src/grammar/alpha050/parser.rs +++ b/src/grammar/alpha050/parser.rs @@ -1,9 +1,7 @@ use chumsky::prelude::*; -use crate::{ - grammar::Token, - T, -}; +use crate::grammar::Token; +use crate::T; use super::AmberParser; diff --git a/src/grammar/alpha050/statements/block.rs b/src/grammar/alpha050/statements/block.rs index c893285..7297179 100644 --- a/src/grammar/alpha050/statements/block.rs +++ b/src/grammar/alpha050/statements/block.rs @@ -1,16 +1,14 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::default_recovery, - AmberParser, - Block, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Block, + Spanned, + Statement, + Token, }; +use crate::T; use super::modifiers::modifier_parser; diff --git a/src/grammar/alpha050/statements/const_init.rs b/src/grammar/alpha050/statements/const_init.rs index 349265c..ff2dc44 100644 --- a/src/grammar/alpha050/statements/const_init.rs +++ b/src/grammar/alpha050/statements/const_init.rs @@ -1,20 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - expressions::parse_expr, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::expressions::parse_expr; +use crate::grammar::alpha050::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, +}; +use crate::T; pub fn const_init_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/statements/failable_handlers.rs b/src/grammar/alpha050/statements/failable_handlers.rs index c3657cd..02971d5 100644 --- a/src/grammar/alpha050/statements/failable_handlers.rs +++ b/src/grammar/alpha050/statements/failable_handlers.rs @@ -1,22 +1,20 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - parser::{ - default_recovery, - ident, - }, - statements::block::block_parser, - AmberParser, - Block, - FailableHandler, - FailureHandler, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha050::statements::block::block_parser; +use crate::grammar::alpha050::{ + AmberParser, + Block, + FailableHandler, + FailureHandler, + Spanned, + Statement, + Token, +}; +use crate::T; fn failure_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/statements/if_cond.rs b/src/grammar/alpha050/statements/if_cond.rs index aea4d57..c4c918a 100644 --- a/src/grammar/alpha050/statements/if_cond.rs +++ b/src/grammar/alpha050/statements/if_cond.rs @@ -1,21 +1,19 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - expressions::parse_expr, - parser::default_recovery, - statements::comment, - AmberParser, - Comment, - ElseCondition, - IfChainContent, - IfCondition, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::expressions::parse_expr; +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::statements::comment; +use crate::grammar::alpha050::{ + AmberParser, + Comment, + ElseCondition, + IfChainContent, + IfCondition, + Spanned, + Statement, + Token, }; +use crate::T; use super::block::block_parser; diff --git a/src/grammar/alpha050/statements/keywords.rs b/src/grammar/alpha050/statements/keywords.rs index ae567df..15a0545 100644 --- a/src/grammar/alpha050/statements/keywords.rs +++ b/src/grammar/alpha050/statements/keywords.rs @@ -1,17 +1,15 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - expressions::parse_expr, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::expressions::parse_expr; +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; pub fn keywords_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/statements/loops.rs b/src/grammar/alpha050/statements/loops.rs index 28804ef..1a8a901 100644 --- a/src/grammar/alpha050/statements/loops.rs +++ b/src/grammar/alpha050/statements/loops.rs @@ -1,22 +1,20 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - expressions::parse_expr, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Block, - Expression, - IterLoopVars, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::expressions::parse_expr; +use crate::grammar::alpha050::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha050::{ + AmberParser, + Block, + Expression, + IterLoopVars, + Spanned, + Statement, + Token, +}; +use crate::T; use super::block::block_parser; diff --git a/src/grammar/alpha050/statements/mod.rs b/src/grammar/alpha050/statements/mod.rs index 5f68af0..c9c8b9a 100644 --- a/src/grammar/alpha050/statements/mod.rs +++ b/src/grammar/alpha050/statements/mod.rs @@ -1,12 +1,10 @@ use chumsky::prelude::*; -use crate::{ - grammar::Token, - T, -}; +use crate::grammar::Token; +use crate::T; +use super::expressions::parse_expr; use super::{ - expressions::parse_expr, AmberParser, Spanned, Statement, diff --git a/src/grammar/alpha050/statements/modifiers.rs b/src/grammar/alpha050/statements/modifiers.rs index 5869460..cfe495f 100644 --- a/src/grammar/alpha050/statements/modifiers.rs +++ b/src/grammar/alpha050/statements/modifiers.rs @@ -1,14 +1,12 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - AmberParser, - CommandModifier, - Spanned, - Token, - }, - T, +use crate::grammar::alpha050::{ + AmberParser, + CommandModifier, + Spanned, + Token, }; +use crate::T; pub fn modifier_parser<'a>() -> impl AmberParser<'a, Spanned> { choice(( diff --git a/src/grammar/alpha050/statements/move_files.rs b/src/grammar/alpha050/statements/move_files.rs index 58a25c9..39cdff2 100644 --- a/src/grammar/alpha050/statements/move_files.rs +++ b/src/grammar/alpha050/statements/move_files.rs @@ -1,22 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - expressions::parse_expr, - parser::default_recovery, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::expressions::parse_expr; +use crate::grammar::alpha050::parser::default_recovery; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, }; +use crate::T; -use super::{ - failable_handlers::failable_handlers_parser, - modifiers::modifier_parser, -}; +use super::failable_handlers::failable_handlers_parser; +use super::modifiers::modifier_parser; pub fn move_files_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/statements/shorthands.rs b/src/grammar/alpha050/statements/shorthands.rs index 66816ac..ff83724 100644 --- a/src/grammar/alpha050/statements/shorthands.rs +++ b/src/grammar/alpha050/statements/shorthands.rs @@ -1,20 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - expressions::parse_expr, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::expressions::parse_expr; +use crate::grammar::alpha050::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, +}; +use crate::T; pub fn shorthand_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/statements/var_init.rs b/src/grammar/alpha050/statements/var_init.rs index 0440f92..ce1cae2 100644 --- a/src/grammar/alpha050/statements/var_init.rs +++ b/src/grammar/alpha050/statements/var_init.rs @@ -1,21 +1,19 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - expressions::parse_expr, - global::type_parser, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Spanned, - Statement, - Token, - VariableInitType, - }, - T, +use crate::grammar::alpha050::expressions::parse_expr; +use crate::grammar::alpha050::global::type_parser; +use crate::grammar::alpha050::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha050::{ + AmberParser, + Spanned, + Statement, + Token, + VariableInitType, +}; +use crate::T; pub fn var_init_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/alpha050/statements/var_set.rs b/src/grammar/alpha050/statements/var_set.rs index 31b3321..178df48 100644 --- a/src/grammar/alpha050/statements/var_set.rs +++ b/src/grammar/alpha050/statements/var_set.rs @@ -1,20 +1,18 @@ use chumsky::prelude::*; -use crate::{ - grammar::alpha050::{ - expressions::parse_expr, - parser::{ - default_recovery, - ident, - }, - AmberParser, - Expression, - Spanned, - Statement, - Token, - }, - T, +use crate::grammar::alpha050::expressions::parse_expr; +use crate::grammar::alpha050::parser::{ + default_recovery, + ident, }; +use crate::grammar::alpha050::{ + AmberParser, + Expression, + Spanned, + Statement, + Token, +}; +use crate::T; pub fn var_set_parser<'a>( stmnts: impl AmberParser<'a, Spanned>, diff --git a/src/grammar/mod.rs b/src/grammar/mod.rs index f17cc40..2ee7daf 100644 --- a/src/grammar/mod.rs +++ b/src/grammar/mod.rs @@ -1,7 +1,5 @@ -use chumsky::{ - error::Rich, - span::SimpleSpan, -}; +use chumsky::error::Rich; +use chumsky::span::SimpleSpan; use std::fmt::{ self, Debug, diff --git a/src/main.rs b/src/main.rs index 096f8c3..04f1cb3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,15 @@ -use std::{ - env::temp_dir, - process::{ - Command, - Stdio, - }, +use std::env::temp_dir; +use std::process::{ + Command, + Stdio, }; use amber_lsp::backend::{ AmberVersion, Backend, }; +use clap::builder::PossibleValue; use clap::{ - builder::PossibleValue, Parser, ValueEnum, }; diff --git a/src/stdlib.rs b/src/stdlib.rs index d3eee0a..abd4d02 100644 --- a/src/stdlib.rs +++ b/src/stdlib.rs @@ -1,12 +1,10 @@ -use std::{ - env::current_exe, - future::Future, - path::{ - Path, - PathBuf, - }, - pin::Pin, +use std::env::current_exe; +use std::future::Future; +use std::path::{ + Path, + PathBuf, }; +use std::pin::Pin; use clap::builder::OsStr; use include_dir::{ @@ -14,10 +12,8 @@ use include_dir::{ Dir, DirEntry, }; -use tower_lsp_server::{ - lsp_types::Uri, - UriExt, -}; +use tower_lsp_server::lsp_types::Uri; +use tower_lsp_server::UriExt; use tracing::warn; use crate::backend::{ diff --git a/tests/analysis/alpha034.rs b/tests/analysis/alpha034.rs index 11fd2f9..bece96a 100644 --- a/tests/analysis/alpha034.rs +++ b/tests/analysis/alpha034.rs @@ -1,23 +1,19 @@ -use std::{ - path::Path, - sync::Arc, -}; +use std::path::Path; +use std::sync::Arc; -use amber_lsp::{ - analysis::{ - FunctionSymbol, - SymbolType, - }, - backend::{ - AmberVersion, - Backend, - }, - fs::MemoryFS, +use amber_lsp::analysis::{ + FunctionSymbol, + SymbolType, +}; +use amber_lsp::backend::{ + AmberVersion, + Backend, }; +use amber_lsp::fs::MemoryFS; use insta::assert_debug_snapshot; use tokio::test; +use tower_lsp_server::lsp_types::Uri; use tower_lsp_server::{ - lsp_types::Uri, LspService, UriExt, }; diff --git a/tests/analysis/alpha050.rs b/tests/analysis/alpha050.rs index f52bd92..90fbaca 100644 --- a/tests/analysis/alpha050.rs +++ b/tests/analysis/alpha050.rs @@ -1,21 +1,15 @@ -use std::{ - path::Path, - sync::Arc, -}; +use std::path::Path; +use std::sync::Arc; -use amber_lsp::{ - backend::{ - AmberVersion, - Backend, - }, - fs::MemoryFS, +use amber_lsp::backend::{ + AmberVersion, + Backend, }; +use amber_lsp::fs::MemoryFS; use insta::assert_debug_snapshot; use tokio::test; -use tower_lsp_server::{ - lsp_types::Uri, - UriExt, -}; +use tower_lsp_server::lsp_types::Uri; +use tower_lsp_server::UriExt; #[test] async fn test_simple_function() { diff --git a/tests/grammar/alpha034.rs b/tests/grammar/alpha034.rs index c18aaf2..fa46c7e 100644 --- a/tests/grammar/alpha034.rs +++ b/tests/grammar/alpha034.rs @@ -3,15 +3,15 @@ use std::fs::read_to_string; use chumsky::error::Rich; use insta::assert_debug_snapshot; +use amber_lsp::grammar::alpha034::semantic_tokens::semantic_tokens_from_ast; +use amber_lsp::grammar::alpha034::{ + AmberCompiler, + Spanned, +}; use amber_lsp::grammar::{ - alpha034::{ - lexer::Token, - semantic_tokens::semantic_tokens_from_ast, - AmberCompiler, - Spanned, - }, LSPAnalysis, ParserResponse, + Token, }; fn tokenize(input: &str) -> Vec> { diff --git a/tests/grammar/alpha035.rs b/tests/grammar/alpha035.rs index 2e2fe1a..c2ecd99 100644 --- a/tests/grammar/alpha035.rs +++ b/tests/grammar/alpha035.rs @@ -3,15 +3,15 @@ use std::fs::read_to_string; use chumsky::error::Rich; use insta::assert_debug_snapshot; +use amber_lsp::grammar::alpha035::{ + AmberCompiler, + GlobalStatement, + Spanned, +}; use amber_lsp::grammar::{ - alpha035::{ - lexer::Token, - AmberCompiler, - GlobalStatement, - Spanned, - }, LSPAnalysis, ParserResponse, + Token, }; fn tokenize(input: &str) -> Vec> { diff --git a/tests/grammar/alpha040.rs b/tests/grammar/alpha040.rs index db3c185..769282e 100644 --- a/tests/grammar/alpha040.rs +++ b/tests/grammar/alpha040.rs @@ -3,15 +3,15 @@ use std::fs::read_to_string; use chumsky::error::Rich; use insta::assert_debug_snapshot; +use amber_lsp::grammar::alpha040::{ + AmberCompiler, + GlobalStatement, + Spanned, +}; use amber_lsp::grammar::{ - alpha040::{ - lexer::Token, - AmberCompiler, - GlobalStatement, - Spanned, - }, LSPAnalysis, ParserResponse, + Token, }; fn tokenize(input: &str) -> Vec> { diff --git a/tests/grammar/alpha050.rs b/tests/grammar/alpha050.rs index 5bfc34d..b48bfcb 100644 --- a/tests/grammar/alpha050.rs +++ b/tests/grammar/alpha050.rs @@ -3,13 +3,13 @@ use std::fs::read_to_string; use chumsky::error::Rich; use insta::assert_debug_snapshot; +use amber_lsp::grammar::alpha050::{ + AmberCompiler, + GlobalStatement, + Spanned, + Token, +}; use amber_lsp::grammar::{ - alpha050::{ - AmberCompiler, - GlobalStatement, - Spanned, - Token, - }, LSPAnalysis, ParserResponse, }; diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-10.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-10.snap index d17739c..97b90e3 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-10.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-10.snap @@ -74,8 +74,8 @@ expression: "parse(&tokenize(\"[1, 2 3 let\"))" ], ), [ - found "3" at 6..7 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', - found "let" at 8..11 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '"]"', + found "3" at 6..7 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', + found "let" at 8..11 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '"]"', found end of input at 8..11 expected something else, found end of input at 11..11 expected '"="', found end of input at 11..11 expected "type", or "expression", diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-11.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-11.snap index ff3365b..e909bd1 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-11.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-11.snap @@ -71,6 +71,6 @@ expression: "parse(&tokenize(\"[1, 2 3] 4\"))" ], ), [ - found "3" at 6..7 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', + found "3" at 6..7 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-5.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-5.snap index 10b23ad..d4d6343 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-5.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-5.snap @@ -34,6 +34,6 @@ expression: "parse(&tokenize(\"[1\"))" ], ), [ - found end of input at 2..2 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '"]"', + found end of input at 2..2 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '"]"', ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-8.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-8.snap index 8ba7aa6..d8a4107 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-8.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-8.snap @@ -43,6 +43,6 @@ expression: "parse(&tokenize(\"[1, 2\"))" ], ), [ - found end of input at 5..5 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '"]"', + found end of input at 5..5 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '"]"', ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-9.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-9.snap index 183b99b..4bb067e 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__array-9.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__array-9.snap @@ -52,7 +52,7 @@ expression: "parse(&tokenize(\"[1, 2 3\"))" ], ), [ - found "3" at 6..7 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', - found end of input at 7..7 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '"]"', + found "3" at 6..7 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', + found end of input at 7..7 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '"]"', ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-2.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-2.snap index 9aefd95..27c560f 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-2.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-2.snap @@ -19,27 +19,9 @@ expression: "parse_unwrap(&tokenize(\"$echo \\\"Hello, {name}!\\\"$\"))" ), ( Text( - "echo", + "echo \"Hello, ", ), - 1..5, - ), - ( - Text( - "\"", - ), - 6..7, - ), - ( - Text( - "Hello", - ), - 7..12, - ), - ( - Text( - ",", - ), - 12..13, + 1..14, ), ( Expression( @@ -57,15 +39,9 @@ expression: "parse_unwrap(&tokenize(\"$echo \\\"Hello, {name}!\\\"$\"))" ), ( Text( - "!", - ), - 20..21, - ), - ( - Text( - "\"", + "!\"", ), - 21..22, + 20..22, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-3.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-3.snap index 1af2b9d..3bc55d8 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-3.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-3.snap @@ -21,21 +21,9 @@ expression: "parse(&tokenize(\"$command --arg1 -v$\"))" ), ( Text( - "command", + "command --arg1 -v", ), - 1..8, - ), - ( - CommandOption( - "--arg1", - ), - 9..15, - ), - ( - CommandOption( - "-v", - ), - 16..18, + 1..18, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-4.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-4.snap index 02febc3..9c86e55 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-4.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-4.snap @@ -21,15 +21,9 @@ expression: "parse(&tokenize(\"$command -$\"))" ), ( Text( - "command", + "command -", ), - 1..8, - ), - ( - CommandOption( - "-", - ), - 9..10, + 1..10, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-5.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-5.snap index 685dda4..cc8198c 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-5.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-5.snap @@ -21,21 +21,9 @@ expression: "parse(&tokenize(\"$command --arg1 -v\"))" ), ( Text( - "command", + "command --arg1 -v", ), - 1..8, - ), - ( - CommandOption( - "--arg1", - ), - 9..15, - ), - ( - CommandOption( - "-v", - ), - 16..18, + 1..18, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-6.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-6.snap index 50ffaa9..ad7eaa1 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-6.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-6.snap @@ -21,9 +21,9 @@ expression: "parse(&tokenize(\"$command {unclosed\"))" ), ( Text( - "command", + "command ", ), - 1..8, + 1..9, ), ( Expression( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-7.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-7.snap index c52f790..76fc3d2 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-7.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-7.snap @@ -21,9 +21,9 @@ expression: "parse(&tokenize(\"$command {unclosed interpolation$ let x = 10\"))" ), ( Text( - "command", + "command ", ), - 1..8, + 1..9, ), ( Expression( @@ -65,38 +65,16 @@ expression: "parse(&tokenize(\"$command {unclosed interpolation$ let x = 10\"))" ( Statement( ( - VariableInit( - ( - "let", - 34..37, - ), - ( - "x", - 38..39, - ), - ( - Expression( - ( - Number( - ( - 10.0, - 42..44, - ), - ), - 42..44, - ), - ), - 42..44, - ), - ), - 34..44, + Error, + 33..44, ), ), - 34..44, + 33..44, ), ], ), [ found "interpolation" at 19..32 expected '"("', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '"}"', + found end of input at 33..44 expected something else, ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-8.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-8.snap index d27c196..80a2177 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-8.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-8.snap @@ -21,9 +21,9 @@ expression: "parse(&tokenize(\"$command {\"))" ), ( Text( - "command", + "command ", ), - 1..8, + 1..9, ), ( Expression( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-9.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-9.snap index 2a2ea51..6e10c52 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__command-9.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command-9.snap @@ -21,9 +21,9 @@ expression: "parse(&tokenize(\"$command {}$\"))" ), ( Text( - "command", + "command ", ), - 1..8, + 1..9, ), ( Expression( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command.snap index a534375..b3fbd40 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__command.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command.snap @@ -19,43 +19,25 @@ expression: "parse_unwrap(&tokenize(r#\"$echo \\\"Hello, world!\\\"$\"#))" ), ( Text( - "echo", + "echo ", ), - 1..5, - ), - ( - Escape( - "\"", - ), - 6..8, - ), - ( - Text( - "Hello", - ), - 8..13, + 1..6, ), ( Text( - ",", + "\\\"", ), - 13..14, + 6..8, ), ( Text( - "world", + "Hello, world!", ), - 15..20, + 8..21, ), ( Text( - "!", - ), - 20..21, - ), - ( - Escape( - "\"", + "\\\"", ), 21..23, ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-5.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-5.snap index 01ee3f7..bc321d3 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-5.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-5.snap @@ -40,6 +40,6 @@ expression: "parse(&tokenize(\"func(1\"))" ], ), [ - found end of input at 6..6 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '")"', + found end of input at 6..6 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '")"', ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-7.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-7.snap index e7a5251..471c833 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-7.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-7.snap @@ -49,7 +49,7 @@ expression: "parse(&tokenize(\"func(1 2\"))" ], ), [ - found "2" at 7..8 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', - found end of input at 8..8 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '")"', + found "2" at 7..8 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', + found end of input at 8..8 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '")"', ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-8.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-8.snap index 900e9a2..8cd55d3 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-8.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-8.snap @@ -71,8 +71,8 @@ expression: "parse(&tokenize(\"func(1 2 let\"))" ], ), [ - found "2" at 7..8 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', - found "let" at 9..12 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '")"', + found "2" at 7..8 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', + found "let" at 9..12 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', '","', or '")"', found end of input at 9..12 expected something else, found end of input at 12..12 expected '"="', found end of input at 12..12 expected "type", or "expression", diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-9.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-9.snap index ead17b3..16f0774 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-9.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__function_invocation-9.snap @@ -68,6 +68,6 @@ expression: "parse(&tokenize(\"func(1 2) 3\"))" ], ), [ - found "2" at 7..8 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', + found "2" at 7..8 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '","', ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__lexer.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__lexer.snap index b3c8a0a..eded5d7 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__lexer.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__lexer.snap @@ -29,21 +29,15 @@ expression: "compiler.tokenize(r#\"\n let x = \"my \\\"interpolated\\\" s ), ( Token( - "my", + "my ", ), - 18..20, + 18..21, ), ( Token( - "\\", + "\\\"", ), - 21..22, - ), - ( - Token( - "\"", - ), - 22..23, + 21..23, ), ( Token( @@ -53,21 +47,15 @@ expression: "compiler.tokenize(r#\"\n let x = \"my \\\"interpolated\\\" s ), ( Token( - "\\", - ), - 35..36, - ), - ( - Token( - "\"", + "\\\"", ), - 36..37, + 35..37, ), ( Token( - "string", + " string ", ), - 38..44, + 37..45, ), ( Token( @@ -89,9 +77,9 @@ expression: "compiler.tokenize(r#\"\n let x = \"my \\\"interpolated\\\" s ), ( Token( - "end", + " end", ), - 52..55, + 51..55, ), ( Token( @@ -113,57 +101,15 @@ expression: "compiler.tokenize(r#\"\n let x = \"my \\\"interpolated\\\" s ), ( Token( - "this", - ), - 68..72, - ), - ( - Token( - "-", - ), - 73..74, - ), - ( - Token( - "-", + "this --should be - tokenized ", ), - 74..75, + 68..97, ), ( Token( - "should", + "\\$", ), - 75..81, - ), - ( - Token( - "be", - ), - 82..84, - ), - ( - Token( - "-", - ), - 85..86, - ), - ( - Token( - "tokenized", - ), - 87..96, - ), - ( - Token( - "\\", - ), - 97..98, - ), - ( - Token( - "$", - ), - 98..99, + 97..99, ), ( Token( @@ -179,21 +125,9 @@ expression: "compiler.tokenize(r#\"\n let x = \"my \\\"interpolated\\\" s ), ( Token( - "unclosed", - ), - 110..118, - ), - ( - Token( - "string", - ), - 119..125, - ), - ( - Token( - "abcd", + "unclosed string\n\n abcd ", ), - 135..139, + 110..140, ), ( Token( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__parentheses-3.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__parentheses-3.snap index 4c83423..4478dc1 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__parentheses-3.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__parentheses-3.snap @@ -32,6 +32,6 @@ expression: "parse(&tokenize(\"(1\"))" ], ), [ - found end of input at 2..2 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '")"', + found end of input at 2..2 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '")"', ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__parentheses-4.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__parentheses-4.snap index 90e519f..ddf583b 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__parentheses-4.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__parentheses-4.snap @@ -32,6 +32,6 @@ expression: "parse(&tokenize(\"(1,)\"))" ], ), [ - found "," at 2..3 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '")"', + found "," at 2..3 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '")"', ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__recovery-4.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__recovery-4.snap index 3fe1f5e..97ca60a 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__recovery-4.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__recovery-4.snap @@ -50,16 +50,16 @@ expression: "parse(&tokenize(r#\"\n fun foo(a) {\n\n return \" ( Text( ( - "echo", - 43..47, + "echo ", + 43..48, ), ), - 43..47, + 43..48, ), ( - Escape( + Text( ( - "\"", + "\\\"", 48..50, ), ), @@ -94,9 +94,9 @@ expression: "parse(&tokenize(r#\"\n fun foo(a) {\n\n return \" 50..57, ), ( - Escape( + Text( ( - "\"", + "\\\"", 57..59, ), ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__recovery-5.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__recovery-5.snap index ccf7e06..d3d6bea 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__recovery-5.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__recovery-5.snap @@ -126,10 +126,14 @@ expression: "parse(&tokenize(r#\"\n // comments\n // comments\n\n ), ( Error, - 144..149, + 144..145, ), ( - Expression( + Echo( + ( + "echo", + 145..149, + ), ( Gt( ( @@ -138,20 +142,11 @@ expression: "parse(&tokenize(r#\"\n // comments\n // comments\n\n ( Text( ( - "NOT", - 151..154, - ), - ), - 151..154, - ), - ( - Text( - ( - "READY", - 155..160, + "NOT READY", + 151..160, ), ), - 155..160, + 151..160, ), ], ), @@ -165,7 +160,7 @@ expression: "parse(&tokenize(r#\"\n // comments\n // comments\n\n 150..163, ), ), - 150..163, + 145..163, ), ( Block( @@ -247,16 +242,16 @@ expression: "parse(&tokenize(r#\"\n // comments\n // comments\n\n ( Text( ( - "echo", - 224..228, + "echo ", + 224..229, ), ), - 224..228, + 224..229, ), ( - Escape( + Text( ( - "\"", + "\\\"", 229..231, ), ), @@ -291,9 +286,9 @@ expression: "parse(&tokenize(r#\"\n // comments\n // comments\n\n 231..238, ), ( - Escape( + Text( ( - "\"", + "\\\"", 238..240, ), ), @@ -482,7 +477,7 @@ expression: "parse(&tokenize(r#\"\n // comments\n // comments\n\n [ found end of input at 74..75 expected something else, found "CmdText" at 115..122 expected "type", - found end of input at 144..149 expected something else, + found end of input at 144..145 expected something else, found "{" at 164..165 expected "expression", found end of input at 170..171 expected something else, ], diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__stdlib.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__stdlib.snap index 6346ab8..99b4fe2 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__stdlib.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__stdlib.snap @@ -65,19 +65,13 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 48..54, + 48..56, ), ( Text( - "\"", - ), - 55..56, - ), - ( - Escape( - "$", + "\\$", ), 56..58, ), @@ -174,20 +168,11 @@ expression: parse(&tokenize(&stdlib)) ( Text( ( - "$", - 106..107, - ), - ), - 106..107, - ), - ( - Text( - ( - "REPLY", - 107..112, + "$REPLY", + 106..112, ), ), - 107..112, + 106..112, ), ], ), @@ -283,39 +268,27 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 189..193, + 189..195, ), ( Text( - "\"", - ), - 194..195, - ), - ( - Escape( - "$", + "\\$", ), 195..197, ), - ( - Escape( - "{", - ), - 197..199, - ), ( Text( - "source", + "\\{", ), - 199..205, + 197..199, ), ( Text( - "/", + "source/", ), - 205..206, + 199..206, ), ( Expression( @@ -353,15 +326,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "}", - ), - 229..230, - ), - ( - Text( - "\"", + "}\"", ), - 230..231, + 229..231, ), ( Text( @@ -464,39 +431,27 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 303..307, + 303..309, ), ( Text( - "\"", - ), - 308..309, - ), - ( - Escape( - "$", + "\\$", ), 309..311, ), - ( - Escape( - "{", - ), - 311..313, - ), ( Text( - "source", + "\\{", ), - 313..319, + 311..313, ), ( Text( - "//", + "source//", ), - 319..321, + 313..321, ), ( Expression( @@ -534,15 +489,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "}", - ), - 344..345, - ), - ( - Text( - "\"", + "}\"", ), - 345..346, + 344..346, ), ( Text( @@ -662,15 +611,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 448..452, - ), - ( - Text( - "\"", + "echo \"", ), - 453..454, + 448..454, ), ( Expression( @@ -688,45 +631,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 462..463, - ), - ( - Text( - "|", - ), - 464..465, - ), - ( - Text( - "sed", - ), - 466..469, - ), - ( - CommandOption( - "-e", - ), - 470..472, - ), - ( - Text( - "\"", - ), - 473..474, - ), - ( - Text( - "s", - ), - 474..475, - ), - ( - Text( - "/", + "\" | sed -e \"s/", ), - 475..476, + 462..476, ), ( Expression( @@ -764,21 +671,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "/", - ), - 499..500, - ), - ( - Text( - "g", - ), - 500..501, - ), - ( - Text( - "\"", + "/g\"", ), - 501..502, + 499..502, ), ( Text( @@ -845,21 +740,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 538..539, - ), - ( - CommandOption( - "-d", - ), - 540..542, - ), - ( - Text( - "\"", + "[ -d \"", ), - 543..544, + 538..544, ), ( Expression( @@ -877,15 +760,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 550..551, - ), - ( - Text( - "]", + "\" ]", ), - 552..553, + 550..553, ), ( Text( @@ -1003,21 +880,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 642..643, - ), - ( - CommandOption( - "-f", - ), - 644..646, - ), - ( - Text( - "\"", + "[ -f \"", ), - 647..648, + 642..648, ), ( Expression( @@ -1035,15 +900,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 654..655, - ), - ( - Text( - "]", + "\" ]", ), - 656..657, + 654..657, ), ( Text( @@ -1166,15 +1025,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "<", + "< \"", ), - 752..753, - ), - ( - Text( - "\"", - ), - 754..755, + 752..755, ), ( Expression( @@ -1284,15 +1137,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 816..820, - ), - ( - Text( - "\"", + "echo \"", ), - 821..822, + 816..822, ), ( Expression( @@ -1310,21 +1157,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 831..832, - ), - ( - Text( - ">", - ), - 833..834, - ), - ( - Text( - "\"", + "\" > \"", ), - 835..836, + 831..836, ), ( Expression( @@ -1434,15 +1269,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 898..902, - ), - ( - Text( - "\"", + "echo \"", ), - 903..904, + 898..904, ), ( Expression( @@ -1460,27 +1289,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 913..914, - ), - ( - Text( - ">", - ), - 915..916, - ), - ( - Text( - ">", - ), - 916..917, - ), - ( - Text( - "\"", + "\" >> \"", ), - 918..919, + 913..919, ), ( Expression( @@ -1625,21 +1436,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "IFS", - ), - 1021..1024, - ), - ( - Text( - "=", - ), - 1024..1025, - ), - ( - Text( - "\"", + "IFS=\"", ), - 1025..1026, + 1021..1026, ), ( Expression( @@ -1657,33 +1456,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1037..1038, - ), - ( - Text( - "read", - ), - 1039..1043, - ), - ( - CommandOption( - "-rd", - ), - 1044..1047, - ), - ( - Text( - "''", - ), - 1048..1050, - ), - ( - CommandOption( - "-a", + "\" read -rd '' -a ", ), - 1051..1053, + 1037..1054, ), ( Expression( @@ -1710,49 +1485,13 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "<", - ), - 1070..1071, - ), - ( - Text( - "<", - ), - 1072..1073, - ), - ( - Text( - "(", - ), - 1073..1074, - ), - ( - Text( - "printf", - ), - 1074..1080, - ), - ( - Text( - "%", + " < <(printf %s \"", ), - 1081..1082, + 1069..1085, ), ( Text( - "s", - ), - 1082..1083, - ), - ( - Text( - "\"", - ), - 1084..1085, - ), - ( - Escape( - "$", + "\\$", ), 1085..1087, ), @@ -1781,15 +1520,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1100..1101, - ), - ( - Text( - ")", + "\")", ), - 1101..1102, + 1100..1102, ), ( Text( @@ -1911,19 +1644,13 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "IFS", + "IFS=", ), - 1197..1200, + 1197..1201, ), ( Text( - "=", - ), - 1200..1201, - ), - ( - Escape( - "$", + "\\$", ), 1201..1203, ), @@ -1933,35 +1660,17 @@ expression: parse(&tokenize(&stdlib)) ), 1203..1204, ), - ( - Escape( - "n'", - ), - 1204..1207, - ), ( Text( - "read", - ), - 1208..1212, - ), - ( - CommandOption( - "-rd", + "\\n", ), - 1213..1216, + 1204..1206, ), ( Text( - "''", - ), - 1217..1219, - ), - ( - CommandOption( - "-a", + "' read -rd '' -a ", ), - 1220..1222, + 1206..1223, ), ( Expression( @@ -1988,31 +1697,13 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "<", - ), - 1239..1240, - ), - ( - Text( - "<", + " <<<\"", ), - 1240..1241, + 1238..1243, ), ( Text( - "<", - ), - 1241..1242, - ), - ( - Text( - "\"", - ), - 1242..1243, - ), - ( - Escape( - "$", + "\\$", ), 1243..1245, ), @@ -2150,7 +1841,17 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - [], + [ + ( + Text( + ( + " ", + 1340..1341, + ), + ), + 1340..1341, + ), + ], ), 1339..1342, ), @@ -2249,21 +1950,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "IFS", - ), - 1418..1421, - ), - ( - Text( - "=", - ), - 1421..1422, - ), - ( - Text( - "\"", + "IFS=\"", ), - 1422..1423, + 1418..1423, ), ( Expression( @@ -2281,39 +1970,21 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ; echo \"", ), - 1434..1435, + 1434..1444, ), ( Text( - ";", + "\\$", ), - 1436..1437, + 1444..1446, ), ( Text( - "echo", + "\\{", ), - 1438..1442, - ), - ( - Text( - "\"", - ), - 1443..1444, - ), - ( - Escape( - "$", - ), - 1444..1446, - ), - ( - Escape( - "{", - ), - 1446..1448, + 1446..1448, ), ( Expression( @@ -2340,33 +2011,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "[", + "[*]}\"", ), - 1461..1462, - ), - ( - Text( - "*", - ), - 1462..1463, - ), - ( - Text( - "]", - ), - 1463..1464, - ), - ( - Text( - "}", - ), - 1464..1465, - ), - ( - Text( - "\"", - ), - 1465..1466, + 1461..1466, ), ( Text( @@ -2452,15 +2099,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 1528..1532, - ), - ( - Text( - "\"", + "echo \"", ), - 1533..1534, + 1528..1534, ), ( Expression( @@ -2478,105 +2119,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1540..1541, - ), - ( - Text( - "|", - ), - 1542..1543, - ), - ( - Text( - "sed", - ), - 1544..1547, - ), - ( - CommandOption( - "-e", - ), - 1548..1550, - ), - ( - Text( - "'s", - ), - 1551..1553, - ), - ( - Text( - "/", - ), - 1553..1554, - ), - ( - Text( - "^", - ), - 1554..1555, - ), - ( - Text( - "[", - ), - 1555..1556, - ), - ( - Text( - "[", - ), - 1556..1557, - ), - ( - Text( - ":", - ), - 1557..1558, - ), - ( - Text( - "space", - ), - 1558..1563, - ), - ( - Text( - ":", - ), - 1563..1564, - ), - ( - Text( - "]", - ), - 1564..1565, - ), - ( - Text( - "]", + "\" | sed -e 's/^[[:space:]]*//'", ), - 1565..1566, - ), - ( - Text( - "*", - ), - 1566..1567, - ), - ( - Text( - "//", - ), - 1567..1569, - ), - ( - Text( - "'", - ), - 1569..1570, + 1540..1570, ), ( Text( @@ -2662,15 +2207,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 1633..1637, - ), - ( - Text( - "\"", - ), - 1638..1639, + 1633..1639, ), ( Expression( @@ -2688,105 +2227,21 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1645..1646, - ), - ( - Text( - "|", - ), - 1647..1648, - ), - ( - Text( - "sed", - ), - 1649..1652, - ), - ( - CommandOption( - "-e", - ), - 1653..1655, - ), - ( - Text( - "'s", + "\" | sed -e 's/[[:space:]]*", ), - 1656..1658, + 1645..1671, ), ( Text( - "/", - ), - 1658..1659, - ), - ( - Text( - "[", - ), - 1659..1660, - ), - ( - Text( - "[", - ), - 1660..1661, - ), - ( - Text( - ":", - ), - 1661..1662, - ), - ( - Text( - "space", - ), - 1662..1667, - ), - ( - Text( - ":", - ), - 1667..1668, - ), - ( - Text( - "]", - ), - 1668..1669, - ), - ( - Text( - "]", - ), - 1669..1670, - ), - ( - Text( - "*", - ), - 1670..1671, - ), - ( - Escape( - "$", + "\\$", ), 1671..1673, ), ( Text( - "//", + "//'", ), - 1673..1675, - ), - ( - Text( - "'", - ), - 1675..1676, + 1673..1676, ), ( Text( @@ -2963,15 +2418,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 1809..1813, - ), - ( - Text( - "\"", + "echo \"", ), - 1814..1815, + 1809..1815, ), ( Expression( @@ -2989,105 +2438,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1821..1822, - ), - ( - Text( - "|", - ), - 1823..1824, - ), - ( - Text( - "tr", - ), - 1825..1827, - ), - ( - Text( - "'", - ), - 1828..1829, - ), - ( - Text( - "[", - ), - 1829..1830, - ), - ( - Text( - ":", - ), - 1830..1831, - ), - ( - Text( - "upper", - ), - 1831..1836, - ), - ( - Text( - ":", - ), - 1836..1837, - ), - ( - Text( - "]", - ), - 1837..1838, - ), - ( - Text( - "'", + "\" | tr '[:upper:]' '[:lower:]'", ), - 1838..1839, - ), - ( - Text( - "'", - ), - 1840..1841, - ), - ( - Text( - "[", - ), - 1841..1842, - ), - ( - Text( - ":", - ), - 1842..1843, - ), - ( - Text( - "lower", - ), - 1843..1848, - ), - ( - Text( - ":", - ), - 1848..1849, - ), - ( - Text( - "]", - ), - 1849..1850, - ), - ( - Text( - "'", - ), - 1850..1851, + 1821..1851, ), ( Text( @@ -3150,154 +2503,52 @@ expression: parse(&tokenize(&stdlib)) ), [ ( - Return( - ( - "return", - 1894..1900, - ), - Some( - ( - Command( - [ - ( - Unsafe, - 1901..1907, - ), - ], - [ - ( - Text( - "$", - ), - 1908..1909, - ), - ( - Text( - "echo", - ), - 1909..1913, - ), - ( - Text( - "\"", - ), - 1914..1915, - ), - ( - Expression( - ( - Var( - ( - "text", - 1916..1920, - ), - ), - 1916..1920, - ), - ), - 1915..1921, - ), - ( - Text( - "\"", - ), - 1921..1922, - ), - ( - Text( - "|", - ), - 1923..1924, - ), - ( - Text( - "tr", - ), - 1925..1927, - ), - ( - Text( - "'", - ), - 1928..1929, - ), - ( - Text( - "[", - ), - 1929..1930, - ), - ( - Text( - ":", - ), - 1930..1931, - ), - ( - Text( - "lower", - ), - 1931..1936, - ), - ( - Text( - ":", - ), - 1936..1937, - ), - ( - Text( - "]", - ), - 1937..1938, - ), - ( - Text( - "'", - ), - 1938..1939, - ), - ( - Text( - "'", - ), - 1940..1941, - ), - ( - Text( - "[", - ), - 1941..1942, - ), + Return( + ( + "return", + 1894..1900, + ), + Some( + ( + Command( + [ ( - Text( - ":", - ), - 1942..1943, + Unsafe, + 1901..1907, ), + ], + [ ( Text( - "upper", + "$", ), - 1943..1948, + 1908..1909, ), ( Text( - ":", + "echo \"", ), - 1948..1949, + 1909..1915, ), ( - Text( - "]", + Expression( + ( + Var( + ( + "text", + 1916..1920, + ), + ), + 1916..1920, + ), ), - 1949..1950, + 1915..1921, ), ( Text( - "'", + "\" | tr '[:lower:]' '[:upper:]'", ), - 1950..1951, + 1921..1951, ), ( Text( @@ -3422,25 +2673,19 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 2062..2066, + 2062..2068, ), ( Text( - "\"", - ), - 2067..2068, - ), - ( - Escape( - "$", + "\\$", ), 2068..2070, ), ( - Escape( - "{", + Text( + "\\{", ), 2070..2072, ), @@ -3475,15 +2720,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "}", - ), - 2087..2088, - ), - ( - Text( - "\"", + "}\"", ), - 2088..2089, + 2087..2089, ), ( Text( @@ -3543,25 +2782,19 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 2132..2136, + 2132..2138, ), ( Text( - "\"", - ), - 2137..2138, - ), - ( - Escape( - "$", + "\\$", ), 2138..2140, ), ( - Escape( - "{", + Text( + "\\{", ), 2140..2142, ), @@ -3596,33 +2829,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 2157..2158, - ), - ( - Text( - "@", - ), - 2158..2159, - ), - ( - Text( - "]", - ), - 2159..2160, - ), - ( - Text( - "}", - ), - 2160..2161, - ), - ( - Text( - "\"", + "[@]}\"", ), - 2161..2162, + 2157..2162, ), ( Text( @@ -3728,21 +2937,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 2239..2240, - ), - ( - CommandOption( - "-n", - ), - 2241..2243, - ), - ( - Text( - "\"", + "[ -n \"", ), - 2244..2245, + 2239..2245, ), ( Expression( @@ -3760,33 +2957,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2251..2252, - ), - ( - Text( - "]", - ), - 2253..2254, - ), - ( - Text( - "&&", - ), - 2255..2257, - ), - ( - Text( - "[", + "\" ] && [ \"", ), - 2258..2259, - ), - ( - Text( - "\"", - ), - 2260..2261, + 2251..2261, ), ( Expression( @@ -3804,21 +2977,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2267..2268, - ), - ( - CommandOption( - "-eq", - ), - 2269..2272, - ), - ( - Text( - "\"", + "\" -eq \"", ), - 2273..2274, + 2267..2274, ), ( Expression( @@ -3836,51 +2997,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2280..2281, - ), - ( - Text( - "]", - ), - 2282..2283, - ), - ( - Text( - "2", - ), - 2284..2285, - ), - ( - Text( - ">", - ), - 2285..2286, - ), - ( - Text( - "/", - ), - 2286..2287, - ), - ( - Text( - "dev", - ), - 2287..2290, - ), - ( - Text( - "/", - ), - 2290..2291, - ), - ( - Text( - "null", + "\" ] 2>/dev/null", ), - 2291..2295, + 2280..2295, ), ( Text( @@ -4020,67 +3139,19 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "for", - ), - 2395..2398, - ), - ( - Text( - "(", - ), - 2399..2400, - ), - ( - Text( - "(", - ), - 2400..2401, - ), - ( - Text( - "i", - ), - 2401..2402, - ), - ( - Text( - "=", - ), - 2402..2403, - ), - ( - Text( - "0", - ), - 2403..2404, - ), - ( - Text( - ";", - ), - 2404..2405, - ), - ( - Text( - "i", + "for ((i=0; i<", ), - 2406..2407, + 2395..2408, ), ( Text( - "<", - ), - 2407..2408, - ), - ( - Escape( - "$", + "\\$", ), 2408..2410, ), ( - Escape( - "{", + Text( + "\\{", ), 2410..2412, ), @@ -4115,57 +3186,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "}", - ), - 2426..2427, - ), - ( - Text( - ";", + "}; i++)); do\n ", ), - 2427..2428, - ), - ( - Text( - "i", - ), - 2429..2430, - ), - ( - Text( - "+", - ), - 2430..2431, - ), - ( - Text( - "+", - ), - 2431..2432, - ), - ( - Text( - ")", - ), - 2432..2433, - ), - ( - Text( - ")", - ), - 2433..2434, - ), - ( - Text( - ";", - ), - 2434..2435, - ), - ( - Text( - "do", - ), - 2436..2438, + 2426..2447, ), ( Expression( @@ -4185,129 +3208,69 @@ expression: parse(&tokenize(&stdlib)) 2455..2460, ), ), - 2455..2460, - ), - ), - 2447..2461, - ), - ( - Text( - "+=", - ), - 2461..2463, - ), - ( - Text( - "(", - ), - 2463..2464, - ), - ( - Text( - "\"", - ), - 2465..2466, - ), - ( - Escape( - "$", - ), - 2466..2468, - ), - ( - Escape( - "{", - ), - 2468..2470, - ), - ( - Expression( - ( - Nameof( - ( - "nameof", - 2471..2477, - ), - ( - Var( - ( - "text", - 2478..2482, - ), - ), - 2478..2482, - ), - ), - 2478..2482, - ), - ), - 2470..2483, - ), - ( - Text( - ":", - ), - 2483..2484, - ), - ( - Escape( - "$", - ), - 2484..2486, - ), - ( - Text( - "i", - ), - 2486..2487, - ), - ( - Text( - ":", + 2455..2460, + ), ), - 2487..2488, + 2447..2461, ), ( Text( - "1", + "+=( \"", ), - 2488..2489, + 2461..2466, ), ( Text( - "}", + "\\$", ), - 2489..2490, + 2466..2468, ), ( Text( - "\"", + "\\{", ), - 2490..2491, + 2468..2470, ), ( - Text( - ")", + Expression( + ( + Nameof( + ( + "nameof", + 2471..2477, + ), + ( + Var( + ( + "text", + 2478..2482, + ), + ), + 2478..2482, + ), + ), + 2478..2482, + ), ), - 2492..2493, + 2470..2483, ), ( Text( - ";", + ":", ), - 2493..2494, + 2483..2484, ), ( Text( - "done", + "\\$", ), - 2499..2503, + 2484..2486, ), ( Text( - ";", + "i:1}\" );\n done;", ), - 2503..2504, + 2486..2504, ), ( Text( @@ -4419,15 +3382,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 2598..2602, - ), - ( - Text( - "\"", + "echo \"", ), - 2603..2604, + 2598..2604, ), ( Expression( @@ -4445,195 +3402,33 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2610..2611, - ), - ( - Text( - "|", - ), - 2612..2613, - ), - ( - Text( - "awk", + "\" | awk '", ), - 2614..2617, + 2610..2619, ), ( Text( - "'", - ), - 2618..2619, - ), - ( - Escape( - "{", + "\\{", ), 2619..2621, ), ( Text( - "s", - ), - 2621..2622, - ), - ( - Text( - "=", - ), - 2622..2623, - ), - ( - Text( - "0", - ), - 2623..2624, - ), - ( - Text( - ";", - ), - 2624..2625, - ), - ( - Text( - "for", - ), - 2626..2629, - ), - ( - Text( - "(", - ), - 2630..2631, - ), - ( - Text( - "i", - ), - 2631..2632, - ), - ( - Text( - "=", - ), - 2632..2633, - ), - ( - Text( - "1", - ), - 2633..2634, - ), - ( - Text( - ";", - ), - 2634..2635, - ), - ( - Text( - "i", - ), - 2636..2637, - ), - ( - Text( - "<=", - ), - 2637..2639, - ), - ( - Text( - "NF", - ), - 2639..2641, - ), - ( - Text( - ";", - ), - 2641..2642, - ), - ( - Text( - "i", - ), - 2643..2644, - ), - ( - Text( - "+", - ), - 2644..2645, - ), - ( - Text( - "+", - ), - 2645..2646, - ), - ( - Text( - ")", - ), - 2646..2647, - ), - ( - Text( - "s", + "s=0; for (i=1; i<=NF; i++) s+=", ), - 2648..2649, + 2621..2651, ), ( Text( - "+=", - ), - 2649..2651, - ), - ( - Escape( - "$", + "\\$", ), 2651..2653, ), ( Text( - "i", - ), - 2653..2654, - ), - ( - Text( - ";", - ), - 2654..2655, - ), - ( - Text( - "print", - ), - 2656..2661, - ), - ( - Text( - "s", - ), - 2662..2663, - ), - ( - Text( - "}", - ), - 2663..2664, - ), - ( - Text( - "'", + "i; print s}'", ), - 2664..2665, + 2653..2665, ), ( Text( @@ -5332,9 +4127,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "eval", + "eval ", ), - 3255..3259, + 3255..3260, ), ( Expression( @@ -5457,15 +4252,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "exit", - ), - 3341..3345, - ), - ( - Text( - "\"", + "exit \"", ), - 3346..3347, + 3341..3347, ), ( Expression( @@ -5735,45 +4524,21 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 3541..3542, - ), - ( - CommandOption( - "-x", + "[ -x \"", ), - 3543..3545, + 3541..3547, ), ( Text( - "\"", - ), - 3546..3547, - ), - ( - Escape( - "$", + "\\$", ), 3547..3549, ), ( Text( - "(", - ), - 3549..3550, - ), - ( - Text( - "command", - ), - 3550..3557, - ), - ( - CommandOption( - "-v", + "(command -v ", ), - 3558..3560, + 3549..3561, ), ( Expression( @@ -5791,21 +4556,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - ")", - ), - 3570..3571, - ), - ( - Text( - "\"", - ), - 3571..3572, - ), - ( - Text( - "]", + ")\" ]", ), - 3573..3574, + 3570..3574, ), ( Text( @@ -5988,21 +4741,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "ln", - ), - 3745..3747, - ), - ( - CommandOption( - "-s", - ), - 3748..3750, - ), - ( - Text( - "\"", + "ln -s \"", ), - 3751..3752, + 3745..3752, ), ( Expression( @@ -6020,15 +4761,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3760..3761, - ), - ( - Text( - "\"", + "\" \"", ), - 3762..3763, + 3760..3763, ), ( Expression( @@ -6108,20 +4843,11 @@ expression: parse(&tokenize(&stdlib)) ( Text( ( - "The", - 3816..3819, + "The file ", + 3816..3825, ), ), - 3816..3819, - ), - ( - Text( - ( - "file", - 3820..3824, - ), - ), - 3820..3824, + 3816..3825, ), ( Expression( @@ -6140,29 +4866,11 @@ expression: parse(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 3834..3841, - ), - ), - 3834..3841, - ), - ( - Text( - ( - "exist", - 3842..3847, - ), - ), - 3842..3847, - ), - ( - Text( - ( - "!", - 3847..3848, + " doesn't exist!", + 3833..3848, ), ), - 3847..3848, + 3833..3848, ), ], ), @@ -6298,21 +5006,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "mkdir", - ), - 3954..3959, - ), - ( - CommandOption( - "-p", - ), - 3960..3962, - ), - ( - Text( - "\"", + "mkdir -p \"", ), - 3963..3964, + 3954..3964, ), ( Expression( @@ -6458,27 +5154,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "chmod", - ), - 4068..4073, - ), - ( - Text( - "+", - ), - 4074..4075, - ), - ( - Text( - "x", - ), - 4075..4076, - ), - ( - Text( - "\"", + "chmod +x \"", ), - 4077..4078, + 4068..4078, ), ( Expression( @@ -6558,20 +5236,11 @@ expression: parse(&tokenize(&stdlib)) ( Text( ( - "The", - 4124..4127, + "The file ", + 4124..4133, ), ), - 4124..4127, - ), - ( - Text( - ( - "file", - 4128..4132, - ), - ), - 4128..4132, + 4124..4133, ), ( Expression( @@ -6590,29 +5259,11 @@ expression: parse(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 4140..4147, - ), - ), - 4140..4147, - ), - ( - Text( - ( - "exist", - 4148..4153, - ), - ), - 4148..4153, - ), - ( - Text( - ( - "!", - 4153..4154, + " doesn't exist!", + 4139..4154, ), ), - 4153..4154, + 4139..4154, ), ], ), @@ -6787,21 +5438,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "chown", - ), - 4290..4295, - ), - ( - CommandOption( - "-R", - ), - 4296..4298, - ), - ( - Text( - "\"", + "chown -R \"", ), - 4299..4300, + 4290..4300, ), ( Expression( @@ -6819,15 +5458,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 4306..4307, - ), - ( - Text( - "\"", + "\" \"", ), - 4308..4309, + 4306..4309, ), ( Expression( @@ -7040,27 +5673,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "curl", - ), - 4471..4475, - ), - ( - CommandOption( - "-L", - ), - 4476..4478, - ), - ( - CommandOption( - "-o", - ), - 4479..4481, - ), - ( - Text( - "\"", + "curl -L -o \"", ), - 4482..4483, + 4471..4483, ), ( Expression( @@ -7078,15 +5693,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 4489..4490, - ), - ( - Text( - "\"", + "\" \"", ), - 4491..4492, + 4489..4492, ), ( Expression( @@ -7188,15 +5797,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "wget", - ), - 4559..4563, - ), - ( - Text( - "\"", + "wget \"", ), - 4564..4565, + 4559..4565, ), ( Expression( @@ -7214,21 +5817,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 4570..4571, - ), - ( - CommandOption( - "-P", - ), - 4572..4574, - ), - ( - Text( - "\"", + "\" -P \"", ), - 4575..4576, + 4570..4576, ), ( Expression( @@ -7330,15 +5921,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "aria2c", + "aria2c \"", ), - 4646..4652, - ), - ( - Text( - "\"", - ), - 4653..4654, + 4646..4654, ), ( Expression( @@ -7356,21 +5941,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 4659..4660, - ), - ( - CommandOption( - "-d", - ), - 4661..4663, - ), - ( - Text( - "\"", + "\" -d \"", ), - 4664..4665, + 4659..4665, ), ( Expression( @@ -7538,15 +6111,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "id", - ), - 4802..4804, - ), - ( - CommandOption( - "-u", + "id -u", ), - 4805..4807, + 4802..4807, ), ( Text( @@ -7711,51 +6278,27 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 4928..4932, + 4928..4934, ), ( Text( - "\"", - ), - 4933..4934, - ), - ( - Escape( - "$", + "\\$", ), 4934..4936, ), - ( - Escape( - "{", - ), - 4936..4938, - ), - ( - Text( - "!", - ), - 4938..4939, - ), - ( - Text( - "var", - ), - 4939..4942, - ), ( Text( - "}", + "\\{", ), - 4942..4943, + 4936..4938, ), ( Text( - "\"", + "!var}\"", ), - 4943..4944, + 4938..4944, ), ( Text( @@ -7860,20 +6403,11 @@ expression: parse(&tokenize(&stdlib)) ( Text( ( - ".", - 5012..5013, - ), - ), - 5012..5013, - ), - ( - Text( - ( - "env", - 5013..5016, + ".env", + 5012..5016, ), ), - 5013..5016, + 5012..5016, ), ], ), @@ -7907,33 +6441,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "source", - ), - 5037..5043, - ), - ( - Text( - "\"", - ), - 5044..5045, - ), - ( - Text( - ".", - ), - 5045..5046, - ), - ( - Text( - "env", - ), - 5046..5049, - ), - ( - Text( - "\"", + "source \".env\"", ), - 5049..5050, + 5037..5050, ), ( Text( @@ -7973,51 +6483,27 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 5075..5079, + 5075..5081, ), ( Text( - "\"", - ), - 5080..5081, - ), - ( - Escape( - "$", + "\\$", ), 5081..5083, ), - ( - Escape( - "{", - ), - 5083..5085, - ), - ( - Text( - "!", - ), - 5085..5086, - ), - ( - Text( - "var", - ), - 5086..5089, - ), ( Text( - "}", + "\\{", ), - 5089..5090, + 5083..5085, ), ( Text( - "\"", + "!var}\"", ), - 5090..5091, + 5085..5091, ), ( Text( @@ -8109,93 +6595,21 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "export", + "export \"", ), - 5161..5167, + 5161..5169, ), ( Text( - "\"", - ), - 5168..5169, - ), - ( - Escape( - "$", + "\\$", ), 5169..5171, ), ( Text( - "(", - ), - 5171..5172, - ), - ( - Text( - "xargs", - ), - 5172..5177, - ), - ( - Text( - "<", - ), - 5178..5179, - ), - ( - Text( - ".", - ), - 5180..5181, - ), - ( - Text( - "env", + "(xargs < .env)\" > /dev/null", ), - 5181..5184, - ), - ( - Text( - ")", - ), - 5184..5185, - ), - ( - Text( - "\"", - ), - 5185..5186, - ), - ( - Text( - ">", - ), - 5187..5188, - ), - ( - Text( - "/", - ), - 5189..5190, - ), - ( - Text( - "dev", - ), - 5190..5193, - ), - ( - Text( - "/", - ), - 5193..5194, - ), - ( - Text( - "null", - ), - 5194..5198, + 5171..5198, ), ( Text( @@ -8270,37 +6684,19 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 5248..5249, - ), - ( - Text( - "[", + "[[ ! -z ", ), - 5249..5250, + 5248..5256, ), ( Text( - "!", - ), - 5251..5252, - ), - ( - CommandOption( - "-z", - ), - 5253..5255, - ), - ( - Escape( - "$", + "\\$", ), 5256..5258, ), ( - Escape( - "{", + Text( + "\\{", ), 5258..5260, ), @@ -8335,33 +6731,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "+", - ), - 5274..5275, - ), - ( - Text( - "z", - ), - 5275..5276, - ), - ( - Text( - "}", - ), - 5276..5277, - ), - ( - Text( - "]", - ), - 5278..5279, - ), - ( - Text( - "]", + "+z} ]]", ), - 5279..5280, + 5274..5280, ), ( Text( @@ -8505,13 +6877,13 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "readonly", + "readonly ", ), - 5400..5408, + 5400..5409, ), ( - Escape( - "$", + Text( + "\\$", ), 5409..5411, ), @@ -8540,19 +6912,13 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "=", + "=\"", ), - 5424..5425, + 5424..5426, ), ( Text( - "\"", - ), - 5425..5426, - ), - ( - Escape( - "$", + "\\$", ), 5426..5428, ), @@ -8581,45 +6947,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 5440..5441, - ), - ( - Text( - "2", - ), - 5442..5443, - ), - ( - Text( - ">", - ), - 5443..5444, - ), - ( - Text( - "/", - ), - 5445..5446, - ), - ( - Text( - "dev", - ), - 5446..5449, - ), - ( - Text( - "/", - ), - 5449..5450, - ), - ( - Text( - "null", + "\" 2> /dev/null", ), - 5450..5454, + 5440..5454, ), ( Text( @@ -8704,19 +7034,19 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 5519..5523, + 5519..5524, ), ( - Escape( - "$", + Text( + "\\$", ), 5524..5526, ), ( - Escape( - "{", + Text( + "\\{", ), 5526..5528, ), @@ -8851,13 +7181,13 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "export", + "export ", ), - 5607..5613, + 5607..5614, ), ( - Escape( - "$", + Text( + "\\$", ), 5614..5616, ), @@ -8886,19 +7216,13 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "=", + "=\"", ), - 5629..5630, + 5629..5631, ), ( Text( - "\"", - ), - 5630..5631, - ), - ( - Escape( - "$", + "\\$", ), 5631..5633, ), @@ -8927,45 +7251,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 5645..5646, - ), - ( - Text( - "2", - ), - 5647..5648, - ), - ( - Text( - ">", - ), - 5648..5649, - ), - ( - Text( - "/", - ), - 5650..5651, - ), - ( - Text( - "dev", - ), - 5651..5654, - ), - ( - Text( - "/", - ), - 5654..5655, - ), - ( - Text( - "null", + "\" 2> /dev/null", ), - 5655..5659, + 5645..5659, ), ( Text( @@ -9050,19 +7338,19 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 5719..5723, + 5719..5724, ), ( - Escape( - "$", + Text( + "\\$", ), 5724..5726, ), ( - Escape( - "{", + Text( + "\\{", ), 5726..5728, ), @@ -9180,9 +7468,9 @@ expression: parse(&tokenize(&stdlib)) ), ( Text( - "unset", + "unset ", ), - 5794..5799, + 5794..5800, ), ( Expression( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__ternary-5.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__ternary-5.snap index dbdc05a..89d5177 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__ternary-5.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__ternary-5.snap @@ -53,7 +53,7 @@ expression: "parse(&tokenize(\"true then 1\"))" ], ), [ - found end of input at 11..11 expected '"."', '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '"else"', + found end of input at 11..11 expected '"as"', '"is"', '"*"', '"/"', '"%"', '"+"', '"-"', '">="', '">"', '"<="', '"<"', '"=="', '"!="', '"and"', '"or"', '".."', '"then"', or '"else"', found end of input at 11..11 expected "expression", ], ) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__text-2.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__text-2.snap index c572340..a198d53 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__text-2.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__text-2.snap @@ -1,6 +1,6 @@ --- source: tests/grammar/alpha034.rs -expression: "parse_unwrap(\"\\\"Hello, {name}!\\\"\")" +expression: "parse_unwrap(&tokenize(\"\\\"Hello, {name}!\\\"\"))" --- [ ( @@ -13,20 +13,11 @@ expression: "parse_unwrap(\"\\\"Hello, {name}!\\\"\")" ( Text( ( - "Hello", - 1..6, + "Hello, ", + 1..8, ), ), - 1..6, - ), - ( - Text( - ( - ",", - 6..7, - ), - ), - 6..7, + 1..8, ), ( Expression( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__text-3.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__text-3.snap index a148009..c2a8eb7 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__text-3.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__text-3.snap @@ -1,6 +1,6 @@ --- source: tests/grammar/alpha034.rs -expression: "parse_unwrap(\"\\\"Hello, {name}! How are you?\\\"\")" +expression: "parse_unwrap(&tokenize(\"\\\"Hello, {name}! How are you?\\\"\"))" --- [ ( @@ -13,20 +13,11 @@ expression: "parse_unwrap(\"\\\"Hello, {name}! How are you?\\\"\")" ( Text( ( - "Hello", - 1..6, + "Hello, ", + 1..8, ), ), - 1..6, - ), - ( - Text( - ( - ",", - 6..7, - ), - ), - 6..7, + 1..8, ), ( Expression( @@ -45,47 +36,11 @@ expression: "parse_unwrap(\"\\\"Hello, {name}! How are you?\\\"\")" ( Text( ( - "!", - 14..15, - ), - ), - 14..15, - ), - ( - Text( - ( - "How", - 16..19, - ), - ), - 16..19, - ), - ( - Text( - ( - "are", - 20..23, - ), - ), - 20..23, - ), - ( - Text( - ( - "you", - 24..27, - ), - ), - 24..27, - ), - ( - Text( - ( - "?", - 27..28, + "! How are you?", + 14..28, ), ), - 27..28, + 14..28, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__text-4.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__text-4.snap index 23e5bbd..c2260fd 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__text-4.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__text-4.snap @@ -1,6 +1,6 @@ --- source: tests/grammar/alpha034.rs -expression: "parse_unwrap(r#\"\"\\\"text in quotes\\\" \\\\\"\"#)" +expression: "parse_unwrap(&tokenize(r#\"\"\\\"text in quotes\\\" \\\\\"\"#))" --- [ ( @@ -11,9 +11,9 @@ expression: "parse_unwrap(r#\"\"\\\"text in quotes\\\" \\\\\"\"#)" Text( [ ( - Escape( + Text( ( - "\"", + "\\\"", 1..3, ), ), @@ -22,43 +22,34 @@ expression: "parse_unwrap(r#\"\"\\\"text in quotes\\\" \\\\\"\"#)" ( Text( ( - "text", - 3..7, + "text in quotes", + 3..17, ), ), - 3..7, + 3..17, ), ( Text( ( - "in", - 8..10, + "\\\"", + 17..19, ), ), - 8..10, + 17..19, ), ( Text( ( - "quotes", - 11..17, + " ", + 19..20, ), ), - 11..17, + 19..20, ), ( - Escape( - ( - "\"", - 17..19, - ), - ), - 17..19, - ), - ( - Escape( + Text( ( - "\\", + "\\\\", 20..22, ), ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__text-8.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__text-8.snap index 56e8601..4932194 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__text-8.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__text-8.snap @@ -13,9 +13,9 @@ expression: "parse(&tokenize(r#\"\"\\\"\"#))" Text( [ ( - Escape( + Text( ( - "\"", + "\\\"", 1..3, ), ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__text.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__text.snap index e3b0a51..94eb2a5 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha034__text.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__text.snap @@ -1,6 +1,6 @@ --- source: tests/grammar/alpha034.rs -expression: "parse_unwrap(\"\\\"Hello, world!\\\"\")" +expression: "parse_unwrap(&tokenize(\"\\\"Hello, world!\\\"\"))" --- [ ( @@ -13,38 +13,11 @@ expression: "parse_unwrap(\"\\\"Hello, world!\\\"\")" ( Text( ( - "Hello", - 1..6, + "Hello, world!", + 1..14, ), ), - 1..6, - ), - ( - Text( - ( - ",", - 6..7, - ), - ), - 6..7, - ), - ( - Text( - ( - "world", - 8..13, - ), - ), - 8..13, - ), - ( - Text( - ( - "!", - 13..14, - ), - ), - 13..14, + 1..14, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_date.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_date.snap index 422daef..48d3481 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_date.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_date.snap @@ -1121,56 +1121,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 2939..2940, + "%FT%T%Z", + 2939..2946, ), ), - 2939..2940, - ), - ( - Text( - ( - "FT", - 2940..2942, - ), - ), - 2940..2942, - ), - ( - Text( - ( - "%", - 2942..2943, - ), - ), - 2942..2943, - ), - ( - Text( - ( - "T", - 2943..2944, - ), - ), - 2943..2944, - ), - ( - Text( - ( - "%", - 2944..2945, - ), - ), - 2944..2945, - ), - ( - Text( - ( - "Z", - 2945..2946, - ), - ), - 2945..2946, + 2939..2946, ), ], ), @@ -1238,63 +1193,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 2982..2986, - ), - ( - Text( - "+", - ), - 2987..2988, - ), - ( - Text( - "\"", - ), - 2988..2989, - ), - ( - Text( - "%", + "date +\"%FT%T%Z\"", ), - 2989..2990, - ), - ( - Text( - "FT", - ), - 2990..2992, - ), - ( - Text( - "%", - ), - 2992..2993, - ), - ( - Text( - "T", - ), - 2993..2994, - ), - ( - Text( - "%", - ), - 2994..2995, - ), - ( - Text( - "Z", - ), - 2995..2996, - ), - ( - Text( - "\"", - ), - 2996..2997, + 2982..2997, ), ( Text( @@ -1363,27 +1264,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 3030..3034, - ), - ( - CommandOption( - "--utc", - ), - 3035..3040, - ), - ( - CommandOption( - "-d", + "date --utc -d \"", ), - 3041..3043, - ), - ( - Text( - "\"", - ), - 3044..3045, + 3030..3045, ), ( Expression( @@ -1401,21 +1284,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3051..3052, - ), - ( - Text( - "+", + "\" +\"", ), - 3053..3054, - ), - ( - Text( - "\"", - ), - 3054..3055, + 3051..3055, ), ( Expression( @@ -1495,21 +1366,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 3096..3100, - ), - ( - CommandOption( - "-d", - ), - 3101..3103, - ), - ( - Text( - "\"", + "date -d \"", ), - 3104..3105, + 3096..3105, ), ( Expression( @@ -1527,21 +1386,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3111..3112, - ), - ( - Text( - "+", - ), - 3113..3114, - ), - ( - Text( - "\"", + "\" +\"", ), - 3114..3115, + 3111..3115, ), ( Expression( @@ -1668,27 +1515,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 3279..3283, - ), - ( - Text( - "+", - ), - 3284..3285, - ), - ( - Text( - "%", + "date +%s", ), - 3285..3286, - ), - ( - Text( - "s", - ), - 3286..3287, + 3279..3287, ), ( Text( @@ -2057,63 +1886,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 3620..3624, - ), - ( - Text( - "+", - ), - 3625..3626, - ), - ( - Text( - "\"", - ), - 3626..3627, - ), - ( - Text( - "%", - ), - 3627..3628, - ), - ( - Text( - "FT", - ), - 3628..3630, - ), - ( - Text( - "%", - ), - 3630..3631, - ), - ( - Text( - "T", - ), - 3631..3632, - ), - ( - Text( - "%", - ), - 3632..3633, - ), - ( - Text( - "Z", - ), - 3633..3634, - ), - ( - Text( - "\"", + "date +\"%FT%T%Z\"", ), - 3634..3635, + 3620..3635, ), ( Text( @@ -2177,20 +1952,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 3677..3678, - ), - ), - 3677..3678, - ), - ( - Text( - ( - "F", - 3678..3679, + "%F", + 3677..3679, ), ), - 3678..3679, + 3677..3679, ), ], ), @@ -2227,6 +1993,15 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3664..3694, ), + ( + Text( + ( + " ", + 3694..3695, + ), + ), + 3694..3695, + ), ( Expression( ( @@ -2241,6 +2016,15 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3695..3700, ), + ( + Text( + ( + " ", + 3700..3701, + ), + ), + 3700..3701, + ), ( Expression( ( @@ -2257,20 +2041,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 3714..3715, - ), - ), - 3714..3715, - ), - ( - Text( - ( - "T", - 3715..3716, + "%T", + 3714..3716, ), ), - 3715..3716, + 3714..3716, ), ], ), @@ -2645,20 +2420,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 4158..4159, + "%s", + 4158..4160, ), ), - 4158..4159, - ), - ( - Text( - ( - "s", - 4159..4160, - ), - ), - 4159..4160, + 4158..4160, ), ], ), @@ -2737,20 +2503,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 4218..4219, - ), - ), - 4218..4219, - ), - ( - Text( - ( - "s", - 4219..4220, + "%s", + 4218..4220, ), ), - 4219..4220, + 4218..4220, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_env.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_env.snap index 74ec417..11eadf2 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_env.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_env.snap @@ -124,20 +124,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - ".", - 201..202, + ".env", + 201..205, ), ), - 201..202, - ), - ( - Text( - ( - "env", - 202..205, - ), - ), - 202..205, + 201..205, ), ], ), @@ -183,51 +174,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 239..243, + 239..245, ), ( Text( - "\"", - ), - 244..245, - ), - ( - Escape( - "$", + "\\$", ), 245..247, ), - ( - Escape( - "{", - ), - 247..249, - ), - ( - Text( - "!", - ), - 249..250, - ), - ( - Text( - "var", - ), - 250..253, - ), ( Text( - "}", + "\\{", ), - 253..254, + 247..249, ), ( Text( - "\"", + "!var}\"", ), - 254..255, + 249..255, ), ( Text( @@ -363,15 +330,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "source", - ), - 346..352, - ), - ( - Text( - "\"", + "source \"", ), - 353..354, + 346..354, ), ( Expression( @@ -431,51 +392,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 386..390, + 386..392, ), ( Text( - "\"", - ), - 391..392, - ), - ( - Escape( - "$", + "\\$", ), 392..394, ), - ( - Escape( - "{", - ), - 394..396, - ), - ( - Text( - "!", - ), - 396..397, - ), ( Text( - "var", + "\\{", ), - 397..400, - ), - ( - Text( - "}", - ), - 400..401, + 394..396, ), ( Text( - "\"", + "!var}\"", ), - 401..402, + 396..402, ), ( Text( @@ -579,20 +516,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - ".", - 520..521, - ), - ), - 520..521, - ), - ( - Text( - ( - "env", - 521..524, + ".env", + 520..524, ), ), - 521..524, + 520..524, ), ], ), @@ -628,39 +556,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "export", + "export \"", ), - 547..553, + 547..555, ), ( Text( - "\"", - ), - 554..555, - ), - ( - Escape( - "$", + "\\$", ), 555..557, ), ( Text( - "(", - ), - 557..558, - ), - ( - Text( - "xargs", - ), - 558..563, - ), - ( - Text( - "<", + "(xargs < ", ), - 564..565, + 557..566, ), ( Expression( @@ -678,45 +588,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - ")", + ")\" > /dev/null", ), - 572..573, - ), - ( - Text( - "\"", - ), - 573..574, - ), - ( - Text( - ">", - ), - 575..576, - ), - ( - Text( - "/", - ), - 577..578, - ), - ( - Text( - "dev", - ), - 578..581, - ), - ( - Text( - "/", - ), - 581..582, - ), - ( - Text( - "null", - ), - 582..586, + 572..586, ), ( Text( @@ -807,37 +681,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 691..692, - ), - ( - Text( - "[", + "[[ ! -z ", ), - 692..693, + 691..699, ), ( Text( - "!", - ), - 694..695, - ), - ( - CommandOption( - "-z", - ), - 696..698, - ), - ( - Escape( - "$", + "\\$", ), 699..701, ), ( - Escape( - "{", + Text( + "\\{", ), 701..703, ), @@ -872,33 +728,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "+", - ), - 717..718, - ), - ( - Text( - "z", - ), - 718..719, - ), - ( - Text( - "}", - ), - 719..720, - ), - ( - Text( - "]", - ), - 721..722, - ), - ( - Text( - "]", + "+z} ]]", ), - 722..723, + 717..723, ), ( Text( @@ -1058,13 +890,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "readonly", + "readonly ", ), - 888..896, + 888..897, ), ( - Escape( - "$", + Text( + "\\$", ), 897..899, ), @@ -1093,19 +925,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "=", + "=\"", ), - 912..913, + 912..914, ), ( Text( - "\"", - ), - 913..914, - ), - ( - Escape( - "$", + "\\$", ), 914..916, ), @@ -1134,45 +960,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 928..929, - ), - ( - Text( - "2", - ), - 930..931, - ), - ( - Text( - ">", - ), - 931..932, - ), - ( - Text( - "/", - ), - 933..934, - ), - ( - Text( - "dev", - ), - 934..937, - ), - ( - Text( - "/", - ), - 937..938, - ), - ( - Text( - "null", + "\" 2> /dev/null", ), - 938..942, + 928..942, ), ( Text( @@ -1273,19 +1063,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 1052..1056, + 1052..1057, ), ( - Escape( - "$", + Text( + "\\$", ), 1057..1059, ), ( - Escape( - "{", + Text( + "\\{", ), 1059..1061, ), @@ -1436,13 +1226,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "export", + "export ", ), - 1185..1191, + 1185..1192, ), ( - Escape( - "$", + Text( + "\\$", ), 1192..1194, ), @@ -1471,19 +1261,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "=", + "=\"", ), - 1207..1208, + 1207..1209, ), ( Text( - "\"", - ), - 1208..1209, - ), - ( - Escape( - "$", + "\\$", ), 1209..1211, ), @@ -1512,45 +1296,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1223..1224, - ), - ( - Text( - "2", - ), - 1225..1226, - ), - ( - Text( - ">", - ), - 1226..1227, - ), - ( - Text( - "/", - ), - 1228..1229, - ), - ( - Text( - "dev", - ), - 1229..1232, - ), - ( - Text( - "/", - ), - 1232..1233, - ), - ( - Text( - "null", + "\" 2> /dev/null", ), - 1233..1237, + 1223..1237, ), ( Text( @@ -1651,19 +1399,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 1342..1346, + 1342..1347, ), ( - Escape( - "$", + Text( + "\\$", ), 1347..1349, ), ( - Escape( - "{", + Text( + "\\{", ), 1349..1351, ), @@ -1797,9 +1545,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "unset", + "unset ", ), - 1465..1470, + 1465..1471, ), ( Expression( @@ -1909,45 +1657,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", + "[ -x \"", ), - 1561..1562, - ), - ( - CommandOption( - "-x", - ), - 1563..1565, + 1561..1567, ), ( Text( - "\"", - ), - 1566..1567, - ), - ( - Escape( - "$", + "\\$", ), 1567..1569, ), ( Text( - "(", - ), - 1569..1570, - ), - ( - Text( - "command", + "(command -v ", ), - 1570..1577, - ), - ( - CommandOption( - "-v", - ), - 1578..1580, + 1569..1581, ), ( Expression( @@ -1965,21 +1689,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - ")", - ), - 1590..1591, - ), - ( - Text( - "\"", - ), - 1591..1592, - ), - ( - Text( - "]", + ")\" ]", ), - 1593..1594, + 1590..1594, ), ( Text( @@ -2127,19 +1839,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 1740..1746, + 1740..1748, ), ( Text( - "\"", - ), - 1747..1748, - ), - ( - Escape( - "$", + "\\$", ), 1748..1750, ), @@ -2234,9 +1940,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "$", + "\\$", 1798..1800, ), ), @@ -2397,83 +2103,47 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "[", - 2061..2062, - ), - ), - 2061..2062, - ), - ( - Escape( - ( - "x1b", - 2062..2066, - ), - ), - 2062..2066, - ), - ( - Text( - ( - "[", - 2066..2067, - ), - ), - 2066..2067, - ), - ( - Text( - ( - "1mY", - 2067..2070, + " [", + 2060..2062, ), ), - 2067..2070, + 2060..2062, ), ( Text( ( - "/", - 2070..2071, - ), - ), - 2070..2071, - ), - ( - Escape( - ( - "x1b", - 2071..2075, + "\\x", + 2062..2064, ), ), - 2071..2075, + 2062..2064, ), ( Text( ( - "[", - 2075..2076, + "1b[1mY/", + 2064..2071, ), ), - 2075..2076, + 2064..2071, ), ( Text( ( - "0mn", - 2076..2079, + "\\x", + 2071..2073, ), ), - 2076..2079, + 2071..2073, ), ( Text( ( - "]", - 2079..2080, + "1b[0mn]", + 2073..2080, ), ), - 2079..2080, + 2073..2080, ), ], ), @@ -2489,92 +2159,47 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "[", - 2089..2090, + " [y/", + 2088..2092, ), ), - 2089..2090, + 2088..2092, ), ( Text( ( - "y", - 2090..2091, + "\\x", + 2092..2094, ), ), - 2090..2091, + 2092..2094, ), ( Text( ( - "/", - 2091..2092, - ), - ), - 2091..2092, - ), - ( - Escape( - ( - "x1b", - 2092..2096, + "1b[1mN", + 2094..2100, ), ), - 2092..2096, + 2094..2100, ), ( Text( ( - "[", - 2096..2097, + "\\x", + 2100..2102, ), ), - 2096..2097, + 2100..2102, ), ( Text( ( - "1mN", - 2097..2100, - ), - ), - 2097..2100, - ), - ( - Escape( - ( - "x1b", - 2100..2104, + "1b[0m]", + 2102..2108, ), ), - 2100..2104, - ), - ( - Text( - ( - "[", - 2104..2105, - ), - ), - 2104..2105, - ), - ( - Text( - ( - "0m", - 2105..2107, - ), - ), - 2105..2107, - ), - ( - Text( - ( - "]", - 2107..2108, - ), - ), - 2107..2108, + 2102..2108, ), ], ), @@ -2614,33 +2239,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 2132..2138, + 2132..2140, ), ( Text( - "\"", + "\\x", ), - 2139..2140, - ), - ( - Escape( - "x1b", - ), - 2140..2144, + 2140..2142, ), ( Text( - "[", + "1b[1m", ), - 2144..2145, - ), - ( - Text( - "1m", - ), - 2145..2147, + 2142..2147, ), ( Expression( @@ -2656,23 +2269,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 2147..2155, ), - ( - Escape( - "x1b", - ), - 2155..2159, - ), ( Text( - "[", + "\\x", ), - 2159..2160, + 2155..2157, ), ( Text( - "0m", + "1b[0m", ), - 2160..2162, + 2157..2162, ), ( Expression( @@ -2722,27 +2329,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "read", - ), - 2190..2194, - ), - ( - CommandOption( - "-s", - ), - 2195..2197, - ), - ( - CommandOption( - "-n", - ), - 2198..2200, - ), - ( - Text( - "1", + "read -s -n 1", ), - 2201..2202, + 2190..2202, ), ( Text( @@ -2772,19 +2361,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 2213..2219, + 2213..2221, ), ( Text( - "\"", - ), - 2220..2221, - ), - ( - Escape( - "n", + "\\n", ), 2221..2223, ), @@ -2852,13 +2435,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 2263..2267, + 2263..2268, ), ( - Escape( - "$", + Text( + "\\$", ), 2268..2270, ), @@ -3067,9 +2650,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "eval", + "eval ", ), - 2438..2442, + 2438..2443, ), ( Expression( @@ -3208,15 +2791,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "exit", + "exit \"", ), - 2545..2549, - ), - ( - Text( - "\"", - ), - 2550..2551, + 2545..2551, ), ( Expression( @@ -3322,15 +2899,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "id", - ), - 2672..2674, - ), - ( - CommandOption( - "-u", + "id -u", ), - 2675..2677, + 2672..2677, ), ( Text( @@ -3553,21 +3124,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "=", - ), - 2864..2865, - ), - ( - Text( - "(", + "=(\"", ), - 2865..2866, - ), - ( - Text( - "\"", - ), - 2866..2867, + 2864..2867, ), ( Expression( @@ -3585,25 +3144,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" \"", ), - 2875..2876, + 2875..2878, ), ( Text( - "\"", - ), - 2877..2878, - ), - ( - Escape( - "$", + "\\$", ), 2878..2880, ), ( - Escape( - "{", + Text( + "\\{", ), 2880..2882, ), @@ -3632,39 +3185,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", + "[@]}\")", ), - 2895..2896, - ), - ( - Text( - "@", - ), - 2896..2897, - ), - ( - Text( - "]", - ), - 2897..2898, - ), - ( - Text( - "}", - ), - 2898..2899, - ), - ( - Text( - "\"", - ), - 2899..2900, - ), - ( - Text( - ")", - ), - 2900..2901, + 2895..2901, ), ( Text( @@ -3699,25 +3222,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 2915..2921, + 2915..2923, ), ( Text( - "\"", - ), - 2922..2923, - ), - ( - Escape( - "$", + "\\$", ), 2923..2925, ), ( - Escape( - "{", + Text( + "\\{", ), 2925..2927, ), @@ -3746,33 +3263,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 2940..2941, - ), - ( - Text( - "@", + "[@]}\"", ), - 2941..2942, - ), - ( - Text( - "]", - ), - 2942..2943, - ), - ( - Text( - "}", - ), - 2943..2944, - ), - ( - Text( - "\"", - ), - 2944..2945, + 2940..2945, ), ( Text( @@ -3873,13 +3366,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 3056..3060, + 3056..3061, ), ( - Escape( - "$", + Text( + "\\$", ), 3061..3063, ), @@ -3908,43 +3401,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "|", + " | sed -e 's/", ), - 3077..3078, + 3076..3089, ), ( Text( - "sed", - ), - 3079..3082, - ), - ( - CommandOption( - "-e", - ), - 3083..3085, - ), - ( - Text( - "'s", - ), - 3086..3088, - ), - ( - Text( - "/", - ), - 3088..3089, - ), - ( - Escape( - "\\", + "\\\\", ), 3089..3091, ), ( - Escape( - "\\", + Text( + "\\\\", ), 3091..3093, ), @@ -3954,107 +3423,35 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3093..3094, ), - ( - Escape( - "\\", - ), - 3094..3096, - ), - ( - Escape( - "\\", - ), - 3096..3098, - ), - ( - Escape( - "\\", - ), - 3098..3100, - ), - ( - Escape( - "\\", - ), - 3100..3102, - ), - ( - Text( - "/", - ), - 3102..3103, - ), ( Text( - "g'", - ), - 3103..3105, - ), - ( - CommandOption( - "-e", + "\\\\", ), - 3106..3108, - ), - ( - Text( - "\"", - ), - 3109..3110, - ), - ( - Text( - "s", - ), - 3110..3111, - ), - ( - Text( - "/", - ), - 3111..3112, - ), - ( - Text( - "%", - ), - 3112..3113, - ), - ( - Text( - "/", - ), - 3113..3114, - ), - ( - Text( - "%", - ), - 3114..3115, + 3094..3096, ), ( Text( - "%", + "\\\\", ), - 3115..3116, + 3096..3098, ), ( Text( - "/", + "\\\\", ), - 3116..3117, + 3098..3100, ), ( Text( - "g", + "\\\\", ), - 3117..3118, + 3100..3102, ), ( Text( - "\"", + "/g' -e \"s/%/%%/g\"", ), - 3118..3119, + 3102..3119, ), ( Text( @@ -4194,22 +3591,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "x1b", - 3264..3268, + "\\x", + 3264..3266, ), ), - 3264..3268, + 3264..3266, ), ( Text( ( - "[", - 3268..3269, + "1b[", + 3266..3269, ), ), - 3268..3269, + 3266..3269, ), ( Expression( @@ -4307,32 +3704,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3287..3311, ), - ( - Escape( - ( - "x1b", - 3311..3315, - ), - ), - 3311..3315, - ), ( Text( ( - "[", - 3315..3316, + "\\x", + 3311..3313, ), ), - 3315..3316, + 3311..3313, ), ( Text( ( - "0m", - 3316..3318, + "1b[0m", + 3313..3318, ), ), - 3316..3318, + 3313..3318, ), ], ), @@ -4413,32 +3801,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3402..3406, - ), - ), - 3402..3406, - ), ( Text( ( - "[", - 3406..3407, + "\\x", + 3402..3404, ), ), - 3406..3407, + 3402..3404, ), ( Text( ( - "1m", - 3407..3409, + "1b[1m", + 3404..3409, ), ), - 3407..3409, + 3404..3409, ), ( Expression( @@ -4467,32 +3846,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3409..3433, ), - ( - Escape( - ( - "x1b", - 3433..3437, - ), - ), - 3433..3437, - ), ( Text( ( - "[", - 3437..3438, + "\\x", + 3433..3435, ), ), - 3437..3438, + 3433..3435, ), ( Text( ( - "0m", - 3438..3440, + "1b[0m", + 3435..3440, ), ), - 3438..3440, + 3435..3440, ), ], ), @@ -4573,32 +3943,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3528..3532, - ), - ), - 3528..3532, - ), ( Text( ( - "[", - 3532..3533, + "\\x", + 3528..3530, ), ), - 3532..3533, + 3528..3530, ), ( Text( ( - "3m", - 3533..3535, + "1b[3m", + 3530..3535, ), ), - 3533..3535, + 3530..3535, ), ( Expression( @@ -4627,32 +3988,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3535..3559, ), - ( - Escape( - ( - "x1b", - 3559..3563, - ), - ), - 3559..3563, - ), ( Text( ( - "[", - 3563..3564, + "\\x", + 3559..3561, ), ), - 3563..3564, + 3559..3561, ), ( Text( ( - "0m", - 3564..3566, + "1b[0m", + 3561..3566, ), ), - 3564..3566, + 3561..3566, ), ], ), @@ -4733,32 +4085,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3662..3666, - ), - ), - 3662..3666, - ), ( Text( ( - "[", - 3666..3667, + "\\x", + 3662..3664, ), ), - 3666..3667, + 3662..3664, ), ( Text( ( - "4m", - 3667..3669, + "1b[4m", + 3664..3669, ), ), - 3667..3669, + 3664..3669, ), ( Expression( @@ -4787,32 +4130,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3669..3693, ), - ( - Escape( - ( - "x1b", - 3693..3697, - ), - ), - 3693..3697, - ), ( Text( ( - "[", - 3697..3698, + "\\x", + 3693..3695, ), ), - 3697..3698, + 3693..3695, ), ( Text( ( - "0m", - 3698..3700, + "1b[0m", + 3695..3700, ), ), - 3698..3700, + 3695..3700, ), ], ), @@ -4914,22 +4248,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "x1b", - 3811..3815, + "\\x", + 3811..3813, ), ), - 3811..3815, + 3811..3813, ), ( Text( ( - "[", - 3815..3816, + "1b[", + 3813..3816, ), ), - 3815..3816, + 3813..3816, ), ( Expression( @@ -4961,61 +4295,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "m", - 3831..3832, - ), - ), - 3831..3832, - ), - ( - Text( - ( - "%", - 3832..3833, + "m%s", + 3831..3834, ), ), - 3832..3833, + 3831..3834, ), ( Text( ( - "s", - 3833..3834, + "\\x", + 3834..3836, ), ), - 3833..3834, - ), - ( - Escape( - ( - "x1b", - 3834..3838, - ), - ), - 3834..3838, + 3834..3836, ), ( Text( ( - "[", - 3838..3839, + "1b[0m", + 3836..3841, ), ), - 3838..3839, + 3836..3841, ), ( Text( ( - "0m", - 3839..3841, - ), - ), - 3839..3841, - ), - ( - Escape( - ( - "n", + "\\n", 3841..3843, ), ), @@ -5123,136 +4430,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3938..3942, - ), - ), - 3938..3942, - ), - ( - Text( - ( - "[", - 3942..3943, - ), - ), - 3942..3943, - ), - ( - Text( - ( - "1", - 3943..3944, - ), - ), - 3943..3944, - ), - ( - Text( - ( - ";", - 3944..3945, - ), - ), - 3944..3945, - ), - ( - Text( - ( - "3", - 3945..3946, - ), - ), - 3945..3946, - ), ( Text( ( - ";", - 3946..3947, + "\\x", + 3938..3940, ), ), - 3946..3947, + 3938..3940, ), ( Text( ( - "97", - 3947..3949, + "1b[1;3;97;44m %s ", + 3940..3957, ), ), - 3947..3949, + 3940..3957, ), ( Text( ( - ";", - 3949..3950, + "\\x", + 3957..3959, ), ), - 3949..3950, + 3957..3959, ), ( Text( ( - "44m", - 3950..3953, + "1b[0m", + 3959..3964, ), ), - 3950..3953, + 3959..3964, ), ( Text( ( - "%", - 3954..3955, - ), - ), - 3954..3955, - ), - ( - Text( - ( - "s", - 3955..3956, - ), - ), - 3955..3956, - ), - ( - Escape( - ( - "x1b", - 3957..3961, - ), - ), - 3957..3961, - ), - ( - Text( - ( - "[", - 3961..3962, - ), - ), - 3961..3962, - ), - ( - Text( - ( - "0m", - 3962..3964, - ), - ), - 3962..3964, - ), - ( - Escape( - ( - "n", + "\\n", 3964..3966, ), ), @@ -5360,136 +4577,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4067..4071, - ), - ), - 4067..4071, - ), - ( - Text( - ( - "[", - 4071..4072, - ), - ), - 4071..4072, - ), - ( - Text( - ( - "1", - 4072..4073, - ), - ), - 4072..4073, - ), - ( - Text( - ( - ";", - 4073..4074, - ), - ), - 4073..4074, - ), - ( - Text( - ( - "3", - 4074..4075, - ), - ), - 4074..4075, - ), - ( - Text( - ( - ";", - 4075..4076, - ), - ), - 4075..4076, - ), ( Text( ( - "97", - 4076..4078, + "\\x", + 4067..4069, ), ), - 4076..4078, + 4067..4069, ), ( Text( ( - ";", - 4078..4079, + "1b[1;3;97;42m %s ", + 4069..4086, ), ), - 4078..4079, + 4069..4086, ), ( Text( ( - "42m", - 4079..4082, + "\\x", + 4086..4088, ), ), - 4079..4082, + 4086..4088, ), ( Text( ( - "%", - 4083..4084, + "1b[0m", + 4088..4093, ), ), - 4083..4084, + 4088..4093, ), ( Text( ( - "s", - 4084..4085, - ), - ), - 4084..4085, - ), - ( - Escape( - ( - "x1b", - 4086..4090, - ), - ), - 4086..4090, - ), - ( - Text( - ( - "[", - 4090..4091, - ), - ), - 4090..4091, - ), - ( - Text( - ( - "0m", - 4091..4093, - ), - ), - 4091..4093, - ), - ( - Escape( - ( - "n", + "\\n", 4093..4095, ), ), @@ -5597,136 +4724,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4196..4200, - ), - ), - 4196..4200, - ), - ( - Text( - ( - "[", - 4200..4201, - ), - ), - 4200..4201, - ), - ( - Text( - ( - "1", - 4201..4202, - ), - ), - 4201..4202, - ), - ( - Text( - ( - ";", - 4202..4203, - ), - ), - 4202..4203, - ), - ( - Text( - ( - "3", - 4203..4204, - ), - ), - 4203..4204, - ), - ( - Text( - ( - ";", - 4204..4205, - ), - ), - 4204..4205, - ), ( Text( ( - "97", - 4205..4207, + "\\x", + 4196..4198, ), ), - 4205..4207, + 4196..4198, ), ( Text( ( - ";", - 4207..4208, + "1b[1;3;97;43m %s ", + 4198..4215, ), ), - 4207..4208, + 4198..4215, ), ( Text( ( - "43m", - 4208..4211, + "\\x", + 4215..4217, ), ), - 4208..4211, + 4215..4217, ), ( Text( ( - "%", - 4212..4213, + "1b[0m", + 4217..4222, ), ), - 4212..4213, + 4217..4222, ), ( Text( ( - "s", - 4213..4214, - ), - ), - 4213..4214, - ), - ( - Escape( - ( - "x1b", - 4215..4219, - ), - ), - 4215..4219, - ), - ( - Text( - ( - "[", - 4219..4220, - ), - ), - 4219..4220, - ), - ( - Text( - ( - "0m", - 4220..4222, - ), - ), - 4220..4222, - ), - ( - Escape( - ( - "n", + "\\n", 4222..4224, ), ), @@ -5862,136 +4899,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4382..4386, - ), - ), - 4382..4386, - ), - ( - Text( - ( - "[", - 4386..4387, - ), - ), - 4386..4387, - ), - ( - Text( - ( - "1", - 4387..4388, - ), - ), - 4387..4388, - ), - ( - Text( - ( - ";", - 4388..4389, - ), - ), - 4388..4389, - ), - ( - Text( - ( - "3", - 4389..4390, - ), - ), - 4389..4390, - ), ( Text( ( - ";", - 4390..4391, + "\\x", + 4382..4384, ), ), - 4390..4391, + 4382..4384, ), ( Text( ( - "97", - 4391..4393, + "1b[1;3;97;41m %s ", + 4384..4401, ), ), - 4391..4393, + 4384..4401, ), ( Text( ( - ";", - 4393..4394, + "\\x", + 4401..4403, ), ), - 4393..4394, + 4401..4403, ), ( Text( ( - "41m", - 4394..4397, + "1b[0m", + 4403..4408, ), ), - 4394..4397, + 4403..4408, ), ( Text( ( - "%", - 4398..4399, - ), - ), - 4398..4399, - ), - ( - Text( - ( - "s", - 4399..4400, - ), - ), - 4399..4400, - ), - ( - Escape( - ( - "x1b", - 4401..4405, - ), - ), - 4401..4405, - ), - ( - Text( - ( - "[", - 4405..4406, - ), - ), - 4405..4406, - ), - ( - Text( - ( - "0m", - 4406..4408, - ), - ), - 4406..4408, - ), - ( - Escape( - ( - "n", + "\\n", 4408..4410, ), ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_fs.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_fs.snap index 207a830..aa2533f 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_fs.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_fs.snap @@ -65,21 +65,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", + "[ -d \"", ), - 61..62, - ), - ( - CommandOption( - "-d", - ), - 63..65, - ), - ( - Text( - "\"", - ), - 66..67, + 61..67, ), ( Expression( @@ -97,15 +85,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ]", ), - 73..74, - ), - ( - Text( - "]", - ), - 75..76, + 73..76, ), ( Text( @@ -239,21 +221,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", + "[ -f \"", ), - 190..191, - ), - ( - CommandOption( - "-f", - ), - 192..194, - ), - ( - Text( - "\"", - ), - 195..196, + 190..196, ), ( Expression( @@ -271,15 +241,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ]", ), - 202..203, - ), - ( - Text( - "]", - ), - 204..205, + 202..205, ), ( Text( @@ -418,15 +382,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "<", + "< \"", ), - 325..326, - ), - ( - Text( - "\"", - ), - 327..328, + 325..328, ), ( Expression( @@ -568,15 +526,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 459..463, - ), - ( - Text( - "\"", + "echo \"", ), - 464..465, + 459..465, ), ( Expression( @@ -594,21 +546,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 474..475, - ), - ( - Text( - ">", + "\" > \"", ), - 476..477, - ), - ( - Text( - "\"", - ), - 478..479, + 474..479, ), ( Expression( @@ -750,15 +690,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 612..616, - ), - ( - Text( - "\"", + "echo \"", ), - 617..618, + 612..618, ), ( Expression( @@ -776,27 +710,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 627..628, - ), - ( - Text( - ">", - ), - 629..630, - ), - ( - Text( - ">", + "\" >> \"", ), - 630..631, - ), - ( - Text( - "\"", - ), - 632..633, + 627..633, ), ( Expression( @@ -985,21 +901,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "ln", - ), - 854..856, - ), - ( - CommandOption( - "-s", - ), - 857..859, - ), - ( - Text( - "\"", + "ln -s \"", ), - 860..861, + 854..861, ), ( Expression( @@ -1017,15 +921,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 869..870, - ), - ( - Text( - "\"", + "\" \"", ), - 871..872, + 869..872, ), ( Expression( @@ -1105,20 +1003,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "The", - 925..928, - ), - ), - 925..928, - ), - ( - Text( - ( - "file", - 929..933, + "The file ", + 925..934, ), ), - 929..933, + 925..934, ), ( Expression( @@ -1137,29 +1026,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 943..950, + " doesn't exist!", + 942..957, ), ), - 943..950, - ), - ( - Text( - ( - "exist", - 951..956, - ), - ), - 951..956, - ), - ( - Text( - ( - "!", - 956..957, - ), - ), - 956..957, + 942..957, ), ], ), @@ -1311,21 +1182,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "mkdir", - ), - 1132..1137, - ), - ( - CommandOption( - "-p", - ), - 1138..1140, - ), - ( - Text( - "\"", + "mkdir -p \"", ), - 1141..1142, + 1132..1142, ), ( Expression( @@ -1503,27 +1362,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "chmod", + "chmod +x \"", ), - 1344..1349, - ), - ( - Text( - "+", - ), - 1350..1351, - ), - ( - Text( - "x", - ), - 1351..1352, - ), - ( - Text( - "\"", - ), - 1353..1354, + 1344..1354, ), ( Expression( @@ -1603,20 +1444,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "The", - 1400..1403, - ), - ), - 1400..1403, - ), - ( - Text( - ( - "file", - 1404..1408, + "The file ", + 1400..1409, ), ), - 1404..1408, + 1400..1409, ), ( Expression( @@ -1635,29 +1467,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 1416..1423, - ), - ), - 1416..1423, - ), - ( - Text( - ( - "exist", - 1424..1429, - ), - ), - 1424..1429, - ), - ( - Text( - ( - "!", - 1429..1430, + " doesn't exist!", + 1415..1430, ), ), - 1429..1430, + 1415..1430, ), ], ), @@ -1864,21 +1678,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "chown", - ), - 1642..1647, - ), - ( - CommandOption( - "-R", - ), - 1648..1650, - ), - ( - Text( - "\"", + "chown -R \"", ), - 1651..1652, + 1642..1652, ), ( Expression( @@ -1896,15 +1698,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1658..1659, - ), - ( - Text( - "\"", + "\" \"", ), - 1660..1661, + 1658..1661, ), ( Expression( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_http.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_http.snap index d57f411..895a9e7 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_http.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_http.snap @@ -229,27 +229,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "curl", + "curl -L -o \"", ), - 569..573, - ), - ( - CommandOption( - "-L", - ), - 574..576, - ), - ( - CommandOption( - "-o", - ), - 577..579, - ), - ( - Text( - "\"", - ), - 580..581, + 569..581, ), ( Expression( @@ -267,15 +249,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" \"", ), - 587..588, - ), - ( - Text( - "\"", - ), - 589..590, + 587..590, ), ( Expression( @@ -377,15 +353,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "wget", + "wget \"", ), - 657..661, - ), - ( - Text( - "\"", - ), - 662..663, + 657..663, ), ( Expression( @@ -403,21 +373,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" -P \"", ), - 668..669, - ), - ( - CommandOption( - "-P", - ), - 670..672, - ), - ( - Text( - "\"", - ), - 673..674, + 668..674, ), ( Expression( @@ -519,15 +477,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "aria2c", - ), - 744..750, - ), - ( - Text( - "\"", + "aria2c \"", ), - 751..752, + 744..752, ), ( Expression( @@ -545,21 +497,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 757..758, - ), - ( - CommandOption( - "-d", - ), - 759..761, - ), - ( - Text( - "\"", + "\" -d \"", ), - 762..763, + 757..763, ), ( Expression( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_math.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_math.snap index 9989797..ec2eb00 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_math.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_math.snap @@ -91,15 +91,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 98..102, - ), - ( - Text( - "\"", - ), - 103..104, + 98..104, ), ( Expression( @@ -117,195 +111,33 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 110..111, - ), - ( - Text( - "|", - ), - 112..113, - ), - ( - Text( - "awk", + "\" | awk '", ), - 114..117, + 110..119, ), ( Text( - "'", - ), - 118..119, - ), - ( - Escape( - "{", + "\\{", ), 119..121, ), ( Text( - "s", - ), - 121..122, - ), - ( - Text( - "=", - ), - 122..123, - ), - ( - Text( - "0", - ), - 123..124, - ), - ( - Text( - ";", - ), - 124..125, - ), - ( - Text( - "for", - ), - 126..129, - ), - ( - Text( - "(", - ), - 130..131, - ), - ( - Text( - "i", - ), - 131..132, - ), - ( - Text( - "=", - ), - 132..133, - ), - ( - Text( - "1", - ), - 133..134, - ), - ( - Text( - ";", - ), - 134..135, - ), - ( - Text( - "i", - ), - 136..137, - ), - ( - Text( - "<=", - ), - 137..139, - ), - ( - Text( - "NF", - ), - 139..141, - ), - ( - Text( - ";", - ), - 141..142, - ), - ( - Text( - "i", - ), - 143..144, - ), - ( - Text( - "+", - ), - 144..145, - ), - ( - Text( - "+", - ), - 145..146, - ), - ( - Text( - ")", + "s=0; for (i=1; i<=NF; i++) s+=", ), - 146..147, + 121..151, ), ( Text( - "s", - ), - 148..149, - ), - ( - Text( - "+=", - ), - 149..151, - ), - ( - Escape( - "$", + "\\$", ), 151..153, ), ( Text( - "i", - ), - 153..154, - ), - ( - Text( - ";", - ), - 154..155, - ), - ( - Text( - "print", - ), - 156..161, - ), - ( - Text( - "s", - ), - 162..163, - ), - ( - Text( - "}", - ), - 163..164, - ), - ( - Text( - "'", + "i; print s}'", ), - 164..165, + 153..165, ), ( Text( @@ -460,21 +292,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 329..333, - ), - ( - Text( - "\"", - ), - 334..335, - ), - ( - Text( - "(", + "echo \"(", ), - 335..336, + 329..336, ), ( Expression( @@ -492,63 +312,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "+", - ), - 344..345, - ), - ( - Text( - "0", - ), - 345..346, - ), - ( - Text( - ".", - ), - 346..347, - ), - ( - Text( - "5", - ), - 347..348, - ), - ( - Text( - ")", - ), - 348..349, - ), - ( - Text( - "/", - ), - 349..350, - ), - ( - Text( - "1", - ), - 350..351, - ), - ( - Text( - "\"", - ), - 351..352, - ), - ( - Text( - "|", - ), - 353..354, - ), - ( - Text( - "bc", + "+0.5)/1\" | bc", ), - 355..357, + 344..357, ), ( Text( @@ -614,21 +380,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 392..396, - ), - ( - Text( - "\"", - ), - 397..398, - ), - ( - Text( - "(", + "echo \"(", ), - 398..399, + 392..399, ), ( Expression( @@ -644,59 +398,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 399..407, ), - ( - CommandOption( - "-0", - ), - 407..409, - ), - ( - Text( - ".", - ), - 409..410, - ), - ( - Text( - "5", - ), - 410..411, - ), - ( - Text( - ")", - ), - 411..412, - ), - ( - Text( - "/", - ), - 412..413, - ), - ( - Text( - "1", - ), - 413..414, - ), - ( - Text( - "\"", - ), - 414..415, - ), - ( - Text( - "|", - ), - 416..417, - ), ( Text( - "bc", + "-0.5)/1\" | bc", ), - 418..420, + 407..420, ), ( Text( @@ -816,15 +522,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 571..575, - ), - ( - Text( - "\"", + "echo \"", ), - 576..577, + 571..577, ), ( Expression( @@ -842,195 +542,57 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" | awk '", ), - 585..586, + 585..594, ), ( Text( - "|", - ), - 587..588, - ), - ( - Text( - "awk", - ), - 589..592, - ), - ( - Text( - "'", - ), - 593..594, - ), - ( - Escape( - "{", + "\\{", ), 594..596, ), ( Text( - "printf", - ), - 596..602, - ), - ( - Text( - "\"", - ), - 603..604, - ), - ( - Text( - "%", - ), - 604..605, - ), - ( - Text( - "d", - ), - 605..606, - ), - ( - Text( - "\"", + "printf \"%d\", (", ), - 606..607, + 596..610, ), ( Text( - ",", - ), - 607..608, - ), - ( - Text( - "(", - ), - 609..610, - ), - ( - Escape( - "$", + "\\$", ), 610..612, ), ( Text( - "1", - ), - 612..613, - ), - ( - Text( - "<", - ), - 614..615, - ), - ( - Text( - "0", - ), - 616..617, - ), - ( - Text( - "?", + "1 < 0 ? int(", ), - 618..619, + 612..624, ), ( Text( - "int", - ), - 620..623, - ), - ( - Text( - "(", - ), - 623..624, - ), - ( - Escape( - "$", + "\\$", ), 624..626, ), ( Text( - "1", - ), - 626..627, - ), - ( - Text( - ")", - ), - 627..628, - ), - ( - CommandOption( - "-1", - ), - 629..632, - ), - ( - Text( - ":", + "1) - 1 : int(", ), - 633..634, + 626..639, ), ( Text( - "int", - ), - 635..638, - ), - ( - Text( - "(", - ), - 638..639, - ), - ( - Escape( - "$", + "\\$", ), 639..641, ), ( Text( - "1", - ), - 641..642, - ), - ( - Text( - ")", - ), - 642..643, - ), - ( - Text( - ")", - ), - 643..644, - ), - ( - Text( - "}", - ), - 644..645, - ), - ( - Text( - "'", + "1))}'", ), - 645..646, + 641..646, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_text.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_text.snap index 59ee232..a443151 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_text.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__stdlib_text.snap @@ -88,18 +88,18 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "$", + "\\$", 171..173, ), ), 171..173, ), ( - Escape( + Text( ( - "{", + "\\{", 173..175, ), ), @@ -108,20 +108,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "source", - 175..181, - ), - ), - 175..181, - ), - ( - Text( - ( - "/", - 181..182, + "source/", + 175..182, ), ), - 181..182, + 175..182, ), ( Expression( @@ -266,18 +257,18 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "$", + "\\$", 358..360, ), ), 358..360, ), ( - Escape( + Text( ( - "{", + "\\{", 360..362, ), ), @@ -286,20 +277,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "source", - 362..368, - ), - ), - 362..368, - ), - ( - Text( - ( - "//", - 368..370, + "source//", + 362..370, ), ), - 368..370, + 362..370, ), ( Expression( @@ -506,15 +488,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 617..621, - ), - ( - Text( - "\"", + "echo \"", ), - 622..623, + 617..623, ), ( Expression( @@ -532,45 +508,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 631..632, - ), - ( - Text( - "|", - ), - 633..634, - ), - ( - Text( - "sed", - ), - 635..638, - ), - ( - CommandOption( - "-e", - ), - 639..641, - ), - ( - Text( - "\"", - ), - 642..643, - ), - ( - Text( - "s", - ), - 643..644, - ), - ( - Text( - "/", + "\" | sed -e \"s/", ), - 644..645, + 631..645, ), ( Expression( @@ -608,21 +548,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "/", - ), - 668..669, - ), - ( - Text( - "g", - ), - 669..670, - ), - ( - Text( - "\"", + "/g\"", ), - 670..671, + 668..671, ), ( Text( @@ -758,21 +686,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "IFS", - ), - 869..872, - ), - ( - Text( - "=", - ), - 872..873, - ), - ( - Text( - "\"", + "IFS=\"", ), - 873..874, + 869..874, ), ( Expression( @@ -790,33 +706,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 885..886, - ), - ( - Text( - "read", - ), - 887..891, - ), - ( - CommandOption( - "-rd", - ), - 892..895, - ), - ( - Text( - "''", - ), - 896..898, - ), - ( - CommandOption( - "-a", + "\" read -rd '' -a ", ), - 899..901, + 885..902, ), ( Expression( @@ -843,49 +735,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "<", - ), - 918..919, - ), - ( - Text( - "<", - ), - 920..921, - ), - ( - Text( - "(", - ), - 921..922, - ), - ( - Text( - "printf", - ), - 922..928, - ), - ( - Text( - "%", + " < <(printf %s \"", ), - 929..930, + 917..933, ), ( Text( - "s", - ), - 930..931, - ), - ( - Text( - "\"", - ), - 932..933, - ), - ( - Escape( - "$", + "\\$", ), 933..935, ), @@ -914,15 +770,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 948..949, - ), - ( - Text( - ")", + "\")", ), - 949..950, + 948..950, ), ( Text( @@ -1047,9 +897,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "n", + "\\n", 1110..1112, ), ), @@ -1155,7 +1005,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - [], + [ + ( + Text( + ( + " ", + 1250..1251, + ), + ), + 1250..1251, + ), + ], ), 1249..1252, ), @@ -1270,21 +1130,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "IFS", - ), - 1375..1378, - ), - ( - Text( - "=", - ), - 1378..1379, - ), - ( - Text( - "\"", + "IFS=\"", ), - 1379..1380, + 1375..1380, ), ( Expression( @@ -1302,37 +1150,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ; echo \"", ), - 1391..1392, + 1391..1401, ), ( Text( - ";", - ), - 1393..1394, - ), - ( - Text( - "echo", - ), - 1395..1399, - ), - ( - Text( - "\"", - ), - 1400..1401, - ), - ( - Escape( - "$", + "\\$", ), 1401..1403, ), ( - Escape( - "{", + Text( + "\\{", ), 1403..1405, ), @@ -1361,33 +1191,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 1418..1419, - ), - ( - Text( - "*", - ), - 1419..1420, - ), - ( - Text( - "]", - ), - 1420..1421, - ), - ( - Text( - "}", - ), - 1421..1422, - ), - ( - Text( - "\"", + "[*]}\"", ), - 1422..1423, + 1418..1423, ), ( Text( @@ -1489,15 +1295,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 1536..1540, - ), - ( - Text( - "\"", + "echo \"", ), - 1541..1542, + 1536..1542, ), ( Expression( @@ -1515,105 +1315,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1548..1549, - ), - ( - Text( - "|", - ), - 1550..1551, - ), - ( - Text( - "sed", - ), - 1552..1555, - ), - ( - CommandOption( - "-e", - ), - 1556..1558, - ), - ( - Text( - "'s", - ), - 1559..1561, - ), - ( - Text( - "/", - ), - 1561..1562, - ), - ( - Text( - "^", - ), - 1562..1563, - ), - ( - Text( - "[", - ), - 1563..1564, - ), - ( - Text( - "[", - ), - 1564..1565, - ), - ( - Text( - ":", - ), - 1565..1566, - ), - ( - Text( - "space", - ), - 1566..1571, - ), - ( - Text( - ":", - ), - 1571..1572, - ), - ( - Text( - "]", - ), - 1572..1573, - ), - ( - Text( - "]", - ), - 1573..1574, - ), - ( - Text( - "*", - ), - 1574..1575, - ), - ( - Text( - "//", - ), - 1575..1577, - ), - ( - Text( - "'", + "\" | sed -e 's/^[[:space:]]*//'", ), - 1577..1578, + 1548..1578, ), ( Text( @@ -1715,15 +1419,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 1692..1696, - ), - ( - Text( - "\"", + "echo \"", ), - 1697..1698, + 1692..1698, ), ( Expression( @@ -1741,111 +1439,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1704..1705, - ), - ( - Text( - "|", - ), - 1706..1707, - ), - ( - Text( - "sed", - ), - 1708..1711, - ), - ( - CommandOption( - "-e", - ), - 1712..1714, - ), - ( - Text( - "'s", - ), - 1715..1717, - ), - ( - Text( - "/", - ), - 1717..1718, - ), - ( - Text( - "[", + "\" | sed -e 's/[[:space:]]*", ), - 1718..1719, + 1704..1730, ), ( Text( - "[", + "\\$", ), - 1719..1720, + 1730..1732, ), ( Text( - ":", + "//'", ), - 1720..1721, + 1732..1735, ), ( Text( - "space", + "$", ), - 1721..1726, - ), - ( - Text( - ":", - ), - 1726..1727, - ), - ( - Text( - "]", - ), - 1727..1728, - ), - ( - Text( - "]", - ), - 1728..1729, - ), - ( - Text( - "*", - ), - 1729..1730, - ), - ( - Escape( - "$", - ), - 1730..1732, - ), - ( - Text( - "//", - ), - 1732..1734, - ), - ( - Text( - "'", - ), - 1734..1735, - ), - ( - Text( - "$", - ), - 1735..1736, + 1735..1736, ), ], None, @@ -2048,15 +1662,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 1948..1952, - ), - ( - Text( - "\"", + "echo \"", ), - 1953..1954, + 1948..1954, ), ( Expression( @@ -2074,105 +1682,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1960..1961, - ), - ( - Text( - "|", - ), - 1962..1963, - ), - ( - Text( - "tr", - ), - 1964..1966, - ), - ( - Text( - "'", - ), - 1967..1968, - ), - ( - Text( - "[", - ), - 1968..1969, - ), - ( - Text( - ":", - ), - 1969..1970, - ), - ( - Text( - "upper", + "\" | tr '[:upper:]' '[:lower:]'", ), - 1970..1975, - ), - ( - Text( - ":", - ), - 1975..1976, - ), - ( - Text( - "]", - ), - 1976..1977, - ), - ( - Text( - "'", - ), - 1977..1978, - ), - ( - Text( - "'", - ), - 1979..1980, - ), - ( - Text( - "[", - ), - 1980..1981, - ), - ( - Text( - ":", - ), - 1981..1982, - ), - ( - Text( - "lower", - ), - 1982..1987, - ), - ( - Text( - ":", - ), - 1987..1988, - ), - ( - Text( - "]", - ), - 1988..1989, - ), - ( - Text( - "'", - ), - 1989..1990, + 1960..1990, ), ( Text( @@ -2274,15 +1786,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 2088..2092, - ), - ( - Text( - "\"", - ), - 2093..2094, + 2088..2094, ), ( Expression( @@ -2300,105 +1806,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2100..2101, - ), - ( - Text( - "|", - ), - 2102..2103, - ), - ( - Text( - "tr", - ), - 2104..2106, - ), - ( - Text( - "'", - ), - 2107..2108, - ), - ( - Text( - "[", - ), - 2108..2109, - ), - ( - Text( - ":", - ), - 2109..2110, - ), - ( - Text( - "lower", - ), - 2110..2115, - ), - ( - Text( - ":", - ), - 2115..2116, - ), - ( - Text( - "]", - ), - 2116..2117, - ), - ( - Text( - "'", - ), - 2117..2118, - ), - ( - Text( - "'", - ), - 2119..2120, - ), - ( - Text( - "[", - ), - 2120..2121, - ), - ( - Text( - ":", + "\" | tr '[:lower:]' '[:upper:]'", ), - 2121..2122, - ), - ( - Text( - "upper", - ), - 2122..2127, - ), - ( - Text( - ":", - ), - 2127..2128, - ), - ( - Text( - "]", - ), - 2128..2129, - ), - ( - Text( - "'", - ), - 2129..2130, + 2100..2130, ), ( Text( @@ -2495,21 +1905,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 2299..2300, - ), - ( - CommandOption( - "-n", + "[ -n \"", ), - 2301..2303, - ), - ( - Text( - "\"", - ), - 2304..2305, + 2299..2305, ), ( Expression( @@ -2527,33 +1925,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2311..2312, - ), - ( - Text( - "]", - ), - 2313..2314, - ), - ( - Text( - "&&", - ), - 2315..2317, - ), - ( - Text( - "[", - ), - 2318..2319, - ), - ( - Text( - "\"", + "\" ] && [ \"", ), - 2320..2321, + 2311..2321, ), ( Expression( @@ -2571,21 +1945,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2327..2328, - ), - ( - CommandOption( - "-eq", - ), - 2329..2332, - ), - ( - Text( - "\"", + "\" -eq \"", ), - 2333..2334, + 2327..2334, ), ( Expression( @@ -2603,51 +1965,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 2340..2341, - ), - ( - Text( - "]", - ), - 2342..2343, - ), - ( - Text( - "2", - ), - 2344..2345, - ), - ( - Text( - ">", + "\" ] 2>/dev/null", ), - 2345..2346, - ), - ( - Text( - "/", - ), - 2346..2347, - ), - ( - Text( - "dev", - ), - 2347..2350, - ), - ( - Text( - "/", - ), - 2350..2351, - ), - ( - Text( - "null", - ), - 2351..2355, + 2340..2355, ), ( Text( @@ -2803,67 +2123,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "for", - ), - 2513..2516, - ), - ( - Text( - "(", - ), - 2517..2518, - ), - ( - Text( - "(", - ), - 2518..2519, - ), - ( - Text( - "i", - ), - 2519..2520, - ), - ( - Text( - "=", - ), - 2520..2521, - ), - ( - Text( - "0", - ), - 2521..2522, - ), - ( - Text( - ";", - ), - 2522..2523, - ), - ( - Text( - "i", + "for ((i=0; i<", ), - 2524..2525, + 2513..2526, ), ( Text( - "<", - ), - 2525..2526, - ), - ( - Escape( - "$", + "\\$", ), 2526..2528, ), ( - Escape( - "{", + Text( + "\\{", ), 2528..2530, ), @@ -2898,57 +2170,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", - ), - 2544..2545, - ), - ( - Text( - ";", - ), - 2545..2546, - ), - ( - Text( - "i", - ), - 2547..2548, - ), - ( - Text( - "+", - ), - 2548..2549, - ), - ( - Text( - "+", + "}; i++)); do\n ", ), - 2549..2550, - ), - ( - Text( - ")", - ), - 2550..2551, - ), - ( - Text( - ")", - ), - 2551..2552, - ), - ( - Text( - ";", - ), - 2552..2553, - ), - ( - Text( - "do", - ), - 2554..2556, + 2544..2565, ), ( Expression( @@ -2975,31 +2199,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "+=", + "+=( \"", ), - 2579..2581, + 2579..2584, ), ( Text( - "(", - ), - 2581..2582, - ), - ( - Text( - "\"", - ), - 2583..2584, - ), - ( - Escape( - "$", + "\\$", ), 2584..2586, ), ( - Escape( - "{", + Text( + "\\{", ), 2586..2588, ), @@ -3032,65 +2244,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 2601..2602, ), - ( - Escape( - "$", - ), - 2602..2604, - ), ( Text( - "i", + "\\$", ), - 2604..2605, - ), - ( - Text( - ":", - ), - 2605..2606, - ), - ( - Text( - "1", - ), - 2606..2607, - ), - ( - Text( - "}", - ), - 2607..2608, - ), - ( - Text( - "\"", - ), - 2608..2609, - ), - ( - Text( - ")", - ), - 2610..2611, - ), - ( - Text( - ";", - ), - 2611..2612, - ), - ( - Text( - "done", - ), - 2617..2621, + 2602..2604, ), ( Text( - ";", + "i:1}\" );\n done;", ), - 2621..2622, + 2604..2622, ), ( Text( @@ -3250,25 +2414,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 2783..2787, + 2783..2789, ), ( Text( - "\"", - ), - 2788..2789, - ), - ( - Escape( - "$", + "\\$", ), 2789..2791, ), ( - Escape( - "{", + Text( + "\\{", ), 2791..2793, ), @@ -3303,15 +2461,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", - ), - 2808..2809, - ), - ( - Text( - "\"", + "}\"", ), - 2809..2810, + 2808..2810, ), ( Text( @@ -3371,25 +2523,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 2853..2857, + 2853..2859, ), ( Text( - "\"", - ), - 2858..2859, - ), - ( - Escape( - "$", + "\\$", ), 2859..2861, ), ( - Escape( - "{", + Text( + "\\{", ), 2861..2863, ), @@ -3424,33 +2570,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", + "[@]}\"", ), - 2878..2879, - ), - ( - Text( - "@", - ), - 2879..2880, - ), - ( - Text( - "]", - ), - 2880..2881, - ), - ( - Text( - "}", - ), - 2881..2882, - ), - ( - Text( - "\"", - ), - 2882..2883, + 2878..2883, ), ( Text( @@ -3599,27 +2721,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "if", - ), - 3011..3013, - ), - ( - Text( - "[", - ), - 3014..3015, - ), - ( - Text( - "[", - ), - 3015..3016, - ), - ( - Text( - "\"", + "if [[ \"", ), - 3017..3018, + 3011..3018, ), ( Expression( @@ -3637,27 +2741,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3024..3025, - ), - ( - Text( - "==", - ), - 3026..3028, - ), - ( - Text( - "*", - ), - 3029..3030, - ), - ( - Text( - "\"", + "\" == *\"", ), - 3030..3031, + 3024..3031, ), ( Expression( @@ -3675,57 +2761,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3039..3040, - ), - ( - Text( - "*", - ), - 3040..3041, - ), - ( - Text( - "]", + "\"* ]]; then\n echo 1\n fi", ), - 3042..3043, - ), - ( - Text( - "]", - ), - 3043..3044, - ), - ( - Text( - ";", - ), - 3044..3045, - ), - ( - Text( - "then", - ), - 3046..3050, - ), - ( - Text( - "echo", - ), - 3055..3059, - ), - ( - Text( - "1", - ), - 3060..3061, - ), - ( - Text( - "fi", - ), - 3064..3066, + 3039..3066, ), ( Text( @@ -3870,15 +2908,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 3181..3185, - ), - ( - Text( - "\"", - ), - 3186..3187, + 3181..3187, ), ( Expression( @@ -3896,21 +2928,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3193..3194, - ), - ( - Text( - "|", - ), - 3195..3196, - ), - ( - Text( - "rev", + "\" | rev", ), - 3197..3200, + 3193..3200, ), ( Text( @@ -4034,27 +3054,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "if", - ), - 3320..3322, - ), - ( - Text( - "[", - ), - 3323..3324, - ), - ( - Text( - "[", - ), - 3324..3325, - ), - ( - Text( - "\"", + "if [[ \"", ), - 3326..3327, + 3320..3327, ), ( Expression( @@ -4072,89 +3074,29 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3333..3334, - ), - ( - Text( - "==", - ), - 3335..3337, - ), - ( - Text( - "\"", + "\" == \"", ), - 3338..3339, + 3333..3339, ), ( Expression( ( Var( - ( - "prefix", - 3340..3346, - ), - ), - 3340..3346, - ), - ), - 3339..3347, - ), - ( - Text( - "\"", - ), - 3347..3348, - ), - ( - Text( - "*", - ), - 3348..3349, - ), - ( - Text( - "]", - ), - 3350..3351, - ), - ( - Text( - "]", - ), - 3351..3352, - ), - ( - Text( - ";", - ), - 3352..3353, - ), - ( - Text( - "then", - ), - 3354..3358, - ), - ( - Text( - "echo", - ), - 3363..3367, - ), - ( - Text( - "1", + ( + "prefix", + 3340..3346, + ), + ), + 3340..3346, + ), ), - 3368..3369, + 3339..3347, ), ( Text( - "fi", + "\"* ]]; then\n echo 1\n fi", ), - 3372..3374, + 3347..3374, ), ( Text( @@ -4321,27 +3263,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "if", - ), - 3514..3516, - ), - ( - Text( - "[", - ), - 3517..3518, - ), - ( - Text( - "[", + "if [[ \"", ), - 3518..3519, - ), - ( - Text( - "\"", - ), - 3520..3521, + 3514..3521, ), ( Expression( @@ -4359,27 +3283,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3527..3528, - ), - ( - Text( - "==", - ), - 3529..3531, - ), - ( - Text( - "*", - ), - 3532..3533, - ), - ( - Text( - "\"", + "\" == *\"", ), - 3533..3534, + 3527..3534, ), ( Expression( @@ -4397,51 +3303,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ]]; then\n echo 1\n fi", ), - 3542..3543, - ), - ( - Text( - "]", - ), - 3544..3545, - ), - ( - Text( - "]", - ), - 3545..3546, - ), - ( - Text( - ";", - ), - 3546..3547, - ), - ( - Text( - "then", - ), - 3548..3552, - ), - ( - Text( - "echo", - ), - 3557..3561, - ), - ( - Text( - "1", - ), - 3562..3563, - ), - ( - Text( - "fi", - ), - 3566..3568, + 3542..3568, ), ( Text( @@ -4819,27 +3683,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", - ), - 4123..4129, - ), - ( - Text( - "\"", + "printf \"%.", ), - 4130..4131, - ), - ( - Text( - "%", - ), - 4131..4132, - ), - ( - Text( - ".", - ), - 4132..4133, + 4123..4133, ), ( Expression( @@ -4857,45 +3703,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "s", - ), - 4141..4142, - ), - ( - Text( - "\"", + "s\" \"", ), - 4142..4143, + 4141..4145, ), ( Text( - "\"", - ), - 4144..4145, - ), - ( - Escape( - "$", + "\\$", ), 4145..4147, ), - ( - Escape( - "{", - ), - 4147..4149, - ), ( Text( - "text", + "\\{", ), - 4149..4153, + 4147..4149, ), ( Text( - ":", + "text:", ), - 4153..4154, + 4149..4154, ), ( Expression( @@ -4913,15 +3741,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", - ), - 4161..4162, - ), - ( - Text( - "\"", + "}\"", ), - 4162..4163, + 4161..4163, ), ( Text( @@ -5056,69 +3878,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", - ), - 4421..4427, - ), - ( - Text( - "\"", - ), - 4428..4429, - ), - ( - Text( - "%", - ), - 4429..4430, - ), - ( - Text( - ".", - ), - 4430..4431, - ), - ( - Text( - "1s", - ), - 4431..4433, - ), - ( - Text( - "\"", + "printf \"%.1s\" \"", ), - 4433..4434, + 4421..4436, ), ( Text( - "\"", - ), - 4435..4436, - ), - ( - Escape( - "$", + "\\$", ), 4436..4438, ), - ( - Escape( - "{", - ), - 4438..4440, - ), ( Text( - "text", + "\\{", ), - 4440..4444, + 4438..4440, ), ( Text( - ":", + "text:", ), - 4444..4445, + 4440..4445, ), ( Expression( @@ -5136,15 +3916,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", - ), - 4452..4453, - ), - ( - Text( - "\"", + "}\"", ), - 4453..4454, + 4452..4454, ), ( Text( @@ -5246,15 +4020,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 4569..4573, - ), - ( - Text( - "\"", + "echo \"", ), - 4574..4575, + 4569..4575, ), ( Expression( @@ -5272,49 +4040,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 4581..4582, - ), - ( - Text( - "|", - ), - 4583..4584, - ), - ( - Text( - "sed", - ), - 4585..4588, - ), - ( - Text( - "\"", - ), - 4589..4590, - ), - ( - Text( - "s", - ), - 4590..4591, - ), - ( - Text( - "/", + "\" | sed \"s/^", ), - 4591..4592, + 4581..4593, ), ( Text( - "^", - ), - 4592..4593, - ), - ( - Escape( - "(", + "\\(", ), 4593..4595, ), @@ -5325,8 +4057,8 @@ expression: parse_unwrap(&tokenize(&stdlib)) 4595..4596, ), ( - Escape( - ")", + Text( + "\\)", ), 4596..4598, ), @@ -5337,28 +4069,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) 4598..4599, ), ( - Escape( - "U", + Text( + "\\U", ), 4599..4601, ), - ( - Escape( - "1", - ), - 4601..4603, - ), ( Text( - "/", + "\\1", ), - 4603..4604, + 4601..4603, ), ( Text( - "\"", + "/\"", ), - 4604..4605, + 4603..4605, ), ( Text( @@ -5610,21 +4336,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", - ), - 4855..4861, - ), - ( - Text( - "\"", - ), - 4862..4863, - ), - ( - Text( - "%", + "printf \"%", ), - 4863..4864, + 4855..4864, ), ( Expression( @@ -5642,57 +4356,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "s", - ), - 4872..4873, - ), - ( - Text( - "\"", - ), - 4873..4874, - ), - ( - Text( - "\"", - ), - 4875..4876, - ), - ( - Text( - "\"", - ), - 4876..4877, - ), - ( - Text( - "|", - ), - 4878..4879, - ), - ( - Text( - "tr", - ), - 4880..4882, - ), - ( - Text( - "\"", - ), - 4883..4884, - ), - ( - Text( - "\"", - ), - 4885..4886, - ), - ( - Text( - "\"", + "s\" \"\" | tr \" \" \"", ), - 4887..4888, + 4872..4888, ), ( Expression( @@ -5997,21 +4663,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", - ), - 5171..5177, - ), - ( - Text( - "\"", - ), - 5178..5179, - ), - ( - Text( - "%", + "printf \"%", ), - 5179..5180, + 5171..5180, ), ( Expression( @@ -6029,57 +4683,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "s", - ), - 5188..5189, - ), - ( - Text( - "\"", - ), - 5189..5190, - ), - ( - Text( - "\"", - ), - 5191..5192, - ), - ( - Text( - "\"", - ), - 5192..5193, - ), - ( - Text( - "|", - ), - 5194..5195, - ), - ( - Text( - "tr", - ), - 5196..5198, - ), - ( - Text( - "\"", - ), - 5199..5200, - ), - ( - Text( - "\"", - ), - 5201..5202, - ), - ( - Text( - "\"", + "s\" \"\" | tr \" \" \"", ), - 5203..5204, + 5188..5204, ), ( Expression( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__comments_in_ifs.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__comments_in_ifs.snap index fbb9247..8cdcc42 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__comments_in_ifs.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__comments_in_ifs.snap @@ -351,29 +351,11 @@ expression: parse(&tokenize(input)) ( Text( ( - "Entry", - 298..303, + "Entry not allowed", + 298..315, ), ), - 298..303, - ), - ( - Text( - ( - "not", - 304..307, - ), - ), - 304..307, - ), - ( - Text( - ( - "allowed", - 308..315, - ), - ), - 308..315, + 298..315, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_date.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_date.snap index 0b78f20..d67f2e9 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_date.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_date.snap @@ -1265,56 +1265,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 3004..3005, + "%FT%T%Z", + 3004..3011, ), ), - 3004..3005, - ), - ( - Text( - ( - "FT", - 3005..3007, - ), - ), - 3005..3007, - ), - ( - Text( - ( - "%", - 3007..3008, - ), - ), - 3007..3008, - ), - ( - Text( - ( - "T", - 3008..3009, - ), - ), - 3008..3009, - ), - ( - Text( - ( - "%", - 3009..3010, - ), - ), - 3009..3010, - ), - ( - Text( - ( - "Z", - 3010..3011, - ), - ), - 3010..3011, + 3004..3011, ), ], ), @@ -1382,63 +1337,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 3047..3051, - ), - ( - Text( - "+", - ), - 3052..3053, - ), - ( - Text( - "\"", - ), - 3053..3054, - ), - ( - Text( - "%", - ), - 3054..3055, - ), - ( - Text( - "FT", + "date +\"%FT%T%Z\" ", ), - 3055..3057, - ), - ( - Text( - "%", - ), - 3057..3058, - ), - ( - Text( - "T", - ), - 3058..3059, - ), - ( - Text( - "%", - ), - 3059..3060, - ), - ( - Text( - "Z", - ), - 3060..3061, - ), - ( - Text( - "\"", - ), - 3061..3062, + 3046..3063, ), ( Text( @@ -1507,27 +1408,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 3097..3101, - ), - ( - CommandOption( - "--utc", - ), - 3102..3107, - ), - ( - CommandOption( - "-d", - ), - 3108..3110, - ), - ( - Text( - "\"", + "date --utc -d \"", ), - 3111..3112, + 3096..3112, ), ( Expression( @@ -1545,21 +1428,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3118..3119, - ), - ( - Text( - "+", + "\" +\"", ), - 3120..3121, - ), - ( - Text( - "\"", - ), - 3121..3122, + 3118..3122, ), ( Expression( @@ -1577,9 +1448,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3130..3131, + 3130..3132, ), ( Text( @@ -1639,21 +1510,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 3165..3169, - ), - ( - CommandOption( - "-d", + "date -d \"", ), - 3170..3172, - ), - ( - Text( - "\"", - ), - 3173..3174, + 3164..3174, ), ( Expression( @@ -1671,21 +1530,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" +\"", ), - 3180..3181, - ), - ( - Text( - "+", - ), - 3182..3183, - ), - ( - Text( - "\"", - ), - 3183..3184, + 3180..3184, ), ( Expression( @@ -1703,9 +1550,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3192..3193, + 3192..3194, ), ( Text( @@ -1812,27 +1659,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 3360..3364, - ), - ( - Text( - "+", + "date +%s ", ), - 3365..3366, - ), - ( - Text( - "%", - ), - 3366..3367, - ), - ( - Text( - "s", - ), - 3367..3368, + 3359..3369, ), ( Text( @@ -2265,63 +2094,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "date", - ), - 3749..3753, - ), - ( - Text( - "+", + "date +\"%FT%T%Z\" ", ), - 3754..3755, - ), - ( - Text( - "\"", - ), - 3755..3756, - ), - ( - Text( - "%", - ), - 3756..3757, - ), - ( - Text( - "FT", - ), - 3757..3759, - ), - ( - Text( - "%", - ), - 3759..3760, - ), - ( - Text( - "T", - ), - 3760..3761, - ), - ( - Text( - "%", - ), - 3761..3762, - ), - ( - Text( - "Z", - ), - 3762..3763, - ), - ( - Text( - "\"", - ), - 3763..3764, + 3748..3765, ), ( Text( @@ -2385,20 +2160,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 3807..3808, + "%F", + 3807..3809, ), ), - 3807..3808, - ), - ( - Text( - ( - "F", - 3808..3809, - ), - ), - 3808..3809, + 3807..3809, ), ], ), @@ -2435,6 +2201,15 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3794..3824, ), + ( + Text( + ( + " ", + 3824..3825, + ), + ), + 3824..3825, + ), ( Expression( ( @@ -2449,6 +2224,15 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3825..3830, ), + ( + Text( + ( + " ", + 3830..3831, + ), + ), + 3830..3831, + ), ( Expression( ( @@ -2465,20 +2249,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 3844..3845, + "%T", + 3844..3846, ), ), - 3844..3845, - ), - ( - Text( - ( - "T", - 3845..3846, - ), - ), - 3845..3846, + 3844..3846, ), ], ), @@ -2917,20 +2692,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 4320..4321, - ), - ), - 4320..4321, - ), - ( - Text( - ( - "s", - 4321..4322, + "%s", + 4320..4322, ), ), - 4321..4322, + 4320..4322, ), ], ), @@ -3009,20 +2775,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "%", - 4380..4381, - ), - ), - 4380..4381, - ), - ( - Text( - ( - "s", - 4381..4382, + "%s", + 4380..4382, ), ), - 4381..4382, + 4380..4382, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_env.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_env.snap index 896a898..f369bb5 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_env.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_env.snap @@ -124,20 +124,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - ".", - 202..203, + ".env", + 202..206, ), ), - 202..203, - ), - ( - Text( - ( - "env", - 203..206, - ), - ), - 203..206, + 202..206, ), ], ), @@ -183,51 +174,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 240..244, + 239..246, ), ( Text( - "\"", - ), - 245..246, - ), - ( - Escape( - "$", + "\\$", ), 246..248, ), - ( - Escape( - "{", - ), - 248..250, - ), - ( - Text( - "!", - ), - 250..251, - ), - ( - Text( - "var", - ), - 251..254, - ), ( Text( - "}", + "\\{", ), - 254..255, + 248..250, ), ( Text( - "\"", + "!var}\" ", ), - 255..256, + 250..257, ), ( Text( @@ -363,15 +330,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "source", - ), - 349..355, - ), - ( - Text( - "\"", + "source \"", ), - 356..357, + 348..357, ), ( Expression( @@ -389,9 +350,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 363..364, + 363..365, ), ( Text( @@ -431,51 +392,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 390..394, + 389..396, ), ( Text( - "\"", - ), - 395..396, - ), - ( - Escape( - "$", + "\\$", ), 396..398, ), - ( - Escape( - "{", - ), - 398..400, - ), - ( - Text( - "!", - ), - 400..401, - ), - ( - Text( - "var", - ), - 401..404, - ), ( Text( - "}", + "\\{", ), - 404..405, + 398..400, ), ( Text( - "\"", + "!var}\" ", ), - 405..406, + 400..407, ), ( Text( @@ -579,20 +516,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - ".", - 527..528, - ), - ), - 527..528, - ), - ( - Text( - ( - "env", - 528..531, + ".env", + 527..531, ), ), - 528..531, + 527..531, ), ], ), @@ -628,39 +556,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "export", + "export \"", ), - 554..560, + 553..562, ), ( Text( - "\"", - ), - 561..562, - ), - ( - Escape( - "$", + "\\$", ), 562..564, ), ( Text( - "(", - ), - 564..565, - ), - ( - Text( - "xargs", - ), - 565..570, - ), - ( - Text( - "<", + "(xargs < ", ), - 571..572, + 564..573, ), ( Expression( @@ -678,45 +588,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - ")", - ), - 579..580, - ), - ( - Text( - "\"", - ), - 580..581, - ), - ( - Text( - ">", - ), - 582..583, - ), - ( - Text( - "/", - ), - 584..585, - ), - ( - Text( - "dev", - ), - 585..588, - ), - ( - Text( - "/", - ), - 588..589, - ), - ( - Text( - "null", + ")\" > /dev/null ", ), - 589..593, + 579..594, ), ( Text( @@ -807,37 +681,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 704..705, - ), - ( - Text( - "[", + "[[ ! -z ", ), - 705..706, + 703..712, ), ( Text( - "!", - ), - 707..708, - ), - ( - CommandOption( - "-z", - ), - 709..711, - ), - ( - Escape( - "$", + "\\$", ), 712..714, ), ( - Escape( - "{", + Text( + "\\{", ), 714..716, ), @@ -872,33 +728,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "+", - ), - 730..731, - ), - ( - Text( - "z", - ), - 731..732, - ), - ( - Text( - "}", - ), - 732..733, - ), - ( - Text( - "]", - ), - 734..735, - ), - ( - Text( - "]", + "+z} ]] ", ), - 735..736, + 730..737, ), ( Text( @@ -1058,13 +890,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "readonly", + "readonly ", ), - 900..908, + 899..909, ), ( - Escape( - "$", + Text( + "\\$", ), 909..911, ), @@ -1093,19 +925,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "=", + "=\"", ), - 924..925, + 924..926, ), ( Text( - "\"", - ), - 925..926, - ), - ( - Escape( - "$", + "\\$", ), 926..928, ), @@ -1134,45 +960,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 940..941, - ), - ( - Text( - "2", - ), - 942..943, - ), - ( - Text( - ">", - ), - 943..944, - ), - ( - Text( - "/", - ), - 945..946, - ), - ( - Text( - "dev", - ), - 946..949, - ), - ( - Text( - "/", - ), - 949..950, - ), - ( - Text( - "null", + "\" 2> /dev/null ", ), - 950..954, + 940..955, ), ( Text( @@ -1273,19 +1063,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 1063..1067, + 1062..1068, ), ( - Escape( - "$", + Text( + "\\$", ), 1068..1070, ), ( - Escape( - "{", + Text( + "\\{", ), 1070..1072, ), @@ -1320,9 +1110,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", + "} ", ), - 1086..1087, + 1086..1088, ), ( Text( @@ -1436,13 +1226,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "export", + "export ", ), - 1198..1204, + 1197..1205, ), ( - Escape( - "$", + Text( + "\\$", ), 1205..1207, ), @@ -1471,19 +1261,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "=", + "=\"", ), - 1220..1221, + 1220..1222, ), ( Text( - "\"", - ), - 1221..1222, - ), - ( - Escape( - "$", + "\\$", ), 1222..1224, ), @@ -1512,45 +1296,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1236..1237, - ), - ( - Text( - "2", - ), - 1238..1239, - ), - ( - Text( - ">", - ), - 1239..1240, - ), - ( - Text( - "/", - ), - 1241..1242, - ), - ( - Text( - "dev", - ), - 1242..1245, - ), - ( - Text( - "/", - ), - 1245..1246, - ), - ( - Text( - "null", + "\" 2> /dev/null ", ), - 1246..1250, + 1236..1251, ), ( Text( @@ -1651,19 +1399,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 1357..1361, + 1356..1362, ), ( - Escape( - "$", + Text( + "\\$", ), 1362..1364, ), ( - Escape( - "{", + Text( + "\\{", ), 1364..1366, ), @@ -1698,9 +1446,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "}", + "} ", ), - 1380..1381, + 1380..1382, ), ( Text( @@ -1797,9 +1545,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "unset", + "unset ", ), - 1486..1491, + 1485..1492, ), ( Expression( @@ -1815,6 +1563,12 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 1492..1498, ), + ( + Text( + " ", + ), + 1498..1499, + ), ( Text( "$", @@ -1909,45 +1663,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 1585..1586, - ), - ( - CommandOption( - "-x", + "[ -x \"", ), - 1587..1589, + 1584..1591, ), ( Text( - "\"", - ), - 1590..1591, - ), - ( - Escape( - "$", + "\\$", ), 1591..1593, ), ( Text( - "(", + "(command -v ", ), - 1593..1594, - ), - ( - Text( - "command", - ), - 1594..1601, - ), - ( - CommandOption( - "-v", - ), - 1602..1604, + 1593..1605, ), ( Expression( @@ -1965,21 +1695,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - ")", - ), - 1614..1615, - ), - ( - Text( - "\"", - ), - 1615..1616, - ), - ( - Text( - "]", + ")\" ] ", ), - 1617..1618, + 1614..1619, ), ( Text( @@ -2127,25 +1845,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "read", - ), - 1775..1779, - ), - ( - CommandOption( - "-p", + "read -p \"", ), - 1780..1782, + 1774..1784, ), ( Text( - "\"", - ), - 1783..1784, - ), - ( - Escape( - "$", + "\\$", ), 1784..1786, ), @@ -2174,9 +1880,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 1801..1802, + 1801..1803, ), ( Text( @@ -2203,9 +1909,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "$", + "\\$", 1817..1819, ), ), @@ -2314,31 +2020,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "read", + "read -s -p \"", ), - 1960..1964, - ), - ( - CommandOption( - "-s", - ), - 1965..1967, - ), - ( - CommandOption( - "-p", - ), - 1968..1970, + 1959..1972, ), ( Text( - "\"", - ), - 1971..1972, - ), - ( - Escape( - "$", + "\\$", ), 1972..1974, ), @@ -2367,9 +2055,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 1989..1990, + 1989..1991, ), ( Text( @@ -2399,33 +2087,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 2003..2007, - ), - ( - Text( - "\"", - ), - 2008..2009, - ), - ( - Text( - "\"", - ), - 2009..2010, - ), - ( - Text( - ">", - ), - 2011..2012, - ), - ( - Text( - "&2", + "echo \"\" >&2 ", ), - 2012..2014, + 2002..2015, ), ( Text( @@ -2459,9 +2123,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "$", + "\\$", 2035..2037, ), ), @@ -2638,83 +2302,47 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "[", - 2329..2330, - ), - ), - 2329..2330, - ), - ( - Escape( - ( - "x1b", - 2330..2334, + " [", + 2328..2330, ), ), - 2330..2334, + 2328..2330, ), ( Text( ( - "[", - 2334..2335, + "\\x", + 2330..2332, ), ), - 2334..2335, + 2330..2332, ), ( Text( ( - "1mY", - 2335..2338, + "1b[1mY/", + 2332..2339, ), ), - 2335..2338, + 2332..2339, ), ( Text( ( - "/", - 2338..2339, - ), - ), - 2338..2339, - ), - ( - Escape( - ( - "x1b", - 2339..2343, + "\\x", + 2339..2341, ), ), - 2339..2343, + 2339..2341, ), ( Text( ( - "[", - 2343..2344, + "1b[0mn]", + 2341..2348, ), ), - 2343..2344, - ), - ( - Text( - ( - "0mn", - 2344..2347, - ), - ), - 2344..2347, - ), - ( - Text( - ( - "]", - 2347..2348, - ), - ), - 2347..2348, + 2341..2348, ), ], ), @@ -2730,92 +2358,47 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "[", - 2357..2358, + " [y/", + 2356..2360, ), ), - 2357..2358, + 2356..2360, ), ( Text( ( - "y", - 2358..2359, + "\\x", + 2360..2362, ), ), - 2358..2359, + 2360..2362, ), ( Text( ( - "/", - 2359..2360, - ), - ), - 2359..2360, - ), - ( - Escape( - ( - "x1b", - 2360..2364, + "1b[1mN", + 2362..2368, ), ), - 2360..2364, + 2362..2368, ), ( Text( ( - "[", - 2364..2365, + "\\x", + 2368..2370, ), ), - 2364..2365, + 2368..2370, ), ( Text( ( - "1mN", - 2365..2368, + "1b[0m]", + 2370..2376, ), ), - 2365..2368, - ), - ( - Escape( - ( - "x1b", - 2368..2372, - ), - ), - 2368..2372, - ), - ( - Text( - ( - "[", - 2372..2373, - ), - ), - 2372..2373, - ), - ( - Text( - ( - "0m", - 2373..2375, - ), - ), - 2373..2375, - ), - ( - Text( - ( - "]", - 2375..2376, - ), - ), - 2375..2376, + 2370..2376, ), ], ), @@ -2855,33 +2438,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 2400..2406, + 2399..2408, ), ( Text( - "\"", + "\\x", ), - 2407..2408, - ), - ( - Escape( - "x1b", - ), - 2408..2412, + 2408..2410, ), ( Text( - "[", + "1b[1m", ), - 2412..2413, - ), - ( - Text( - "1m", - ), - 2413..2415, + 2410..2415, ), ( Expression( @@ -2897,23 +2468,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 2415..2423, ), - ( - Escape( - "x1b", - ), - 2423..2427, - ), ( Text( - "[", + "\\x", ), - 2427..2428, + 2423..2425, ), ( Text( - "0m", + "1b[0m", ), - 2428..2430, + 2425..2430, ), ( Expression( @@ -2931,9 +2496,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 2446..2447, + 2446..2448, ), ( Text( @@ -2963,27 +2528,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "read", - ), - 2460..2464, - ), - ( - CommandOption( - "-s", - ), - 2465..2467, - ), - ( - CommandOption( - "-n", + "read -s -n 1 ", ), - 2468..2470, - ), - ( - Text( - "1", - ), - 2471..2472, + 2459..2473, ), ( Text( @@ -3013,27 +2560,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 2485..2491, + 2484..2493, ), ( Text( - "\"", - ), - 2492..2493, - ), - ( - Escape( - "n", + "\\n", ), 2493..2495, ), ( Text( - "\"", + "\" ", ), - 2495..2496, + 2495..2497, ), ( Text( @@ -3093,21 +2634,21 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 2540..2544, + 2539..2545, ), ( - Escape( - "$", + Text( + "\\$", ), 2545..2547, ), ( Text( - "REPLY", + "REPLY ", ), - 2547..2552, + 2547..2553, ), ( Text( @@ -3308,9 +2849,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "eval", + "eval ", ), - 2717..2721, + 2716..2722, ), ( Expression( @@ -3326,6 +2867,12 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 2722..2731, ), + ( + Text( + " ", + ), + 2731..2732, + ), ( Text( "$", @@ -3439,15 +2986,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "id", + "id -u ", ), - 2871..2873, - ), - ( - CommandOption( - "-u", - ), - 2874..2876, + 2870..2877, ), ( Text( @@ -3645,6 +3186,12 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3050..3051, ), + ( + Text( + "", + ), + 3051..3052, + ), ( Expression( ( @@ -3670,21 +3217,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "=", - ), - 3065..3066, - ), - ( - Text( - "(", - ), - 3066..3067, - ), - ( - Text( - "\"", + "=(\"", ), - 3067..3068, + 3065..3068, ), ( Expression( @@ -3702,25 +3237,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" \"", ), - 3076..3077, + 3076..3079, ), ( Text( - "\"", - ), - 3078..3079, - ), - ( - Escape( - "$", + "\\$", ), 3079..3081, ), ( - Escape( - "{", + Text( + "\\{", ), 3081..3083, ), @@ -3749,39 +3278,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 3096..3097, - ), - ( - Text( - "@", + "[@]}\") ", ), - 3097..3098, - ), - ( - Text( - "]", - ), - 3098..3099, - ), - ( - Text( - "}", - ), - 3099..3100, - ), - ( - Text( - "\"", - ), - 3100..3101, - ), - ( - Text( - ")", - ), - 3101..3102, + 3096..3103, ), ( Text( @@ -3816,25 +3315,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "printf", + "printf \"", ), - 3117..3123, + 3116..3125, ), ( Text( - "\"", - ), - 3124..3125, - ), - ( - Escape( - "$", + "\\$", ), 3125..3127, ), ( - Escape( - "{", + Text( + "\\{", ), 3127..3129, ), @@ -3863,33 +3356,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", + "[@]}\" ", ), - 3142..3143, - ), - ( - Text( - "@", - ), - 3143..3144, - ), - ( - Text( - "]", - ), - 3144..3145, - ), - ( - Text( - "}", - ), - 3145..3146, - ), - ( - Text( - "\"", - ), - 3146..3147, + 3142..3148, ), ( Text( @@ -3990,13 +3459,13 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo ", ), - 3255..3259, + 3254..3260, ), ( - Escape( - "$", + Text( + "\\$", ), 3260..3262, ), @@ -4025,43 +3494,19 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "|", - ), - 3276..3277, - ), - ( - Text( - "sed", - ), - 3278..3281, - ), - ( - CommandOption( - "-e", - ), - 3282..3284, - ), - ( - Text( - "'s", + " | sed -e 's/", ), - 3285..3287, + 3275..3288, ), ( Text( - "/", - ), - 3287..3288, - ), - ( - Escape( - "\\", + "\\\\", ), 3288..3290, ), ( - Escape( - "\\", + Text( + "\\\\", ), 3290..3292, ), @@ -4071,107 +3516,35 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3292..3293, ), - ( - Escape( - "\\", - ), - 3293..3295, - ), - ( - Escape( - "\\", - ), - 3295..3297, - ), - ( - Escape( - "\\", - ), - 3297..3299, - ), - ( - Escape( - "\\", - ), - 3299..3301, - ), - ( - Text( - "/", - ), - 3301..3302, - ), - ( - Text( - "g'", - ), - 3302..3304, - ), - ( - CommandOption( - "-e", - ), - 3305..3307, - ), - ( - Text( - "\"", - ), - 3308..3309, - ), - ( - Text( - "s", - ), - 3309..3310, - ), - ( - Text( - "/", - ), - 3310..3311, - ), - ( - Text( - "%", - ), - 3311..3312, - ), - ( - Text( - "/", - ), - 3312..3313, - ), ( Text( - "%", + "\\\\", ), - 3313..3314, + 3293..3295, ), ( Text( - "%", + "\\\\", ), - 3314..3315, + 3295..3297, ), ( Text( - "/", + "\\\\", ), - 3315..3316, + 3297..3299, ), ( Text( - "g", + "\\\\", ), - 3316..3317, + 3299..3301, ), ( Text( - "\"", + "/g' -e \"s/%/%%/g\" ", ), - 3317..3318, + 3301..3319, ), ( Text( @@ -4311,22 +3684,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "x1b", - 3462..3466, + "\\x", + 3462..3464, ), ), - 3462..3466, + 3462..3464, ), ( Text( ( - "[", - 3466..3467, + "1b[", + 3464..3467, ), ), - 3466..3467, + 3464..3467, ), ( Expression( @@ -4424,32 +3797,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3485..3503, ), - ( - Escape( - ( - "x1b", - 3503..3507, - ), - ), - 3503..3507, - ), ( Text( ( - "[", - 3507..3508, + "\\x", + 3503..3505, ), ), - 3507..3508, + 3503..3505, ), ( Text( ( - "0m", - 3508..3510, + "1b[0m", + 3505..3510, ), ), - 3508..3510, + 3505..3510, ), ], ), @@ -4530,32 +3894,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3591..3595, - ), - ), - 3591..3595, - ), ( Text( ( - "[", - 3595..3596, + "\\x", + 3591..3593, ), ), - 3595..3596, + 3591..3593, ), ( Text( ( - "1m", - 3596..3598, + "1b[1m", + 3593..3598, ), ), - 3596..3598, + 3593..3598, ), ( Expression( @@ -4584,32 +3939,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3598..3616, ), - ( - Escape( - ( - "x1b", - 3616..3620, - ), - ), - 3616..3620, - ), ( Text( ( - "[", - 3620..3621, + "\\x", + 3616..3618, ), ), - 3620..3621, + 3616..3618, ), ( Text( ( - "0m", - 3621..3623, + "1b[0m", + 3618..3623, ), ), - 3621..3623, + 3618..3623, ), ], ), @@ -4690,32 +4036,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3708..3712, - ), - ), - 3708..3712, - ), ( Text( ( - "[", - 3712..3713, + "\\x", + 3708..3710, ), ), - 3712..3713, + 3708..3710, ), ( Text( ( - "3m", - 3713..3715, + "1b[3m", + 3710..3715, ), ), - 3713..3715, + 3710..3715, ), ( Expression( @@ -4744,32 +4081,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3715..3733, ), - ( - Escape( - ( - "x1b", - 3733..3737, - ), - ), - 3733..3737, - ), ( Text( ( - "[", - 3737..3738, + "\\x", + 3733..3735, ), ), - 3737..3738, + 3733..3735, ), ( Text( ( - "0m", - 3738..3740, + "1b[0m", + 3735..3740, ), ), - 3738..3740, + 3735..3740, ), ], ), @@ -4850,32 +4178,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 3833..3837, - ), - ), - 3833..3837, - ), ( Text( ( - "[", - 3837..3838, + "\\x", + 3833..3835, ), ), - 3837..3838, + 3833..3835, ), ( Text( ( - "4m", - 3838..3840, + "1b[4m", + 3835..3840, ), ), - 3838..3840, + 3835..3840, ), ( Expression( @@ -4904,32 +4223,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 3840..3858, ), - ( - Escape( - ( - "x1b", - 3858..3862, - ), - ), - 3858..3862, - ), ( Text( ( - "[", - 3862..3863, + "\\x", + 3858..3860, ), ), - 3862..3863, + 3858..3860, ), ( Text( ( - "0m", - 3863..3865, + "1b[0m", + 3860..3865, ), ), - 3863..3865, + 3860..3865, ), ], ), @@ -5031,22 +4341,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "x1b", - 3980..3984, + "\\x", + 3980..3982, ), ), - 3980..3984, + 3980..3982, ), ( Text( ( - "[", - 3984..3985, + "1b[", + 3982..3985, ), ), - 3984..3985, + 3982..3985, ), ( Expression( @@ -5078,61 +4388,34 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "m", - 4000..4001, - ), - ), - 4000..4001, - ), - ( - Text( - ( - "%", - 4001..4002, + "m%s", + 4000..4003, ), ), - 4001..4002, + 4000..4003, ), ( Text( ( - "s", - 4002..4003, - ), - ), - 4002..4003, - ), - ( - Escape( - ( - "x1b", - 4003..4007, + "\\x", + 4003..4005, ), ), - 4003..4007, + 4003..4005, ), ( Text( ( - "[", - 4007..4008, + "1b[0m", + 4005..4010, ), ), - 4007..4008, + 4005..4010, ), ( Text( ( - "0m", - 4008..4010, - ), - ), - 4008..4010, - ), - ( - Escape( - ( - "n", + "\\n", 4010..4012, ), ), @@ -5240,136 +4523,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4119..4123, - ), - ), - 4119..4123, - ), - ( - Text( - ( - "[", - 4123..4124, - ), - ), - 4123..4124, - ), ( Text( ( - "1", - 4124..4125, + "\\x", + 4119..4121, ), ), - 4124..4125, + 4119..4121, ), ( Text( ( - ";", - 4125..4126, + "1b[1;3;97;44m%s", + 4121..4136, ), ), - 4125..4126, + 4121..4136, ), ( Text( ( - "3", - 4126..4127, + "\\x", + 4136..4138, ), ), - 4126..4127, + 4136..4138, ), ( Text( ( - ";", - 4127..4128, + "1b[0m", + 4138..4143, ), ), - 4127..4128, + 4138..4143, ), ( Text( ( - "97", - 4128..4130, - ), - ), - 4128..4130, - ), - ( - Text( - ( - ";", - 4130..4131, - ), - ), - 4130..4131, - ), - ( - Text( - ( - "44m", - 4131..4134, - ), - ), - 4131..4134, - ), - ( - Text( - ( - "%", - 4134..4135, - ), - ), - 4134..4135, - ), - ( - Text( - ( - "s", - 4135..4136, - ), - ), - 4135..4136, - ), - ( - Escape( - ( - "x1b", - 4136..4140, - ), - ), - 4136..4140, - ), - ( - Text( - ( - "[", - 4140..4141, - ), - ), - 4140..4141, - ), - ( - Text( - ( - "0m", - 4141..4143, - ), - ), - 4141..4143, - ), - ( - Escape( - ( - "n", + "\\n", 4143..4145, ), ), @@ -5477,136 +4670,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4258..4262, - ), - ), - 4258..4262, - ), - ( - Text( - ( - "[", - 4262..4263, - ), - ), - 4262..4263, - ), - ( - Text( - ( - "1", - 4263..4264, - ), - ), - 4263..4264, - ), - ( - Text( - ( - ";", - 4264..4265, - ), - ), - 4264..4265, - ), - ( - Text( - ( - "3", - 4265..4266, - ), - ), - 4265..4266, - ), - ( - Text( - ( - ";", - 4266..4267, - ), - ), - 4266..4267, - ), - ( - Text( - ( - "97", - 4267..4269, - ), - ), - 4267..4269, - ), ( Text( ( - ";", - 4269..4270, + "\\x", + 4258..4260, ), ), - 4269..4270, + 4258..4260, ), ( Text( ( - "42m", - 4270..4273, + "1b[1;3;97;42m%s", + 4260..4275, ), ), - 4270..4273, + 4260..4275, ), ( Text( ( - "%", - 4273..4274, + "\\x", + 4275..4277, ), ), - 4273..4274, + 4275..4277, ), ( Text( ( - "s", - 4274..4275, + "1b[0m", + 4277..4282, ), ), - 4274..4275, - ), - ( - Escape( - ( - "x1b", - 4275..4279, - ), - ), - 4275..4279, + 4277..4282, ), ( Text( ( - "[", - 4279..4280, - ), - ), - 4279..4280, - ), - ( - Text( - ( - "0m", - 4280..4282, - ), - ), - 4280..4282, - ), - ( - Escape( - ( - "n", + "\\n", 4282..4284, ), ), @@ -5714,136 +4817,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4397..4401, - ), - ), - 4397..4401, - ), - ( - Text( - ( - "[", - 4401..4402, - ), - ), - 4401..4402, - ), - ( - Text( - ( - "1", - 4402..4403, - ), - ), - 4402..4403, - ), - ( - Text( - ( - ";", - 4403..4404, - ), - ), - 4403..4404, - ), - ( - Text( - ( - "3", - 4404..4405, - ), - ), - 4404..4405, - ), - ( - Text( - ( - ";", - 4405..4406, - ), - ), - 4405..4406, - ), - ( - Text( - ( - "97", - 4406..4408, - ), - ), - 4406..4408, - ), ( Text( ( - ";", - 4408..4409, + "\\x", + 4397..4399, ), ), - 4408..4409, + 4397..4399, ), ( Text( ( - "43m", - 4409..4412, + "1b[1;3;97;43m%s", + 4399..4414, ), ), - 4409..4412, + 4399..4414, ), ( Text( ( - "%", - 4412..4413, + "\\x", + 4414..4416, ), ), - 4412..4413, + 4414..4416, ), ( Text( ( - "s", - 4413..4414, - ), - ), - 4413..4414, - ), - ( - Escape( - ( - "x1b", - 4414..4418, + "1b[0m", + 4416..4421, ), ), - 4414..4418, + 4416..4421, ), ( Text( ( - "[", - 4418..4419, - ), - ), - 4418..4419, - ), - ( - Text( - ( - "0m", - 4419..4421, - ), - ), - 4419..4421, - ), - ( - Escape( - ( - "n", + "\\n", 4421..4423, ), ), @@ -5979,136 +4992,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( [ - ( - Escape( - ( - "x1b", - 4591..4595, - ), - ), - 4591..4595, - ), - ( - Text( - ( - "[", - 4595..4596, - ), - ), - 4595..4596, - ), - ( - Text( - ( - "1", - 4596..4597, - ), - ), - 4596..4597, - ), - ( - Text( - ( - ";", - 4597..4598, - ), - ), - 4597..4598, - ), - ( - Text( - ( - "3", - 4598..4599, - ), - ), - 4598..4599, - ), - ( - Text( - ( - ";", - 4599..4600, - ), - ), - 4599..4600, - ), - ( - Text( - ( - "97", - 4600..4602, - ), - ), - 4600..4602, - ), - ( - Text( - ( - ";", - 4602..4603, - ), - ), - 4602..4603, - ), ( Text( ( - "41m", - 4603..4606, + "\\x", + 4591..4593, ), ), - 4603..4606, + 4591..4593, ), ( Text( ( - "%", - 4606..4607, + "1b[1;3;97;41m%s", + 4593..4608, ), ), - 4606..4607, + 4593..4608, ), ( Text( ( - "s", - 4607..4608, + "\\x", + 4608..4610, ), ), - 4607..4608, - ), - ( - Escape( - ( - "x1b", - 4608..4612, - ), - ), - 4608..4612, + 4608..4610, ), ( Text( ( - "[", - 4612..4613, + "1b[0m", + 4610..4615, ), ), - 4612..4613, + 4610..4615, ), ( Text( ( - "0m", - 4613..4615, - ), - ), - 4613..4615, - ), - ( - Escape( - ( - "n", + "\\n", 4615..4617, ), ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_fs.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_fs.snap index ac03936..5bb0d58 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_fs.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_fs.snap @@ -109,21 +109,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", + "[ -d \"", ), - 135..136, - ), - ( - CommandOption( - "-d", - ), - 137..139, - ), - ( - Text( - "\"", - ), - 140..141, + 134..141, ), ( Expression( @@ -141,15 +129,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 147..148, - ), - ( - Text( - "]", + "\" ] ", ), - 149..150, + 147..151, ), ( Text( @@ -283,21 +265,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "[", - ), - 271..272, - ), - ( - CommandOption( - "-f", - ), - 273..275, - ), - ( - Text( - "\"", + "[ -f \"", ), - 276..277, + 270..277, ), ( Expression( @@ -315,15 +285,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 283..284, - ), - ( - Text( - "]", + "\" ] ", ), - 285..286, + 283..287, ), ( Text( @@ -462,15 +426,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "<", - ), - 419..420, - ), - ( - Text( - "\"", + "< \"", ), - 421..422, + 418..422, ), ( Expression( @@ -488,9 +446,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 428..429, + 428..430, ), ( Text( @@ -612,15 +570,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 551..555, - ), - ( - Text( - "\"", + "echo \"", ), - 556..557, + 550..557, ), ( Expression( @@ -638,21 +590,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 566..567, - ), - ( - Text( - ">", - ), - 568..569, - ), - ( - Text( - "\"", + "\" > \"", ), - 570..571, + 566..571, ), ( Expression( @@ -670,9 +610,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 577..578, + 577..579, ), ( Text( @@ -810,15 +750,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 708..712, - ), - ( - Text( - "\"", + "echo \"", ), - 713..714, + 707..714, ), ( Expression( @@ -836,27 +770,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 723..724, - ), - ( - Text( - ">", - ), - 725..726, - ), - ( - Text( - ">", - ), - 726..727, - ), - ( - Text( - "\"", + "\" >> \"", ), - 728..729, + 723..729, ), ( Expression( @@ -874,9 +790,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 735..736, + 735..737, ), ( Text( @@ -1061,21 +977,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "ln", - ), - 959..961, - ), - ( - CommandOption( - "-s", - ), - 962..964, - ), - ( - Text( - "\"", + "ln -s \"", ), - 965..966, + 958..966, ), ( Expression( @@ -1093,15 +997,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 974..975, - ), - ( - Text( - "\"", + "\" \"", ), - 976..977, + 974..977, ), ( Expression( @@ -1119,9 +1017,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 990..991, + 990..992, ), ( Text( @@ -1181,20 +1079,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "The", - 1031..1034, - ), - ), - 1031..1034, - ), - ( - Text( - ( - "file", - 1035..1039, + "The file ", + 1031..1040, ), ), - 1035..1039, + 1031..1040, ), ( Expression( @@ -1213,29 +1102,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 1049..1056, - ), - ), - 1049..1056, - ), - ( - Text( - ( - "exist", - 1057..1062, - ), - ), - 1057..1062, - ), - ( - Text( - ( - "!", - 1062..1063, + " doesn't exist!", + 1048..1063, ), ), - 1062..1063, + 1048..1063, ), ], ), @@ -1387,21 +1258,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "mkdir", - ), - 1235..1240, - ), - ( - CommandOption( - "-p", - ), - 1241..1243, - ), - ( - Text( - "\"", + "mkdir -p \"", ), - 1244..1245, + 1234..1245, ), ( Expression( @@ -1419,9 +1278,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 1251..1252, + 1251..1253, ), ( Text( @@ -1612,15 +1471,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "chmod", - ), - 1467..1472, - ), - ( - Text( - "\"", + "chmod \"", ), - 1473..1474, + 1466..1474, ), ( Expression( @@ -1638,15 +1491,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1480..1481, - ), - ( - Text( - "\"", + "\" \"", ), - 1482..1483, + 1480..1483, ), ( Expression( @@ -1664,9 +1511,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 1489..1490, + 1489..1491, ), ( Text( @@ -1726,20 +1573,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "The", - 1530..1533, - ), - ), - 1530..1533, - ), - ( - Text( - ( - "file", - 1534..1538, + "The file ", + 1530..1539, ), ), - 1534..1538, + 1530..1539, ), ( Expression( @@ -1758,29 +1596,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 1546..1553, - ), - ), - 1546..1553, - ), - ( - Text( - ( - "exist", - 1554..1559, - ), - ), - 1554..1559, - ), - ( - Text( - ( - "!", - 1559..1560, + " doesn't exist!", + 1545..1560, ), ), - 1559..1560, + 1545..1560, ), ], ), @@ -2003,21 +1823,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "chown", - ), - 1783..1788, - ), - ( - CommandOption( - "-R", - ), - 1789..1791, - ), - ( - Text( - "\"", + "chown -R \"", ), - 1792..1793, + 1782..1793, ), ( Expression( @@ -2035,15 +1843,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 1799..1800, - ), - ( - Text( - "\"", + "\" \"", ), - 1801..1802, + 1799..1802, ), ( Expression( @@ -2061,9 +1863,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 1808..1809, + 1808..1810, ), ( Text( @@ -2123,20 +1925,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "The", - 1849..1852, - ), - ), - 1849..1852, - ), - ( - Text( - ( - "file", - 1853..1857, + "The file ", + 1849..1858, ), ), - 1853..1857, + 1849..1858, ), ( Expression( @@ -2155,29 +1948,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "doesn't", - 1865..1872, - ), - ), - 1865..1872, - ), - ( - Text( - ( - "exist", - 1873..1878, - ), - ), - 1873..1878, - ), - ( - Text( - ( - "!", - 1878..1879, + " doesn't exist!", + 1864..1879, ), ), - 1878..1879, + 1864..1879, ), ], ), @@ -2311,9 +2086,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "(", + "\\(", 2087..2089, ), ), @@ -2322,61 +2097,16 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "[", - 2089..2090, - ), - ), - 2089..2090, - ), - ( - Text( - ( - "^", - 2090..2091, - ), - ), - 2090..2091, - ), - ( - Text( - ( - "*", - 2091..2092, - ), - ), - 2091..2092, - ), - ( - Text( - ( - "?", - 2092..2093, - ), - ), - 2092..2093, - ), - ( - Text( - ( - "/", - 2093..2094, + "[^*?/]", + 2089..2095, ), ), - 2093..2094, + 2089..2095, ), ( Text( ( - "]", - 2094..2095, - ), - ), - 2094..2095, - ), - ( - Escape( - ( - ")", + "\\)", 2095..2097, ), ), @@ -2390,27 +2120,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "\\", + "\\\\", 2101..2103, ), ), 2101..2103, ), ( - Escape( + Text( ( - "\\", + "\\\\", 2103..2105, ), ), 2103..2105, ), ( - Escape( + Text( ( - "1", + "\\1", 2105..2107, ), ), @@ -2800,7 +2530,17 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - [], + [ + ( + Text( + ( + " ", + 2607..2608, + ), + ), + 2607..2608, + ), + ], ), 2606..2609, ), @@ -2847,33 +2587,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "eval", - ), - 2635..2639, - ), - ( - Text( - "\"", - ), - 2640..2641, - ), - ( - Text( - "for", - ), - 2641..2644, - ), - ( - Text( - "file", - ), - 2645..2649, - ), - ( - Text( - "in", + "eval \"for file in ", ), - 2650..2652, + 2634..2653, ), ( Expression( @@ -2891,49 +2607,31 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - ";", + "; do [ -e ", ), - 2663..2664, + 2663..2673, ), ( Text( - "do", - ), - 2665..2667, - ), - ( - Text( - "[", - ), - 2668..2669, - ), - ( - CommandOption( - "-e", - ), - 2670..2672, - ), - ( - Escape( - "\\", + "\\\\", ), 2673..2675, ), ( - Escape( - "\"", + Text( + "\\\"", ), 2675..2677, ), ( - Escape( - "\\", + Text( + "\\\\", ), 2677..2679, ), ( - Escape( - "$", + Text( + "\\$", ), 2679..2681, ), @@ -2944,56 +2642,44 @@ expression: parse_unwrap(&tokenize(&stdlib)) 2681..2685, ), ( - Escape( - "\\", + Text( + "\\\\", ), 2685..2687, ), - ( - Escape( - "\"", - ), - 2687..2689, - ), ( Text( - "]", + "\\\"", ), - 2690..2691, + 2687..2689, ), ( Text( - "&&", + " ] && echo ", ), - 2692..2694, + 2689..2700, ), ( Text( - "echo", - ), - 2695..2699, - ), - ( - Escape( - "\\", + "\\\\", ), 2700..2702, ), ( - Escape( - "\"", + Text( + "\\\"", ), 2702..2704, ), ( - Escape( - "\\", + Text( + "\\\\", ), 2704..2706, ), ( - Escape( - "$", + Text( + "\\$", ), 2706..2708, ), @@ -3003,35 +2689,23 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 2708..2712, ), - ( - Escape( - "\\", - ), - 2712..2714, - ), - ( - Escape( - "\"", - ), - 2714..2716, - ), ( Text( - ";", + "\\\\", ), - 2716..2717, + 2712..2714, ), ( Text( - "done", + "\\\"", ), - 2718..2722, + 2714..2716, ), ( Text( - "\"", + "; done\" ", ), - 2722..2723, + 2716..2724, ), ( Text( @@ -3083,9 +2757,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - "n", + "\\n", 2752..2754, ), ), @@ -3386,18 +3060,18 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3227..3229, ), ), 3227..3229, ), ( - Escape( + Text( ( - "(", + "\\(", 3229..3231, ), ), @@ -3413,9 +3087,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3231..3234, ), ( - Escape( + Text( ( - ".", + "\\.", 3234..3236, ), ), @@ -3431,27 +3105,45 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3236..3239, ), ( - Escape( + Text( + ( + "\\|", + 3239..3241, + ), + ), + 3239..3241, + ), + ( + Text( + ( + "tbz", + 3241..3244, + ), + ), + 3241..3244, + ), + ( + Text( ( - "|tbz", - 3239..3244, + "\\|", + 3244..3246, ), ), - 3239..3244, + 3244..3246, ), ( - Escape( + Text( ( - "|tbz2", - 3244..3250, + "tbz2", + 3246..3250, ), ), - 3244..3250, + 3246..3250, ), ( - Escape( + Text( ( - ")", + "\\)", 3250..3252, ), ), @@ -3489,21 +3181,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "tar", + "tar xvjf \"", ), - 3259..3262, - ), - ( - Text( - "xvjf", - ), - 3263..3267, - ), - ( - Text( - "\"", - ), - 3268..3269, + 3258..3269, ), ( Expression( @@ -3521,21 +3201,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" -C \"", ), - 3275..3276, - ), - ( - CommandOption( - "-C", - ), - 3277..3279, - ), - ( - Text( - "\"", - ), - 3280..3281, + 3275..3281, ), ( Expression( @@ -3553,9 +3221,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3289..3290, + 3289..3291, ), ( Text( @@ -3607,18 +3275,18 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3325..3327, ), ), 3325..3327, ), ( - Escape( + Text( ( - "(", + "\\(", 3327..3329, ), ), @@ -3634,9 +3302,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3329..3332, ), ( - Escape( + Text( ( - ".", + "\\.", 3332..3334, ), ), @@ -3652,18 +3320,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3334..3336, ), ( - Escape( + Text( ( - "|tgz", - 3336..3341, + "\\|", + 3336..3338, ), ), - 3336..3341, + 3336..3338, ), ( - Escape( + Text( ( - ")", + "tgz", + 3338..3341, + ), + ), + 3338..3341, + ), + ( + Text( + ( + "\\)", 3341..3343, ), ), @@ -3701,21 +3378,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "tar", - ), - 3350..3353, - ), - ( - Text( - "xzf", + "tar xzf \"", ), - 3354..3357, - ), - ( - Text( - "\"", - ), - 3358..3359, + 3349..3359, ), ( Expression( @@ -3733,21 +3398,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3365..3366, - ), - ( - CommandOption( - "-C", + "\" -C \"", ), - 3367..3369, - ), - ( - Text( - "\"", - ), - 3370..3371, + 3365..3371, ), ( Expression( @@ -3765,9 +3418,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3379..3380, + 3379..3381, ), ( Text( @@ -3819,18 +3472,18 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3415..3417, ), ), 3415..3417, ), ( - Escape( + Text( ( - "(", + "\\(", 3417..3419, ), ), @@ -3846,9 +3499,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3419..3422, ), ( - Escape( + Text( ( - ".", + "\\.", 3422..3424, ), ), @@ -3864,27 +3517,27 @@ expression: parse_unwrap(&tokenize(&stdlib)) 3424..3426, ), ( - Escape( + Text( ( - "|txz", - 3426..3431, + "\\|", + 3426..3428, ), ), - 3426..3431, + 3426..3428, ), ( Text( ( - "$", - 3431..3432, + "txz$", + 3428..3432, ), ), - 3431..3432, + 3428..3432, ), ( - Escape( + Text( ( - ")", + "\\)", 3432..3434, ), ), @@ -3922,21 +3575,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "tar", - ), - 3441..3444, - ), - ( - Text( - "xJf", - ), - 3445..3448, - ), - ( - Text( - "\"", + "tar xJf \"", ), - 3449..3450, + 3440..3450, ), ( Expression( @@ -3954,21 +3595,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" -C \"", ), - 3456..3457, - ), - ( - CommandOption( - "-C", - ), - 3458..3460, - ), - ( - Text( - "\"", - ), - 3461..3462, + 3456..3462, ), ( Expression( @@ -3986,9 +3615,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3470..3471, + 3470..3472, ), ( Text( @@ -4040,9 +3669,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3506..3508, ), ), @@ -4051,20 +3680,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "bz2", - 3508..3511, - ), - ), - 3508..3511, - ), - ( - Text( - ( - "$", - 3511..3512, + "bz2$", + 3508..3512, ), ), - 3511..3512, + 3508..3512, ), ], ), @@ -4089,15 +3709,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "bunzip2", - ), - 3518..3525, - ), - ( - Text( - "\"", + "bunzip2 \"", ), - 3526..3527, + 3517..3527, ), ( Expression( @@ -4115,9 +3729,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3533..3534, + 3533..3535, ), ( Text( @@ -4169,9 +3783,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3569..3571, ), ), @@ -4180,20 +3794,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "deb", - 3571..3574, - ), - ), - 3571..3574, - ), - ( - Text( - ( - "$", - 3574..3575, + "deb$", + 3571..3575, ), ), - 3574..3575, + 3571..3575, ), ], ), @@ -4218,27 +3823,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "dpkg", + "dpkg-deb -xv \"", ), - 3581..3585, - ), - ( - CommandOption( - "-deb", - ), - 3585..3589, - ), - ( - CommandOption( - "-xv", - ), - 3590..3593, - ), - ( - Text( - "\"", - ), - 3594..3595, + 3580..3595, ), ( Expression( @@ -4256,15 +3843,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3601..3602, - ), - ( - Text( - "\"", + "\" \"", ), - 3603..3604, + 3601..3604, ), ( Expression( @@ -4282,9 +3863,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3612..3613, + 3612..3614, ), ( Text( @@ -4336,9 +3917,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3648..3650, ), ), @@ -4347,20 +3928,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "gz", - 3650..3652, - ), - ), - 3650..3652, - ), - ( - Text( - ( - "$", - 3652..3653, + "gz$", + 3650..3653, ), ), - 3652..3653, + 3650..3653, ), ], ), @@ -4385,15 +3957,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "gunzip", - ), - 3659..3665, - ), - ( - Text( - "\"", + "gunzip \"", ), - 3666..3667, + 3658..3667, ), ( Expression( @@ -4411,9 +3977,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3673..3674, + 3673..3675, ), ( Text( @@ -4465,9 +4031,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3709..3711, ), ), @@ -4476,20 +4042,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "rar", - 3711..3714, + "rar$", + 3711..3715, ), ), - 3711..3714, - ), - ( - Text( - ( - "$", - 3714..3715, - ), - ), - 3714..3715, + 3711..3715, ), ], ), @@ -4514,21 +4071,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "unrar", - ), - 3721..3726, - ), - ( - Text( - "x", + "unrar x \"", ), - 3727..3728, - ), - ( - Text( - "\"", - ), - 3729..3730, + 3720..3730, ), ( Expression( @@ -4546,15 +4091,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3736..3737, - ), - ( - Text( - "\"", + "\" \"", ), - 3738..3739, + 3736..3739, ), ( Expression( @@ -4572,9 +4111,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3747..3748, + 3747..3749, ), ( Text( @@ -4626,9 +4165,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3783..3785, ), ), @@ -4637,20 +4176,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "rpm", - 3785..3788, - ), - ), - 3785..3788, - ), - ( - Text( - ( - "$", - 3788..3789, + "rpm$", + 3785..3789, ), ), - 3788..3789, + 3785..3789, ), ], ), @@ -4675,15 +4205,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "rpm2cpio", - ), - 3795..3803, - ), - ( - Text( - "\"", + "rpm2cpio \"", ), - 3804..3805, + 3794..3805, ), ( Expression( @@ -4701,27 +4225,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3811..3812, - ), - ( - Text( - "|", + "\" | cpio -idm ", ), - 3813..3814, - ), - ( - Text( - "cpio", - ), - 3815..3819, - ), - ( - CommandOption( - "-idm", - ), - 3820..3824, + 3811..3825, ), ( Text( @@ -4773,9 +4279,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3859..3861, ), ), @@ -4784,20 +4290,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "tar", - 3861..3864, + "tar$", + 3861..3865, ), ), - 3861..3864, - ), - ( - Text( - ( - "$", - 3864..3865, - ), - ), - 3864..3865, + 3861..3865, ), ], ), @@ -4822,21 +4319,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "tar", + "tar xf \"", ), - 3871..3874, - ), - ( - Text( - "xf", - ), - 3875..3877, - ), - ( - Text( - "\"", - ), - 3878..3879, + 3870..3879, ), ( Expression( @@ -4854,21 +4339,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 3885..3886, - ), - ( - CommandOption( - "-C", - ), - 3887..3889, - ), - ( - Text( - "\"", + "\" -C \"", ), - 3890..3891, + 3885..3891, ), ( Expression( @@ -4886,9 +4359,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3899..3900, + 3899..3901, ), ( Text( @@ -4940,9 +4413,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 3935..3937, ), ), @@ -4951,20 +4424,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "xz", - 3937..3939, + "xz$", + 3937..3940, ), ), - 3937..3939, - ), - ( - Text( - ( - "$", - 3939..3940, - ), - ), - 3939..3940, + 3937..3940, ), ], ), @@ -4989,21 +4453,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "xz", - ), - 3946..3948, - ), - ( - CommandOption( - "--decompress", - ), - 3949..3961, - ), - ( - Text( - "\"", + "xz --decompress \"", ), - 3962..3963, + 3945..3963, ), ( Expression( @@ -5021,9 +4473,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 3969..3970, + 3969..3971, ), ( Text( @@ -5075,9 +4527,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 4005..4007, ), ), @@ -5086,20 +4538,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "7z", - 4007..4009, - ), - ), - 4007..4009, - ), - ( - Text( - ( - "$", - 4009..4010, + "7z$", + 4007..4010, ), ), - 4009..4010, + 4007..4010, ), ], ), @@ -5124,21 +4567,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "7z", + "7z -y \"", ), - 4016..4018, - ), - ( - CommandOption( - "-y", - ), - 4019..4021, - ), - ( - Text( - "\"", - ), - 4022..4023, + 4015..4023, ), ( Expression( @@ -5156,21 +4587,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 4029..4030, - ), - ( - CommandOption( - "-o", - ), - 4031..4033, - ), - ( - Text( - "\"", + "\" -o \"", ), - 4034..4035, + 4029..4035, ), ( Expression( @@ -5188,9 +4607,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 4043..4044, + 4043..4045, ), ( Text( @@ -5242,18 +4661,18 @@ expression: parse_unwrap(&tokenize(&stdlib)) Text( [ ( - Escape( + Text( ( - ".", + "\\.", 4079..4081, ), ), 4079..4081, ), ( - Escape( + Text( ( - "(", + "\\(", 4081..4083, ), ), @@ -5269,27 +4688,45 @@ expression: parse_unwrap(&tokenize(&stdlib)) 4083..4086, ), ( - Escape( + Text( ( - "|war", - 4086..4091, + "\\|", + 4086..4088, ), ), - 4086..4091, + 4086..4088, ), ( - Escape( + Text( ( - "|jar", - 4091..4096, + "war", + 4088..4091, ), ), - 4091..4096, + 4088..4091, ), ( - Escape( + Text( + ( + "\\|", + 4091..4093, + ), + ), + 4091..4093, + ), + ( + Text( + ( + "jar", + 4093..4096, + ), + ), + 4093..4096, + ), + ( + Text( ( - ")", + "\\)", 4096..4098, ), ), @@ -5327,15 +4764,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "unzip", + "unzip \"", ), - 4105..4110, - ), - ( - Text( - "\"", - ), - 4111..4112, + 4104..4112, ), ( Expression( @@ -5353,21 +4784,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 4118..4119, - ), - ( - CommandOption( - "-d", - ), - 4120..4122, - ), - ( - Text( - "\"", + "\" -d \"", ), - 4123..4124, + 4118..4124, ), ( Expression( @@ -5385,9 +4804,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 4132..4133, + 4132..4134, ), ( Text( @@ -5438,47 +4857,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "Error", - 4178..4183, - ), - ), - 4178..4183, - ), - ( - Text( - ( - ":", - 4183..4184, - ), - ), - 4183..4184, - ), - ( - Text( - ( - "Unsupported", - 4185..4196, + "Error: Unsupported file type", + 4178..4206, ), ), - 4185..4196, - ), - ( - Text( - ( - "file", - 4197..4201, - ), - ), - 4197..4201, - ), - ( - Text( - ( - "type", - 4202..4206, - ), - ), - 4202..4206, + 4178..4206, ), ], ), @@ -5552,47 +4935,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ( Text( ( - "Error", - 4282..4287, - ), - ), - 4282..4287, - ), - ( - Text( - ( - ":", - 4287..4288, - ), - ), - 4287..4288, - ), - ( - Text( - ( - "File", - 4289..4293, - ), - ), - 4289..4293, - ), - ( - Text( - ( - "not", - 4294..4297, - ), - ), - 4294..4297, - ), - ( - Text( - ( - "found", - 4298..4303, + "Error: File not found", + 4282..4303, ), ), - 4298..4303, + 4282..4303, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_http.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_http.snap index 943de16..4700c4a 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_http.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_http.snap @@ -213,27 +213,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "curl", + "curl -L -o \"", ), - 481..485, - ), - ( - CommandOption( - "-L", - ), - 486..488, - ), - ( - CommandOption( - "-o", - ), - 489..491, - ), - ( - Text( - "\"", - ), - 492..493, + 480..493, ), ( Expression( @@ -251,15 +233,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 499..500, - ), - ( - Text( - "\"", + "\" \"", ), - 501..502, + 499..502, ), ( Expression( @@ -277,9 +253,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 507..508, + 507..509, ), ( Text( @@ -361,15 +337,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "wget", - ), - 570..574, - ), - ( - Text( - "\"", + "wget \"", ), - 575..576, + 569..576, ), ( Expression( @@ -387,21 +357,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" -P \"", ), - 581..582, - ), - ( - CommandOption( - "-P", - ), - 583..585, - ), - ( - Text( - "\"", - ), - 586..587, + 581..587, ), ( Expression( @@ -419,9 +377,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 593..594, + 593..595, ), ( Text( @@ -503,15 +461,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "aria2c", - ), - 658..664, - ), - ( - Text( - "\"", + "aria2c \"", ), - 665..666, + 657..666, ), ( Expression( @@ -529,21 +481,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 671..672, - ), - ( - CommandOption( - "-d", - ), - 673..675, - ), - ( - Text( - "\"", + "\" -d \"", ), - 676..677, + 671..677, ), ( Expression( @@ -561,9 +501,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" ", ), - 683..684, + 683..685, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_math.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_math.snap index f350c3d..b8cb839 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_math.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_math.snap @@ -91,15 +91,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", + "echo \"", ), - 106..110, - ), - ( - Text( - "\"", - ), - 111..112, + 105..112, ), ( Expression( @@ -117,195 +111,33 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", - ), - 118..119, - ), - ( - Text( - "|", - ), - 120..121, - ), - ( - Text( - "awk", + "\" | awk '", ), - 122..125, + 118..127, ), ( Text( - "'", - ), - 126..127, - ), - ( - Escape( - "{", + "\\{", ), 127..129, ), ( Text( - "s", - ), - 129..130, - ), - ( - Text( - "=", - ), - 130..131, - ), - ( - Text( - "0", - ), - 131..132, - ), - ( - Text( - ";", - ), - 132..133, - ), - ( - Text( - "for", - ), - 134..137, - ), - ( - Text( - "(", - ), - 138..139, - ), - ( - Text( - "i", - ), - 139..140, - ), - ( - Text( - "=", - ), - 140..141, - ), - ( - Text( - "1", - ), - 141..142, - ), - ( - Text( - ";", - ), - 142..143, - ), - ( - Text( - "i", - ), - 144..145, - ), - ( - Text( - "<=", - ), - 145..147, - ), - ( - Text( - "NF", - ), - 147..149, - ), - ( - Text( - ";", - ), - 149..150, - ), - ( - Text( - "i", - ), - 151..152, - ), - ( - Text( - "+", - ), - 152..153, - ), - ( - Text( - "+", - ), - 153..154, - ), - ( - Text( - ")", + "s=0; for (i=1; i<=NF; i++) s+=", ), - 154..155, + 129..159, ), ( Text( - "s", - ), - 156..157, - ), - ( - Text( - "+=", - ), - 157..159, - ), - ( - Escape( - "$", + "\\$", ), 159..161, ), ( Text( - "i", - ), - 161..162, - ), - ( - Text( - ";", - ), - 162..163, - ), - ( - Text( - "print", - ), - 164..169, - ), - ( - Text( - "s", - ), - 170..171, - ), - ( - Text( - "}", - ), - 171..172, - ), - ( - Text( - "'", + "i; print s}' ", ), - 172..173, + 161..174, ), ( Text( @@ -460,21 +292,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 342..346, - ), - ( - Text( - "\"", - ), - 347..348, - ), - ( - Text( - "(", + "echo \"(", ), - 348..349, + 341..349, ), ( Expression( @@ -492,63 +312,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "+", - ), - 357..358, - ), - ( - Text( - "0", - ), - 358..359, - ), - ( - Text( - ".", - ), - 359..360, - ), - ( - Text( - "5", - ), - 360..361, - ), - ( - Text( - ")", - ), - 361..362, - ), - ( - Text( - "/", - ), - 362..363, - ), - ( - Text( - "1", - ), - 363..364, - ), - ( - Text( - "\"", - ), - 364..365, - ), - ( - Text( - "|", - ), - 366..367, - ), - ( - Text( - "bc", + "+0.5)/1\" | bc ", ), - 368..370, + 357..371, ), ( Text( @@ -614,21 +380,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 406..410, - ), - ( - Text( - "\"", - ), - 411..412, - ), - ( - Text( - "(", + "echo \"(", ), - 412..413, + 405..413, ), ( Expression( @@ -644,59 +398,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), 413..421, ), - ( - CommandOption( - "-0", - ), - 421..423, - ), - ( - Text( - ".", - ), - 423..424, - ), - ( - Text( - "5", - ), - 424..425, - ), - ( - Text( - ")", - ), - 425..426, - ), - ( - Text( - "/", - ), - 426..427, - ), - ( - Text( - "1", - ), - 427..428, - ), - ( - Text( - "\"", - ), - 428..429, - ), - ( - Text( - "|", - ), - 430..431, - ), ( Text( - "bc", + "-0.5)/1\" | bc ", ), - 432..434, + 421..435, ), ( Text( @@ -816,15 +522,9 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "echo", - ), - 589..593, - ), - ( - Text( - "\"", + "echo \"", ), - 594..595, + 588..595, ), ( Expression( @@ -842,195 +542,57 @@ expression: parse_unwrap(&tokenize(&stdlib)) ), ( Text( - "\"", + "\" | awk '", ), - 603..604, + 603..612, ), ( Text( - "|", - ), - 605..606, - ), - ( - Text( - "awk", - ), - 607..610, - ), - ( - Text( - "'", - ), - 611..612, - ), - ( - Escape( - "{", + "\\{", ), 612..614, ), ( Text( - "printf", - ), - 614..620, - ), - ( - Text( - "\"", - ), - 621..622, - ), - ( - Text( - "%", - ), - 622..623, - ), - ( - Text( - "d", - ), - 623..624, - ), - ( - Text( - "\"", + "printf \"%d\", (", ), - 624..625, + 614..628, ), ( Text( - ",", - ), - 625..626, - ), - ( - Text( - "(", - ), - 627..628, - ), - ( - Escape( - "$", + "\\$", ), 628..630, ), ( Text( - "1", - ), - 630..631, - ), - ( - Text( - "<", - ), - 632..633, - ), - ( - Text( - "0", - ), - 634..635, - ), - ( - Text( - "?", + "1 < 0 ? int(", ), - 636..637, + 630..642, ), ( Text( - "int", - ), - 638..641, - ), - ( - Text( - "(", - ), - 641..642, - ), - ( - Escape( - "$", + "\\$", ), 642..644, ), ( Text( - "1", - ), - 644..645, - ), - ( - Text( - ")", - ), - 645..646, - ), - ( - CommandOption( - "-1", - ), - 647..650, - ), - ( - Text( - ":", + "1) - 1 : int(", ), - 651..652, + 644..657, ), ( Text( - "int", - ), - 653..656, - ), - ( - Text( - "(", - ), - 656..657, - ), - ( - Escape( - "$", + "\\$", ), 657..659, ), ( Text( - "1", - ), - 659..660, - ), - ( - Text( - ")", - ), - 660..661, - ), - ( - Text( - ")", - ), - 661..662, - ), - ( - Text( - "}", - ), - 662..663, - ), - ( - Text( - "'", + "1))}' ", ), - 663..664, + 659..665, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_text-2.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_text-2.snap index 7767c6e..cad2ccc 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_text-2.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_text-2.snap @@ -88,18 +88,18 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "$", + "\\$", 143..145, ), ), 143..145, ), ( - Escape( + Text( ( - "{", + "\\{", 145..147, ), ), @@ -108,20 +108,11 @@ expression: parse_unwrap(&tokens) ( Text( ( - "source", - 147..153, - ), - ), - 147..153, - ), - ( - Text( - ( - "//", - 153..155, + "source//", + 147..155, ), ), - 153..155, + 147..155, ), ( Expression( @@ -266,18 +257,18 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "$", + "\\$", 331..333, ), ), 331..333, ), ( - Escape( + Text( ( - "{", + "\\{", 333..335, ), ), @@ -286,20 +277,11 @@ expression: parse_unwrap(&tokens) ( Text( ( - "source", - 335..341, - ), - ), - 335..341, - ), - ( - Text( - ( - "/", - 341..342, + "source/", + 335..342, ), ), - 341..342, + 335..342, ), ( Expression( @@ -564,9 +546,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "/", + "\\/", 636..638, ), ), @@ -627,9 +609,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "/", + "\\/", 682..684, ), ), @@ -715,189 +697,81 @@ expression: parse_unwrap(&tokens) ), ( Text( - "re", + "re='", ), - 918..920, + 917..922, ), ( Text( - "=", + "\\b", ), - 920..921, + 922..924, ), ( Text( - "'", - ), - 921..922, - ), - ( - Escape( - "bCopyright", - ), - 922..933, - ), - ( - Escape( - "b", + "Copyright", ), - 933..935, + 924..933, ), ( Text( - ".", + "\\b", ), - 935..936, + 933..935, ), ( Text( - "+", - ), - 936..937, - ), - ( - Escape( - "bFree", + ".+", ), - 937..943, + 935..937, ), ( Text( - "Software", + "\\b", ), - 944..952, + 937..939, ), ( Text( - "Foundation", - ), - 953..963, - ), - ( - Escape( - "b'", + "Free Software Foundation", ), - 963..966, + 939..963, ), ( Text( - ";", + "\\b", ), - 966..967, + 963..965, ), ( Text( - "[", + "'; [[ ", ), - 968..969, + 965..971, ), ( Text( - "[", - ), - 969..970, - ), - ( - Escape( - "$", + "\\$", ), 971..973, ), ( Text( - "(", - ), - 973..974, - ), - ( - Text( - "sed", - ), - 974..977, - ), - ( - CommandOption( - "--version", - ), - 978..987, - ), - ( - Text( - "2", - ), - 988..989, - ), - ( - Text( - ">", - ), - 989..990, - ), - ( - Text( - "/", - ), - 990..991, - ), - ( - Text( - "dev", + "(sed --version 2>/dev/null) =~ ", ), - 991..994, + 973..1004, ), ( Text( - "/", - ), - 994..995, - ), - ( - Text( - "null", - ), - 995..999, - ), - ( - Text( - ")", - ), - 999..1000, - ), - ( - Text( - "=", - ), - 1001..1002, - ), - ( - Text( - "~", - ), - 1002..1003, - ), - ( - Escape( - "$", + "\\$", ), 1004..1006, ), ( Text( - "re", - ), - 1006..1008, - ), - ( - Text( - "]", + "re ]] ", ), - 1009..1010, - ), - ( - Text( - "]", - ), - 1010..1011, + 1006..1012, ), ( Text( @@ -955,20 +829,11 @@ expression: parse_unwrap(&tokens) ( Text( ( - "-", - 1055..1056, - ), - ), - 1055..1056, - ), - ( - Text( - ( - "r", - 1056..1057, + "-r", + 1055..1057, ), ), - 1056..1057, + 1055..1057, ), ], ), @@ -984,20 +849,11 @@ expression: parse_unwrap(&tokens) ( Text( ( - "-", - 1065..1066, - ), - ), - 1065..1066, - ), - ( - Text( - ( - "E", - 1066..1067, + "-E", + 1065..1067, ), ), - 1066..1067, + 1065..1067, ), ], ), @@ -1031,15 +887,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", + "echo \"", ), - 1090..1094, - ), - ( - Text( - "\"", - ), - 1095..1096, + 1089..1096, ), ( Expression( @@ -1057,27 +907,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 1104..1105, - ), - ( - Text( - "|", + "\" | sed \"", ), - 1106..1107, - ), - ( - Text( - "sed", - ), - 1108..1111, - ), - ( - Text( - "\"", - ), - 1112..1113, + 1104..1113, ), ( Expression( @@ -1095,33 +927,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 1119..1120, - ), - ( - CommandOption( - "-e", - ), - 1121..1123, - ), - ( - Text( - "\"", - ), - 1124..1125, - ), - ( - Text( - "s", - ), - 1125..1126, - ), - ( - Text( - "/", + "\" -e \"s/", ), - 1126..1127, + 1119..1127, ), ( Expression( @@ -1159,21 +967,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 1145..1146, - ), - ( - Text( - "g", - ), - 1146..1147, - ), - ( - Text( - "\"", + "/g\" ", ), - 1147..1148, + 1145..1149, ), ( Text( @@ -1228,15 +1024,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 1189..1193, - ), - ( - Text( - "\"", + "echo \"", ), - 1194..1195, + 1188..1195, ), ( Expression( @@ -1254,45 +1044,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 1203..1204, - ), - ( - Text( - "|", - ), - 1205..1206, - ), - ( - Text( - "sed", - ), - 1207..1210, - ), - ( - CommandOption( - "-e", - ), - 1211..1213, - ), - ( - Text( - "\"", - ), - 1214..1215, - ), - ( - Text( - "s", + "\" | sed -e \"s/", ), - 1215..1216, - ), - ( - Text( - "/", - ), - 1216..1217, + 1203..1217, ), ( Expression( @@ -1330,21 +1084,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 1235..1236, - ), - ( - Text( - "g", - ), - 1236..1237, - ), - ( - Text( - "\"", + "/g\" ", ), - 1237..1238, + 1235..1239, ), ( Text( @@ -1498,21 +1240,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "IFS", - ), - 1438..1441, - ), - ( - Text( - "=", - ), - 1441..1442, - ), - ( - Text( - "\"", + "IFS=\"", ), - 1442..1443, + 1437..1443, ), ( Expression( @@ -1530,33 +1260,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 1454..1455, - ), - ( - Text( - "read", - ), - 1456..1460, - ), - ( - CommandOption( - "-rd", - ), - 1461..1464, - ), - ( - Text( - "''", - ), - 1465..1467, - ), - ( - CommandOption( - "-a", + "\" read -rd '' -a ", ), - 1468..1470, + 1454..1471, ), ( Expression( @@ -1583,49 +1289,13 @@ expression: parse_unwrap(&tokens) ), ( Text( - "<", - ), - 1487..1488, - ), - ( - Text( - "<", - ), - 1489..1490, - ), - ( - Text( - "(", - ), - 1490..1491, - ), - ( - Text( - "printf", - ), - 1491..1497, - ), - ( - Text( - "%", - ), - 1498..1499, - ), - ( - Text( - "s", + " < <(printf %s \"", ), - 1499..1500, + 1486..1502, ), ( Text( - "\"", - ), - 1501..1502, - ), - ( - Escape( - "$", + "\\$", ), 1502..1504, ), @@ -1654,15 +1324,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 1517..1518, - ), - ( - Text( - ")", + "\") ", ), - 1518..1519, + 1517..1520, ), ( Text( @@ -1787,9 +1451,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "n", + "\\n", 1686..1688, ), ), @@ -1895,7 +1559,17 @@ expression: parse_unwrap(&tokens) ), ( Text( - [], + [ + ( + Text( + ( + " ", + 1834..1835, + ), + ), + 1834..1835, + ), + ], ), 1833..1836, ), @@ -2010,21 +1684,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "IFS", - ), - 1959..1962, - ), - ( - Text( - "=", - ), - 1962..1963, - ), - ( - Text( - "\"", + "IFS=\"", ), - 1963..1964, + 1958..1964, ), ( Expression( @@ -2042,39 +1704,21 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 1975..1976, - ), - ( - Text( - ";", + "\" ; echo \"", ), - 1977..1978, + 1975..1985, ), ( Text( - "echo", + "\\$", ), - 1979..1983, + 1985..1987, ), ( Text( - "\"", + "\\{", ), - 1984..1985, - ), - ( - Escape( - "$", - ), - 1985..1987, - ), - ( - Escape( - "{", - ), - 1987..1989, + 1987..1989, ), ( Expression( @@ -2101,33 +1745,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "[", - ), - 2002..2003, - ), - ( - Text( - "*", - ), - 2003..2004, - ), - ( - Text( - "]", - ), - 2004..2005, - ), - ( - Text( - "}", - ), - 2005..2006, - ), - ( - Text( - "\"", + "[*]}\" ", ), - 2006..2007, + 2002..2008, ), ( Text( @@ -2229,15 +1849,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 2123..2127, - ), - ( - Text( - "\"", + "echo \"", ), - 2128..2129, + 2122..2129, ), ( Expression( @@ -2255,105 +1869,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", + "\" | sed -e 's/^[[:space:]]*//' ", ), - 2135..2136, - ), - ( - Text( - "|", - ), - 2137..2138, - ), - ( - Text( - "sed", - ), - 2139..2142, - ), - ( - CommandOption( - "-e", - ), - 2143..2145, - ), - ( - Text( - "'s", - ), - 2146..2148, - ), - ( - Text( - "/", - ), - 2148..2149, - ), - ( - Text( - "^", - ), - 2149..2150, - ), - ( - Text( - "[", - ), - 2150..2151, - ), - ( - Text( - "[", - ), - 2151..2152, - ), - ( - Text( - ":", - ), - 2152..2153, - ), - ( - Text( - "space", - ), - 2153..2158, - ), - ( - Text( - ":", - ), - 2158..2159, - ), - ( - Text( - "]", - ), - 2159..2160, - ), - ( - Text( - "]", - ), - 2160..2161, - ), - ( - Text( - "*", - ), - 2161..2162, - ), - ( - Text( - "//", - ), - 2162..2164, - ), - ( - Text( - "'", - ), - 2164..2165, + 2135..2166, ), ( Text( @@ -2455,15 +1973,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 2282..2286, - ), - ( - Text( - "\"", + "echo \"", ), - 2287..2288, + 2281..2288, ), ( Expression( @@ -2481,105 +1993,21 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 2294..2295, - ), - ( - Text( - "|", - ), - 2296..2297, - ), - ( - Text( - "sed", - ), - 2298..2301, - ), - ( - CommandOption( - "-e", - ), - 2302..2304, - ), - ( - Text( - "'s", - ), - 2305..2307, - ), - ( - Text( - "/", - ), - 2307..2308, - ), - ( - Text( - "[", - ), - 2308..2309, - ), - ( - Text( - "[", - ), - 2309..2310, - ), - ( - Text( - ":", - ), - 2310..2311, - ), - ( - Text( - "space", - ), - 2311..2316, - ), - ( - Text( - ":", - ), - 2316..2317, - ), - ( - Text( - "]", - ), - 2317..2318, - ), - ( - Text( - "]", + "\" | sed -e 's/[[:space:]]*", ), - 2318..2319, + 2294..2320, ), ( Text( - "*", - ), - 2319..2320, - ), - ( - Escape( - "$", + "\\$", ), 2320..2322, ), ( Text( - "//", + "//' ", ), - 2322..2324, - ), - ( - Text( - "'", - ), - 2324..2325, + 2322..2326, ), ( Text( @@ -2788,15 +2216,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", + "echo \"", ), - 2552..2556, - ), - ( - Text( - "\"", - ), - 2557..2558, + 2551..2558, ), ( Expression( @@ -2814,105 +2236,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 2564..2565, - ), - ( - Text( - "|", - ), - 2566..2567, - ), - ( - Text( - "tr", - ), - 2568..2570, - ), - ( - Text( - "'", - ), - 2571..2572, - ), - ( - Text( - "[", - ), - 2572..2573, - ), - ( - Text( - ":", - ), - 2573..2574, - ), - ( - Text( - "upper", - ), - 2574..2579, - ), - ( - Text( - ":", - ), - 2579..2580, - ), - ( - Text( - "]", - ), - 2580..2581, - ), - ( - Text( - "'", - ), - 2581..2582, - ), - ( - Text( - "'", - ), - 2583..2584, - ), - ( - Text( - "[", - ), - 2584..2585, - ), - ( - Text( - ":", - ), - 2585..2586, - ), - ( - Text( - "lower", - ), - 2586..2591, - ), - ( - Text( - ":", - ), - 2591..2592, - ), - ( - Text( - "]", + "\" | tr '[:upper:]' '[:lower:]' ", ), - 2592..2593, - ), - ( - Text( - "'", - ), - 2593..2594, + 2564..2595, ), ( Text( @@ -3014,15 +2340,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", + "echo \"", ), - 2704..2708, - ), - ( - Text( - "\"", - ), - 2709..2710, + 2703..2710, ), ( Expression( @@ -3040,105 +2360,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 2716..2717, - ), - ( - Text( - "|", + "\" | tr '[:lower:]' '[:upper:]' ", ), - 2718..2719, - ), - ( - Text( - "tr", - ), - 2720..2722, - ), - ( - Text( - "'", - ), - 2723..2724, - ), - ( - Text( - "[", - ), - 2724..2725, - ), - ( - Text( - ":", - ), - 2725..2726, - ), - ( - Text( - "lower", - ), - 2726..2731, - ), - ( - Text( - ":", - ), - 2731..2732, - ), - ( - Text( - "]", - ), - 2732..2733, - ), - ( - Text( - "'", - ), - 2733..2734, - ), - ( - Text( - "'", - ), - 2735..2736, - ), - ( - Text( - "[", - ), - 2736..2737, - ), - ( - Text( - ":", - ), - 2737..2738, - ), - ( - Text( - "upper", - ), - 2738..2743, - ), - ( - Text( - ":", - ), - 2743..2744, - ), - ( - Text( - "]", - ), - 2744..2745, - ), - ( - Text( - "'", - ), - 2745..2746, + 2716..2747, ), ( Text( @@ -3235,21 +2459,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "[", - ), - 2924..2925, - ), - ( - CommandOption( - "-n", + "[ -n \"", ), - 2926..2928, - ), - ( - Text( - "\"", - ), - 2929..2930, + 2923..2930, ), ( Expression( @@ -3267,127 +2479,49 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 2936..2937, - ), - ( - Text( - "]", - ), - 2938..2939, - ), - ( - Text( - "&&", - ), - 2940..2942, - ), - ( - Text( - "[", - ), - 2943..2944, - ), - ( - Text( - "\"", - ), - 2945..2946, - ), - ( - Expression( - ( - Var( - ( - "text", - 2947..2951, - ), - ), - 2947..2951, - ), - ), - 2946..2952, - ), - ( - Text( - "\"", + "\" ] && [ \"", ), - 2952..2953, - ), - ( - CommandOption( - "-eq", - ), - 2954..2957, - ), - ( - Text( - "\"", - ), - 2958..2959, + 2936..2946, ), ( Expression( ( Var( ( - "text", - 2960..2964, - ), - ), - 2960..2964, - ), - ), - 2959..2965, - ), - ( - Text( - "\"", - ), - 2965..2966, - ), - ( - Text( - "]", - ), - 2967..2968, - ), - ( - Text( - "2", - ), - 2969..2970, - ), - ( - Text( - ">", - ), - 2970..2971, - ), - ( - Text( - "/", + "text", + 2947..2951, + ), + ), + 2947..2951, + ), ), - 2971..2972, + 2946..2952, ), ( Text( - "dev", + "\" -eq \"", ), - 2972..2975, + 2952..2959, ), ( - Text( - "/", + Expression( + ( + Var( + ( + "text", + 2960..2964, + ), + ), + 2960..2964, + ), ), - 2975..2976, + 2959..2965, ), ( Text( - "null", + "\" ] 2>/dev/null ", ), - 2976..2980, + 2965..2981, ), ( Text( @@ -3543,67 +2677,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "for", - ), - 3145..3148, - ), - ( - Text( - "(", - ), - 3149..3150, - ), - ( - Text( - "(", - ), - 3150..3151, - ), - ( - Text( - "i", - ), - 3151..3152, - ), - ( - Text( - "=", - ), - 3152..3153, - ), - ( - Text( - "0", - ), - 3153..3154, - ), - ( - Text( - ";", - ), - 3154..3155, - ), - ( - Text( - "i", + "for ((i=0; i<", ), - 3156..3157, + 3144..3158, ), ( Text( - "<", - ), - 3157..3158, - ), - ( - Escape( - "$", + "\\$", ), 3158..3160, ), ( - Escape( - "{", + Text( + "\\{", ), 3160..3162, ), @@ -3638,57 +2724,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 3176..3177, - ), - ( - Text( - ";", - ), - 3177..3178, - ), - ( - Text( - "i", - ), - 3179..3180, - ), - ( - Text( - "+", + "}; i++)); do\n ", ), - 3180..3181, - ), - ( - Text( - "+", - ), - 3181..3182, - ), - ( - Text( - ")", - ), - 3182..3183, - ), - ( - Text( - ")", - ), - 3183..3184, - ), - ( - Text( - ";", - ), - 3184..3185, - ), - ( - Text( - "do", - ), - 3186..3188, + 3176..3197, ), ( Expression( @@ -3715,31 +2753,19 @@ expression: parse_unwrap(&tokens) ), ( Text( - "+=", - ), - 3211..3213, - ), - ( - Text( - "(", + "+=( \"", ), - 3213..3214, + 3211..3216, ), ( Text( - "\"", - ), - 3215..3216, - ), - ( - Escape( - "$", + "\\$", ), 3216..3218, ), ( - Escape( - "{", + Text( + "\\{", ), 3218..3220, ), @@ -3772,59 +2798,17 @@ expression: parse_unwrap(&tokens) ), 3233..3234, ), - ( - Escape( - "$", - ), - 3234..3236, - ), - ( - Text( - "i", - ), - 3236..3237, - ), - ( - Text( - ":", - ), - 3237..3238, - ), - ( - Text( - "1", - ), - 3238..3239, - ), - ( - Text( - "}", - ), - 3239..3240, - ), - ( - Text( - "\"", - ), - 3240..3241, - ), - ( - Text( - ")", - ), - 3242..3243, - ), ( Text( - ";", + "\\$", ), - 3243..3244, + 3234..3236, ), ( Text( - "done", + "i:1}\" );\n done ", ), - 3249..3253, + 3236..3254, ), ( Text( @@ -3967,27 +2951,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "if", - ), - 3397..3399, - ), - ( - Text( - "[", + "if [[ \"", ), - 3400..3401, - ), - ( - Text( - "[", - ), - 3401..3402, - ), - ( - Text( - "\"", - ), - 3403..3404, + 3396..3404, ), ( Expression( @@ -4005,27 +2971,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 3410..3411, - ), - ( - Text( - "==", - ), - 3412..3414, - ), - ( - Text( - "*", + "\" == *\"", ), - 3415..3416, - ), - ( - Text( - "\"", - ), - 3416..3417, + 3410..3417, ), ( Expression( @@ -4043,57 +2991,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 3425..3426, - ), - ( - Text( - "*", - ), - 3426..3427, - ), - ( - Text( - "]", - ), - 3428..3429, - ), - ( - Text( - "]", + "\"* ]]; then\n echo 1\n fi ", ), - 3429..3430, - ), - ( - Text( - ";", - ), - 3430..3431, - ), - ( - Text( - "then", - ), - 3432..3436, - ), - ( - Text( - "echo", - ), - 3441..3445, - ), - ( - Text( - "1", - ), - 3446..3447, - ), - ( - Text( - "fi", - ), - 3450..3452, + 3425..3453, ), ( Text( @@ -4778,9 +3678,9 @@ expression: parse_unwrap(&tokens) Text( [ ( - Escape( + Text( ( - "/", + "\\/", 4159..4161, ), ), @@ -4863,216 +3763,108 @@ expression: parse_unwrap(&tokens) 4301..4370, ), ), - 4301..4370, - ), - ( - Comment( - ( - Comment( - "contains \"GNU sed\".", - ), - 4382..4405, - ), - ), - 4382..4405, - ), - ( - Expression( - ( - Command( - [], - [ - ( - Text( - "$", - ), - 4417..4418, - ), - ( - Text( - "re", - ), - 4419..4421, - ), - ( - Text( - "=", - ), - 4421..4422, - ), - ( - Text( - "'", - ), - 4422..4423, - ), - ( - Escape( - "bCopyright", - ), - 4423..4434, - ), - ( - Escape( - "b", - ), - 4434..4436, - ), - ( - Text( - ".", - ), - 4436..4437, - ), - ( - Text( - "+", - ), - 4437..4438, - ), - ( - Escape( - "bFree", - ), - 4438..4444, - ), - ( - Text( - "Software", - ), - 4445..4453, - ), - ( - Text( - "Foundation", - ), - 4454..4464, - ), - ( - Escape( - "b'", - ), - 4464..4467, - ), - ( - Text( - ";", - ), - 4467..4468, - ), - ( - Text( - "[", - ), - 4469..4470, - ), + 4301..4370, + ), + ( + Comment( + ( + Comment( + "contains \"GNU sed\".", + ), + 4382..4405, + ), + ), + 4382..4405, + ), + ( + Expression( + ( + Command( + [], + [ ( Text( - "[", - ), - 4470..4471, - ), - ( - Escape( "$", ), - 4472..4474, - ), - ( - Text( - "(", - ), - 4474..4475, + 4417..4418, ), ( Text( - "sed", + "re='", ), - 4475..4478, - ), - ( - CommandOption( - "--version", - ), - 4479..4488, + 4418..4423, ), ( Text( - "2", + "\\b", ), - 4489..4490, + 4423..4425, ), ( Text( - ">", + "Copyright", ), - 4490..4491, + 4425..4434, ), ( Text( - "/", + "\\b", ), - 4491..4492, + 4434..4436, ), ( Text( - "dev", + ".+", ), - 4492..4495, + 4436..4438, ), ( Text( - "/", + "\\b", ), - 4495..4496, + 4438..4440, ), ( Text( - "null", + "Free Software Foundation", ), - 4496..4500, + 4440..4464, ), ( Text( - ")", + "\\b", ), - 4500..4501, + 4464..4466, ), ( Text( - "=", + "'; [[ ", ), - 4502..4503, + 4466..4472, ), ( Text( - "~", + "\\$", ), - 4503..4504, - ), - ( - Escape( - "$", - ), - 4505..4507, + 4472..4474, ), ( Text( - "re", + "(sed --version 2>/dev/null) =~ ", ), - 4507..4509, + 4474..4505, ), ( Text( - "]", + "\\$", ), - 4510..4511, + 4505..4507, ), ( Text( - "]", + "re ]] ", ), - 4511..4512, + 4507..4513, ), ( Text( @@ -5130,20 +3922,11 @@ expression: parse_unwrap(&tokens) ( Text( ( - "-", - 4556..4557, - ), - ), - 4556..4557, - ), - ( - Text( - ( - "r", - 4557..4558, + "-r", + 4556..4558, ), ), - 4557..4558, + 4556..4558, ), ], ), @@ -5159,20 +3942,11 @@ expression: parse_unwrap(&tokens) ( Text( ( - "-", - 4566..4567, - ), - ), - 4566..4567, - ), - ( - Text( - ( - "E", - 4567..4568, + "-E", + 4566..4568, ), ), - 4567..4568, + 4566..4568, ), ], ), @@ -5205,15 +3979,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 4593..4597, - ), - ( - Text( - "\"", + "echo \"", ), - 4598..4599, + 4592..4599, ), ( Expression( @@ -5231,27 +3999,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 4607..4608, - ), - ( - Text( - "|", - ), - 4609..4610, - ), - ( - Text( - "sed", - ), - 4611..4614, - ), - ( - Text( - "\"", + "\" | sed \"", ), - 4615..4616, + 4607..4616, ), ( Expression( @@ -5269,27 +4019,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 4622..4623, - ), - ( - CommandOption( - "-ne", - ), - 4624..4627, - ), - ( - Text( - "\"", - ), - 4628..4629, - ), - ( - Text( - "/", + "\" -ne \"/", ), - 4629..4630, + 4622..4630, ), ( Expression( @@ -5307,21 +4039,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 4638..4639, - ), - ( - Text( - "p", - ), - 4639..4640, - ), - ( - Text( - "\"", + "/p\" ", ), - 4640..4641, + 4638..4642, ), ( Text( @@ -5374,15 +4094,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 4684..4688, - ), - ( - Text( - "\"", + "echo \"", ), - 4689..4690, + 4683..4690, ), ( Expression( @@ -5400,39 +4114,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 4698..4699, - ), - ( - Text( - "|", - ), - 4700..4701, - ), - ( - Text( - "sed", - ), - 4702..4705, - ), - ( - CommandOption( - "-ne", - ), - 4706..4709, - ), - ( - Text( - "\"", - ), - 4710..4711, - ), - ( - Text( - "/", + "\" | sed -ne \"/", ), - 4711..4712, + 4698..4712, ), ( Expression( @@ -5450,21 +4134,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "/", - ), - 4720..4721, - ), - ( - Text( - "p", - ), - 4721..4722, - ), - ( - Text( - "\"", + "/p\" ", ), - 4722..4723, + 4720..4724, ), ( Text( @@ -5888,15 +4560,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 5168..5172, - ), - ( - Text( - "\"", + "echo \"", ), - 5173..5174, + 5167..5174, ), ( Expression( @@ -5914,21 +4580,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 5180..5181, - ), - ( - Text( - "|", - ), - 5182..5183, - ), - ( - Text( - "rev", + "\" | rev ", ), - 5184..5187, + 5180..5188, ), ( Text( @@ -6052,27 +4706,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "if", - ), - 5310..5312, - ), - ( - Text( - "[", - ), - 5313..5314, - ), - ( - Text( - "[", - ), - 5314..5315, - ), - ( - Text( - "\"", + "if [[ \"", ), - 5316..5317, + 5309..5317, ), ( Expression( @@ -6090,21 +4726,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 5323..5324, - ), - ( - Text( - "==", - ), - 5325..5327, - ), - ( - Text( - "\"", + "\" == \"", ), - 5328..5329, + 5323..5329, ), ( Expression( @@ -6122,57 +4746,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 5337..5338, - ), - ( - Text( - "*", - ), - 5338..5339, - ), - ( - Text( - "]", - ), - 5340..5341, - ), - ( - Text( - "]", - ), - 5341..5342, - ), - ( - Text( - ";", - ), - 5342..5343, - ), - ( - Text( - "then", - ), - 5344..5348, - ), - ( - Text( - "echo", - ), - 5353..5357, - ), - ( - Text( - "1", - ), - 5358..5359, - ), - ( - Text( - "fi", + "\"* ]]; then\n echo 1\n fi ", ), - 5362..5364, + 5337..5365, ), ( Text( @@ -6339,27 +4915,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "if", - ), - 5507..5509, - ), - ( - Text( - "[", - ), - 5510..5511, - ), - ( - Text( - "[", - ), - 5511..5512, - ), - ( - Text( - "\"", + "if [[ \"", ), - 5513..5514, + 5506..5514, ), ( Expression( @@ -6377,27 +4935,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 5520..5521, - ), - ( - Text( - "==", - ), - 5522..5524, - ), - ( - Text( - "*", - ), - 5525..5526, - ), - ( - Text( - "\"", + "\" == *\"", ), - 5526..5527, + 5520..5527, ), ( Expression( @@ -6415,51 +4955,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 5535..5536, - ), - ( - Text( - "]", - ), - 5537..5538, - ), - ( - Text( - "]", - ), - 5538..5539, - ), - ( - Text( - ";", - ), - 5539..5540, - ), - ( - Text( - "then", - ), - 5541..5545, - ), - ( - Text( - "echo", - ), - 5550..5554, - ), - ( - Text( - "1", - ), - 5555..5556, - ), - ( - Text( - "fi", + "\" ]]; then\n echo 1\n fi ", ), - 5559..5561, + 5535..5562, ), ( Text( @@ -6853,27 +5351,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "printf", - ), - 6121..6127, - ), - ( - Text( - "\"", - ), - 6128..6129, - ), - ( - Text( - "%", - ), - 6129..6130, - ), - ( - Text( - ".", + "printf \"%.", ), - 6130..6131, + 6120..6131, ), ( Expression( @@ -6887,49 +5367,31 @@ expression: parse_unwrap(&tokens) 6132..6138, ), ), - 6131..6139, - ), - ( - Text( - "s", - ), - 6139..6140, - ), - ( - Text( - "\"", - ), - 6140..6141, + 6131..6139, ), ( Text( - "\"", + "s\" \"", ), - 6142..6143, + 6139..6143, ), ( - Escape( - "$", + Text( + "\\$", ), 6143..6145, ), - ( - Escape( - "{", - ), - 6145..6147, - ), ( Text( - "text", + "\\{", ), - 6147..6151, + 6145..6147, ), ( Text( - ":", + "text:", ), - 6151..6152, + 6147..6152, ), ( Expression( @@ -6947,15 +5409,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 6159..6160, - ), - ( - Text( - "\"", + "}\" ", ), - 6160..6161, + 6159..6162, ), ( Text( @@ -7106,69 +5562,27 @@ expression: parse_unwrap(&tokens) ), ( Text( - "printf", - ), - 6424..6430, - ), - ( - Text( - "\"", - ), - 6431..6432, - ), - ( - Text( - "%", - ), - 6432..6433, - ), - ( - Text( - ".", - ), - 6433..6434, - ), - ( - Text( - "1s", - ), - 6434..6436, - ), - ( - Text( - "\"", + "printf \"%.1s\" \"", ), - 6436..6437, + 6423..6439, ), ( Text( - "\"", - ), - 6438..6439, - ), - ( - Escape( - "$", + "\\$", ), 6439..6441, ), - ( - Escape( - "{", - ), - 6441..6443, - ), ( Text( - "text", + "\\{", ), - 6443..6447, + 6441..6443, ), ( Text( - ":", + "text:", ), - 6447..6448, + 6443..6448, ), ( Expression( @@ -7186,15 +5600,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "}", - ), - 6455..6456, - ), - ( - Text( - "\"", + "}\" ", ), - 6456..6457, + 6455..6458, ), ( Text( @@ -7392,63 +5800,45 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", + "echo ", ), - 6682..6686, + 6681..6687, ), ( - Escape( - "\"", + Text( + "\\\"", ), 6687..6689, ), - ( - Escape( - "$", - ), - 6689..6691, - ), - ( - Escape( - "{", - ), - 6691..6693, - ), ( Text( - "BASH_VERSINFO", + "\\$", ), - 6693..6706, + 6689..6691, ), ( Text( - "[", + "\\{", ), - 6706..6707, + 6691..6693, ), ( Text( - "0", + "BASH_VERSINFO[0]}", ), - 6707..6708, + 6693..6710, ), ( Text( - "]", + "\\\"", ), - 6708..6709, + 6710..6712, ), ( Text( - "}", + " ", ), - 6709..6710, - ), - ( - Escape( - "\"", - ), - 6710..6712, + 6712..6713, ), ( Text( @@ -7529,45 +5919,45 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", + "echo ", ), - 6774..6778, + 6773..6779, ), ( - Escape( - "\"", + Text( + "\\\"", ), 6779..6781, ), ( - Escape( - "$", + Text( + "\\$", ), 6781..6783, ), ( - Escape( - "{", + Text( + "\\{", ), 6783..6785, ), ( Text( - "text^", + "text^}", ), - 6785..6790, + 6785..6791, ), ( Text( - "}", + "\\\"", ), - 6790..6791, + 6791..6793, ), ( - Escape( - "\"", + Text( + " ", ), - 6791..6793, + 6793..6794, ), ( Text( @@ -7617,189 +6007,81 @@ expression: parse_unwrap(&tokens) ), ( Text( - "re", + "re='", ), - 6847..6849, + 6846..6851, ), ( Text( - "=", + "\\b", ), - 6849..6850, + 6851..6853, ), ( Text( - "'", - ), - 6850..6851, - ), - ( - Escape( - "bCopyright", - ), - 6851..6862, - ), - ( - Escape( - "b", + "Copyright", ), - 6862..6864, + 6853..6862, ), ( Text( - ".", + "\\b", ), - 6864..6865, + 6862..6864, ), ( Text( - "+", - ), - 6865..6866, - ), - ( - Escape( - "bFree", + ".+", ), - 6866..6872, + 6864..6866, ), ( Text( - "Software", + "\\b", ), - 6873..6881, + 6866..6868, ), ( Text( - "Foundation", - ), - 6882..6892, - ), - ( - Escape( - "b'", + "Free Software Foundation", ), - 6892..6895, + 6868..6892, ), ( Text( - ";", + "\\b", ), - 6895..6896, + 6892..6894, ), ( Text( - "[", + "'; [[ ", ), - 6897..6898, + 6894..6900, ), ( Text( - "[", - ), - 6898..6899, - ), - ( - Escape( - "$", + "\\$", ), 6900..6902, ), ( Text( - "(", - ), - 6902..6903, - ), - ( - Text( - "sed", - ), - 6903..6906, - ), - ( - CommandOption( - "--version", - ), - 6907..6916, - ), - ( - Text( - "2", - ), - 6917..6918, - ), - ( - Text( - ">", - ), - 6918..6919, - ), - ( - Text( - "/", - ), - 6919..6920, - ), - ( - Text( - "dev", - ), - 6920..6923, - ), - ( - Text( - "/", - ), - 6923..6924, - ), - ( - Text( - "null", - ), - 6924..6928, - ), - ( - Text( - ")", - ), - 6928..6929, - ), - ( - Text( - "=", + "(sed --version 2>/dev/null) =~ ", ), - 6930..6931, + 6902..6933, ), ( Text( - "~", - ), - 6931..6932, - ), - ( - Escape( - "$", + "\\$", ), 6933..6935, ), ( Text( - "re", - ), - 6935..6937, - ), - ( - Text( - "]", + "re ]] ", ), - 6938..6939, - ), - ( - Text( - "]", - ), - 6939..6940, + 6935..6941, ), ( Text( @@ -7864,15 +6146,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "echo", - ), - 6989..6993, - ), - ( - Text( - "\"", + "echo \"", ), - 6994..6995, + 6988..6995, ), ( Expression( @@ -7890,49 +6166,13 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", - ), - 7001..7002, - ), - ( - Text( - "|", - ), - 7003..7004, - ), - ( - Text( - "sed", - ), - 7005..7008, - ), - ( - Text( - "\"", - ), - 7009..7010, - ), - ( - Text( - "s", + "\" | sed \"s/^", ), - 7010..7011, + 7001..7013, ), ( Text( - "/", - ), - 7011..7012, - ), - ( - Text( - "^", - ), - 7012..7013, - ), - ( - Escape( - "(", + "\\(", ), 7013..7015, ), @@ -7943,8 +6183,8 @@ expression: parse_unwrap(&tokens) 7015..7016, ), ( - Escape( - ")", + Text( + "\\)", ), 7016..7018, ), @@ -7955,28 +6195,22 @@ expression: parse_unwrap(&tokens) 7018..7019, ), ( - Escape( - "U", + Text( + "\\U", ), 7019..7021, ), - ( - Escape( - "1", - ), - 7021..7023, - ), ( Text( - "/", + "\\1", ), - 7023..7024, + 7021..7023, ), ( Text( - "\"", + "/\" ", ), - 7024..7025, + 7023..7026, ), ( Text( @@ -8360,21 +6594,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "printf", + "printf \"%", ), - 7395..7401, - ), - ( - Text( - "\"", - ), - 7402..7403, - ), - ( - Text( - "%", - ), - 7403..7404, + 7394..7404, ), ( Expression( @@ -8392,57 +6614,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "s", - ), - 7412..7413, - ), - ( - Text( - "\"", - ), - 7413..7414, - ), - ( - Text( - "\"", + "s\" \"\" | tr \" \" \"", ), - 7415..7416, - ), - ( - Text( - "\"", - ), - 7416..7417, - ), - ( - Text( - "|", - ), - 7418..7419, - ), - ( - Text( - "tr", - ), - 7420..7422, - ), - ( - Text( - "\"", - ), - 7423..7424, - ), - ( - Text( - "\"", - ), - 7425..7426, - ), - ( - Text( - "\"", - ), - 7427..7428, + 7412..7428, ), ( Expression( @@ -8460,9 +6634,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", + "\" ", ), - 7433..7434, + 7433..7435, ), ( Text( @@ -8747,21 +6921,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "printf", - ), - 7712..7718, - ), - ( - Text( - "\"", - ), - 7719..7720, - ), - ( - Text( - "%", + "printf \"%", ), - 7720..7721, + 7711..7721, ), ( Expression( @@ -8779,57 +6941,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "s", - ), - 7729..7730, - ), - ( - Text( - "\"", - ), - 7730..7731, - ), - ( - Text( - "\"", - ), - 7732..7733, - ), - ( - Text( - "\"", - ), - 7733..7734, - ), - ( - Text( - "|", - ), - 7735..7736, - ), - ( - Text( - "tr", - ), - 7737..7739, - ), - ( - Text( - "\"", - ), - 7740..7741, - ), - ( - Text( - "\"", - ), - 7742..7743, - ), - ( - Text( - "\"", + "s\" \"\" | tr \" \" \"", ), - 7744..7745, + 7729..7745, ), ( Expression( @@ -8847,9 +6961,9 @@ expression: parse_unwrap(&tokens) ), ( Text( - "\"", + "\" ", ), - 7750..7751, + 7750..7752, ), ( Text( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_text.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_text.snap index cf550a8..ee09ff2 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_text.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__stdlib_text.snap @@ -89,39 +89,21 @@ expression: tokens ), ( Token( - "\\", + "\\$", ), - 143..144, + 143..145, ), ( Token( - "$", - ), - 144..145, - ), - ( - Token( - "\\", - ), - 145..146, - ), - ( - Token( - "{", - ), - 146..147, - ), - ( - Token( - "source", + "\\{", ), - 147..153, + 145..147, ), ( Token( - "//", + "source//", ), - 153..155, + 147..155, ), ( Token( @@ -269,39 +251,21 @@ expression: tokens ), ( Token( - "\\", - ), - 331..332, - ), - ( - Token( - "$", - ), - 332..333, - ), - ( - Token( - "\\", + "\\$", ), - 333..334, + 331..333, ), ( Token( - "{", - ), - 334..335, - ), - ( - Token( - "source", + "\\{", ), - 335..341, + 333..335, ), ( Token( - "/", + "source/", ), - 341..342, + 335..342, ), ( Token( @@ -611,15 +575,9 @@ expression: tokens ), ( Token( - "\\", - ), - 636..637, - ), - ( - Token( - "/", + "\\/", ), - 637..638, + 636..638, ), ( Token( @@ -701,15 +659,9 @@ expression: tokens ), ( Token( - "\\", - ), - 682..683, - ), - ( - Token( - "/", + "\\/", ), - 683..684, + 682..684, ), ( Token( @@ -767,7713 +719,5667 @@ expression: tokens ), ( Token( - "re", + "re='", ), - 918..920, + 917..922, ), ( Token( - "=", + "\\b", ), - 920..921, + 922..924, ), ( Token( - "'", + "Copyright", ), - 921..922, + 924..933, ), ( Token( - "\\", + "\\b", ), - 922..923, + 933..935, ), ( Token( - "bCopyright", + ".+", ), - 923..933, + 935..937, ), ( Token( - "\\", + "\\b", ), - 933..934, + 937..939, ), ( Token( - "b", + "Free Software Foundation", ), - 934..935, + 939..963, ), ( Token( - ".", + "\\b", ), - 935..936, + 963..965, ), ( Token( - "+", + "'; [[ ", ), - 936..937, + 965..971, ), ( Token( - "\\", + "\\$", ), - 937..938, + 971..973, ), ( Token( - "bFree", + "(sed --version 2>/dev/null) =~ ", ), - 938..943, + 973..1004, ), ( Token( - "Software", + "\\$", ), - 944..952, + 1004..1006, ), ( Token( - "Foundation", + "re ]] ", ), - 953..963, + 1006..1012, ), ( Token( - "\\", + "$", ), - 963..964, + 1012..1013, ), ( Token( - "b'", + "let", ), - 964..966, + 1026..1029, ), ( Token( - ";", + "flag", ), - 966..967, + 1030..1034, ), ( Token( - "[", + "=", ), - 968..969, + 1035..1036, ), ( Token( - "[", + "status", ), - 969..970, + 1037..1043, ), ( Token( - "\\", + "==", ), - 971..972, + 1044..1046, ), ( Token( - "$", + "0", ), - 972..973, + 1047..1048, ), ( Token( - "(", + "then", ), - 973..974, + 1049..1053, ), ( Token( - "sed", + "\"", ), - 974..977, + 1054..1055, ), ( Token( - "-", + "-r", ), - 978..979, + 1055..1057, ), ( Token( - "-", + "\"", ), - 979..980, + 1057..1058, ), ( Token( - "version", + "else", ), - 980..987, + 1059..1063, ), ( Token( - "2", + "\"", ), - 988..989, + 1064..1065, ), ( Token( - ">", + "-E", ), - 989..990, + 1065..1067, ), ( Token( - "/", + "\"", ), - 990..991, + 1067..1068, ), ( Token( - "dev", + "return", ), - 991..994, + 1081..1087, ), ( Token( - "/", + "$", ), - 994..995, + 1088..1089, ), ( Token( - "null", + "echo \"", ), - 995..999, + 1089..1096, ), ( Token( - ")", + "{", ), - 999..1000, + 1096..1097, ), ( Token( - "=", + "source", ), - 1001..1002, + 1097..1103, ), ( Token( - "~", + "}", ), - 1002..1003, + 1103..1104, ), ( Token( - "\\", + "\" | sed \"", ), - 1004..1005, + 1104..1113, ), ( Token( - "$", + "{", ), - 1005..1006, + 1113..1114, ), ( Token( - "re", + "flag", ), - 1006..1008, + 1114..1118, ), ( Token( - "]", + "}", ), - 1009..1010, + 1118..1119, ), ( Token( - "]", + "\" -e \"s/", ), - 1010..1011, + 1119..1127, ), ( Token( - "$", + "{", ), - 1012..1013, + 1127..1128, ), ( Token( - "let", + "search", ), - 1026..1029, + 1128..1134, ), ( Token( - "flag", + "}", ), - 1030..1034, + 1134..1135, ), ( Token( - "=", + "/", ), - 1035..1036, + 1135..1136, ), ( Token( - "status", + "{", ), - 1037..1043, + 1136..1137, ), ( Token( - "==", + "replace", ), - 1044..1046, + 1137..1144, ), ( Token( - "0", + "}", ), - 1047..1048, + 1144..1145, ), ( Token( - "then", + "/g\" ", ), - 1049..1053, + 1145..1149, ), ( Token( - "\"", + "$", ), - 1054..1055, + 1149..1150, ), ( Token( - "-", + "}", ), - 1055..1056, + 1159..1160, ), ( Token( - "r", + "else", ), - 1056..1057, + 1161..1165, ), ( Token( - "\"", + "{", ), - 1057..1058, + 1166..1167, ), ( Token( - "else", + "return", ), - 1059..1063, + 1180..1186, ), ( Token( - "\"", + "$", ), - 1064..1065, + 1187..1188, ), ( Token( - "-", + "echo \"", ), - 1065..1066, + 1188..1195, ), ( Token( - "E", + "{", ), - 1066..1067, + 1195..1196, ), ( Token( - "\"", + "source", ), - 1067..1068, + 1196..1202, ), ( Token( - "return", + "}", ), - 1081..1087, + 1202..1203, ), ( Token( - "$", + "\" | sed -e \"s/", ), - 1088..1089, + 1203..1217, ), ( Token( - "echo", + "{", ), - 1090..1094, + 1217..1218, ), ( Token( - "\"", + "search", ), - 1095..1096, + 1218..1224, ), ( Token( - "{", + "}", ), - 1096..1097, + 1224..1225, ), ( Token( - "source", + "/", ), - 1097..1103, + 1225..1226, ), ( Token( - "}", + "{", ), - 1103..1104, + 1226..1227, ), ( Token( - "\"", + "replace", ), - 1104..1105, + 1227..1234, ), ( Token( - "|", + "}", ), - 1106..1107, + 1234..1235, ), ( Token( - "sed", + "/g\" ", ), - 1108..1111, + 1235..1239, ), ( Token( - "\"", + "$", ), - 1112..1113, + 1239..1240, ), ( Token( - "{", + "}", ), - 1113..1114, + 1249..1250, ), ( Token( - "flag", + "}", ), - 1114..1118, + 1255..1256, ), ( Token( "}", ), - 1118..1119, + 1257..1258, ), ( Token( - "\"", + "/// Splits the input `text` into an array of substrings using the specified `delimiter`.\n", ), - 1119..1120, + 1260..1349, ), ( Token( - "-", + "pub", ), - 1121..1122, + 1349..1352, ), ( Token( - "e", + "fun", ), - 1122..1123, + 1353..1356, ), ( Token( - "\"", + "split", ), - 1124..1125, + 1357..1362, ), ( Token( - "s", + "(", ), - 1125..1126, + 1362..1363, ), ( Token( - "/", + "text", ), - 1126..1127, + 1363..1367, ), ( Token( - "{", + ":", ), - 1127..1128, + 1367..1368, ), ( Token( - "search", + "Text", ), - 1128..1134, + 1369..1373, ), ( Token( - "}", + ",", ), - 1134..1135, + 1373..1374, ), ( Token( - "/", + "delimiter", ), - 1135..1136, + 1375..1384, ), ( Token( - "{", + ":", ), - 1136..1137, + 1384..1385, ), ( Token( - "replace", + "Text", ), - 1137..1144, + 1386..1390, ), ( Token( - "}", + ")", ), - 1144..1145, + 1390..1391, ), ( Token( - "/", + ":", ), - 1145..1146, + 1391..1392, ), ( Token( - "g", + "[", ), - 1146..1147, + 1393..1394, ), ( Token( - "\"", + "Text", ), - 1147..1148, + 1394..1398, ), ( Token( - "$", + "]", ), - 1149..1150, + 1398..1399, ), ( Token( - "}", + "{", ), - 1159..1160, - ), - ( - Token( - "else", - ), - 1161..1165, - ), - ( - Token( - "{", - ), - 1166..1167, - ), - ( - Token( - "return", - ), - 1180..1186, + 1400..1401, ), ( Token( - "$", + "let", ), - 1187..1188, + 1406..1409, ), ( Token( - "echo", + "result", ), - 1189..1193, + 1410..1416, ), ( Token( - "\"", + "=", ), - 1194..1195, + 1417..1418, ), ( Token( - "{", + "[", ), - 1195..1196, + 1419..1420, ), ( Token( - "source", + "Text", ), - 1196..1202, + 1420..1424, ), ( Token( - "}", + "]", ), - 1202..1203, + 1424..1425, ), ( Token( - "\"", + "trust", ), - 1203..1204, + 1430..1435, ), ( Token( - "|", + "$", ), - 1205..1206, + 1436..1437, ), ( Token( - "sed", + "IFS=\"", ), - 1207..1210, + 1437..1443, ), ( Token( - "-", + "{", ), - 1211..1212, + 1443..1444, ), ( Token( - "e", + "delimiter", ), - 1212..1213, + 1444..1453, ), ( Token( - "\"", + "}", ), - 1214..1215, + 1453..1454, ), ( Token( - "s", + "\" read -rd '' -a ", ), - 1215..1216, + 1454..1471, ), ( Token( - "/", + "{", ), - 1216..1217, + 1471..1472, ), ( Token( - "{", + "nameof", ), - 1217..1218, + 1472..1478, ), ( Token( - "search", + "result", ), - 1218..1224, + 1479..1485, ), ( Token( "}", ), - 1224..1225, + 1485..1486, ), ( Token( - "/", + " < <(printf %s \"", ), - 1225..1226, + 1486..1502, ), ( Token( - "{", + "\\$", ), - 1226..1227, + 1502..1504, ), ( Token( - "replace", + "{", ), - 1227..1234, + 1504..1505, ), ( Token( - "}", + "nameof", ), - 1234..1235, + 1505..1511, ), ( Token( - "/", + "text", ), - 1235..1236, + 1512..1516, ), ( Token( - "g", + "}", ), - 1236..1237, + 1516..1517, ), ( Token( - "\"", + "\") ", ), - 1237..1238, + 1517..1520, ), ( Token( "$", ), - 1239..1240, + 1520..1521, ), ( Token( - "}", + "return", ), - 1249..1250, + 1526..1532, ), ( Token( - "}", + "result", ), - 1255..1256, + 1533..1539, ), ( Token( "}", ), - 1257..1258, + 1540..1541, ), ( Token( - "/// Splits the input `text` into an array of substrings using the specified `delimiter`.\n", + "/// Splits a `text` into an array of substrings based on newline characters.\n", ), - 1260..1349, + 1543..1620, ), ( Token( "pub", ), - 1349..1352, + 1620..1623, ), ( Token( "fun", ), - 1353..1356, + 1624..1627, ), ( Token( - "split", + "split_lines", ), - 1357..1362, + 1628..1639, ), ( Token( "(", ), - 1362..1363, + 1639..1640, ), ( Token( "text", ), - 1363..1367, + 1640..1644, ), ( Token( ":", ), - 1367..1368, + 1644..1645, ), ( Token( "Text", ), - 1369..1373, + 1646..1650, ), ( Token( - ",", + ")", ), - 1373..1374, + 1650..1651, ), ( Token( - "delimiter", + ":", ), - 1375..1384, + 1651..1652, ), ( Token( - ":", + "[", ), - 1384..1385, + 1653..1654, ), ( Token( "Text", ), - 1386..1390, + 1654..1658, ), ( Token( - ")", + "]", ), - 1390..1391, + 1658..1659, ), ( Token( - ":", + "{", ), - 1391..1392, + 1660..1661, ), ( Token( - "[", + "return", ), - 1393..1394, + 1666..1672, ), ( Token( - "Text", + "split", ), - 1394..1398, + 1673..1678, ), ( Token( - "]", + "(", ), - 1398..1399, + 1678..1679, ), ( Token( - "{", + "text", ), - 1400..1401, + 1679..1683, ), ( Token( - "let", + ",", ), - 1406..1409, + 1683..1684, ), ( Token( - "result", + "\"", ), - 1410..1416, + 1685..1686, ), ( Token( - "=", + "\\n", ), - 1417..1418, + 1686..1688, ), ( Token( - "[", + "\"", ), - 1419..1420, + 1688..1689, ), ( Token( - "Text", + ")", ), - 1420..1424, + 1689..1690, ), ( Token( - "]", + "}", ), - 1424..1425, + 1691..1692, ), ( Token( - "trust", + "/// Splits a `text` into an array of substrings based on space character.\n", ), - 1430..1435, + 1694..1768, ), ( Token( - "$", + "pub", ), - 1436..1437, + 1768..1771, ), ( Token( - "IFS", + "fun", ), - 1438..1441, + 1772..1775, ), ( Token( - "=", + "split_words", ), - 1441..1442, + 1776..1787, ), ( Token( - "\"", + "(", ), - 1442..1443, + 1787..1788, ), ( Token( - "{", + "text", ), - 1443..1444, + 1788..1792, ), ( Token( - "delimiter", + ":", ), - 1444..1453, + 1792..1793, ), ( Token( - "}", + "Text", ), - 1453..1454, + 1794..1798, ), ( Token( - "\"", + ")", ), - 1454..1455, + 1798..1799, ), ( Token( - "read", + ":", ), - 1456..1460, + 1799..1800, ), ( Token( - "-", + "[", ), - 1461..1462, + 1801..1802, ), ( Token( - "rd", + "Text", ), - 1462..1464, + 1802..1806, ), ( Token( - "''", + "]", ), - 1465..1467, + 1806..1807, ), ( Token( - "-", + "{", ), - 1468..1469, + 1808..1809, ), ( Token( - "a", + "return", ), - 1469..1470, + 1814..1820, ), ( Token( - "{", + "split", ), - 1471..1472, + 1821..1826, ), ( Token( - "nameof", + "(", ), - 1472..1478, + 1826..1827, ), ( Token( - "result", + "text", ), - 1479..1485, + 1827..1831, ), ( Token( - "}", + ",", ), - 1485..1486, + 1831..1832, ), ( Token( - "<", + "\"", ), - 1487..1488, + 1833..1834, ), ( Token( - "<", + " ", ), - 1489..1490, + 1834..1835, ), ( Token( - "(", + "\"", ), - 1490..1491, + 1835..1836, ), ( Token( - "printf", + ")", ), - 1491..1497, + 1836..1837, ), ( Token( - "%", + "}", ), - 1498..1499, + 1838..1839, ), ( Token( - "s", + "/// Merges text using the delimeter specified.\n", ), - 1499..1500, + 1841..1888, ), ( Token( - "\"", + "pub", ), - 1501..1502, + 1888..1891, ), ( Token( - "\\", + "fun", ), - 1502..1503, + 1892..1895, ), ( Token( - "$", + "join", ), - 1503..1504, - ), - ( - Token( - "{", - ), - 1504..1505, - ), - ( - Token( - "nameof", - ), - 1505..1511, - ), - ( - Token( - "text", - ), - 1512..1516, - ), - ( - Token( - "}", - ), - 1516..1517, + 1896..1900, ), ( Token( - "\"", + "(", ), - 1517..1518, + 1900..1901, ), ( Token( - ")", + "list", ), - 1518..1519, + 1901..1905, ), ( Token( - "$", + ":", ), - 1520..1521, + 1905..1906, ), ( Token( - "return", + "[", ), - 1526..1532, + 1907..1908, ), ( Token( - "result", + "Text", ), - 1533..1539, + 1908..1912, ), ( Token( - "}", + "]", ), - 1540..1541, + 1912..1913, ), ( Token( - "/// Splits a `text` into an array of substrings based on newline characters.\n", + ",", ), - 1543..1620, + 1913..1914, ), ( Token( - "pub", + "delimiter", ), - 1620..1623, + 1915..1924, ), ( Token( - "fun", + ":", ), - 1624..1627, + 1924..1925, ), ( Token( - "split_lines", + "Text", ), - 1628..1639, + 1926..1930, ), ( Token( - "(", + ")", ), - 1639..1640, + 1930..1931, ), ( Token( - "text", + ":", ), - 1640..1644, + 1931..1932, ), ( Token( - ":", + "Text", ), - 1644..1645, + 1933..1937, ), ( Token( - "Text", + "{", ), - 1646..1650, + 1938..1939, ), ( Token( - ")", + "return", ), - 1650..1651, + 1944..1950, ), ( Token( - ":", + "trust", ), - 1651..1652, + 1951..1956, ), ( Token( - "[", + "$", ), - 1653..1654, + 1957..1958, ), ( Token( - "Text", + "IFS=\"", ), - 1654..1658, + 1958..1964, ), ( Token( - "]", + "{", ), - 1658..1659, + 1964..1965, ), ( Token( - "{", + "delimiter", ), - 1660..1661, + 1965..1974, ), ( Token( - "return", + "}", ), - 1666..1672, + 1974..1975, ), ( Token( - "split", + "\" ; echo \"", ), - 1673..1678, + 1975..1985, ), ( Token( - "(", + "\\$", ), - 1678..1679, + 1985..1987, ), ( Token( - "text", + "\\{", ), - 1679..1683, + 1987..1989, ), ( Token( - ",", + "{", ), - 1683..1684, + 1989..1990, ), ( Token( - "\"", + "nameof", ), - 1685..1686, + 1990..1996, ), ( Token( - "\\", + "list", ), - 1686..1687, + 1997..2001, ), ( Token( - "n", + "}", ), - 1687..1688, + 2001..2002, ), ( Token( - "\"", + "[*]}\" ", ), - 1688..1689, + 2002..2008, ), ( Token( - ")", + "$", ), - 1689..1690, + 2008..2009, ), ( Token( "}", ), - 1691..1692, + 2010..2011, ), ( Token( - "/// Splits a `text` into an array of substrings based on space character.\n", + "/// Trims the spaces at top of the text using `sed`.\n", ), - 1694..1768, + 2013..2066, ), ( Token( "pub", ), - 1768..1771, + 2066..2069, ), ( Token( "fun", ), - 1772..1775, + 2070..2073, ), ( Token( - "split_words", + "trim_left", ), - 1776..1787, + 2074..2083, ), ( Token( "(", ), - 1787..1788, + 2083..2084, ), ( Token( "text", ), - 1788..1792, + 2084..2088, ), ( Token( ":", ), - 1792..1793, + 2088..2089, ), ( Token( "Text", ), - 1794..1798, + 2090..2094, ), ( Token( ")", ), - 1798..1799, + 2094..2095, ), ( Token( ":", ), - 1799..1800, - ), - ( - Token( - "[", - ), - 1801..1802, + 2095..2096, ), ( Token( "Text", ), - 1802..1806, + 2097..2101, ), ( Token( - "]", + "{", ), - 1806..1807, + 2102..2103, ), ( Token( - "{", + "return", ), - 1808..1809, + 2108..2114, ), ( Token( - "return", + "trust", ), - 1814..1820, + 2115..2120, ), ( Token( - "split", + "$", ), - 1821..1826, + 2121..2122, ), ( Token( - "(", + "echo \"", ), - 1826..1827, + 2122..2129, ), ( Token( - "text", + "{", ), - 1827..1831, + 2129..2130, ), ( Token( - ",", + "text", ), - 1831..1832, + 2130..2134, ), ( Token( - "\"", + "}", ), - 1833..1834, + 2134..2135, ), ( Token( - "\"", + "\" | sed -e 's/^[[:space:]]*//' ", ), - 1835..1836, + 2135..2166, ), ( Token( - ")", + "$", ), - 1836..1837, + 2166..2167, ), ( Token( "}", ), - 1838..1839, + 2168..2169, ), ( Token( - "/// Merges text using the delimeter specified.\n", + "/// Trims the spaces at end of the text using `sed`.\n", ), - 1841..1888, + 2171..2224, ), ( Token( "pub", ), - 1888..1891, + 2224..2227, ), ( Token( "fun", ), - 1892..1895, + 2228..2231, ), ( Token( - "join", + "trim_right", ), - 1896..1900, + 2232..2242, ), ( Token( "(", ), - 1900..1901, + 2242..2243, ), ( Token( - "list", + "text", ), - 1901..1905, + 2243..2247, ), ( Token( ":", ), - 1905..1906, + 2247..2248, ), ( Token( - "[", + "Text", ), - 1907..1908, + 2249..2253, ), ( Token( - "Text", + ")", ), - 1908..1912, + 2253..2254, ), ( Token( - "]", + ":", ), - 1912..1913, + 2254..2255, ), ( Token( - ",", + "Text", ), - 1913..1914, + 2256..2260, ), ( Token( - "delimiter", + "{", ), - 1915..1924, + 2261..2262, ), ( Token( - ":", + "return", ), - 1924..1925, + 2267..2273, ), ( Token( - "Text", + "trust", ), - 1926..1930, + 2274..2279, ), ( Token( - ")", + "$", ), - 1930..1931, + 2280..2281, ), ( Token( - ":", + "echo \"", ), - 1931..1932, - ), - ( - Token( - "Text", - ), - 1933..1937, + 2281..2288, ), ( Token( "{", ), - 1938..1939, + 2288..2289, ), ( Token( - "return", + "text", ), - 1944..1950, + 2289..2293, ), ( Token( - "trust", + "}", ), - 1951..1956, + 2293..2294, ), ( Token( - "$", + "\" | sed -e 's/[[:space:]]*", ), - 1957..1958, + 2294..2320, ), ( Token( - "IFS", + "\\$", ), - 1959..1962, + 2320..2322, ), ( Token( - "=", + "//' ", ), - 1962..1963, + 2322..2326, ), ( Token( - "\"", + "$", ), - 1963..1964, + 2326..2327, ), ( Token( - "{", + "}", ), - 1964..1965, + 2328..2329, ), ( Token( - "delimiter", + "/// Trims the spaces from the text input.\n", ), - 1965..1974, + 2331..2373, ), ( Token( - "}", + "pub", ), - 1974..1975, + 2373..2376, ), ( Token( - "\"", + "fun", ), - 1975..1976, + 2377..2380, ), ( Token( - ";", + "trim", ), - 1977..1978, + 2381..2385, ), ( Token( - "echo", + "(", ), - 1979..1983, + 2385..2386, ), ( Token( - "\"", + "text", ), - 1984..1985, + 2386..2390, ), ( Token( - "\\", + ":", ), - 1985..1986, + 2390..2391, ), ( Token( - "$", + "Text", ), - 1986..1987, + 2392..2396, ), ( Token( - "\\", + ")", ), - 1987..1988, + 2396..2397, ), ( Token( - "{", + ":", ), - 1988..1989, + 2397..2398, ), ( Token( - "{", + "Text", ), - 1989..1990, + 2399..2403, ), ( Token( - "nameof", + "{", ), - 1990..1996, + 2404..2405, ), ( Token( - "list", + "return", ), - 1997..2001, + 2410..2416, ), ( Token( - "}", + "trim_left", ), - 2001..2002, + 2417..2426, ), ( Token( - "[", + "(", ), - 2002..2003, + 2426..2427, ), ( Token( - "*", + "trim_right", ), - 2003..2004, + 2427..2437, ), ( Token( - "]", + "(", ), - 2004..2005, + 2437..2438, ), ( Token( - "}", + "text", ), - 2005..2006, + 2438..2442, ), ( Token( - "\"", + ")", ), - 2006..2007, + 2442..2443, ), ( Token( - "$", + ")", ), - 2008..2009, + 2443..2444, ), ( Token( "}", ), - 2010..2011, + 2445..2446, ), ( Token( - "/// Trims the spaces at top of the text using `sed`.\n", + "/// Makes the text input lowercase using `tr`.\n", ), - 2013..2066, + 2448..2495, ), ( Token( "pub", ), - 2066..2069, + 2495..2498, ), ( Token( "fun", ), - 2070..2073, + 2499..2502, ), ( Token( - "trim_left", + "lowercase", ), - 2074..2083, + 2503..2512, ), ( Token( "(", ), - 2083..2084, + 2512..2513, ), ( Token( "text", ), - 2084..2088, + 2513..2517, ), ( Token( ":", ), - 2088..2089, + 2517..2518, ), ( Token( "Text", ), - 2090..2094, + 2519..2523, ), ( Token( ")", ), - 2094..2095, + 2523..2524, ), ( Token( ":", ), - 2095..2096, + 2524..2525, ), ( Token( "Text", ), - 2097..2101, + 2526..2530, ), ( Token( "{", ), - 2102..2103, + 2531..2532, ), ( Token( "return", ), - 2108..2114, + 2537..2543, ), ( Token( "trust", ), - 2115..2120, + 2544..2549, ), ( Token( "$", ), - 2121..2122, - ), - ( - Token( - "echo", - ), - 2123..2127, + 2550..2551, ), ( Token( - "\"", + "echo \"", ), - 2128..2129, + 2551..2558, ), ( Token( "{", ), - 2129..2130, + 2558..2559, ), ( Token( "text", ), - 2130..2134, + 2559..2563, ), ( Token( "}", ), - 2134..2135, + 2563..2564, ), ( Token( - "\"", + "\" | tr '[:upper:]' '[:lower:]' ", ), - 2135..2136, + 2564..2595, ), ( Token( - "|", + "$", ), - 2137..2138, + 2595..2596, ), ( Token( - "sed", + "}", ), - 2139..2142, + 2597..2598, ), ( Token( - "-", + "/// Makes the text input uppercase using `tr`.\n", ), - 2143..2144, + 2600..2647, ), ( Token( - "e", + "pub", ), - 2144..2145, + 2647..2650, ), ( Token( - "'s", + "fun", ), - 2146..2148, + 2651..2654, ), ( Token( - "/", + "uppercase", ), - 2148..2149, + 2655..2664, ), ( Token( - "^", + "(", ), - 2149..2150, + 2664..2665, ), ( Token( - "[", + "text", ), - 2150..2151, + 2665..2669, ), ( Token( - "[", + ":", ), - 2151..2152, + 2669..2670, ), ( Token( - ":", + "Text", ), - 2152..2153, + 2671..2675, ), ( Token( - "space", + ")", ), - 2153..2158, + 2675..2676, ), ( Token( ":", ), - 2158..2159, + 2676..2677, ), ( Token( - "]", + "Text", ), - 2159..2160, + 2678..2682, ), ( Token( - "]", + "{", ), - 2160..2161, + 2683..2684, ), ( Token( - "*", + "return", ), - 2161..2162, + 2689..2695, ), ( Token( - "//", + "trust", ), - 2162..2164, + 2696..2701, ), ( Token( - "'", + "$", ), - 2164..2165, + 2702..2703, ), ( Token( - "$", + "echo \"", ), - 2166..2167, + 2703..2710, ), ( Token( - "}", + "{", ), - 2168..2169, + 2710..2711, ), ( Token( - "/// Trims the spaces at end of the text using `sed`.\n", + "text", ), - 2171..2224, + 2711..2715, ), ( Token( - "pub", + "}", ), - 2224..2227, + 2715..2716, ), ( Token( - "fun", + "\" | tr '[:lower:]' '[:upper:]' ", ), - 2228..2231, + 2716..2747, ), ( Token( - "trim_right", + "$", ), - 2232..2242, + 2747..2748, ), ( Token( - "(", + "}", ), - 2242..2243, + 2749..2750, ), ( Token( - "text", + "/// Attempts to parse a given text into a number, returning the parsed number or zero if parsing fails.\n", ), - 2243..2247, + 2752..2856, ), ( Token( - ":", + "#[", ), - 2247..2248, + 2856..2858, ), ( Token( - "Text", + "allow_absurd_cast", ), - 2249..2253, + 2858..2875, ), ( Token( - ")", + "]", ), - 2253..2254, + 2875..2876, ), ( Token( - ":", + "pub", ), - 2254..2255, + 2877..2880, ), ( Token( - "Text", + "fun", ), - 2256..2260, + 2881..2884, ), ( Token( - "{", + "parse_number", ), - 2261..2262, + 2885..2897, ), ( Token( - "return", + "(", ), - 2267..2273, + 2897..2898, ), ( Token( - "trust", + "text", ), - 2274..2279, + 2898..2902, ), ( Token( - "$", + ":", ), - 2280..2281, + 2902..2903, ), ( Token( - "echo", + "Text", ), - 2282..2286, + 2904..2908, ), ( Token( - "\"", + ")", ), - 2287..2288, + 2908..2909, ), ( Token( - "{", + ":", ), - 2288..2289, + 2909..2910, ), ( Token( - "text", + "Num", ), - 2289..2293, + 2911..2914, ), ( Token( - "}", + "?", ), - 2293..2294, + 2914..2915, ), ( Token( - "\"", + "{", ), - 2294..2295, + 2916..2917, ), ( Token( - "|", + "$", ), - 2296..2297, + 2922..2923, ), ( Token( - "sed", + "[ -n \"", ), - 2298..2301, + 2923..2930, ), ( Token( - "-", + "{", ), - 2302..2303, + 2930..2931, ), ( Token( - "e", + "text", ), - 2303..2304, + 2931..2935, ), ( Token( - "'s", + "}", ), - 2305..2307, + 2935..2936, ), ( Token( - "/", + "\" ] && [ \"", ), - 2307..2308, + 2936..2946, ), ( Token( - "[", + "{", ), - 2308..2309, + 2946..2947, ), ( Token( - "[", + "text", ), - 2309..2310, + 2947..2951, ), ( Token( - ":", + "}", ), - 2310..2311, + 2951..2952, ), ( Token( - "space", + "\" -eq \"", ), - 2311..2316, + 2952..2959, ), ( Token( - ":", + "{", ), - 2316..2317, + 2959..2960, ), ( Token( - "]", + "text", ), - 2317..2318, + 2960..2964, ), ( Token( - "]", + "}", ), - 2318..2319, + 2964..2965, ), ( Token( - "*", + "\" ] 2>/dev/null ", ), - 2319..2320, + 2965..2981, ), ( Token( - "\\", + "$", ), - 2320..2321, + 2981..2982, ), ( Token( - "$", + "?", ), - 2321..2322, + 2982..2983, ), ( Token( - "//", + "return", ), - 2322..2324, + 2988..2994, ), ( Token( - "'", + "text", ), - 2324..2325, + 2995..2999, ), ( Token( - "$", + "as", ), - 2326..2327, + 3000..3002, + ), + ( + Token( + "Num", + ), + 3003..3006, ), ( Token( "}", ), - 2328..2329, + 3007..3008, ), ( Token( - "/// Trims the spaces from the text input.\n", + "/// Splits a text into an array of individual characters.\n", ), - 2331..2373, + 3010..3068, ), ( Token( "pub", ), - 2373..2376, + 3068..3071, ), ( Token( "fun", ), - 2377..2380, + 3072..3075, ), ( Token( - "trim", + "split_chars", ), - 2381..2385, + 3076..3087, ), ( Token( "(", ), - 2385..2386, + 3087..3088, ), ( Token( "text", ), - 2386..2390, + 3088..3092, ), ( Token( ":", ), - 2390..2391, + 3092..3093, ), ( Token( "Text", ), - 2392..2396, + 3094..3098, ), ( Token( ")", ), - 2396..2397, + 3098..3099, ), ( Token( ":", ), - 2397..2398, + 3099..3100, ), ( Token( - "Text", + "[", ), - 2399..2403, + 3101..3102, ), ( Token( - "{", + "Text", ), - 2404..2405, + 3102..3106, ), ( Token( - "return", + "]", ), - 2410..2416, + 3106..3107, ), ( Token( - "trim_left", + "{", ), - 2417..2426, + 3108..3109, ), ( Token( - "(", + "let", ), - 2426..2427, + 3114..3117, ), ( Token( - "trim_right", + "chars", ), - 2427..2437, + 3118..3123, ), ( Token( - "(", + "=", ), - 2437..2438, + 3124..3125, ), ( Token( - "text", + "[", ), - 2438..2442, + 3126..3127, ), ( Token( - ")", + "Text", ), - 2442..2443, + 3127..3131, ), ( Token( - ")", + "]", ), - 2443..2444, + 3131..3132, ), ( Token( - "}", + "trust", ), - 2445..2446, + 3137..3142, ), ( Token( - "/// Makes the text input lowercase using `tr`.\n", + "$", ), - 2448..2495, + 3143..3144, ), ( Token( - "pub", + "for ((i=0; i<", ), - 2495..2498, + 3144..3158, ), ( Token( - "fun", + "\\$", ), - 2499..2502, + 3158..3160, ), ( Token( - "lowercase", + "\\{", ), - 2503..2512, + 3160..3162, ), ( Token( - "(", + "#", ), - 2512..2513, + 3162..3163, ), ( Token( - "text", + "{", ), - 2513..2517, + 3163..3164, ), ( Token( - ":", + "nameof", ), - 2517..2518, + 3164..3170, ), ( Token( - "Text", + "text", ), - 2519..2523, + 3171..3175, ), ( Token( - ")", + "}", ), - 2523..2524, + 3175..3176, ), ( Token( - ":", + "}; i++)); do\n ", ), - 2524..2525, + 3176..3197, ), ( Token( - "Text", + "{", ), - 2526..2530, + 3197..3198, ), ( Token( - "{", + "nameof", ), - 2531..2532, + 3198..3204, ), ( Token( - "return", + "chars", ), - 2537..2543, + 3205..3210, ), ( Token( - "trust", + "}", ), - 2544..2549, + 3210..3211, ), ( Token( - "$", + "+=( \"", ), - 2550..2551, + 3211..3216, ), ( Token( - "echo", + "\\$", ), - 2552..2556, + 3216..3218, ), ( Token( - "\"", + "\\{", ), - 2557..2558, + 3218..3220, ), ( Token( "{", ), - 2558..2559, + 3220..3221, ), ( Token( - "text", + "nameof", ), - 2559..2563, + 3221..3227, ), ( Token( - "}", + "text", ), - 2563..2564, + 3228..3232, ), ( Token( - "\"", + "}", ), - 2564..2565, + 3232..3233, ), ( Token( - "|", + ":", ), - 2566..2567, + 3233..3234, ), ( Token( - "tr", + "\\$", ), - 2568..2570, + 3234..3236, ), ( Token( - "'", + "i:1}\" );\n done ", ), - 2571..2572, + 3236..3254, ), ( Token( - "[", + "$", ), - 2572..2573, + 3254..3255, ), ( Token( - ":", + "return", ), - 2573..2574, + 3260..3266, ), ( Token( - "upper", + "chars", ), - 2574..2579, + 3267..3272, ), ( Token( - ":", + "}", ), - 2579..2580, + 3273..3274, ), ( Token( - "]", + "/// Checks if some text contains a value.\n", ), - 2580..2581, + 3276..3318, ), ( Token( - "'", + "pub", ), - 2581..2582, + 3318..3321, ), ( Token( - "'", + "fun", ), - 2583..2584, + 3322..3325, ), ( Token( - "[", + "text_contains", ), - 2584..2585, + 3326..3339, ), ( Token( - ":", + "(", ), - 2585..2586, + 3339..3340, ), ( Token( - "lower", + "text", ), - 2586..2591, + 3340..3344, ), ( Token( ":", ), - 2591..2592, + 3344..3345, ), ( Token( - "]", + "Text", ), - 2592..2593, + 3346..3350, ), ( Token( - "'", + ",", ), - 2593..2594, + 3350..3351, ), ( Token( - "$", + "phrase", ), - 2595..2596, + 3352..3358, ), ( Token( - "}", + ":", ), - 2597..2598, + 3358..3359, ), ( Token( - "/// Makes the text input uppercase using `tr`.\n", + "Text", ), - 2600..2647, + 3360..3364, ), ( Token( - "pub", + ")", ), - 2647..2650, + 3364..3365, ), ( Token( - "fun", + ":", ), - 2651..2654, + 3365..3366, ), ( Token( - "uppercase", + "Bool", ), - 2655..2664, + 3367..3371, ), ( Token( - "(", + "{", ), - 2664..2665, + 3372..3373, ), ( Token( - "text", + "let", ), - 2665..2669, + 3376..3379, ), ( Token( - ":", + "result", ), - 2669..2670, + 3380..3386, ), ( Token( - "Text", + "=", ), - 2671..2675, + 3387..3388, ), ( Token( - ")", + "trust", ), - 2675..2676, + 3389..3394, ), ( Token( - ":", + "$", ), - 2676..2677, + 3395..3396, ), ( Token( - "Text", + "if [[ \"", ), - 2678..2682, + 3396..3404, ), ( Token( "{", ), - 2683..2684, + 3404..3405, ), ( Token( - "return", + "text", ), - 2689..2695, + 3405..3409, ), ( Token( - "trust", + "}", ), - 2696..2701, + 3409..3410, ), ( Token( - "$", + "\" == *\"", ), - 2702..2703, + 3410..3417, ), ( Token( - "echo", + "{", ), - 2704..2708, + 3417..3418, ), ( Token( - "\"", + "phrase", ), - 2709..2710, + 3418..3424, ), ( Token( - "{", + "}", ), - 2710..2711, + 3424..3425, ), ( Token( - "text", + "\"* ]]; then\n echo 1\n fi ", ), - 2711..2715, + 3425..3453, ), ( Token( - "}", + "$", ), - 2715..2716, + 3453..3454, ), ( Token( - "\"", + "return", ), - 2716..2717, + 3458..3464, ), ( Token( - "|", + "result", ), - 2718..2719, + 3465..3471, ), ( Token( - "tr", + "==", ), - 2720..2722, + 3472..3474, ), ( Token( - "'", + "\"", ), - 2723..2724, + 3475..3476, ), ( Token( - "[", + "1", ), - 2724..2725, + 3476..3477, ), ( Token( - ":", + "\"", ), - 2725..2726, + 3477..3478, ), ( Token( - "lower", + "}", ), - 2726..2731, + 3479..3480, ), ( Token( - ":", + "/// Checks if an array value is in the text.\n", ), - 2731..2732, + 3482..3527, ), ( Token( - "]", + "pub", ), - 2732..2733, + 3527..3530, ), ( Token( - "'", + "fun", ), - 2733..2734, + 3531..3534, ), ( Token( - "'", + "text_contains_any", ), - 2735..2736, + 3535..3552, ), ( Token( - "[", + "(", ), - 2736..2737, + 3552..3553, ), ( Token( - ":", + "text", ), - 2737..2738, + 3553..3557, ), ( Token( - "upper", + ":", ), - 2738..2743, + 3557..3558, ), ( Token( - ":", + "Text", ), - 2743..2744, + 3559..3563, ), ( Token( - "]", + ",", ), - 2744..2745, + 3563..3564, ), ( Token( - "'", + "terms", ), - 2745..2746, + 3565..3570, ), ( Token( - "$", + ":", ), - 2747..2748, + 3570..3571, ), ( Token( - "}", + "[", ), - 2749..2750, + 3572..3573, ), ( Token( - "/// Attempts to parse a given text into a number, returning the parsed number or zero if parsing fails.\n", + "Text", ), - 2752..2856, + 3573..3577, ), ( Token( - "#", + "]", ), - 2856..2857, + 3577..3578, ), ( Token( - "[", + ")", ), - 2857..2858, + 3578..3579, ), ( Token( - "allow_absurd_cast", + ":", ), - 2858..2875, + 3579..3580, ), ( Token( - "]", + "Bool", ), - 2875..2876, + 3581..3585, ), ( Token( - "pub", + "{", ), - 2877..2880, + 3586..3587, ), ( Token( - "fun", + "for", ), - 2881..2884, + 3592..3595, ), ( Token( - "parse_number", + "term", ), - 2885..2897, + 3596..3600, ), ( Token( - "(", + "in", ), - 2897..2898, + 3601..3603, ), ( Token( - "text", + "terms", ), - 2898..2902, + 3604..3609, ), ( Token( - ":", + "{", ), - 2902..2903, + 3610..3611, ), ( Token( - "Text", + "if", ), - 2904..2908, + 3620..3622, ), ( Token( - ")", + "text_contains", ), - 2908..2909, + 3623..3636, ), ( Token( - ":", + "(", ), - 2909..2910, + 3636..3637, ), ( Token( - "Num", + "text", ), - 2911..2914, + 3637..3641, ), ( Token( - "?", + ",", ), - 2914..2915, + 3641..3642, ), ( Token( - "{", + "term", ), - 2916..2917, + 3643..3647, ), ( Token( - "$", + ")", ), - 2922..2923, + 3647..3648, ), ( Token( - "[", + "{", ), - 2924..2925, + 3649..3650, ), ( Token( - "-", + "return", ), - 2926..2927, + 3663..3669, ), ( Token( - "n", + "true", ), - 2927..2928, + 3670..3674, ), ( Token( - "\"", + "}", ), - 2929..2930, + 3683..3684, ), ( Token( - "{", + "}", ), - 2930..2931, + 3689..3690, ), ( Token( - "text", + "return", ), - 2931..2935, + 3696..3702, ), ( Token( - "}", + "false", ), - 2935..2936, + 3703..3708, ), ( Token( - "\"", + "}", ), - 2936..2937, + 3709..3710, ), ( Token( - "]", + "/// Checks if all the arrays values are in the string\n", ), - 2938..2939, + 3712..3766, ), ( Token( - "&&", + "pub", ), - 2940..2942, + 3766..3769, ), ( Token( - "[", + "fun", ), - 2943..2944, + 3770..3773, ), ( Token( - "\"", + "text_contains_all", ), - 2945..2946, + 3774..3791, ), ( Token( - "{", + "(", ), - 2946..2947, + 3791..3792, ), ( Token( "text", ), - 2947..2951, + 3792..3796, ), ( Token( - "}", + ":", ), - 2951..2952, + 3796..3797, ), ( Token( - "\"", + "Text", ), - 2952..2953, + 3798..3802, ), ( Token( - "-", + ",", ), - 2954..2955, + 3802..3803, ), ( Token( - "eq", + "terms", ), - 2955..2957, + 3804..3809, ), ( Token( - "\"", + ":", ), - 2958..2959, + 3809..3810, ), ( Token( - "{", + "[", ), - 2959..2960, + 3811..3812, ), ( Token( - "text", + "Text", ), - 2960..2964, + 3812..3816, ), ( Token( - "}", + "]", ), - 2964..2965, + 3816..3817, ), ( Token( - "\"", + ")", ), - 2965..2966, + 3817..3818, ), ( Token( - "]", + ":", ), - 2967..2968, + 3818..3819, ), ( Token( - "2", + "Bool", ), - 2969..2970, + 3820..3824, ), ( Token( - ">", + "{", ), - 2970..2971, + 3825..3826, ), ( Token( - "/", + "for", ), - 2971..2972, + 3831..3834, ), ( Token( - "dev", + "term", ), - 2972..2975, + 3835..3839, ), ( Token( - "/", + "in", ), - 2975..2976, + 3840..3842, ), ( Token( - "null", + "terms", ), - 2976..2980, + 3843..3848, ), ( Token( - "$", + "{", ), - 2981..2982, + 3849..3850, ), ( Token( - "?", + "if", ), - 2982..2983, + 3859..3861, ), ( Token( - "return", - ), - 2988..2994, - ), - ( - Token( - "text", + "not", ), - 2995..2999, + 3862..3865, ), ( Token( - "as", + "text_contains", ), - 3000..3002, + 3866..3879, ), ( Token( - "Num", + "(", ), - 3003..3006, + 3879..3880, ), ( Token( - "}", + "text", ), - 3007..3008, + 3880..3884, ), ( Token( - "/// Splits a text into an array of individual characters.\n", + ",", ), - 3010..3068, + 3884..3885, ), ( Token( - "pub", + "term", ), - 3068..3071, + 3886..3890, ), ( Token( - "fun", + ")", ), - 3072..3075, + 3890..3891, ), ( Token( - "split_chars", + "{", ), - 3076..3087, + 3892..3893, ), ( Token( - "(", + "return", ), - 3087..3088, + 3906..3912, ), ( Token( - "text", + "false", ), - 3088..3092, + 3913..3918, ), ( Token( - ":", + "}", ), - 3092..3093, + 3927..3928, ), ( Token( - "Text", + "}", ), - 3094..3098, + 3933..3934, ), ( Token( - ")", + "return", ), - 3098..3099, + 3940..3946, ), ( Token( - ":", + "true", ), - 3099..3100, + 3947..3951, ), ( Token( - "[", + "}", ), - 3101..3102, + 3952..3953, ), ( Token( - "Text", + "/// Match all occurences of a regex pattern.\n", ), - 3102..3106, + 3955..4000, ), ( Token( - "]", + "///\n", ), - 3106..3107, + 4000..4004, ), ( Token( - "{", + "/// Function uses `sed`\n", ), - 3108..3109, + 4004..4028, ), ( Token( - "let", + "pub", ), - 3114..3117, + 4028..4031, ), ( Token( - "chars", + "fun", ), - 3118..3123, + 4032..4035, ), ( Token( - "=", + "match_regex", ), - 3124..3125, + 4036..4047, ), ( Token( - "[", + "(", ), - 3126..3127, + 4047..4048, ), ( Token( - "Text", + "source", ), - 3127..3131, + 4048..4054, ), ( Token( - "]", + ":", ), - 3131..3132, + 4054..4055, ), ( Token( - "trust", + "Text", ), - 3137..3142, + 4056..4060, ), ( Token( - "$", + ",", ), - 3143..3144, + 4060..4061, ), ( Token( - "for", + "search", ), - 3145..3148, + 4062..4068, ), ( Token( - "(", + ":", ), - 3149..3150, + 4068..4069, ), ( Token( - "(", + "Text", ), - 3150..3151, + 4070..4074, ), ( Token( - "i", + ",", ), - 3151..3152, + 4074..4075, ), ( Token( - "=", + "extended", ), - 3152..3153, + 4076..4084, ), ( Token( - "0", + ":", ), - 3153..3154, + 4084..4085, ), ( Token( - ";", + "Bool", ), - 3154..3155, + 4086..4090, ), ( Token( - "i", + "=", ), - 3156..3157, + 4091..4092, ), ( Token( - "<", + "false", ), - 3157..3158, + 4093..4098, ), ( Token( - "\\", + ")", ), - 3158..3159, + 4098..4099, ), ( Token( - "$", + ":", ), - 3159..3160, + 4099..4100, ), ( Token( - "\\", + "Bool", ), - 3160..3161, + 4101..4105, ), ( Token( "{", ), - 3161..3162, + 4106..4107, ), ( Token( - "#", + "trust", ), - 3162..3163, + 4112..4117, ), ( Token( "{", ), - 3163..3164, + 4118..4119, ), ( Token( - "nameof", + "search", ), - 3164..3170, + 4128..4134, ), ( Token( - "text", + "=", ), - 3171..3175, + 4135..4136, ), ( Token( - "}", + "replace", ), - 3175..3176, + 4137..4144, ), ( Token( - "}", + "(", ), - 3176..3177, + 4144..4145, ), ( Token( - ";", + "search", ), - 3177..3178, + 4145..4151, ), ( Token( - "i", + ",", ), - 3179..3180, + 4151..4152, ), ( Token( - "+", + "\"", ), - 3180..3181, + 4153..4154, ), ( Token( - "+", + "/", ), - 3181..3182, + 4154..4155, ), ( Token( - ")", + "\"", ), - 3182..3183, + 4155..4156, ), ( Token( - ")", + ",", ), - 3183..3184, + 4156..4157, ), ( Token( - ";", + "\"", ), - 3184..3185, + 4158..4159, ), ( Token( - "do", + "\\/", ), - 3186..3188, + 4159..4161, ), ( Token( - "{", + "\"", ), - 3197..3198, + 4161..4162, ), ( Token( - "nameof", + ")", ), - 3198..3204, + 4162..4163, ), ( Token( - "chars", + "let", ), - 3205..3210, + 4172..4175, ), ( Token( - "}", + "output", ), - 3210..3211, + 4176..4182, ), ( Token( - "+=", + "=", ), - 3211..3213, + 4183..4184, ), ( Token( - "(", + "\"", ), - 3213..3214, + 4185..4186, ), ( Token( "\"", ), - 3215..3216, + 4186..4187, ), ( Token( - "\\", + "if", ), - 3216..3217, + 4196..4198, ), ( Token( - "$", + "extended", ), - 3217..3218, + 4199..4207, ), ( Token( - "\\", + "{", ), - 3218..3219, + 4208..4209, ), ( Token( - "{", + "// GNU sed versions 4.0 through 4.2 support extended regex syntax,\n", ), - 3219..3220, + 4222..4289, ), ( Token( - "{", + "// but only via the \"-r\" option; use that if the version information\n", ), - 3220..3221, + 4301..4370, ), ( Token( - "nameof", + "// contains \"GNU sed\".\n", ), - 3221..3227, + 4382..4405, ), ( Token( - "text", + "$", ), - 3228..3232, + 4417..4418, ), ( Token( - "}", + "re='", ), - 3232..3233, + 4418..4423, ), ( Token( - ":", + "\\b", ), - 3233..3234, + 4423..4425, ), ( Token( - "\\", + "Copyright", ), - 3234..3235, + 4425..4434, ), ( Token( - "$", + "\\b", ), - 3235..3236, + 4434..4436, ), ( Token( - "i", + ".+", ), - 3236..3237, + 4436..4438, ), ( Token( - ":", + "\\b", ), - 3237..3238, + 4438..4440, ), ( Token( - "1", + "Free Software Foundation", ), - 3238..3239, + 4440..4464, ), ( Token( - "}", + "\\b", ), - 3239..3240, + 4464..4466, ), ( Token( - "\"", + "'; [[ ", ), - 3240..3241, + 4466..4472, ), ( Token( - ")", + "\\$", ), - 3242..3243, + 4472..4474, ), ( Token( - ";", + "(sed --version 2>/dev/null) =~ ", ), - 3243..3244, + 4474..4505, ), ( Token( - "done", + "\\$", ), - 3249..3253, + 4505..4507, ), ( Token( - "$", + "re ]] ", ), - 3254..3255, + 4507..4513, ), ( Token( - "return", + "$", ), - 3260..3266, + 4513..4514, ), ( Token( - "chars", + "let", ), - 3267..3272, + 4527..4530, ), ( Token( - "}", + "flag", ), - 3273..3274, + 4531..4535, ), ( Token( - "/// Checks if some text contains a value.\n", + "=", ), - 3276..3318, + 4536..4537, ), ( Token( - "pub", + "status", ), - 3318..3321, + 4538..4544, ), ( Token( - "fun", + "==", ), - 3322..3325, + 4545..4547, ), ( Token( - "text_contains", + "0", ), - 3326..3339, + 4548..4549, ), ( Token( - "(", + "then", ), - 3339..3340, + 4550..4554, ), ( Token( - "text", + "\"", ), - 3340..3344, + 4555..4556, ), ( Token( - ":", + "-r", ), - 3344..3345, + 4556..4558, ), ( Token( - "Text", + "\"", ), - 3346..3350, + 4558..4559, ), ( Token( - ",", + "else", ), - 3350..3351, + 4560..4564, ), ( Token( - "phrase", + "\"", ), - 3352..3358, + 4565..4566, ), ( Token( - ":", + "-E", ), - 3358..3359, + 4566..4568, ), ( Token( - "Text", + "\"", ), - 3360..3364, + 4568..4569, ), ( Token( - ")", + "output", ), - 3364..3365, + 4582..4588, ), ( Token( - ":", + "=", ), - 3365..3366, + 4589..4590, ), ( Token( - "Bool", + "$", ), - 3367..3371, + 4591..4592, + ), + ( + Token( + "echo \"", + ), + 4592..4599, ), ( Token( "{", ), - 3372..3373, + 4599..4600, ), ( Token( - "let", + "source", ), - 3376..3379, + 4600..4606, ), ( Token( - "result", + "}", ), - 3380..3386, + 4606..4607, ), ( Token( - "=", + "\" | sed \"", ), - 3387..3388, + 4607..4616, ), ( Token( - "trust", + "{", ), - 3389..3394, + 4616..4617, ), ( Token( - "$", + "flag", ), - 3395..3396, + 4617..4621, ), ( Token( - "if", + "}", ), - 3397..3399, + 4621..4622, ), ( Token( - "[", + "\" -ne \"/", ), - 3400..3401, + 4622..4630, ), ( Token( - "[", + "{", ), - 3401..3402, + 4630..4631, ), ( Token( - "\"", + "search", ), - 3403..3404, + 4631..4637, ), ( Token( - "{", + "}", ), - 3404..3405, + 4637..4638, ), ( Token( - "text", + "/p\" ", ), - 3405..3409, + 4638..4642, + ), + ( + Token( + "$", + ), + 4642..4643, ), ( Token( "}", ), - 3409..3410, + 4652..4653, ), ( Token( - "\"", + "else", ), - 3410..3411, + 4654..4658, ), ( Token( - "==", + "{", + ), + 4659..4660, + ), + ( + Token( + "output", ), - 3412..3414, + 4673..4679, ), ( Token( - "*", + "=", ), - 3415..3416, + 4680..4681, ), ( Token( - "\"", + "$", ), - 3416..3417, + 4682..4683, + ), + ( + Token( + "echo \"", + ), + 4683..4690, ), ( Token( "{", ), - 3417..3418, + 4690..4691, ), ( Token( - "phrase", + "source", ), - 3418..3424, + 4691..4697, ), ( Token( "}", ), - 3424..3425, + 4697..4698, ), ( Token( - "\"", + "\" | sed -ne \"/", + ), + 4698..4712, + ), + ( + Token( + "{", ), - 3425..3426, + 4712..4713, ), ( Token( - "*", + "search", ), - 3426..3427, + 4713..4719, ), ( Token( - "]", + "}", ), - 3428..3429, + 4719..4720, ), ( Token( - "]", + "/p\" ", ), - 3429..3430, + 4720..4724, ), ( Token( - ";", + "$", ), - 3430..3431, + 4724..4725, ), ( Token( - "then", + "}", + ), + 4734..4735, + ), + ( + Token( + "if", ), - 3432..3436, + 4744..4746, ), ( Token( - "echo", + "output", ), - 3441..3445, + 4747..4753, ), ( Token( - "1", + "!=", ), - 3446..3447, + 4754..4756, ), ( Token( - "fi", + "\"", ), - 3450..3452, + 4757..4758, ), ( Token( - "$", + "\"", ), - 3453..3454, + 4758..4759, + ), + ( + Token( + "{", + ), + 4760..4761, ), ( Token( "return", ), - 3458..3464, + 4774..4780, ), ( Token( - "result", + "true", ), - 3465..3471, + 4781..4785, ), ( Token( - "==", + "}", ), - 3472..3474, + 4794..4795, ), ( Token( - "\"", + "}", ), - 3475..3476, + 4800..4801, ), ( Token( - "1", + "return", ), - 3476..3477, + 4806..4812, ), ( Token( - "\"", + "false", ), - 3477..3478, + 4813..4818, ), ( Token( "}", ), - 3479..3480, + 4819..4820, ), ( Token( - "/// Checks if an array value is in the text.\n", + "/// Checks if an array value (with regular expression) is in the text.\n", ), - 3482..3527, + 4822..4893, ), ( Token( "pub", ), - 3527..3530, + 4893..4896, ), ( Token( "fun", ), - 3531..3534, + 4897..4900, ), ( Token( - "text_contains_any", + "match_regex_any", ), - 3535..3552, + 4901..4916, ), ( Token( "(", ), - 3552..3553, + 4916..4917, ), ( Token( "text", ), - 3553..3557, + 4917..4921, ), ( Token( ":", ), - 3557..3558, + 4921..4922, ), ( Token( "Text", ), - 3559..3563, + 4923..4927, ), ( Token( ",", ), - 3563..3564, + 4927..4928, ), ( Token( "terms", ), - 3565..3570, + 4929..4934, ), ( Token( ":", ), - 3570..3571, + 4934..4935, ), ( Token( "[", ), - 3572..3573, + 4936..4937, ), ( Token( "Text", ), - 3573..3577, + 4937..4941, ), ( Token( "]", ), - 3577..3578, + 4941..4942, ), ( Token( ")", ), - 3578..3579, + 4942..4943, ), ( Token( ":", ), - 3579..3580, + 4943..4944, ), ( Token( "Bool", ), - 3581..3585, + 4945..4949, ), ( Token( "{", ), - 3586..3587, + 4950..4951, ), ( Token( "for", ), - 3592..3595, + 4956..4959, ), ( Token( "term", ), - 3596..3600, + 4960..4964, ), ( Token( "in", ), - 3601..3603, + 4965..4967, ), ( Token( "terms", ), - 3604..3609, + 4968..4973, ), ( Token( "{", ), - 3610..3611, + 4974..4975, ), ( Token( "if", ), - 3620..3622, + 4984..4986, ), ( Token( - "text_contains", + "match_regex", ), - 3623..3636, + 4987..4998, ), ( Token( "(", ), - 3636..3637, + 4998..4999, ), ( Token( "text", ), - 3637..3641, + 4999..5003, ), ( Token( ",", ), - 3641..3642, + 5003..5004, ), ( Token( "term", ), - 3643..3647, + 5005..5009, ), ( Token( - ")", + ",", ), - 3647..3648, - ), - ( - Token( - "{", - ), - 3649..3650, - ), - ( - Token( - "return", - ), - 3663..3669, - ), - ( - Token( - "true", - ), - 3670..3674, - ), - ( - Token( - "}", - ), - 3683..3684, - ), - ( - Token( - "}", - ), - 3689..3690, - ), - ( - Token( - "return", - ), - 3696..3702, - ), - ( - Token( - "false", - ), - 3703..3708, - ), - ( - Token( - "}", - ), - 3709..3710, - ), - ( - Token( - "/// Checks if all the arrays values are in the string\n", - ), - 3712..3766, - ), - ( - Token( - "pub", - ), - 3766..3769, - ), - ( - Token( - "fun", - ), - 3770..3773, - ), - ( - Token( - "text_contains_all", - ), - 3774..3791, - ), - ( - Token( - "(", - ), - 3791..3792, - ), - ( - Token( - "text", - ), - 3792..3796, - ), - ( - Token( - ":", - ), - 3796..3797, - ), - ( - Token( - "Text", - ), - 3798..3802, - ), - ( - Token( - ",", - ), - 3802..3803, - ), - ( - Token( - "terms", - ), - 3804..3809, - ), - ( - Token( - ":", - ), - 3809..3810, - ), - ( - Token( - "[", - ), - 3811..3812, - ), - ( - Token( - "Text", - ), - 3812..3816, - ), - ( - Token( - "]", - ), - 3816..3817, - ), - ( - Token( - ")", - ), - 3817..3818, - ), - ( - Token( - ":", - ), - 3818..3819, - ), - ( - Token( - "Bool", - ), - 3820..3824, - ), - ( - Token( - "{", - ), - 3825..3826, - ), - ( - Token( - "for", - ), - 3831..3834, - ), - ( - Token( - "term", - ), - 3835..3839, - ), - ( - Token( - "in", - ), - 3840..3842, - ), - ( - Token( - "terms", - ), - 3843..3848, - ), - ( - Token( - "{", - ), - 3849..3850, - ), - ( - Token( - "if", - ), - 3859..3861, - ), - ( - Token( - "not", - ), - 3862..3865, - ), - ( - Token( - "text_contains", - ), - 3866..3879, - ), - ( - Token( - "(", - ), - 3879..3880, - ), - ( - Token( - "text", - ), - 3880..3884, - ), - ( - Token( - ",", - ), - 3884..3885, - ), - ( - Token( - "term", - ), - 3886..3890, - ), - ( - Token( - ")", - ), - 3890..3891, - ), - ( - Token( - "{", - ), - 3892..3893, - ), - ( - Token( - "return", - ), - 3906..3912, - ), - ( - Token( - "false", - ), - 3913..3918, - ), - ( - Token( - "}", - ), - 3927..3928, - ), - ( - Token( - "}", - ), - 3933..3934, - ), - ( - Token( - "return", - ), - 3940..3946, - ), - ( - Token( - "true", - ), - 3947..3951, - ), - ( - Token( - "}", - ), - 3952..3953, - ), - ( - Token( - "/// Match all occurences of a regex pattern.\n", - ), - 3955..4000, - ), - ( - Token( - "///\n", - ), - 4000..4004, - ), - ( - Token( - "/// Function uses `sed`\n", - ), - 4004..4028, - ), - ( - Token( - "pub", - ), - 4028..4031, - ), - ( - Token( - "fun", - ), - 4032..4035, - ), - ( - Token( - "match_regex", - ), - 4036..4047, - ), - ( - Token( - "(", - ), - 4047..4048, - ), - ( - Token( - "source", - ), - 4048..4054, - ), - ( - Token( - ":", - ), - 4054..4055, - ), - ( - Token( - "Text", - ), - 4056..4060, - ), - ( - Token( - ",", - ), - 4060..4061, - ), - ( - Token( - "search", - ), - 4062..4068, - ), - ( - Token( - ":", - ), - 4068..4069, - ), - ( - Token( - "Text", - ), - 4070..4074, - ), - ( - Token( - ",", - ), - 4074..4075, - ), - ( - Token( - "extended", - ), - 4076..4084, - ), - ( - Token( - ":", - ), - 4084..4085, - ), - ( - Token( - "Bool", - ), - 4086..4090, - ), - ( - Token( - "=", - ), - 4091..4092, - ), - ( - Token( - "false", - ), - 4093..4098, - ), - ( - Token( - ")", - ), - 4098..4099, - ), - ( - Token( - ":", - ), - 4099..4100, - ), - ( - Token( - "Bool", - ), - 4101..4105, - ), - ( - Token( - "{", - ), - 4106..4107, - ), - ( - Token( - "trust", - ), - 4112..4117, - ), - ( - Token( - "{", - ), - 4118..4119, - ), - ( - Token( - "search", - ), - 4128..4134, - ), - ( - Token( - "=", - ), - 4135..4136, - ), - ( - Token( - "replace", - ), - 4137..4144, - ), - ( - Token( - "(", - ), - 4144..4145, - ), - ( - Token( - "search", - ), - 4145..4151, - ), - ( - Token( - ",", - ), - 4151..4152, - ), - ( - Token( - "\"", - ), - 4153..4154, - ), - ( - Token( - "/", - ), - 4154..4155, - ), - ( - Token( - "\"", - ), - 4155..4156, - ), - ( - Token( - ",", - ), - 4156..4157, - ), - ( - Token( - "\"", - ), - 4158..4159, - ), - ( - Token( - "\\", - ), - 4159..4160, - ), - ( - Token( - "/", - ), - 4160..4161, - ), - ( - Token( - "\"", - ), - 4161..4162, - ), - ( - Token( - ")", - ), - 4162..4163, - ), - ( - Token( - "let", - ), - 4172..4175, - ), - ( - Token( - "output", - ), - 4176..4182, - ), - ( - Token( - "=", - ), - 4183..4184, - ), - ( - Token( - "\"", - ), - 4185..4186, - ), - ( - Token( - "\"", - ), - 4186..4187, - ), - ( - Token( - "if", - ), - 4196..4198, - ), - ( - Token( - "extended", - ), - 4199..4207, - ), - ( - Token( - "{", - ), - 4208..4209, - ), - ( - Token( - "// GNU sed versions 4.0 through 4.2 support extended regex syntax,\n", - ), - 4222..4289, - ), - ( - Token( - "// but only via the \"-r\" option; use that if the version information\n", - ), - 4301..4370, - ), - ( - Token( - "// contains \"GNU sed\".\n", - ), - 4382..4405, - ), - ( - Token( - "$", - ), - 4417..4418, - ), - ( - Token( - "re", - ), - 4419..4421, - ), - ( - Token( - "=", - ), - 4421..4422, - ), - ( - Token( - "'", - ), - 4422..4423, - ), - ( - Token( - "\\", - ), - 4423..4424, - ), - ( - Token( - "bCopyright", - ), - 4424..4434, - ), - ( - Token( - "\\", - ), - 4434..4435, - ), - ( - Token( - "b", - ), - 4435..4436, - ), - ( - Token( - ".", - ), - 4436..4437, - ), - ( - Token( - "+", - ), - 4437..4438, - ), - ( - Token( - "\\", - ), - 4438..4439, - ), - ( - Token( - "bFree", - ), - 4439..4444, - ), - ( - Token( - "Software", - ), - 4445..4453, - ), - ( - Token( - "Foundation", - ), - 4454..4464, - ), - ( - Token( - "\\", - ), - 4464..4465, - ), - ( - Token( - "b'", - ), - 4465..4467, - ), - ( - Token( - ";", - ), - 4467..4468, - ), - ( - Token( - "[", - ), - 4469..4470, - ), - ( - Token( - "[", - ), - 4470..4471, - ), - ( - Token( - "\\", - ), - 4472..4473, - ), - ( - Token( - "$", - ), - 4473..4474, - ), - ( - Token( - "(", - ), - 4474..4475, - ), - ( - Token( - "sed", - ), - 4475..4478, - ), - ( - Token( - "-", - ), - 4479..4480, - ), - ( - Token( - "-", - ), - 4480..4481, - ), - ( - Token( - "version", - ), - 4481..4488, - ), - ( - Token( - "2", - ), - 4489..4490, - ), - ( - Token( - ">", - ), - 4490..4491, - ), - ( - Token( - "/", - ), - 4491..4492, - ), - ( - Token( - "dev", - ), - 4492..4495, - ), - ( - Token( - "/", - ), - 4495..4496, - ), - ( - Token( - "null", - ), - 4496..4500, - ), - ( - Token( - ")", - ), - 4500..4501, - ), - ( - Token( - "=", - ), - 4502..4503, - ), - ( - Token( - "~", - ), - 4503..4504, - ), - ( - Token( - "\\", - ), - 4505..4506, - ), - ( - Token( - "$", - ), - 4506..4507, - ), - ( - Token( - "re", - ), - 4507..4509, - ), - ( - Token( - "]", - ), - 4510..4511, - ), - ( - Token( - "]", - ), - 4511..4512, - ), - ( - Token( - "$", - ), - 4513..4514, - ), - ( - Token( - "let", - ), - 4527..4530, - ), - ( - Token( - "flag", - ), - 4531..4535, - ), - ( - Token( - "=", - ), - 4536..4537, - ), - ( - Token( - "status", - ), - 4538..4544, - ), - ( - Token( - "==", - ), - 4545..4547, - ), - ( - Token( - "0", - ), - 4548..4549, - ), - ( - Token( - "then", - ), - 4550..4554, - ), - ( - Token( - "\"", - ), - 4555..4556, - ), - ( - Token( - "-", - ), - 4556..4557, - ), - ( - Token( - "r", - ), - 4557..4558, - ), - ( - Token( - "\"", - ), - 4558..4559, - ), - ( - Token( - "else", - ), - 4560..4564, - ), - ( - Token( - "\"", - ), - 4565..4566, - ), - ( - Token( - "-", - ), - 4566..4567, - ), - ( - Token( - "E", - ), - 4567..4568, - ), - ( - Token( - "\"", - ), - 4568..4569, - ), - ( - Token( - "output", - ), - 4582..4588, - ), - ( - Token( - "=", - ), - 4589..4590, - ), - ( - Token( - "$", - ), - 4591..4592, - ), - ( - Token( - "echo", - ), - 4593..4597, - ), - ( - Token( - "\"", - ), - 4598..4599, - ), - ( - Token( - "{", - ), - 4599..4600, - ), - ( - Token( - "source", - ), - 4600..4606, - ), - ( - Token( - "}", - ), - 4606..4607, - ), - ( - Token( - "\"", - ), - 4607..4608, - ), - ( - Token( - "|", - ), - 4609..4610, - ), - ( - Token( - "sed", - ), - 4611..4614, - ), - ( - Token( - "\"", - ), - 4615..4616, - ), - ( - Token( - "{", - ), - 4616..4617, - ), - ( - Token( - "flag", - ), - 4617..4621, - ), - ( - Token( - "}", - ), - 4621..4622, - ), - ( - Token( - "\"", - ), - 4622..4623, - ), - ( - Token( - "-", - ), - 4624..4625, - ), - ( - Token( - "ne", - ), - 4625..4627, - ), - ( - Token( - "\"", - ), - 4628..4629, - ), - ( - Token( - "/", - ), - 4629..4630, - ), - ( - Token( - "{", - ), - 4630..4631, - ), - ( - Token( - "search", - ), - 4631..4637, - ), - ( - Token( - "}", - ), - 4637..4638, - ), - ( - Token( - "/", - ), - 4638..4639, - ), - ( - Token( - "p", - ), - 4639..4640, - ), - ( - Token( - "\"", - ), - 4640..4641, - ), - ( - Token( - "$", - ), - 4642..4643, - ), - ( - Token( - "}", - ), - 4652..4653, - ), - ( - Token( - "else", - ), - 4654..4658, - ), - ( - Token( - "{", - ), - 4659..4660, - ), - ( - Token( - "output", - ), - 4673..4679, - ), - ( - Token( - "=", - ), - 4680..4681, - ), - ( - Token( - "$", - ), - 4682..4683, - ), - ( - Token( - "echo", - ), - 4684..4688, - ), - ( - Token( - "\"", - ), - 4689..4690, - ), - ( - Token( - "{", - ), - 4690..4691, - ), - ( - Token( - "source", - ), - 4691..4697, - ), - ( - Token( - "}", - ), - 4697..4698, - ), - ( - Token( - "\"", - ), - 4698..4699, - ), - ( - Token( - "|", - ), - 4700..4701, - ), - ( - Token( - "sed", - ), - 4702..4705, - ), - ( - Token( - "-", - ), - 4706..4707, - ), - ( - Token( - "ne", - ), - 4707..4709, - ), - ( - Token( - "\"", - ), - 4710..4711, - ), - ( - Token( - "/", - ), - 4711..4712, - ), - ( - Token( - "{", - ), - 4712..4713, - ), - ( - Token( - "search", - ), - 4713..4719, - ), - ( - Token( - "}", - ), - 4719..4720, - ), - ( - Token( - "/", - ), - 4720..4721, - ), - ( - Token( - "p", - ), - 4721..4722, - ), - ( - Token( - "\"", - ), - 4722..4723, - ), - ( - Token( - "$", - ), - 4724..4725, - ), - ( - Token( - "}", - ), - 4734..4735, - ), - ( - Token( - "if", - ), - 4744..4746, - ), - ( - Token( - "output", - ), - 4747..4753, - ), - ( - Token( - "!=", - ), - 4754..4756, - ), - ( - Token( - "\"", - ), - 4757..4758, - ), - ( - Token( - "\"", - ), - 4758..4759, - ), - ( - Token( - "{", - ), - 4760..4761, - ), - ( - Token( - "return", - ), - 4774..4780, - ), - ( - Token( - "true", - ), - 4781..4785, - ), - ( - Token( - "}", - ), - 4794..4795, - ), - ( - Token( - "}", - ), - 4800..4801, - ), - ( - Token( - "return", - ), - 4806..4812, - ), - ( - Token( - "false", - ), - 4813..4818, - ), - ( - Token( - "}", - ), - 4819..4820, - ), - ( - Token( - "/// Checks if an array value (with regular expression) is in the text.\n", - ), - 4822..4893, - ), - ( - Token( - "pub", - ), - 4893..4896, - ), - ( - Token( - "fun", - ), - 4897..4900, - ), - ( - Token( - "match_regex_any", - ), - 4901..4916, - ), - ( - Token( - "(", - ), - 4916..4917, - ), - ( - Token( - "text", - ), - 4917..4921, - ), - ( - Token( - ":", - ), - 4921..4922, - ), - ( - Token( - "Text", - ), - 4923..4927, - ), - ( - Token( - ",", - ), - 4927..4928, - ), - ( - Token( - "terms", - ), - 4929..4934, - ), - ( - Token( - ":", - ), - 4934..4935, - ), - ( - Token( - "[", - ), - 4936..4937, - ), - ( - Token( - "Text", - ), - 4937..4941, - ), - ( - Token( - "]", - ), - 4941..4942, - ), - ( - Token( - ")", - ), - 4942..4943, - ), - ( - Token( - ":", - ), - 4943..4944, - ), - ( - Token( - "Bool", - ), - 4945..4949, - ), - ( - Token( - "{", - ), - 4950..4951, - ), - ( - Token( - "for", - ), - 4956..4959, - ), - ( - Token( - "term", - ), - 4960..4964, - ), - ( - Token( - "in", - ), - 4965..4967, - ), - ( - Token( - "terms", - ), - 4968..4973, - ), - ( - Token( - "{", - ), - 4974..4975, - ), - ( - Token( - "if", - ), - 4984..4986, - ), - ( - Token( - "match_regex", - ), - 4987..4998, - ), - ( - Token( - "(", - ), - 4998..4999, - ), - ( - Token( - "text", - ), - 4999..5003, - ), - ( - Token( - ",", - ), - 5003..5004, - ), - ( - Token( - "term", - ), - 5005..5009, - ), - ( - Token( - ",", - ), - 5009..5010, - ), - ( - Token( - "false", - ), - 5011..5016, - ), - ( - Token( - ")", - ), - 5016..5017, - ), - ( - Token( - "{", - ), - 5018..5019, - ), - ( - Token( - "return", - ), - 5032..5038, - ), - ( - Token( - "true", - ), - 5039..5043, - ), - ( - Token( - "}", - ), - 5052..5053, - ), - ( - Token( - "}", - ), - 5058..5059, - ), - ( - Token( - "return", - ), - 5065..5071, - ), - ( - Token( - "false", - ), - 5072..5077, - ), - ( - Token( - "}", - ), - 5078..5079, - ), - ( - Token( - "/// Reverses text using `rev`.\n", - ), - 5081..5112, - ), - ( - Token( - "pub", - ), - 5112..5115, - ), - ( - Token( - "fun", - ), - 5116..5119, - ), - ( - Token( - "reversed", - ), - 5120..5128, - ), - ( - Token( - "(", - ), - 5128..5129, - ), - ( - Token( - "text", - ), - 5129..5133, - ), - ( - Token( - ":", - ), - 5133..5134, - ), - ( - Token( - "Text", - ), - 5135..5139, - ), - ( - Token( - ")", - ), - 5139..5140, - ), - ( - Token( - ":", - ), - 5140..5141, - ), - ( - Token( - "Text", - ), - 5142..5146, - ), - ( - Token( - "{", - ), - 5147..5148, - ), - ( - Token( - "return", - ), - 5153..5159, - ), - ( - Token( - "trust", - ), - 5160..5165, - ), - ( - Token( - "$", - ), - 5166..5167, - ), - ( - Token( - "echo", - ), - 5168..5172, - ), - ( - Token( - "\"", - ), - 5173..5174, - ), - ( - Token( - "{", - ), - 5174..5175, - ), - ( - Token( - "text", - ), - 5175..5179, - ), - ( - Token( - "}", - ), - 5179..5180, - ), - ( - Token( - "\"", - ), - 5180..5181, - ), - ( - Token( - "|", - ), - 5182..5183, - ), - ( - Token( - "rev", - ), - 5184..5187, - ), - ( - Token( - "$", - ), - 5188..5189, - ), - ( - Token( - "}", - ), - 5190..5191, - ), - ( - Token( - "/// Checks if text starts with a value.\n", - ), - 5193..5233, - ), - ( - Token( - "pub", - ), - 5233..5236, - ), - ( - Token( - "fun", - ), - 5237..5240, - ), - ( - Token( - "starts_with", - ), - 5241..5252, - ), - ( - Token( - "(", - ), - 5252..5253, - ), - ( - Token( - "text", - ), - 5253..5257, - ), - ( - Token( - ":", - ), - 5257..5258, - ), - ( - Token( - "Text", - ), - 5259..5263, - ), - ( - Token( - ",", - ), - 5263..5264, - ), - ( - Token( - "prefix", - ), - 5265..5271, - ), - ( - Token( - ":", - ), - 5271..5272, - ), - ( - Token( - "Text", - ), - 5273..5277, - ), - ( - Token( - ")", - ), - 5277..5278, - ), - ( - Token( - ":", - ), - 5278..5279, - ), - ( - Token( - "Bool", - ), - 5280..5284, - ), - ( - Token( - "{", - ), - 5285..5286, - ), - ( - Token( - "let", - ), - 5289..5292, - ), - ( - Token( - "result", - ), - 5293..5299, - ), - ( - Token( - "=", - ), - 5300..5301, - ), - ( - Token( - "trust", - ), - 5302..5307, - ), - ( - Token( - "$", - ), - 5308..5309, - ), - ( - Token( - "if", - ), - 5310..5312, - ), - ( - Token( - "[", - ), - 5313..5314, - ), - ( - Token( - "[", - ), - 5314..5315, - ), - ( - Token( - "\"", - ), - 5316..5317, - ), - ( - Token( - "{", - ), - 5317..5318, - ), - ( - Token( - "text", - ), - 5318..5322, - ), - ( - Token( - "}", - ), - 5322..5323, - ), - ( - Token( - "\"", - ), - 5323..5324, - ), - ( - Token( - "==", - ), - 5325..5327, - ), - ( - Token( - "\"", - ), - 5328..5329, - ), - ( - Token( - "{", - ), - 5329..5330, - ), - ( - Token( - "prefix", - ), - 5330..5336, - ), - ( - Token( - "}", - ), - 5336..5337, - ), - ( - Token( - "\"", - ), - 5337..5338, - ), - ( - Token( - "*", - ), - 5338..5339, - ), - ( - Token( - "]", - ), - 5340..5341, - ), - ( - Token( - "]", - ), - 5341..5342, - ), - ( - Token( - ";", - ), - 5342..5343, - ), - ( - Token( - "then", - ), - 5344..5348, - ), - ( - Token( - "echo", - ), - 5353..5357, + 5009..5010, ), ( Token( - "1", + "false", ), - 5358..5359, + 5011..5016, ), ( Token( - "fi", + ")", ), - 5362..5364, + 5016..5017, ), ( Token( - "$", + "{", ), - 5365..5366, + 5018..5019, ), ( Token( "return", ), - 5370..5376, + 5032..5038, ), ( Token( - "result", + "true", ), - 5377..5383, + 5039..5043, ), ( Token( - "==", + "}", ), - 5384..5386, + 5052..5053, ), ( Token( - "\"", + "}", ), - 5387..5388, + 5058..5059, ), ( Token( - "1", + "return", ), - 5388..5389, + 5065..5071, ), ( Token( - "\"", + "false", ), - 5389..5390, + 5072..5077, ), ( Token( "}", ), - 5391..5392, + 5078..5079, ), ( Token( - "/// Checks if text ends with a value.\n", + "/// Reverses text using `rev`.\n", ), - 5394..5432, + 5081..5112, ), ( Token( "pub", ), - 5432..5435, + 5112..5115, ), ( Token( "fun", ), - 5436..5439, + 5116..5119, ), ( Token( - "ends_with", + "reversed", ), - 5440..5449, + 5120..5128, ), ( Token( "(", ), - 5449..5450, + 5128..5129, ), ( Token( "text", ), - 5450..5454, - ), - ( - Token( - ":", - ), - 5454..5455, - ), - ( - Token( - "Text", - ), - 5456..5460, - ), - ( - Token( - ",", - ), - 5460..5461, - ), - ( - Token( - "suffix", - ), - 5462..5468, + 5129..5133, ), ( Token( ":", ), - 5468..5469, + 5133..5134, ), ( Token( "Text", ), - 5470..5474, + 5135..5139, ), ( Token( ")", ), - 5474..5475, + 5139..5140, ), ( Token( ":", ), - 5475..5476, + 5140..5141, ), ( Token( - "Bool", + "Text", ), - 5477..5481, + 5142..5146, ), ( Token( "{", ), - 5482..5483, - ), - ( - Token( - "let", - ), - 5486..5489, - ), - ( - Token( - "result", - ), - 5490..5496, + 5147..5148, ), ( Token( - "=", + "return", ), - 5497..5498, + 5153..5159, ), ( Token( "trust", ), - 5499..5504, + 5160..5165, ), ( Token( "$", ), - 5505..5506, - ), - ( - Token( - "if", - ), - 5507..5509, - ), - ( - Token( - "[", - ), - 5510..5511, - ), - ( - Token( - "[", - ), - 5511..5512, + 5166..5167, ), ( Token( - "\"", + "echo \"", ), - 5513..5514, + 5167..5174, ), ( Token( "{", ), - 5514..5515, + 5174..5175, ), ( Token( "text", ), - 5515..5519, + 5175..5179, ), ( Token( "}", ), - 5519..5520, - ), - ( - Token( - "\"", - ), - 5520..5521, - ), - ( - Token( - "==", - ), - 5522..5524, + 5179..5180, ), ( Token( - "*", + "\" | rev ", ), - 5525..5526, + 5180..5188, ), ( Token( - "\"", + "$", ), - 5526..5527, + 5188..5189, ), ( Token( - "{", + "}", ), - 5527..5528, + 5190..5191, ), ( Token( - "suffix", + "/// Checks if text starts with a value.\n", ), - 5528..5534, + 5193..5233, ), ( Token( - "}", + "pub", ), - 5534..5535, + 5233..5236, ), ( Token( - "\"", + "fun", ), - 5535..5536, + 5237..5240, ), ( Token( - "]", + "starts_with", ), - 5537..5538, + 5241..5252, ), ( Token( - "]", + "(", ), - 5538..5539, + 5252..5253, ), ( Token( - ";", + "text", ), - 5539..5540, + 5253..5257, ), ( Token( - "then", + ":", ), - 5541..5545, + 5257..5258, ), ( Token( - "echo", + "Text", ), - 5550..5554, + 5259..5263, ), ( Token( - "1", + ",", ), - 5555..5556, + 5263..5264, ), ( Token( - "fi", + "prefix", ), - 5559..5561, + 5265..5271, ), ( Token( - "$", + ":", ), - 5562..5563, + 5271..5272, ), ( Token( - "return", + "Text", ), - 5567..5573, + 5273..5277, ), ( Token( - "result", + ")", ), - 5574..5580, + 5277..5278, ), ( Token( - "==", + ":", ), - 5581..5583, + 5278..5279, ), ( Token( - "\"", + "Bool", ), - 5584..5585, + 5280..5284, ), ( Token( - "1", + "{", ), - 5585..5586, + 5285..5286, ), ( Token( - "\"", + "let", ), - 5586..5587, + 5289..5292, ), ( Token( - "}", + "result", ), - 5588..5589, + 5293..5299, ), ( Token( - "/// Returns a substring from `text` starting at the given `index` (0-based).\n", + "=", ), - 5591..5668, + 5300..5301, ), ( Token( - "///\n", + "trust", ), - 5668..5672, + 5302..5307, ), ( Token( - "/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.\n", + "$", ), - 5672..5784, + 5308..5309, ), ( Token( - "/// If `length` is provided, the substring will include `length` characters; otherwise, it slices to the end of `text`.\n", + "if [[ \"", ), - 5784..5904, + 5309..5317, ), ( Token( - "/// If `length` is negative, an empty string is returned.\n", + "{", ), - 5904..5962, + 5317..5318, ), ( Token( - "pub", + "text", ), - 5962..5965, + 5318..5322, ), ( Token( - "fun", + "}", ), - 5966..5969, + 5322..5323, ), ( Token( - "slice", + "\" == \"", ), - 5970..5975, + 5323..5329, ), ( Token( - "(", + "{", ), - 5975..5976, + 5329..5330, ), ( Token( - "text", + "prefix", ), - 5976..5980, + 5330..5336, ), ( Token( - ":", + "}", ), - 5980..5981, + 5336..5337, ), ( Token( - "Text", + "\"* ]]; then\n echo 1\n fi ", ), - 5982..5986, + 5337..5365, ), ( Token( - ",", + "$", ), - 5986..5987, + 5365..5366, ), ( Token( - "index", + "return", ), - 5988..5993, + 5370..5376, ), ( Token( - ":", + "result", ), - 5993..5994, + 5377..5383, ), ( Token( - "Num", + "==", ), - 5995..5998, + 5384..5386, ), ( Token( - ",", + "\"", ), - 5998..5999, + 5387..5388, ), ( Token( - "length", + "1", ), - 6000..6006, + 5388..5389, ), ( Token( - ":", + "\"", ), - 6006..6007, + 5389..5390, ), ( Token( - "Num", + "}", ), - 6008..6011, + 5391..5392, ), ( Token( - "=", + "/// Checks if text ends with a value.\n", ), - 6012..6013, + 5394..5432, ), ( Token( - "0", + "pub", ), - 6014..6015, + 5432..5435, ), ( Token( - ")", + "fun", ), - 6015..6016, + 5436..5439, ), ( Token( - ":", + "ends_with", ), - 6016..6017, + 5440..5449, ), ( Token( - "Text", + "(", ), - 6018..6022, + 5449..5450, ), ( Token( - "{", + "text", ), - 6023..6024, + 5450..5454, ), ( Token( - "if", + ":", ), - 6029..6031, + 5454..5455, ), ( Token( - "length", + "Text", ), - 6032..6038, + 5456..5460, ), ( Token( - "==", + ",", ), - 6039..6041, + 5460..5461, ), ( Token( - "0", + "suffix", ), - 6042..6043, + 5462..5468, ), ( Token( ":", ), - 6043..6044, + 5468..5469, ), ( Token( - "length", + "Text", ), - 6045..6051, + 5470..5474, ), ( Token( - "=", + ")", ), - 6052..6053, + 5474..5475, ), ( Token( - "len", + ":", ), - 6054..6057, + 5475..5476, ), ( Token( - "(", + "Bool", ), - 6057..6058, + 5477..5481, ), ( Token( - "text", + "{", ), - 6058..6062, + 5482..5483, ), ( Token( - ")", + "let", ), - 6062..6063, + 5486..5489, ), ( Token( - "-", + "result", ), - 6064..6065, + 5490..5496, ), ( Token( - "index", + "=", ), - 6066..6071, + 5497..5498, ), ( Token( - "if", + "trust", ), - 6076..6078, + 5499..5504, ), ( Token( - "length", + "$", ), - 6079..6085, + 5505..5506, ), ( Token( - "<=", + "if [[ \"", ), - 6086..6088, + 5506..5514, ), ( Token( - "0", + "{", ), - 6089..6090, + 5514..5515, ), ( Token( - ":", + "text", ), - 6090..6091, + 5515..5519, ), ( Token( - "return", + "}", ), - 6092..6098, + 5519..5520, ), ( Token( - "\"", + "\" == *\"", ), - 6099..6100, + 5520..5527, ), ( Token( - "\"", + "{", ), - 6100..6101, + 5527..5528, ), ( Token( - "return", + "suffix", ), - 6106..6112, + 5528..5534, ), ( Token( - "trust", + "}", ), - 6113..6118, + 5534..5535, ), ( Token( - "$", + "\" ]]; then\n echo 1\n fi ", ), - 6119..6120, + 5535..5562, ), ( Token( - "printf", + "$", ), - 6121..6127, + 5562..5563, ), ( Token( - "\"", + "return", ), - 6128..6129, + 5567..5573, ), ( Token( - "%", + "result", ), - 6129..6130, + 5574..5580, ), ( Token( - ".", + "==", ), - 6130..6131, + 5581..5583, ), ( Token( - "{", + "\"", ), - 6131..6132, + 5584..5585, ), ( Token( - "length", + "1", ), - 6132..6138, + 5585..5586, ), ( Token( - "}", + "\"", ), - 6138..6139, + 5586..5587, ), ( Token( - "s", + "}", ), - 6139..6140, + 5588..5589, ), ( Token( - "\"", + "/// Returns a substring from `text` starting at the given `index` (0-based).\n", ), - 6140..6141, + 5591..5668, ), ( Token( - "\"", + "///\n", ), - 6142..6143, + 5668..5672, ), ( Token( - "\\", + "/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.\n", ), - 6143..6144, + 5672..5784, ), ( Token( - "$", + "/// If `length` is provided, the substring will include `length` characters; otherwise, it slices to the end of `text`.\n", ), - 6144..6145, + 5784..5904, ), ( Token( - "\\", + "/// If `length` is negative, an empty string is returned.\n", ), - 6145..6146, + 5904..5962, ), ( Token( - "{", + "pub", ), - 6146..6147, + 5962..5965, ), ( Token( - "text", + "fun", ), - 6147..6151, + 5966..5969, ), ( Token( - ":", + "slice", ), - 6151..6152, + 5970..5975, ), ( Token( - "{", + "(", ), - 6152..6153, + 5975..5976, ), ( Token( - "index", + "text", ), - 6153..6158, + 5976..5980, ), ( Token( - "}", + ":", ), - 6158..6159, + 5980..5981, ), ( Token( - "}", + "Text", ), - 6159..6160, + 5982..5986, ), ( Token( - "\"", + ",", ), - 6160..6161, + 5986..5987, ), ( Token( - "$", + "index", ), - 6162..6163, + 5988..5993, ), ( Token( - "}", + ":", ), - 6164..6165, + 5993..5994, ), ( Token( - "/// Returns the character from `text` at the specified `index` (0-based).\n", + "Num", ), - 6167..6241, + 5995..5998, ), ( Token( - "///\n", + ",", ), - 6241..6245, + 5998..5999, ), ( Token( - "/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.\n", + "length", ), - 6245..6357, + 6000..6006, ), ( Token( - "pub", + ":", ), - 6357..6360, + 6006..6007, ), ( Token( - "fun", + "Num", ), - 6361..6364, + 6008..6011, ), ( Token( - "char_at", + "=", ), - 6365..6372, + 6012..6013, ), ( Token( - "(", + "0", ), - 6372..6373, + 6014..6015, ), ( Token( - "text", + ")", ), - 6373..6377, + 6015..6016, ), ( Token( ":", ), - 6377..6378, + 6016..6017, ), ( Token( "Text", ), - 6379..6383, + 6018..6022, ), ( Token( - ",", + "{", ), - 6383..6384, + 6023..6024, ), ( Token( - "index", + "if", ), - 6385..6390, + 6029..6031, ), ( Token( - ":", + "length", ), - 6390..6391, + 6032..6038, ), ( Token( - "Num", + "==", ), - 6392..6395, + 6039..6041, ), ( Token( - ")", + "0", ), - 6395..6396, + 6042..6043, ), ( Token( ":", ), - 6396..6397, + 6043..6044, ), ( Token( - "Text", + "length", ), - 6398..6402, + 6045..6051, ), ( Token( - "{", + "=", ), - 6403..6404, + 6052..6053, ), ( Token( - "return", + "len", ), - 6409..6415, + 6054..6057, ), ( Token( - "trust", + "(", ), - 6416..6421, + 6057..6058, ), ( Token( - "$", + "text", ), - 6422..6423, + 6058..6062, ), ( Token( - "printf", + ")", ), - 6424..6430, + 6062..6063, ), ( Token( - "\"", + "-", ), - 6431..6432, + 6064..6065, ), ( Token( - "%", + "index", ), - 6432..6433, + 6066..6071, ), ( Token( - ".", + "if", ), - 6433..6434, + 6076..6078, ), ( Token( - "1s", + "length", ), - 6434..6436, + 6079..6085, ), ( Token( - "\"", + "<=", ), - 6436..6437, + 6086..6088, ), ( Token( - "\"", + "0", ), - 6438..6439, + 6089..6090, ), ( Token( - "\\", + ":", ), - 6439..6440, + 6090..6091, ), ( Token( - "$", + "return", ), - 6440..6441, + 6092..6098, ), ( Token( - "\\", + "\"", ), - 6441..6442, + 6099..6100, ), ( Token( - "{", + "\"", ), - 6442..6443, + 6100..6101, ), ( Token( - "text", + "return", ), - 6443..6447, + 6106..6112, ), ( Token( - ":", + "trust", ), - 6447..6448, + 6113..6118, ), ( Token( - "{", + "$", ), - 6448..6449, + 6119..6120, ), ( Token( - "index", + "printf \"%.", ), - 6449..6454, + 6120..6131, ), ( Token( - "}", + "{", ), - 6454..6455, + 6131..6132, ), ( Token( - "}", + "length", ), - 6455..6456, + 6132..6138, ), ( Token( - "\"", + "}", ), - 6456..6457, + 6138..6139, ), ( Token( - "$", + "s\" \"", ), - 6458..6459, + 6139..6143, ), ( Token( - "}", + "\\$", ), - 6460..6461, + 6143..6145, ), ( Token( - "/// Capitalize the first letter of the given `text`.\n", + "\\{", ), - 6463..6516, + 6145..6147, ), ( Token( - "#", + "text:", ), - 6516..6517, + 6147..6152, ), ( Token( - "[", + "{", ), - 6517..6518, + 6152..6153, ), ( Token( - "allow_absurd_cast", + "index", ), - 6518..6535, + 6153..6158, ), ( Token( - "]", + "}", ), - 6535..6536, + 6158..6159, ), ( Token( - "pub", + "}\" ", ), - 6537..6540, + 6159..6162, ), ( Token( - "fun", + "$", ), - 6541..6544, + 6162..6163, ), ( Token( - "capitalized", + "}", ), - 6545..6556, + 6164..6165, ), ( Token( - "(", + "/// Returns the character from `text` at the specified `index` (0-based).\n", ), - 6556..6557, + 6167..6241, ), ( Token( - "text", + "///\n", ), - 6557..6561, + 6241..6245, ), ( Token( - ":", + "/// If `index` is negative, the substring starts from the end of `text` based on the absolute value of `index`.\n", ), - 6561..6562, + 6245..6357, ), ( Token( - "Text", + "pub", ), - 6563..6567, + 6357..6360, ), ( Token( - ")", + "fun", ), - 6567..6568, + 6361..6364, ), ( Token( - ":", + "char_at", ), - 6568..6569, + 6365..6372, ), ( Token( - "Text", + "(", ), - 6570..6574, + 6372..6373, ), ( Token( - "{", + "text", ), - 6575..6576, + 6373..6377, ), ( Token( - "trust", + ":", ), - 6581..6586, + 6377..6378, ), ( Token( - "{", + "Text", ), - 6587..6588, + 6379..6383, ), ( Token( - "if", + ",", ), - 6597..6599, + 6383..6384, ), ( Token( - "len", + "index", ), - 6600..6603, + 6385..6390, ), ( Token( - "(", + ":", ), - 6603..6604, + 6390..6391, ), ( Token( - "text", + "Num", ), - 6604..6608, + 6392..6395, ), ( Token( ")", ), - 6608..6609, + 6395..6396, ), ( Token( - "==", + ":", ), - 6610..6612, + 6396..6397, ), ( Token( - "0", + "Text", ), - 6613..6614, + 6398..6402, ), ( Token( "{", ), - 6615..6616, + 6403..6404, ), ( Token( "return", ), - 6629..6635, + 6409..6415, ), ( Token( - "text", + "trust", ), - 6636..6640, + 6416..6421, ), ( Token( - "}", + "$", ), - 6649..6650, + 6422..6423, ), ( Token( - "const", + "printf \"%.1s\" \"", ), - 6659..6664, + 6423..6439, ), ( Token( - "bash_version", + "\\$", ), - 6665..6677, + 6439..6441, ), ( Token( - "=", + "\\{", ), - 6678..6679, + 6441..6443, ), ( Token( - "$", + "text:", ), - 6680..6681, + 6443..6448, ), ( Token( - "echo", + "{", ), - 6682..6686, + 6448..6449, ), ( Token( - "\\", + "index", ), - 6687..6688, + 6449..6454, ), ( Token( - "\"", + "}", ), - 6688..6689, + 6454..6455, ), ( Token( - "\\", + "}\" ", ), - 6689..6690, + 6455..6458, ), ( Token( "$", ), - 6690..6691, + 6458..6459, ), ( Token( - "\\", + "}", ), - 6691..6692, + 6460..6461, ), ( Token( - "{", + "/// Capitalize the first letter of the given `text`.\n", ), - 6692..6693, + 6463..6516, ), ( Token( - "BASH_VERSINFO", + "#[", ), - 6693..6706, + 6516..6518, ), ( Token( - "[", + "allow_absurd_cast", ), - 6706..6707, + 6518..6535, ), ( Token( - "0", + "]", ), - 6707..6708, + 6535..6536, ), ( Token( - "]", + "pub", ), - 6708..6709, + 6537..6540, ), ( Token( - "}", + "fun", ), - 6709..6710, + 6541..6544, ), ( Token( - "\\", + "capitalized", ), - 6710..6711, + 6545..6556, ), ( Token( - "\"", + "(", ), - 6711..6712, + 6556..6557, ), ( Token( - "$", + "text", ), - 6713..6714, + 6557..6561, ), ( Token( - "as", + ":", ), - 6715..6717, + 6561..6562, ), ( Token( - "Num", + "Text", ), - 6718..6721, + 6563..6567, ), ( Token( - "if", + ")", ), - 6730..6732, + 6567..6568, + ), + ( + Token( + ":", + ), + 6568..6569, ), ( Token( - "bash_version", + "Text", ), - 6733..6745, + 6570..6574, ), ( Token( - ">=", + "{", ), - 6746..6748, + 6575..6576, ), ( Token( - "4", + "trust", ), - 6749..6750, + 6581..6586, ), ( Token( "{", ), - 6751..6752, + 6587..6588, ), ( Token( - "return", + "if", ), - 6765..6771, + 6597..6599, ), ( Token( - "$", + "len", ), - 6772..6773, + 6600..6603, ), ( Token( - "echo", + "(", ), - 6774..6778, + 6603..6604, ), ( Token( - "\\", + "text", ), - 6779..6780, + 6604..6608, ), ( Token( - "\"", + ")", ), - 6780..6781, + 6608..6609, ), ( Token( - "\\", + "==", ), - 6781..6782, + 6610..6612, ), ( Token( - "$", + "0", ), - 6782..6783, + 6613..6614, ), ( Token( - "\\", + "{", ), - 6783..6784, + 6615..6616, ), ( Token( - "{", + "return", ), - 6784..6785, + 6629..6635, ), ( Token( - "text^", + "text", ), - 6785..6790, + 6636..6640, ), ( Token( "}", ), - 6790..6791, + 6649..6650, ), ( Token( - "\\", + "const", ), - 6791..6792, + 6659..6664, ), ( Token( - "\"", + "bash_version", ), - 6792..6793, + 6665..6677, ), ( Token( - "$", + "=", ), - 6794..6795, + 6678..6679, ), ( Token( - "}", + "$", ), - 6804..6805, + 6680..6681, ), ( Token( - "// GNU sed supports \\U\n", + "echo ", ), - 6814..6837, + 6681..6687, ), ( Token( - "$", + "\\\"", ), - 6845..6846, + 6687..6689, ), ( Token( - "re", + "\\$", ), - 6847..6849, + 6689..6691, ), ( Token( - "=", + "\\{", ), - 6849..6850, + 6691..6693, ), ( Token( - "'", + "BASH_VERSINFO[0]}", ), - 6850..6851, + 6693..6710, ), ( Token( - "\\", + "\\\"", ), - 6851..6852, + 6710..6712, ), ( Token( - "bCopyright", + " ", ), - 6852..6862, + 6712..6713, ), ( Token( - "\\", + "$", ), - 6862..6863, + 6713..6714, ), ( Token( - "b", + "as", ), - 6863..6864, + 6715..6717, ), ( Token( - ".", + "Num", ), - 6864..6865, + 6718..6721, ), ( Token( - "+", + "if", ), - 6865..6866, + 6730..6732, ), ( Token( - "\\", + "bash_version", ), - 6866..6867, + 6733..6745, ), ( Token( - "bFree", + ">=", ), - 6867..6872, + 6746..6748, ), ( Token( - "Software", + "4", ), - 6873..6881, + 6749..6750, ), ( Token( - "Foundation", + "{", ), - 6882..6892, + 6751..6752, ), ( Token( - "\\", + "return", ), - 6892..6893, + 6765..6771, ), ( Token( - "b'", + "$", ), - 6893..6895, + 6772..6773, ), ( Token( - ";", + "echo ", ), - 6895..6896, + 6773..6779, ), ( Token( - "[", + "\\\"", ), - 6897..6898, + 6779..6781, ), ( Token( - "[", + "\\$", ), - 6898..6899, + 6781..6783, ), ( Token( - "\\", + "\\{", ), - 6900..6901, + 6783..6785, ), ( Token( - "$", + "text^}", ), - 6901..6902, + 6785..6791, ), ( Token( - "(", + "\\\"", ), - 6902..6903, + 6791..6793, ), ( Token( - "sed", + " ", ), - 6903..6906, + 6793..6794, ), ( Token( - "-", + "$", ), - 6907..6908, + 6794..6795, ), ( Token( - "-", + "}", ), - 6908..6909, + 6804..6805, ), ( Token( - "version", + "// GNU sed supports \\U\n", ), - 6909..6916, + 6814..6837, ), ( Token( - "2", + "$", ), - 6917..6918, + 6845..6846, ), ( Token( - ">", + "re='", ), - 6918..6919, + 6846..6851, ), ( Token( - "/", + "\\b", ), - 6919..6920, + 6851..6853, ), ( Token( - "dev", + "Copyright", ), - 6920..6923, + 6853..6862, ), ( Token( - "/", + "\\b", ), - 6923..6924, + 6862..6864, ), ( Token( - "null", + ".+", ), - 6924..6928, + 6864..6866, ), ( Token( - ")", + "\\b", ), - 6928..6929, + 6866..6868, ), ( Token( - "=", + "Free Software Foundation", ), - 6930..6931, + 6868..6892, ), ( Token( - "~", + "\\b", ), - 6931..6932, + 6892..6894, ), ( Token( - "\\", + "'; [[ ", ), - 6933..6934, + 6894..6900, ), ( Token( - "$", + "\\$", ), - 6934..6935, + 6900..6902, ), ( Token( - "re", + "(sed --version 2>/dev/null) =~ ", ), - 6935..6937, + 6902..6933, ), ( Token( - "]", + "\\$", ), - 6938..6939, + 6933..6935, ), ( Token( - "]", + "re ]] ", ), - 6939..6940, + 6935..6941, ), ( Token( @@ -8525,15 +6431,9 @@ expression: tokens ), ( Token( - "echo", - ), - 6989..6993, - ), - ( - Token( - "\"", + "echo \"", ), - 6994..6995, + 6988..6995, ), ( Token( @@ -8555,57 +6455,15 @@ expression: tokens ), ( Token( - "\"", - ), - 7001..7002, - ), - ( - Token( - "|", - ), - 7003..7004, - ), - ( - Token( - "sed", - ), - 7005..7008, - ), - ( - Token( - "\"", - ), - 7009..7010, - ), - ( - Token( - "s", - ), - 7010..7011, - ), - ( - Token( - "/", - ), - 7011..7012, - ), - ( - Token( - "^", - ), - 7012..7013, - ), - ( - Token( - "\\", + "\" | sed \"s/^", ), - 7013..7014, + 7001..7013, ), ( Token( - "(", + "\\(", ), - 7014..7015, + 7013..7015, ), ( Token( @@ -8615,15 +6473,9 @@ expression: tokens ), ( Token( - "\\", - ), - 7016..7017, - ), - ( - Token( - ")", + "\\)", ), - 7017..7018, + 7016..7018, ), ( Token( @@ -8633,39 +6485,21 @@ expression: tokens ), ( Token( - "\\", - ), - 7019..7020, - ), - ( - Token( - "U", - ), - 7020..7021, - ), - ( - Token( - "\\", - ), - 7021..7022, - ), - ( - Token( - "1", + "\\U", ), - 7022..7023, + 7019..7021, ), ( Token( - "/", + "\\1", ), - 7023..7024, + 7021..7023, ), ( Token( - "\"", + "/\" ", ), - 7024..7025, + 7023..7026, ), ( Token( @@ -9071,21 +6905,9 @@ expression: tokens ), ( Token( - "printf", + "printf \"%", ), - 7395..7401, - ), - ( - Token( - "\"", - ), - 7402..7403, - ), - ( - Token( - "%", - ), - 7403..7404, + 7394..7404, ), ( Token( @@ -9107,57 +6929,9 @@ expression: tokens ), ( Token( - "s", - ), - 7412..7413, - ), - ( - Token( - "\"", - ), - 7413..7414, - ), - ( - Token( - "\"", - ), - 7415..7416, - ), - ( - Token( - "\"", - ), - 7416..7417, - ), - ( - Token( - "|", - ), - 7418..7419, - ), - ( - Token( - "tr", + "s\" \"\" | tr \" \" \"", ), - 7420..7422, - ), - ( - Token( - "\"", - ), - 7423..7424, - ), - ( - Token( - "\"", - ), - 7425..7426, - ), - ( - Token( - "\"", - ), - 7427..7428, + 7412..7428, ), ( Token( @@ -9179,9 +6953,9 @@ expression: tokens ), ( Token( - "\"", + "\" ", ), - 7433..7434, + 7433..7435, ), ( Token( @@ -9473,21 +7247,9 @@ expression: tokens ), ( Token( - "printf", + "printf \"%", ), - 7712..7718, - ), - ( - Token( - "\"", - ), - 7719..7720, - ), - ( - Token( - "%", - ), - 7720..7721, + 7711..7721, ), ( Token( @@ -9509,57 +7271,9 @@ expression: tokens ), ( Token( - "s", - ), - 7729..7730, - ), - ( - Token( - "\"", - ), - 7730..7731, - ), - ( - Token( - "\"", - ), - 7732..7733, - ), - ( - Token( - "\"", - ), - 7733..7734, - ), - ( - Token( - "|", - ), - 7735..7736, - ), - ( - Token( - "tr", + "s\" \"\" | tr \" \" \"", ), - 7737..7739, - ), - ( - Token( - "\"", - ), - 7740..7741, - ), - ( - Token( - "\"", - ), - 7742..7743, - ), - ( - Token( - "\"", - ), - 7744..7745, + 7729..7745, ), ( Token( @@ -9581,9 +7295,9 @@ expression: tokens ), ( Token( - "\"", + "\" ", ), - 7750..7751, + 7750..7752, ), ( Token( diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__unfinished_function_call-2.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__unfinished_function_call-2.snap index 033dde5..1e0b3ac 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__unfinished_function_call-2.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__unfinished_function_call-2.snap @@ -242,29 +242,11 @@ expression: result ( Text( ( - "text", - 165..169, + "text.txt", + 165..173, ), ), - 165..169, - ), - ( - Text( - ( - ".", - 169..170, - ), - ), - 169..170, - ), - ( - Text( - ( - "txt", - 170..173, - ), - ), - 170..173, + 165..173, ), ], ), diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__unfinished_function_call.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__unfinished_function_call.snap index d008c71..d7b8f2a 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha040__unfinished_function_call.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__unfinished_function_call.snap @@ -41,21 +41,9 @@ expression: tokens ), ( Token( - "std", + "std/array", ), - 37..40, - ), - ( - Token( - "/", - ), - 40..41, - ), - ( - Token( - "array", - ), - 41..46, + 37..46, ), ( Token( @@ -263,21 +251,9 @@ expression: tokens ), ( Token( - "text", - ), - 165..169, - ), - ( - Token( - ".", - ), - 169..170, - ), - ( - Token( - "txt", + "text.txt", ), - 170..173, + 165..173, ), ( Token( From db64f05ee213902eb5ebf75dfdc01b85134dbcc2 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sun, 9 Nov 2025 18:59:34 +0100 Subject: [PATCH 10/19] Updated test snapshot --- ...#mod__grammar__alpha050__stdlib_array.snap | 283 +++++++++--------- 1 file changed, 137 insertions(+), 146 deletions(-) diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap index 2301fd6..f57443e 100644 --- a/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__stdlib_array.snap @@ -2382,67 +2382,67 @@ expression: parse_unwrap(&tokenize(&stdlib)) Comment( ( DocString( - "is less than zero or not of type `Int`, an empty array is returned", + "is less than zero an empty array is returned", ), - 2596..2667, + 2596..2645, ), ), - 2596..2667, + 2596..2645, ), ), - 2596..2667, + 2596..2645, ), ( FunctionDefinition( [], ( true, - 2667..2670, + 2645..2648, ), ( "fun", - 2671..2674, + 2649..2652, ), ( "array_filled", - 2675..2687, + 2653..2665, ), [ ( Generic( ( false, - 2688..2688, + 2666..2666, ), ( "size", - 2688..2692, + 2666..2670, ), ), - 2688..2692, + 2666..2670, ), ( Optional( ( false, - 2694..2693, + 2672..2671, ), ( "value", - 2694..2699, + 2672..2677, ), None, ( Int( ( 0, - 2702..2703, + 2680..2681, ), ), - 2702..2703, + 2680..2681, ), ), - 2694..2703, + 2672..2681, ), ], None, @@ -2451,11 +2451,11 @@ expression: parse_unwrap(&tokenize(&stdlib)) VariableInit( ( "let", - 2711..2714, + 2689..2692, ), ( "array", - 2715..2720, + 2693..2698, ), ( Expression( @@ -2466,26 +2466,37 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "value", - 2724..2729, + 2702..2707, ), ), - 2724..2729, + 2702..2707, ), ], ), - 2723..2730, + 2701..2708, ), ), - 2723..2730, + 2701..2708, ), ), - 2711..2730, + 2689..2708, + ), + ( + Comment( + ( + Comment( + "Used for type casting array", + ), + 2709..2740, + ), + ), + 2709..2740, ), ( VariableSet( ( "array", - 2735..2740, + 2744..2749, ), ( ArrayIndex( @@ -2493,10 +2504,10 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "array", - 2743..2748, + 2752..2757, ), ), - 2743..2748, + 2752..2757, ), ( Range( @@ -2504,72 +2515,115 @@ expression: parse_unwrap(&tokenize(&stdlib)) Int( ( 0, - 2749..2750, + 2758..2759, ), ), - 2749..2750, + 2758..2759, ), ( Int( ( 0, - 2752..2753, + 2761..2762, ), ), - 2752..2753, + 2761..2762, ), ), - 2749..2753, + 2758..2762, ), ), - 2743..2753, + 2752..2762, + ), + ), + 2744..2763, + ), + ( + Comment( + ( + Comment( + "Resetting the array size to 0", + ), + 2764..2797, ), ), - 2735..2754, + 2764..2797, ), ( IfCondition( ( "if", - 2759..2761, + 2802..2804, ), ( IfCondition( ( - Not( + Or( ( - "not", - 2762..2765, + Le( + ( + Var( + ( + "size", + 2805..2809, + ), + ), + 2805..2809, + ), + ( + Int( + ( + 0, + 2813..2814, + ), + ), + 2813..2814, + ), + ), + 2805..2814, ), ( - Parentheses( + "or", + 2815..2817, + ), + ( + Not( ( - Is( + "not", + 2818..2821, + ), + ( + Parentheses( ( - Var( + Is( + ( + Var( + ( + "size", + 2823..2827, + ), + ), + 2823..2827, + ), ( - "size", - 2767..2771, + "is", + 2828..2830, + ), + ( + Int, + 2831..2834, ), ), - 2767..2771, - ), - ( - "is", - 2772..2774, - ), - ( - Int, - 2775..2778, + 2823..2834, ), ), - 2767..2778, + 2822..2835, ), ), - 2766..2779, + 2822..2835, ), ), - 2766..2779, + 2805..2835, ), ( Singleline( @@ -2577,51 +2631,51 @@ expression: parse_unwrap(&tokenize(&stdlib)) Return( ( "return", - 2789..2795, + 2845..2851, ), Some( ( Var( ( "array", - 2796..2801, + 2852..2857, ), ), - 2796..2801, + 2852..2857, ), ), ), - 2789..2801, + 2845..2857, ), ), - 2779..2801, + 2835..2857, ), ), - 2762..2801, + 2805..2857, ), [], None, ), - 2759..2801, + 2802..2857, ), ( IterLoop( ( "for", - 2806..2809, + 2863..2866, ), ( Single( ( "_", - 2810..2811, + 2867..2868, ), ), - 2810..2811, + 2867..2868, ), ( "in", - 2812..2814, + 2869..2871, ), ( Range( @@ -2629,85 +2683,22 @@ expression: parse_unwrap(&tokenize(&stdlib)) Int( ( 0, - 2815..2816, + 2872..2873, ), ), - 2815..2816, + 2872..2873, ), ( - Parentheses( + Var( ( - Ternary( - ( - Ge( - ( - Cast( - ( - Var( - ( - "size", - 2819..2823, - ), - ), - 2819..2823, - ), - ( - "as", - 2824..2826, - ), - ( - Int, - 2827..2830, - ), - ), - 2819..2830, - ), - ( - Int( - ( - 0, - 2834..2835, - ), - ), - 2834..2835, - ), - ), - 2819..2835, - ), - ( - "then", - 2836..2840, - ), - ( - Var( - ( - "size", - 2841..2845, - ), - ), - 2841..2845, - ), - ( - "else", - 2846..2850, - ), - ( - Int( - ( - 0, - 2851..2852, - ), - ), - 2851..2852, - ), - ), - 2819..2852, + "size", + 2875..2879, ), ), - 2818..2853, + 2875..2879, ), ), - 2815..2853, + 2872..2879, ), ( Singleline( @@ -2715,7 +2706,7 @@ expression: parse_unwrap(&tokenize(&stdlib)) ShorthandAdd( ( "array", - 2863..2868, + 2889..2894, ), ( Array( @@ -2724,46 +2715,46 @@ expression: parse_unwrap(&tokenize(&stdlib)) Var( ( "value", - 2873..2878, + 2899..2904, ), ), - 2873..2878, + 2899..2904, ), ], ), - 2872..2879, + 2898..2905, ), ), - 2863..2879, + 2889..2905, ), ), - 2853..2879, + 2879..2905, ), ), - 2806..2879, + 2863..2905, ), ( Return( ( "return", - 2884..2890, + 2911..2917, ), Some( ( Var( ( "array", - 2891..2896, + 2918..2923, ), ), - 2891..2896, + 2918..2923, ), ), ), - 2884..2896, + 2911..2923, ), ], ), - 2667..2898, + 2645..2925, ), ] From aab896d8228f040a88b06eda06e3a376ce48df3e Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sun, 9 Nov 2025 19:15:35 +0100 Subject: [PATCH 11/19] Replaced old pipeline tool --- .github/workflows/quality-check.yml | 7 ++----- .github/workflows/release.yml | 6 ++++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index 5d64ec8..bd93996 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -13,9 +13,8 @@ jobs: uses: actions/checkout@v4 - name: Set up Rust - uses: actions-rs/toolchain@v1 + uses: dtolnay/rust-toolchain@1.90.0 with: - toolchain: "1.90.0" components: rustfmt, clippy - name: Cargo check @@ -36,9 +35,7 @@ jobs: uses: actions/checkout@v4 - name: Set up Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: "1.90.0" + uses: dtolnay/rust-toolchain@1.90.0 - name: Install nextest uses: taiki-e/install-action@nextest diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 84a9238..b630489 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -113,6 +113,8 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + - name: Set up Rust + uses: dtolnay/rust-toolchain@1.90.0 - uses: swatinem/rust-cache@v2 with: key: ${{ join(matrix.targets, '-') }} @@ -167,6 +169,8 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + - name: Set up Rust + uses: dtolnay/rust-toolchain@1.90.0 - name: Install cargo-dist shell: bash run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.20.0/cargo-dist-installer.sh | sh" @@ -341,6 +345,8 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + - name: Set up Rust + uses: dtolnay/rust-toolchain@1.90.0 - name: Install cargo-dist run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.20.0/cargo-dist-installer.sh | sh" # Fetch artifacts from scratch-storage From c1945d98895585fe363546901e0c3a03c66aa527 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sun, 9 Nov 2025 19:30:39 +0100 Subject: [PATCH 12/19] Added nightly flag --- .github/workflows/quality-check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index bd93996..e3fc7d8 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -21,7 +21,7 @@ jobs: run: cargo clippy --all-targets --all-features -- -D warnings - name: Format check - run: cargo fmt --all -- --check + run: cargo +nightly fmt --all -- --check test: needs: From ba166100ea44170faf0d58d6125d483dd657ed95 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sun, 9 Nov 2025 19:40:11 +0100 Subject: [PATCH 13/19] Added nightly rust --- .github/workflows/quality-check.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index e3fc7d8..71afd4c 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -12,6 +12,11 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Install minimal nightly (for fmt) + uses: dtolnay/rust-toolchain@nightly + with: + components: rustfmt + - name: Set up Rust uses: dtolnay/rust-toolchain@1.90.0 with: From 889ec9bd3c4eb25480b8edc9d0598d008b462dc8 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sun, 9 Nov 2025 19:56:39 +0100 Subject: [PATCH 14/19] Added build for tests step --- .github/workflows/quality-check.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index 71afd4c..fb661b5 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -66,6 +66,9 @@ jobs: args: | build ./run_coverage.ab ./run_coverage.sh + - name: Build project + run: cargo build --tests + - name: Test coverage run: ./run_coverage.sh xml From 29a41ce526e6acffa07db3486b2069b18df16080 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Sun, 9 Nov 2025 22:40:00 +0100 Subject: [PATCH 15/19] Testing coverage pipeline --- .github/workflows/quality-check.yml | 11 +---------- codecov.yml | 7 +++++++ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index fb661b5..3bde4ad 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -60,17 +60,8 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Build script - uses: docker://ghcr.io/amber-lang/amber:alpine-0.4.0-alpha - with: - args: | - build ./run_coverage.ab ./run_coverage.sh - - - name: Build project - run: cargo build --tests - - name: Test coverage - run: ./run_coverage.sh xml + run: cargo tarpaulin --verbose --all-features --workspace --timeout 120 --out xml - name: Upload to codecov.io uses: codecov/codecov-action@v2 diff --git a/codecov.yml b/codecov.yml index df8bb48..bc4dd0a 100644 --- a/codecov.yml +++ b/codecov.yml @@ -11,6 +11,10 @@ flags: paths: - src/grammar/alpha040/ - src/analysis/alpha040/ + 0.5.0-alpha: + paths: + - src/grammar/alpha050/ + - src/analysis/alpha050/ coverage: status: @@ -34,6 +38,9 @@ coverage: 0.4.0-alpha: flags: - 0.4.0-alpha + 0.5.0-alpha: + flags: + - 0.5.0-alpha patch: default: target: 100% From 9159e1c12ece0af7ae144472dfd76d5ef056c71e Mon Sep 17 00:00:00 2001 From: KrosFire Date: Mon, 10 Nov 2025 14:08:01 +0100 Subject: [PATCH 16/19] Added more tests --- codecov.yml | 2 +- tests/grammar/alpha034.rs | 211 ++++++++++++++++++ tests/grammar/alpha035.rs | 119 ++++++++++ tests/grammar/alpha040.rs | 119 ++++++++++ tests/grammar/alpha050.rs | 108 +++++++++ ...grammar__alpha034__brace_depth_nested.snap | 72 ++++++ ...grammar__alpha034__brace_depth_simple.snap | 42 ++++ ...mar__alpha034__brace_no_interpolation.snap | 48 ++++ ..._grammar__alpha034__command_backslash.snap | 30 +++ ...d__grammar__alpha034__command_escapes.snap | 48 ++++ ...mmar__alpha034__command_interpolation.snap | 42 ++++ ...alpha034__command_multi_interpolation.snap | 90 ++++++++ ...mmar__alpha034__command_nested_braces.snap | 90 ++++++++ ...ar__alpha034__context_command_to_main.snap | 42 ++++ ...__alpha034__context_multiple_switches.snap | 60 +++++ ...mar__alpha034__context_string_to_main.snap | 48 ++++ ...mod__grammar__alpha034__dollar_at_end.snap | 18 ++ ...mod__grammar__alpha034__dollar_dollar.snap | 18 ++ ...grammar__alpha034__dollar_dollar_char.snap | 24 ++ ...rammar__alpha034__dollar_dollar_space.snap | 18 ++ ...__alpha034__dollar_followed_by_dollar.snap | 24 ++ ...mod__grammar__alpha034__dollar_no_cmd.snap | 18 ++ ...rammar__alpha034__double_dollar_brace.snap | 42 ++++ ...ar__alpha034__double_dollar_cmd_space.snap | 30 +++ ..._grammar__alpha034__double_dollar_end.snap | 18 ++ ...mar__alpha034__double_dollar_no_space.snap | 24 ++ ...r__alpha034__double_dollar_whitespace.snap | 18 ++ ...r#mod__grammar__alpha034__empty_input.snap | 5 + ...#mod__grammar__alpha034__empty_string.snap | 18 ++ ...r#mod__grammar__alpha034__just_dollar.snap | 12 + ..._grammar__alpha034__mismatched_braces.snap | 36 +++ ...r#mod__grammar__alpha034__single_char.snap | 12 + ..._grammar__alpha034__single_dollar_cmd.snap | 24 ++ ..._alpha034__string_empty_interpolation.snap | 42 ++++ ...od__grammar__alpha034__string_escapes.snap | 60 +++++ ..._alpha034__string_multi_interpolation.snap | 84 +++++++ ...ammar__alpha034__string_nested_braces.snap | 120 ++++++++++ ...__alpha034__string_trailing_backslash.snap | 24 ++ ...#mod__grammar__alpha034__token_at_end.snap | 18 ++ ...mod__grammar__alpha034__triple_dollar.snap | 24 ++ ...__grammar__alpha034__unclosed_command.snap | 18 ++ ...d__grammar__alpha034__unclosed_string.snap | 18 ++ ..._grammar__alpha035__command_backslash.snap | 30 +++ ...d__grammar__alpha035__command_escapes.snap | 48 ++++ ...mmar__alpha035__command_nested_braces.snap | 90 ++++++++ ...ar__alpha035__context_command_to_main.snap | 42 ++++ ...__alpha035__context_multiple_switches.snap | 60 +++++ ...mar__alpha035__context_string_to_main.snap | 48 ++++ ...mod__grammar__alpha035__dollar_at_end.snap | 18 ++ ...mod__grammar__alpha035__dollar_dollar.snap | 18 ++ ...grammar__alpha035__dollar_dollar_char.snap | 24 ++ ...rammar__alpha035__dollar_dollar_space.snap | 18 ++ ...rammar__alpha035__double_dollar_brace.snap | 42 ++++ ..._grammar__alpha035__double_dollar_end.snap | 18 ++ ...mar__alpha035__double_dollar_no_space.snap | 24 ++ ...r__alpha035__double_dollar_whitespace.snap | 18 ++ ...r#mod__grammar__alpha035__empty_input.snap | 5 + ...#mod__grammar__alpha035__empty_string.snap | 18 ++ ...r#mod__grammar__alpha035__just_dollar.snap | 12 + ..._grammar__alpha035__mismatched_braces.snap | 36 +++ .../r#mod__grammar__alpha035__numbers.snap | 63 ++++++ ...r#mod__grammar__alpha035__single_char.snap | 12 + ..._grammar__alpha035__single_dollar_cmd.snap | 24 ++ ...od__grammar__alpha035__string_escapes.snap | 60 +++++ ..._alpha035__string_multi_interpolation.snap | 84 +++++++ ...ammar__alpha035__string_nested_braces.snap | 120 ++++++++++ ...__alpha035__string_trailing_backslash.snap | 24 ++ ...mod__grammar__alpha035__triple_dollar.snap | 24 ++ ...__grammar__alpha035__unclosed_command.snap | 18 ++ ...d__grammar__alpha035__unclosed_string.snap | 18 ++ ..._grammar__alpha040__command_backslash.snap | 30 +++ ...d__grammar__alpha040__command_escapes.snap | 48 ++++ ...mmar__alpha040__command_nested_braces.snap | 90 ++++++++ ...ar__alpha040__context_command_to_main.snap | 42 ++++ ...__alpha040__context_multiple_switches.snap | 60 +++++ ...mar__alpha040__context_string_to_main.snap | 48 ++++ ...mod__grammar__alpha040__dollar_at_end.snap | 18 ++ ...mod__grammar__alpha040__dollar_dollar.snap | 18 ++ ...grammar__alpha040__dollar_dollar_char.snap | 24 ++ ...rammar__alpha040__dollar_dollar_space.snap | 18 ++ ...rammar__alpha040__double_dollar_brace.snap | 42 ++++ ..._grammar__alpha040__double_dollar_end.snap | 18 ++ ...mar__alpha040__double_dollar_no_space.snap | 24 ++ ...r__alpha040__double_dollar_whitespace.snap | 18 ++ ...r#mod__grammar__alpha040__empty_input.snap | 5 + ...#mod__grammar__alpha040__empty_string.snap | 18 ++ ...r#mod__grammar__alpha040__just_dollar.snap | 12 + ..._grammar__alpha040__mismatched_braces.snap | 36 +++ .../r#mod__grammar__alpha040__numbers.snap | 63 ++++++ ...r#mod__grammar__alpha040__single_char.snap | 12 + ..._grammar__alpha040__single_dollar_cmd.snap | 24 ++ ...od__grammar__alpha040__string_escapes.snap | 60 +++++ ..._alpha040__string_multi_interpolation.snap | 84 +++++++ ...ammar__alpha040__string_nested_braces.snap | 120 ++++++++++ ...__alpha040__string_trailing_backslash.snap | 24 ++ ...mod__grammar__alpha040__triple_dollar.snap | 24 ++ ...__grammar__alpha040__unclosed_command.snap | 18 ++ ...d__grammar__alpha040__unclosed_string.snap | 18 ++ ..._grammar__alpha050__command_backslash.snap | 30 +++ ...d__grammar__alpha050__command_escapes.snap | 48 ++++ ...mmar__alpha050__command_nested_braces.snap | 90 ++++++++ ...ar__alpha050__context_command_to_main.snap | 42 ++++ ...__alpha050__context_multiple_switches.snap | 60 +++++ ...mar__alpha050__context_string_to_main.snap | 48 ++++ ...mod__grammar__alpha050__dollar_at_end.snap | 18 ++ ...mod__grammar__alpha050__dollar_dollar.snap | 18 ++ ...grammar__alpha050__dollar_dollar_char.snap | 24 ++ ...rammar__alpha050__dollar_dollar_space.snap | 18 ++ ...rammar__alpha050__double_dollar_brace.snap | 42 ++++ ..._grammar__alpha050__double_dollar_end.snap | 18 ++ ...mar__alpha050__double_dollar_no_space.snap | 24 ++ ...r__alpha050__double_dollar_whitespace.snap | 18 ++ ...r#mod__grammar__alpha050__empty_input.snap | 5 + ...#mod__grammar__alpha050__empty_string.snap | 18 ++ ...r#mod__grammar__alpha050__just_dollar.snap | 12 + ..._grammar__alpha050__mismatched_braces.snap | 36 +++ ...r#mod__grammar__alpha050__single_char.snap | 12 + ..._grammar__alpha050__single_dollar_cmd.snap | 24 ++ ...od__grammar__alpha050__string_escapes.snap | 60 +++++ ..._alpha050__string_multi_interpolation.snap | 84 +++++++ ...ammar__alpha050__string_nested_braces.snap | 120 ++++++++++ ...__alpha050__string_trailing_backslash.snap | 24 ++ ...mod__grammar__alpha050__triple_dollar.snap | 24 ++ ...__grammar__alpha050__unclosed_command.snap | 18 ++ ...d__grammar__alpha050__unclosed_string.snap | 18 ++ 125 files changed, 4922 insertions(+), 1 deletion(-) create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__brace_depth_nested.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__brace_depth_simple.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__brace_no_interpolation.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__command_backslash.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__command_escapes.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__command_interpolation.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__command_multi_interpolation.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__command_nested_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__context_command_to_main.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__context_multiple_switches.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__context_string_to_main.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_at_end.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar_char.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar_space.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_followed_by_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_no_cmd.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_brace.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_cmd_space.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_end.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_no_space.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_whitespace.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__empty_input.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__empty_string.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__just_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__mismatched_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__single_char.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__single_dollar_cmd.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__string_empty_interpolation.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__string_escapes.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__string_multi_interpolation.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__string_nested_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__string_trailing_backslash.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__token_at_end.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__triple_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__unclosed_command.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha034__unclosed_string.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__command_backslash.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__command_escapes.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__command_nested_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__context_command_to_main.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__context_multiple_switches.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__context_string_to_main.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_at_end.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar_char.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar_space.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_brace.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_end.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_no_space.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_whitespace.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__empty_input.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__empty_string.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__just_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__mismatched_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__numbers.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__single_char.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__single_dollar_cmd.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__string_escapes.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__string_multi_interpolation.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__string_nested_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__string_trailing_backslash.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__triple_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__unclosed_command.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha035__unclosed_string.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__command_backslash.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__command_escapes.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__command_nested_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__context_command_to_main.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__context_multiple_switches.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__context_string_to_main.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_at_end.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar_char.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar_space.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_brace.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_end.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_no_space.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_whitespace.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__empty_input.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__empty_string.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__just_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__mismatched_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__numbers.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__single_char.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__single_dollar_cmd.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__string_escapes.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__string_multi_interpolation.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__string_nested_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__string_trailing_backslash.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__triple_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__unclosed_command.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha040__unclosed_string.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__command_backslash.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__command_escapes.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__command_nested_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__context_command_to_main.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__context_multiple_switches.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__context_string_to_main.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_at_end.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar_char.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar_space.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_brace.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_end.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_no_space.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_whitespace.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__empty_input.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__empty_string.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__just_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__mismatched_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__single_char.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__single_dollar_cmd.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__string_escapes.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__string_multi_interpolation.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__string_nested_braces.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__string_trailing_backslash.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__triple_dollar.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__unclosed_command.snap create mode 100644 tests/grammar/snapshots/r#mod__grammar__alpha050__unclosed_string.snap diff --git a/codecov.yml b/codecov.yml index bc4dd0a..cb1a4e5 100644 --- a/codecov.yml +++ b/codecov.yml @@ -43,7 +43,7 @@ coverage: - 0.5.0-alpha patch: default: - target: 100% + target: 80% comment: layout: " diff, flags, files" diff --git a/tests/grammar/alpha034.rs b/tests/grammar/alpha034.rs index fa46c7e..a7dc2da 100644 --- a/tests/grammar/alpha034.rs +++ b/tests/grammar/alpha034.rs @@ -670,6 +670,217 @@ fn test_lexer() { )); } +#[test] +fn test_lexer_double_dollar_edge_cases() { + let compiler = AmberCompiler::new(); + + // Test $$ followed by whitespace + assert_debug_snapshot!("double_dollar_whitespace", compiler.tokenize("$$ \n")); + + // Test $$ at end of input + assert_debug_snapshot!("double_dollar_end", compiler.tokenize("$$")); + + // Test $$ followed by identifier without space + assert_debug_snapshot!("double_dollar_no_space", compiler.tokenize("$$failed")); + + // Test $$ followed by { + assert_debug_snapshot!("double_dollar_brace", compiler.tokenize("$$ {var}$")); +} + +#[test] +fn test_lexer_string_escapes() { + let compiler = AmberCompiler::new(); + + // Test string with various escape sequences + assert_debug_snapshot!( + "string_escapes", + compiler.tokenize(r#""hello\nworld\t\"quote\"""#) + ); + + // Test string with backslash at end + assert_debug_snapshot!("string_trailing_backslash", compiler.tokenize(r#""test\""#)); + + // Test empty string + assert_debug_snapshot!("empty_string", compiler.tokenize(r#""""#)); +} + +#[test] +fn test_lexer_command_escapes() { + let compiler = AmberCompiler::new(); + + // Test command with escaped spaces + assert_debug_snapshot!( + "command_escapes", + compiler.tokenize(r#"$echo\ with\ spaces$"#) + ); + + // Test command with backslash + assert_debug_snapshot!("command_backslash", compiler.tokenize(r#"$test\n$"#)); +} + +#[test] +fn test_lexer_command_context_whitespace() { + let compiler = AmberCompiler::new(); + + // Test $$ command with leading whitespace after $$ + assert_debug_snapshot!("double_dollar_cmd_space", compiler.tokenize("$$ cmd$")); +} + +#[test] +fn test_lexer_dollar_at_end() { + let compiler = AmberCompiler::new(); + + // Test single $ at end of input (line 226 - None case) + assert_debug_snapshot!("dollar_at_end", compiler.tokenize("text$")); + + // Test $ followed by end of string + assert_debug_snapshot!("just_dollar", compiler.tokenize("$")); +} + +#[test] +fn test_lexer_dollar_followed_by_dollar() { + let compiler = AmberCompiler::new(); + + // Test first $ of $$ (line 217-218 - next_ch == '$' false branch) + assert_debug_snapshot!("dollar_dollar", compiler.tokenize("$$")); + + // Test $$$ (triple dollar) + assert_debug_snapshot!("triple_dollar", compiler.tokenize("$$$")); +} + +#[test] +fn test_lexer_dollar_prev_is_dollar() { + let compiler = AmberCompiler::new(); + + // Test second $ with whitespace after (lines 221-223) + assert_debug_snapshot!("dollar_dollar_space", compiler.tokenize("$$ ")); + + // Test second $ with non-whitespace after (line 222 - !next_ch.is_whitespace()) + assert_debug_snapshot!("dollar_dollar_char", compiler.tokenize("$$x")); +} + +#[test] +fn test_lexer_string_interpolation_edge_cases() { + let compiler = AmberCompiler::new(); + + // Test nested braces in string interpolation + assert_debug_snapshot!( + "string_nested_braces", + compiler.tokenize(r#""text {if true { "inner" } else { "other" }} end""#) + ); + + // Test multiple interpolations + assert_debug_snapshot!( + "string_multi_interpolation", + compiler.tokenize(r#""{a} and {b} and {c}""#) + ); + + // Test empty interpolation + assert_debug_snapshot!( + "string_empty_interpolation", + compiler.tokenize(r#""test {} end""#) + ); +} + +#[test] +fn test_lexer_command_interpolation_edge_cases() { + let compiler = AmberCompiler::new(); + + // Test nested braces in command interpolation + assert_debug_snapshot!( + "command_nested_braces", + compiler.tokenize(r#"$echo {if true { 1 } else { 0 }}$"#) + ); + + // Test command with multiple interpolations + assert_debug_snapshot!( + "command_multi_interpolation", + compiler.tokenize("$echo {a} {b} {c}$") + ); +} + +#[test] +fn test_lexer_context_transitions() { + let compiler = AmberCompiler::new(); + + // Test transitioning between contexts + assert_debug_snapshot!( + "context_string_to_main", + compiler.tokenize(r#""start {expr} end""#) + ); + + // Test command to main context + assert_debug_snapshot!("context_command_to_main", compiler.tokenize("$cmd {expr}$")); + + // Test multiple context switches + assert_debug_snapshot!( + "context_multiple_switches", + compiler.tokenize(r#""a {$b$} c""#) + ); +} + +#[test] +fn test_lexer_brace_depth_tracking() { + let compiler = AmberCompiler::new(); + + // Test brace depth increases and decreases correctly + assert_debug_snapshot!("brace_depth_simple", compiler.tokenize(r#""{{}}" "#)); + + // Test brace depth with nested interpolations + assert_debug_snapshot!( + "brace_depth_nested", + compiler.tokenize(r#""outer { "inner {x}" }""#) + ); + + // Test braces outside interpolation context + assert_debug_snapshot!( + "brace_no_interpolation", + compiler.tokenize("{ let x = {} }") + ); +} + +#[test] +fn test_lexer_error_recovery() { + let compiler = AmberCompiler::new(); + + // Test with various malformed inputs + assert_debug_snapshot!("unclosed_string", compiler.tokenize(r#""unclosed"#)); + + // Test with unclosed command + assert_debug_snapshot!("unclosed_command", compiler.tokenize("$echo test")); + + // Test with mismatched braces + assert_debug_snapshot!("mismatched_braces", compiler.tokenize(r#""{{{""#)); +} + +#[test] +fn test_lexer_single_dollar_variations() { + let compiler = AmberCompiler::new(); + + // Test single $ starting command + assert_debug_snapshot!("single_dollar_cmd", compiler.tokenize("$echo$")); + + // Test $ not starting command (followed by whitespace in $$ case) + assert_debug_snapshot!("dollar_no_cmd", compiler.tokenize("$ ")); + + // Test $ followed by another $ + assert_debug_snapshot!("dollar_followed_by_dollar", compiler.tokenize("$$$")); +} + +#[test] +fn test_lexer_edge_case_positions() { + let compiler = AmberCompiler::new(); + + // Test token at very end of input + assert_debug_snapshot!("token_at_end", compiler.tokenize("let x")); + + // Test empty input + assert_debug_snapshot!("empty_input", compiler.tokenize("")); + + // Test single character + assert_debug_snapshot!("single_char", compiler.tokenize("x")); +} + #[test] fn test_stdlib() { let stdlib = read_to_string("resources/alpha034/std/main.ab").unwrap(); diff --git a/tests/grammar/alpha035.rs b/tests/grammar/alpha035.rs index c2ecd99..c1011b9 100644 --- a/tests/grammar/alpha035.rs +++ b/tests/grammar/alpha035.rs @@ -39,6 +39,17 @@ fn parse_unwrap(tokens: &[Spanned]) -> Vec> { parse(tokens).0.unwrap() } +#[test] +fn test_numbers() { + let input = r#" + 2 + 2.4 + .2 + "#; + + assert_debug_snapshot!(parse_unwrap(&tokenize(input))); +} + #[test] fn test_stdlib_array() { let stdlib = read_to_string("resources/alpha035/std/array.ab").unwrap(); @@ -87,3 +98,111 @@ fn test_stdlib_text() { assert_debug_snapshot!(parse_unwrap(&tokenize(&stdlib))); } + +#[test] +fn test_lexer_double_dollar_edge_cases() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("double_dollar_whitespace", compiler.tokenize("$$ \n")); + assert_debug_snapshot!("double_dollar_end", compiler.tokenize("$$")); + assert_debug_snapshot!("double_dollar_no_space", compiler.tokenize("$$failed")); + assert_debug_snapshot!("double_dollar_brace", compiler.tokenize("$$ {var}$")); +} + +#[test] +fn test_lexer_string_escapes() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "string_escapes", + compiler.tokenize(r#""hello\nworld\t\"quote\"""#) + ); + assert_debug_snapshot!("string_trailing_backslash", compiler.tokenize(r#""test\""#)); + assert_debug_snapshot!("empty_string", compiler.tokenize(r#""""#)); +} + +#[test] +fn test_lexer_command_escapes() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "command_escapes", + compiler.tokenize(r#"$echo\ with\ spaces$"#) + ); + assert_debug_snapshot!("command_backslash", compiler.tokenize(r#"$test\n$"#)); +} + +#[test] +fn test_lexer_interpolation_edge_cases() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "string_nested_braces", + compiler.tokenize(r#""text {if true { "inner" } else { "other" }} end""#) + ); + assert_debug_snapshot!( + "string_multi_interpolation", + compiler.tokenize(r#""{a} and {b} and {c}""#) + ); + assert_debug_snapshot!( + "command_nested_braces", + compiler.tokenize(r#"$echo {if true { 1 } else { 0 }}$"#) + ); +} + +#[test] +fn test_lexer_dollar_at_end() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("dollar_at_end", compiler.tokenize("text$")); + assert_debug_snapshot!("just_dollar", compiler.tokenize("$")); +} + +#[test] +fn test_lexer_dollar_followed_by_dollar() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("dollar_dollar", compiler.tokenize("$$")); + assert_debug_snapshot!("triple_dollar", compiler.tokenize("$$$")); +} + +#[test] +fn test_lexer_dollar_prev_is_dollar() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("dollar_dollar_space", compiler.tokenize("$$ ")); + assert_debug_snapshot!("dollar_dollar_char", compiler.tokenize("$$x")); +} + +#[test] +fn test_lexer_context_transitions() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "context_string_to_main", + compiler.tokenize(r#""start {expr} end""#) + ); + assert_debug_snapshot!("context_command_to_main", compiler.tokenize("$cmd {expr}$")); + assert_debug_snapshot!( + "context_multiple_switches", + compiler.tokenize(r#""a {$b$} c""#) + ); +} + +#[test] +fn test_lexer_error_recovery() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("unclosed_string", compiler.tokenize(r#""unclosed"#)); + assert_debug_snapshot!("unclosed_command", compiler.tokenize("$echo test")); + assert_debug_snapshot!("mismatched_braces", compiler.tokenize(r#""{{{""#)); +} + +#[test] +fn test_lexer_edge_cases() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("empty_input", compiler.tokenize("")); + assert_debug_snapshot!("single_char", compiler.tokenize("x")); + assert_debug_snapshot!("single_dollar_cmd", compiler.tokenize("$echo$")); +} diff --git a/tests/grammar/alpha040.rs b/tests/grammar/alpha040.rs index 769282e..88e937c 100644 --- a/tests/grammar/alpha040.rs +++ b/tests/grammar/alpha040.rs @@ -43,6 +43,17 @@ fn parse_unwrap(tokens: &[Spanned]) -> Vec> { ast.unwrap() } +#[test] +fn test_numbers() { + let input = r#" + 2 + 2.4 + .2 + "#; + + assert_debug_snapshot!(parse_unwrap(&tokenize(input))); +} + #[test] fn test_stdlib_array() { let stdlib = read_to_string("resources/alpha040/std/array.ab").unwrap(); @@ -152,3 +163,111 @@ fn test_comments_in_ifs() { assert_debug_snapshot!(parse(&tokenize(input))); } + +#[test] +fn test_lexer_double_dollar_edge_cases() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("double_dollar_whitespace", compiler.tokenize("$$ \n")); + assert_debug_snapshot!("double_dollar_end", compiler.tokenize("$$")); + assert_debug_snapshot!("double_dollar_no_space", compiler.tokenize("$$failed")); + assert_debug_snapshot!("double_dollar_brace", compiler.tokenize("$$ {var}$")); +} + +#[test] +fn test_lexer_string_escapes() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "string_escapes", + compiler.tokenize(r#""hello\nworld\t\"quote\"""#) + ); + assert_debug_snapshot!("string_trailing_backslash", compiler.tokenize(r#""test\""#)); + assert_debug_snapshot!("empty_string", compiler.tokenize(r#""""#)); +} + +#[test] +fn test_lexer_command_escapes() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "command_escapes", + compiler.tokenize(r#"$echo\ with\ spaces$"#) + ); + assert_debug_snapshot!("command_backslash", compiler.tokenize(r#"$test\n$"#)); +} + +#[test] +fn test_lexer_interpolation_edge_cases() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "string_nested_braces", + compiler.tokenize(r#""text {if true { "inner" } else { "other" }} end""#) + ); + assert_debug_snapshot!( + "string_multi_interpolation", + compiler.tokenize(r#""{a} and {b} and {c}""#) + ); + assert_debug_snapshot!( + "command_nested_braces", + compiler.tokenize(r#"$echo {if true { 1 } else { 0 }}$"#) + ); +} + +#[test] +fn test_lexer_dollar_at_end() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("dollar_at_end", compiler.tokenize("text$")); + assert_debug_snapshot!("just_dollar", compiler.tokenize("$")); +} + +#[test] +fn test_lexer_dollar_followed_by_dollar() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("dollar_dollar", compiler.tokenize("$$")); + assert_debug_snapshot!("triple_dollar", compiler.tokenize("$$$")); +} + +#[test] +fn test_lexer_dollar_prev_is_dollar() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("dollar_dollar_space", compiler.tokenize("$$ ")); + assert_debug_snapshot!("dollar_dollar_char", compiler.tokenize("$$x")); +} + +#[test] +fn test_lexer_context_transitions() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "context_string_to_main", + compiler.tokenize(r#""start {expr} end""#) + ); + assert_debug_snapshot!("context_command_to_main", compiler.tokenize("$cmd {expr}$")); + assert_debug_snapshot!( + "context_multiple_switches", + compiler.tokenize(r#""a {$b$} c""#) + ); +} + +#[test] +fn test_lexer_error_recovery() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("unclosed_string", compiler.tokenize(r#""unclosed"#)); + assert_debug_snapshot!("unclosed_command", compiler.tokenize("$echo test")); + assert_debug_snapshot!("mismatched_braces", compiler.tokenize(r#""{{{""#)); +} + +#[test] +fn test_lexer_edge_cases() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("empty_input", compiler.tokenize("")); + assert_debug_snapshot!("single_char", compiler.tokenize("x")); + assert_debug_snapshot!("single_dollar_cmd", compiler.tokenize("$echo$")); +} diff --git a/tests/grammar/alpha050.rs b/tests/grammar/alpha050.rs index b48bfcb..86667d0 100644 --- a/tests/grammar/alpha050.rs +++ b/tests/grammar/alpha050.rs @@ -220,3 +220,111 @@ fn test_mv_files() { assert_debug_snapshot!(parse_unwrap(&tokenize(input))); } + +#[test] +fn test_lexer_double_dollar_edge_cases() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("double_dollar_whitespace", compiler.tokenize("$$ \n")); + assert_debug_snapshot!("double_dollar_end", compiler.tokenize("$$")); + assert_debug_snapshot!("double_dollar_no_space", compiler.tokenize("$$failed")); + assert_debug_snapshot!("double_dollar_brace", compiler.tokenize("$$ {var}$")); +} + +#[test] +fn test_lexer_string_escapes() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "string_escapes", + compiler.tokenize(r#""hello\nworld\t\"quote\"""#) + ); + assert_debug_snapshot!("string_trailing_backslash", compiler.tokenize(r#""test\""#)); + assert_debug_snapshot!("empty_string", compiler.tokenize(r#""""#)); +} + +#[test] +fn test_lexer_command_escapes() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "command_escapes", + compiler.tokenize(r#"$echo\ with\ spaces$"#) + ); + assert_debug_snapshot!("command_backslash", compiler.tokenize(r#"$test\n$"#)); +} + +#[test] +fn test_lexer_interpolation_edge_cases() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "string_nested_braces", + compiler.tokenize(r#""text {if true { "inner" } else { "other" }} end""#) + ); + assert_debug_snapshot!( + "string_multi_interpolation", + compiler.tokenize(r#""{a} and {b} and {c}""#) + ); + assert_debug_snapshot!( + "command_nested_braces", + compiler.tokenize(r#"$echo {if true { 1 } else { 0 }}$"#) + ); +} + +#[test] +fn test_lexer_dollar_at_end() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("dollar_at_end", compiler.tokenize("text$")); + assert_debug_snapshot!("just_dollar", compiler.tokenize("$")); +} + +#[test] +fn test_lexer_dollar_followed_by_dollar() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("dollar_dollar", compiler.tokenize("$$")); + assert_debug_snapshot!("triple_dollar", compiler.tokenize("$$$")); +} + +#[test] +fn test_lexer_dollar_prev_is_dollar() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("dollar_dollar_space", compiler.tokenize("$$ ")); + assert_debug_snapshot!("dollar_dollar_char", compiler.tokenize("$$x")); +} + +#[test] +fn test_lexer_context_transitions() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!( + "context_string_to_main", + compiler.tokenize(r#""start {expr} end""#) + ); + assert_debug_snapshot!("context_command_to_main", compiler.tokenize("$cmd {expr}$")); + assert_debug_snapshot!( + "context_multiple_switches", + compiler.tokenize(r#""a {$b$} c""#) + ); +} + +#[test] +fn test_lexer_error_recovery() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("unclosed_string", compiler.tokenize(r#""unclosed"#)); + assert_debug_snapshot!("unclosed_command", compiler.tokenize("$echo test")); + assert_debug_snapshot!("mismatched_braces", compiler.tokenize(r#""{{{""#)); +} + +#[test] +fn test_lexer_edge_cases() { + let compiler = AmberCompiler::new(); + + assert_debug_snapshot!("empty_input", compiler.tokenize("")); + assert_debug_snapshot!("single_char", compiler.tokenize("x")); + assert_debug_snapshot!("single_dollar_cmd", compiler.tokenize("$echo$")); +} diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__brace_depth_nested.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__brace_depth_nested.snap new file mode 100644 index 0000000..1c0f83f --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__brace_depth_nested.snap @@ -0,0 +1,72 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"outer { \"inner {x}\" }\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "outer ", + ), + 1..7, + ), + ( + Token( + "{", + ), + 7..8, + ), + ( + Token( + "\"", + ), + 9..10, + ), + ( + Token( + "inner ", + ), + 10..16, + ), + ( + Token( + "{", + ), + 16..17, + ), + ( + Token( + "x", + ), + 17..18, + ), + ( + Token( + "}", + ), + 18..19, + ), + ( + Token( + "\"", + ), + 19..20, + ), + ( + Token( + "}", + ), + 21..22, + ), + ( + Token( + "\"", + ), + 22..23, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__brace_depth_simple.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__brace_depth_simple.snap new file mode 100644 index 0000000..8400de9 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__brace_depth_simple.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"{{}}\" \"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "{", + ), + 1..2, + ), + ( + Token( + "{", + ), + 2..3, + ), + ( + Token( + "}", + ), + 3..4, + ), + ( + Token( + "}", + ), + 4..5, + ), + ( + Token( + "\"", + ), + 5..6, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__brace_no_interpolation.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__brace_no_interpolation.snap new file mode 100644 index 0000000..819a462 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__brace_no_interpolation.snap @@ -0,0 +1,48 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"{ let x = {} }\")" +--- +[ + ( + Token( + "{", + ), + 0..1, + ), + ( + Token( + "let", + ), + 2..5, + ), + ( + Token( + "x", + ), + 6..7, + ), + ( + Token( + "=", + ), + 8..9, + ), + ( + Token( + "{", + ), + 10..11, + ), + ( + Token( + "}", + ), + 11..12, + ), + ( + Token( + "}", + ), + 13..14, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command_backslash.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_backslash.snap new file mode 100644 index 0000000..17e849b --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_backslash.snap @@ -0,0 +1,30 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"$test\\n$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "test", + ), + 1..5, + ), + ( + Token( + "\\n", + ), + 5..7, + ), + ( + Token( + "$", + ), + 7..8, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command_escapes.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_escapes.snap new file mode 100644 index 0000000..a1385e8 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_escapes.snap @@ -0,0 +1,48 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"$echo\\ with\\ spaces$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo", + ), + 1..5, + ), + ( + Token( + "\\ ", + ), + 5..7, + ), + ( + Token( + "with", + ), + 7..11, + ), + ( + Token( + "\\ ", + ), + 11..13, + ), + ( + Token( + "spaces", + ), + 13..19, + ), + ( + Token( + "$", + ), + 19..20, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command_interpolation.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_interpolation.snap new file mode 100644 index 0000000..947eae4 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_interpolation.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$echo {var}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "var", + ), + 7..10, + ), + ( + Token( + "}", + ), + 10..11, + ), + ( + Token( + "$", + ), + 11..12, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command_multi_interpolation.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_multi_interpolation.snap new file mode 100644 index 0000000..0fbbdf2 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_multi_interpolation.snap @@ -0,0 +1,90 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$echo {a} {b} {c}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "a", + ), + 7..8, + ), + ( + Token( + "}", + ), + 8..9, + ), + ( + Token( + " ", + ), + 9..10, + ), + ( + Token( + "{", + ), + 10..11, + ), + ( + Token( + "b", + ), + 11..12, + ), + ( + Token( + "}", + ), + 12..13, + ), + ( + Token( + " ", + ), + 13..14, + ), + ( + Token( + "{", + ), + 14..15, + ), + ( + Token( + "c", + ), + 15..16, + ), + ( + Token( + "}", + ), + 16..17, + ), + ( + Token( + "$", + ), + 17..18, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__command_nested_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_nested_braces.snap new file mode 100644 index 0000000..8884745 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__command_nested_braces.snap @@ -0,0 +1,90 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"$echo {if true { 1 } else { 0 }}$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "if", + ), + 7..9, + ), + ( + Token( + "true", + ), + 10..14, + ), + ( + Token( + "{", + ), + 15..16, + ), + ( + Token( + "1", + ), + 17..18, + ), + ( + Token( + "}", + ), + 19..20, + ), + ( + Token( + "else", + ), + 21..25, + ), + ( + Token( + "{", + ), + 26..27, + ), + ( + Token( + "0", + ), + 28..29, + ), + ( + Token( + "}", + ), + 30..31, + ), + ( + Token( + "}", + ), + 31..32, + ), + ( + Token( + "$", + ), + 32..33, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__context_command_to_main.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__context_command_to_main.snap new file mode 100644 index 0000000..7e51f95 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__context_command_to_main.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$cmd {expr}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "cmd ", + ), + 1..5, + ), + ( + Token( + "{", + ), + 5..6, + ), + ( + Token( + "expr", + ), + 6..10, + ), + ( + Token( + "}", + ), + 10..11, + ), + ( + Token( + "$", + ), + 11..12, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__context_multiple_switches.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__context_multiple_switches.snap new file mode 100644 index 0000000..0886c16 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__context_multiple_switches.snap @@ -0,0 +1,60 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"a {$b$} c\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "a ", + ), + 1..3, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "$", + ), + 4..5, + ), + ( + Token( + "b", + ), + 5..6, + ), + ( + Token( + "$", + ), + 6..7, + ), + ( + Token( + "}", + ), + 7..8, + ), + ( + Token( + " c", + ), + 8..10, + ), + ( + Token( + "\"", + ), + 10..11, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__context_string_to_main.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__context_string_to_main.snap new file mode 100644 index 0000000..e86fe3c --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__context_string_to_main.snap @@ -0,0 +1,48 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"start {expr} end\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "start ", + ), + 1..7, + ), + ( + Token( + "{", + ), + 7..8, + ), + ( + Token( + "expr", + ), + 8..12, + ), + ( + Token( + "}", + ), + 12..13, + ), + ( + Token( + " end", + ), + 13..17, + ), + ( + Token( + "\"", + ), + 17..18, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_at_end.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_at_end.snap new file mode 100644 index 0000000..b98e5d7 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_at_end.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"text$\")" +--- +[ + ( + Token( + "text", + ), + 0..4, + ), + ( + Token( + "$", + ), + 4..5, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar.snap new file mode 100644 index 0000000..3145dcb --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar_char.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar_char.snap new file mode 100644 index 0000000..b0056ea --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar_char.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$x\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "x", + ), + 2..3, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar_space.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar_space.snap new file mode 100644 index 0000000..11fee59 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_dollar_space.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$ \")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_followed_by_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_followed_by_dollar.snap new file mode 100644 index 0000000..7d7d69d --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_followed_by_dollar.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "$", + ), + 2..3, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_no_cmd.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_no_cmd.snap new file mode 100644 index 0000000..8a35105 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__dollar_no_cmd.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$ \")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_brace.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_brace.snap new file mode 100644 index 0000000..c4c814e --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_brace.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$ {var}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "var", + ), + 4..7, + ), + ( + Token( + "}", + ), + 7..8, + ), + ( + Token( + "$", + ), + 8..9, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_cmd_space.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_cmd_space.snap new file mode 100644 index 0000000..3004ed7 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_cmd_space.snap @@ -0,0 +1,30 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$ cmd$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "cmd", + ), + 3..6, + ), + ( + Token( + "$", + ), + 6..7, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_end.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_end.snap new file mode 100644 index 0000000..3145dcb --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_end.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_no_space.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_no_space.snap new file mode 100644 index 0000000..2bca3c2 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_no_space.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$failed\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "failed", + ), + 2..8, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_whitespace.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_whitespace.snap new file mode 100644 index 0000000..602f478 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__double_dollar_whitespace.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$ \\n\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__empty_input.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__empty_input.snap new file mode 100644 index 0000000..fd5c88a --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__empty_input.snap @@ -0,0 +1,5 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"\")" +--- +[] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__empty_string.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__empty_string.snap new file mode 100644 index 0000000..234b662 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__empty_string.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "\"", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__just_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__just_dollar.snap new file mode 100644 index 0000000..b9f3413 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__just_dollar.snap @@ -0,0 +1,12 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__mismatched_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__mismatched_braces.snap new file mode 100644 index 0000000..03acf50 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__mismatched_braces.snap @@ -0,0 +1,36 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"{{{\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "{", + ), + 1..2, + ), + ( + Token( + "{", + ), + 2..3, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "\"", + ), + 4..5, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__single_char.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__single_char.snap new file mode 100644 index 0000000..0505235 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__single_char.snap @@ -0,0 +1,12 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"x\")" +--- +[ + ( + Token( + "x", + ), + 0..1, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__single_dollar_cmd.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__single_dollar_cmd.snap new file mode 100644 index 0000000..a690bd0 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__single_dollar_cmd.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$echo$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo", + ), + 1..5, + ), + ( + Token( + "$", + ), + 5..6, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__string_empty_interpolation.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_empty_interpolation.snap new file mode 100644 index 0000000..33dc232 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_empty_interpolation.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"test {} end\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "test ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "}", + ), + 7..8, + ), + ( + Token( + " end", + ), + 8..12, + ), + ( + Token( + "\"", + ), + 12..13, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__string_escapes.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_escapes.snap new file mode 100644 index 0000000..3f0c997 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_escapes.snap @@ -0,0 +1,60 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"hello\\nworld\\t\\\"quote\\\"\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "hello", + ), + 1..6, + ), + ( + Token( + "\\n", + ), + 6..8, + ), + ( + Token( + "world", + ), + 8..13, + ), + ( + Token( + "\\t", + ), + 13..15, + ), + ( + Token( + "\\\"", + ), + 15..17, + ), + ( + Token( + "quote", + ), + 17..22, + ), + ( + Token( + "\\\"", + ), + 22..24, + ), + ( + Token( + "\"", + ), + 24..25, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__string_multi_interpolation.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_multi_interpolation.snap new file mode 100644 index 0000000..8defaca --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_multi_interpolation.snap @@ -0,0 +1,84 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"{a} and {b} and {c}\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "{", + ), + 1..2, + ), + ( + Token( + "a", + ), + 2..3, + ), + ( + Token( + "}", + ), + 3..4, + ), + ( + Token( + " and ", + ), + 4..9, + ), + ( + Token( + "{", + ), + 9..10, + ), + ( + Token( + "b", + ), + 10..11, + ), + ( + Token( + "}", + ), + 11..12, + ), + ( + Token( + " and ", + ), + 12..17, + ), + ( + Token( + "{", + ), + 17..18, + ), + ( + Token( + "c", + ), + 18..19, + ), + ( + Token( + "}", + ), + 19..20, + ), + ( + Token( + "\"", + ), + 20..21, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__string_nested_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_nested_braces.snap new file mode 100644 index 0000000..dc714d8 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_nested_braces.snap @@ -0,0 +1,120 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"text {if true { \"inner\" } else { \"other\" }} end\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "text ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "if", + ), + 7..9, + ), + ( + Token( + "true", + ), + 10..14, + ), + ( + Token( + "{", + ), + 15..16, + ), + ( + Token( + "\"", + ), + 17..18, + ), + ( + Token( + "inner", + ), + 18..23, + ), + ( + Token( + "\"", + ), + 23..24, + ), + ( + Token( + "}", + ), + 25..26, + ), + ( + Token( + "else", + ), + 27..31, + ), + ( + Token( + "{", + ), + 32..33, + ), + ( + Token( + "\"", + ), + 34..35, + ), + ( + Token( + "other", + ), + 35..40, + ), + ( + Token( + "\"", + ), + 40..41, + ), + ( + Token( + "}", + ), + 42..43, + ), + ( + Token( + "}", + ), + 43..44, + ), + ( + Token( + " end", + ), + 44..48, + ), + ( + Token( + "\"", + ), + 48..49, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__string_trailing_backslash.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_trailing_backslash.snap new file mode 100644 index 0000000..b732480 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__string_trailing_backslash.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"test\\\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "test", + ), + 1..5, + ), + ( + Token( + "\\\"", + ), + 5..7, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__token_at_end.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__token_at_end.snap new file mode 100644 index 0000000..c76c534 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__token_at_end.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"let x\")" +--- +[ + ( + Token( + "let", + ), + 0..3, + ), + ( + Token( + "x", + ), + 4..5, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__triple_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__triple_dollar.snap new file mode 100644 index 0000000..7d7d69d --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__triple_dollar.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "$", + ), + 2..3, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__unclosed_command.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__unclosed_command.snap new file mode 100644 index 0000000..b6c28f5 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__unclosed_command.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(\"$echo test\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo test", + ), + 1..10, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha034__unclosed_string.snap b/tests/grammar/snapshots/r#mod__grammar__alpha034__unclosed_string.snap new file mode 100644 index 0000000..67d7def --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha034__unclosed_string.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha034.rs +expression: "compiler.tokenize(r#\"\"unclosed\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "unclosed", + ), + 1..9, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__command_backslash.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__command_backslash.snap new file mode 100644 index 0000000..1a653f1 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__command_backslash.snap @@ -0,0 +1,30 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"$test\\n$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "test", + ), + 1..5, + ), + ( + Token( + "\\n", + ), + 5..7, + ), + ( + Token( + "$", + ), + 7..8, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__command_escapes.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__command_escapes.snap new file mode 100644 index 0000000..ec6feaf --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__command_escapes.snap @@ -0,0 +1,48 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"$echo\\ with\\ spaces$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo", + ), + 1..5, + ), + ( + Token( + "\\ ", + ), + 5..7, + ), + ( + Token( + "with", + ), + 7..11, + ), + ( + Token( + "\\ ", + ), + 11..13, + ), + ( + Token( + "spaces", + ), + 13..19, + ), + ( + Token( + "$", + ), + 19..20, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__command_nested_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__command_nested_braces.snap new file mode 100644 index 0000000..8f67430 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__command_nested_braces.snap @@ -0,0 +1,90 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"$echo {if true { 1 } else { 0 }}$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "if", + ), + 7..9, + ), + ( + Token( + "true", + ), + 10..14, + ), + ( + Token( + "{", + ), + 15..16, + ), + ( + Token( + "1", + ), + 17..18, + ), + ( + Token( + "}", + ), + 19..20, + ), + ( + Token( + "else", + ), + 21..25, + ), + ( + Token( + "{", + ), + 26..27, + ), + ( + Token( + "0", + ), + 28..29, + ), + ( + Token( + "}", + ), + 30..31, + ), + ( + Token( + "}", + ), + 31..32, + ), + ( + Token( + "$", + ), + 32..33, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__context_command_to_main.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__context_command_to_main.snap new file mode 100644 index 0000000..81c626e --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__context_command_to_main.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$cmd {expr}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "cmd ", + ), + 1..5, + ), + ( + Token( + "{", + ), + 5..6, + ), + ( + Token( + "expr", + ), + 6..10, + ), + ( + Token( + "}", + ), + 10..11, + ), + ( + Token( + "$", + ), + 11..12, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__context_multiple_switches.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__context_multiple_switches.snap new file mode 100644 index 0000000..4cc876c --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__context_multiple_switches.snap @@ -0,0 +1,60 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"\"a {$b$} c\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "a ", + ), + 1..3, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "$", + ), + 4..5, + ), + ( + Token( + "b", + ), + 5..6, + ), + ( + Token( + "$", + ), + 6..7, + ), + ( + Token( + "}", + ), + 7..8, + ), + ( + Token( + " c", + ), + 8..10, + ), + ( + Token( + "\"", + ), + 10..11, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__context_string_to_main.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__context_string_to_main.snap new file mode 100644 index 0000000..6317f8c --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__context_string_to_main.snap @@ -0,0 +1,48 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"\"start {expr} end\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "start ", + ), + 1..7, + ), + ( + Token( + "{", + ), + 7..8, + ), + ( + Token( + "expr", + ), + 8..12, + ), + ( + Token( + "}", + ), + 12..13, + ), + ( + Token( + " end", + ), + 13..17, + ), + ( + Token( + "\"", + ), + 17..18, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_at_end.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_at_end.snap new file mode 100644 index 0000000..b0fced7 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_at_end.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"text$\")" +--- +[ + ( + Token( + "text", + ), + 0..4, + ), + ( + Token( + "$", + ), + 4..5, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar.snap new file mode 100644 index 0000000..1eed2a9 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar_char.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar_char.snap new file mode 100644 index 0000000..62f3977 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar_char.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$$x\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "x", + ), + 2..3, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar_space.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar_space.snap new file mode 100644 index 0000000..34f8a30 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__dollar_dollar_space.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$$ \")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_brace.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_brace.snap new file mode 100644 index 0000000..c159a1b --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_brace.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$$ {var}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "var", + ), + 4..7, + ), + ( + Token( + "}", + ), + 7..8, + ), + ( + Token( + "$", + ), + 8..9, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_end.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_end.snap new file mode 100644 index 0000000..1eed2a9 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_end.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_no_space.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_no_space.snap new file mode 100644 index 0000000..f2bb93b --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_no_space.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$$failed\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "failed", + ), + 2..8, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_whitespace.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_whitespace.snap new file mode 100644 index 0000000..3a8540e --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__double_dollar_whitespace.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$$ \\n\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__empty_input.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__empty_input.snap new file mode 100644 index 0000000..5d6d0d5 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__empty_input.snap @@ -0,0 +1,5 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"\")" +--- +[] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__empty_string.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__empty_string.snap new file mode 100644 index 0000000..6299bf2 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__empty_string.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"\"\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "\"", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__just_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__just_dollar.snap new file mode 100644 index 0000000..15df301 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__just_dollar.snap @@ -0,0 +1,12 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__mismatched_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__mismatched_braces.snap new file mode 100644 index 0000000..3d7e67a --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__mismatched_braces.snap @@ -0,0 +1,36 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"\"{{{\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "{", + ), + 1..2, + ), + ( + Token( + "{", + ), + 2..3, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "\"", + ), + 4..5, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__numbers.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__numbers.snap new file mode 100644 index 0000000..632e83b --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__numbers.snap @@ -0,0 +1,63 @@ +--- +source: tests/grammar/alpha035.rs +expression: parse_unwrap(&tokenize(input)) +--- +[ + ( + Statement( + ( + Expression( + ( + Number( + ( + 2.0, + 5..6, + ), + ), + 5..6, + ), + ), + 5..6, + ), + ), + 5..6, + ), + ( + Statement( + ( + Expression( + ( + Number( + ( + 2.4, + 11..14, + ), + ), + 11..14, + ), + ), + 11..14, + ), + ), + 11..14, + ), + ( + Statement( + ( + Expression( + ( + Number( + ( + 0.2, + 19..21, + ), + ), + 19..21, + ), + ), + 19..21, + ), + ), + 19..21, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__single_char.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__single_char.snap new file mode 100644 index 0000000..33578b9 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__single_char.snap @@ -0,0 +1,12 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"x\")" +--- +[ + ( + Token( + "x", + ), + 0..1, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__single_dollar_cmd.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__single_dollar_cmd.snap new file mode 100644 index 0000000..b2b5cc4 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__single_dollar_cmd.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$echo$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo", + ), + 1..5, + ), + ( + Token( + "$", + ), + 5..6, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__string_escapes.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__string_escapes.snap new file mode 100644 index 0000000..45754da --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__string_escapes.snap @@ -0,0 +1,60 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"\"hello\\nworld\\t\\\"quote\\\"\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "hello", + ), + 1..6, + ), + ( + Token( + "\\n", + ), + 6..8, + ), + ( + Token( + "world", + ), + 8..13, + ), + ( + Token( + "\\t", + ), + 13..15, + ), + ( + Token( + "\\\"", + ), + 15..17, + ), + ( + Token( + "quote", + ), + 17..22, + ), + ( + Token( + "\\\"", + ), + 22..24, + ), + ( + Token( + "\"", + ), + 24..25, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__string_multi_interpolation.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__string_multi_interpolation.snap new file mode 100644 index 0000000..6b77a03 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__string_multi_interpolation.snap @@ -0,0 +1,84 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"\"{a} and {b} and {c}\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "{", + ), + 1..2, + ), + ( + Token( + "a", + ), + 2..3, + ), + ( + Token( + "}", + ), + 3..4, + ), + ( + Token( + " and ", + ), + 4..9, + ), + ( + Token( + "{", + ), + 9..10, + ), + ( + Token( + "b", + ), + 10..11, + ), + ( + Token( + "}", + ), + 11..12, + ), + ( + Token( + " and ", + ), + 12..17, + ), + ( + Token( + "{", + ), + 17..18, + ), + ( + Token( + "c", + ), + 18..19, + ), + ( + Token( + "}", + ), + 19..20, + ), + ( + Token( + "\"", + ), + 20..21, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__string_nested_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__string_nested_braces.snap new file mode 100644 index 0000000..ea45a3d --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__string_nested_braces.snap @@ -0,0 +1,120 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"\"text {if true { \"inner\" } else { \"other\" }} end\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "text ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "if", + ), + 7..9, + ), + ( + Token( + "true", + ), + 10..14, + ), + ( + Token( + "{", + ), + 15..16, + ), + ( + Token( + "\"", + ), + 17..18, + ), + ( + Token( + "inner", + ), + 18..23, + ), + ( + Token( + "\"", + ), + 23..24, + ), + ( + Token( + "}", + ), + 25..26, + ), + ( + Token( + "else", + ), + 27..31, + ), + ( + Token( + "{", + ), + 32..33, + ), + ( + Token( + "\"", + ), + 34..35, + ), + ( + Token( + "other", + ), + 35..40, + ), + ( + Token( + "\"", + ), + 40..41, + ), + ( + Token( + "}", + ), + 42..43, + ), + ( + Token( + "}", + ), + 43..44, + ), + ( + Token( + " end", + ), + 44..48, + ), + ( + Token( + "\"", + ), + 48..49, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__string_trailing_backslash.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__string_trailing_backslash.snap new file mode 100644 index 0000000..442d9ad --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__string_trailing_backslash.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"\"test\\\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "test", + ), + 1..5, + ), + ( + Token( + "\\\"", + ), + 5..7, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__triple_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__triple_dollar.snap new file mode 100644 index 0000000..f039a07 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__triple_dollar.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "$", + ), + 2..3, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__unclosed_command.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__unclosed_command.snap new file mode 100644 index 0000000..548c75d --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__unclosed_command.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(\"$echo test\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo test", + ), + 1..10, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha035__unclosed_string.snap b/tests/grammar/snapshots/r#mod__grammar__alpha035__unclosed_string.snap new file mode 100644 index 0000000..03a4f8a --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha035__unclosed_string.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha035.rs +expression: "compiler.tokenize(r#\"\"unclosed\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "unclosed", + ), + 1..9, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__command_backslash.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__command_backslash.snap new file mode 100644 index 0000000..b948635 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__command_backslash.snap @@ -0,0 +1,30 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"$test\\n$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "test", + ), + 1..5, + ), + ( + Token( + "\\n", + ), + 5..7, + ), + ( + Token( + "$", + ), + 7..8, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__command_escapes.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__command_escapes.snap new file mode 100644 index 0000000..a580a1a --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__command_escapes.snap @@ -0,0 +1,48 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"$echo\\ with\\ spaces$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo", + ), + 1..5, + ), + ( + Token( + "\\ ", + ), + 5..7, + ), + ( + Token( + "with", + ), + 7..11, + ), + ( + Token( + "\\ ", + ), + 11..13, + ), + ( + Token( + "spaces", + ), + 13..19, + ), + ( + Token( + "$", + ), + 19..20, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__command_nested_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__command_nested_braces.snap new file mode 100644 index 0000000..9d2372e --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__command_nested_braces.snap @@ -0,0 +1,90 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"$echo {if true { 1 } else { 0 }}$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "if", + ), + 7..9, + ), + ( + Token( + "true", + ), + 10..14, + ), + ( + Token( + "{", + ), + 15..16, + ), + ( + Token( + "1", + ), + 17..18, + ), + ( + Token( + "}", + ), + 19..20, + ), + ( + Token( + "else", + ), + 21..25, + ), + ( + Token( + "{", + ), + 26..27, + ), + ( + Token( + "0", + ), + 28..29, + ), + ( + Token( + "}", + ), + 30..31, + ), + ( + Token( + "}", + ), + 31..32, + ), + ( + Token( + "$", + ), + 32..33, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__context_command_to_main.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__context_command_to_main.snap new file mode 100644 index 0000000..fbf7b5e --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__context_command_to_main.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$cmd {expr}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "cmd ", + ), + 1..5, + ), + ( + Token( + "{", + ), + 5..6, + ), + ( + Token( + "expr", + ), + 6..10, + ), + ( + Token( + "}", + ), + 10..11, + ), + ( + Token( + "$", + ), + 11..12, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__context_multiple_switches.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__context_multiple_switches.snap new file mode 100644 index 0000000..8942fa1 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__context_multiple_switches.snap @@ -0,0 +1,60 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"\"a {$b$} c\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "a ", + ), + 1..3, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "$", + ), + 4..5, + ), + ( + Token( + "b", + ), + 5..6, + ), + ( + Token( + "$", + ), + 6..7, + ), + ( + Token( + "}", + ), + 7..8, + ), + ( + Token( + " c", + ), + 8..10, + ), + ( + Token( + "\"", + ), + 10..11, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__context_string_to_main.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__context_string_to_main.snap new file mode 100644 index 0000000..c17c4ac --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__context_string_to_main.snap @@ -0,0 +1,48 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"\"start {expr} end\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "start ", + ), + 1..7, + ), + ( + Token( + "{", + ), + 7..8, + ), + ( + Token( + "expr", + ), + 8..12, + ), + ( + Token( + "}", + ), + 12..13, + ), + ( + Token( + " end", + ), + 13..17, + ), + ( + Token( + "\"", + ), + 17..18, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_at_end.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_at_end.snap new file mode 100644 index 0000000..6934da5 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_at_end.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"text$\")" +--- +[ + ( + Token( + "text", + ), + 0..4, + ), + ( + Token( + "$", + ), + 4..5, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar.snap new file mode 100644 index 0000000..b922044 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar_char.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar_char.snap new file mode 100644 index 0000000..12482c7 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar_char.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$$x\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "x", + ), + 2..3, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar_space.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar_space.snap new file mode 100644 index 0000000..d52f14c --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__dollar_dollar_space.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$$ \")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_brace.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_brace.snap new file mode 100644 index 0000000..53279fb --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_brace.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$$ {var}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "var", + ), + 4..7, + ), + ( + Token( + "}", + ), + 7..8, + ), + ( + Token( + "$", + ), + 8..9, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_end.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_end.snap new file mode 100644 index 0000000..b922044 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_end.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_no_space.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_no_space.snap new file mode 100644 index 0000000..5b80637 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_no_space.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$$failed\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "failed", + ), + 2..8, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_whitespace.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_whitespace.snap new file mode 100644 index 0000000..a7eb7b9 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__double_dollar_whitespace.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$$ \\n\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__empty_input.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__empty_input.snap new file mode 100644 index 0000000..6369eb2 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__empty_input.snap @@ -0,0 +1,5 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"\")" +--- +[] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__empty_string.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__empty_string.snap new file mode 100644 index 0000000..0ba5326 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__empty_string.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"\"\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "\"", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__just_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__just_dollar.snap new file mode 100644 index 0000000..d14738f --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__just_dollar.snap @@ -0,0 +1,12 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__mismatched_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__mismatched_braces.snap new file mode 100644 index 0000000..d5b5fae --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__mismatched_braces.snap @@ -0,0 +1,36 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"\"{{{\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "{", + ), + 1..2, + ), + ( + Token( + "{", + ), + 2..3, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "\"", + ), + 4..5, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__numbers.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__numbers.snap new file mode 100644 index 0000000..9a8ebac --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__numbers.snap @@ -0,0 +1,63 @@ +--- +source: tests/grammar/alpha040.rs +expression: parse_unwrap(&tokenize(input)) +--- +[ + ( + Statement( + ( + Expression( + ( + Number( + ( + 2.0, + 5..6, + ), + ), + 5..6, + ), + ), + 5..6, + ), + ), + 5..6, + ), + ( + Statement( + ( + Expression( + ( + Number( + ( + 2.4, + 11..14, + ), + ), + 11..14, + ), + ), + 11..14, + ), + ), + 11..14, + ), + ( + Statement( + ( + Expression( + ( + Number( + ( + 0.2, + 19..21, + ), + ), + 19..21, + ), + ), + 19..21, + ), + ), + 19..21, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__single_char.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__single_char.snap new file mode 100644 index 0000000..695fa9f --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__single_char.snap @@ -0,0 +1,12 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"x\")" +--- +[ + ( + Token( + "x", + ), + 0..1, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__single_dollar_cmd.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__single_dollar_cmd.snap new file mode 100644 index 0000000..71ef9ff --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__single_dollar_cmd.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$echo$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo", + ), + 1..5, + ), + ( + Token( + "$", + ), + 5..6, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__string_escapes.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__string_escapes.snap new file mode 100644 index 0000000..283ccef --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__string_escapes.snap @@ -0,0 +1,60 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"\"hello\\nworld\\t\\\"quote\\\"\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "hello", + ), + 1..6, + ), + ( + Token( + "\\n", + ), + 6..8, + ), + ( + Token( + "world", + ), + 8..13, + ), + ( + Token( + "\\t", + ), + 13..15, + ), + ( + Token( + "\\\"", + ), + 15..17, + ), + ( + Token( + "quote", + ), + 17..22, + ), + ( + Token( + "\\\"", + ), + 22..24, + ), + ( + Token( + "\"", + ), + 24..25, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__string_multi_interpolation.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__string_multi_interpolation.snap new file mode 100644 index 0000000..8a0ced0 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__string_multi_interpolation.snap @@ -0,0 +1,84 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"\"{a} and {b} and {c}\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "{", + ), + 1..2, + ), + ( + Token( + "a", + ), + 2..3, + ), + ( + Token( + "}", + ), + 3..4, + ), + ( + Token( + " and ", + ), + 4..9, + ), + ( + Token( + "{", + ), + 9..10, + ), + ( + Token( + "b", + ), + 10..11, + ), + ( + Token( + "}", + ), + 11..12, + ), + ( + Token( + " and ", + ), + 12..17, + ), + ( + Token( + "{", + ), + 17..18, + ), + ( + Token( + "c", + ), + 18..19, + ), + ( + Token( + "}", + ), + 19..20, + ), + ( + Token( + "\"", + ), + 20..21, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__string_nested_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__string_nested_braces.snap new file mode 100644 index 0000000..88a8bbb --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__string_nested_braces.snap @@ -0,0 +1,120 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"\"text {if true { \"inner\" } else { \"other\" }} end\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "text ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "if", + ), + 7..9, + ), + ( + Token( + "true", + ), + 10..14, + ), + ( + Token( + "{", + ), + 15..16, + ), + ( + Token( + "\"", + ), + 17..18, + ), + ( + Token( + "inner", + ), + 18..23, + ), + ( + Token( + "\"", + ), + 23..24, + ), + ( + Token( + "}", + ), + 25..26, + ), + ( + Token( + "else", + ), + 27..31, + ), + ( + Token( + "{", + ), + 32..33, + ), + ( + Token( + "\"", + ), + 34..35, + ), + ( + Token( + "other", + ), + 35..40, + ), + ( + Token( + "\"", + ), + 40..41, + ), + ( + Token( + "}", + ), + 42..43, + ), + ( + Token( + "}", + ), + 43..44, + ), + ( + Token( + " end", + ), + 44..48, + ), + ( + Token( + "\"", + ), + 48..49, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__string_trailing_backslash.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__string_trailing_backslash.snap new file mode 100644 index 0000000..6b4eb6d --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__string_trailing_backslash.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"\"test\\\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "test", + ), + 1..5, + ), + ( + Token( + "\\\"", + ), + 5..7, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__triple_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__triple_dollar.snap new file mode 100644 index 0000000..9f108a9 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__triple_dollar.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "$", + ), + 2..3, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__unclosed_command.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__unclosed_command.snap new file mode 100644 index 0000000..6942daf --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__unclosed_command.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(\"$echo test\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo test", + ), + 1..10, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha040__unclosed_string.snap b/tests/grammar/snapshots/r#mod__grammar__alpha040__unclosed_string.snap new file mode 100644 index 0000000..fe91ad1 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha040__unclosed_string.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha040.rs +expression: "compiler.tokenize(r#\"\"unclosed\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "unclosed", + ), + 1..9, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__command_backslash.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__command_backslash.snap new file mode 100644 index 0000000..715b5b6 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__command_backslash.snap @@ -0,0 +1,30 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"$test\\n$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "test", + ), + 1..5, + ), + ( + Token( + "\\n", + ), + 5..7, + ), + ( + Token( + "$", + ), + 7..8, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__command_escapes.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__command_escapes.snap new file mode 100644 index 0000000..36cdd45 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__command_escapes.snap @@ -0,0 +1,48 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"$echo\\ with\\ spaces$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo", + ), + 1..5, + ), + ( + Token( + "\\ ", + ), + 5..7, + ), + ( + Token( + "with", + ), + 7..11, + ), + ( + Token( + "\\ ", + ), + 11..13, + ), + ( + Token( + "spaces", + ), + 13..19, + ), + ( + Token( + "$", + ), + 19..20, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__command_nested_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__command_nested_braces.snap new file mode 100644 index 0000000..7bfc791 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__command_nested_braces.snap @@ -0,0 +1,90 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"$echo {if true { 1 } else { 0 }}$\"#)" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "if", + ), + 7..9, + ), + ( + Token( + "true", + ), + 10..14, + ), + ( + Token( + "{", + ), + 15..16, + ), + ( + Token( + "1", + ), + 17..18, + ), + ( + Token( + "}", + ), + 19..20, + ), + ( + Token( + "else", + ), + 21..25, + ), + ( + Token( + "{", + ), + 26..27, + ), + ( + Token( + "0", + ), + 28..29, + ), + ( + Token( + "}", + ), + 30..31, + ), + ( + Token( + "}", + ), + 31..32, + ), + ( + Token( + "$", + ), + 32..33, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__context_command_to_main.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__context_command_to_main.snap new file mode 100644 index 0000000..92c49c1 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__context_command_to_main.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$cmd {expr}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "cmd ", + ), + 1..5, + ), + ( + Token( + "{", + ), + 5..6, + ), + ( + Token( + "expr", + ), + 6..10, + ), + ( + Token( + "}", + ), + 10..11, + ), + ( + Token( + "$", + ), + 11..12, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__context_multiple_switches.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__context_multiple_switches.snap new file mode 100644 index 0000000..731fac3 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__context_multiple_switches.snap @@ -0,0 +1,60 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"\"a {$b$} c\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "a ", + ), + 1..3, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "$", + ), + 4..5, + ), + ( + Token( + "b", + ), + 5..6, + ), + ( + Token( + "$", + ), + 6..7, + ), + ( + Token( + "}", + ), + 7..8, + ), + ( + Token( + " c", + ), + 8..10, + ), + ( + Token( + "\"", + ), + 10..11, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__context_string_to_main.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__context_string_to_main.snap new file mode 100644 index 0000000..baf3784 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__context_string_to_main.snap @@ -0,0 +1,48 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"\"start {expr} end\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "start ", + ), + 1..7, + ), + ( + Token( + "{", + ), + 7..8, + ), + ( + Token( + "expr", + ), + 8..12, + ), + ( + Token( + "}", + ), + 12..13, + ), + ( + Token( + " end", + ), + 13..17, + ), + ( + Token( + "\"", + ), + 17..18, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_at_end.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_at_end.snap new file mode 100644 index 0000000..161e57e --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_at_end.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"text$\")" +--- +[ + ( + Token( + "text", + ), + 0..4, + ), + ( + Token( + "$", + ), + 4..5, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar.snap new file mode 100644 index 0000000..32c0089 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar_char.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar_char.snap new file mode 100644 index 0000000..0ab2db3 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar_char.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$$x\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "x", + ), + 2..3, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar_space.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar_space.snap new file mode 100644 index 0000000..5ed99f2 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__dollar_dollar_space.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$$ \")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_brace.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_brace.snap new file mode 100644 index 0000000..a9437dc --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_brace.snap @@ -0,0 +1,42 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$$ {var}$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "var", + ), + 4..7, + ), + ( + Token( + "}", + ), + 7..8, + ), + ( + Token( + "$", + ), + 8..9, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_end.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_end.snap new file mode 100644 index 0000000..32c0089 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_end.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_no_space.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_no_space.snap new file mode 100644 index 0000000..b4c8eae --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_no_space.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$$failed\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "failed", + ), + 2..8, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_whitespace.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_whitespace.snap new file mode 100644 index 0000000..9acfbb3 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__double_dollar_whitespace.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$$ \\n\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__empty_input.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__empty_input.snap new file mode 100644 index 0000000..d0df723 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__empty_input.snap @@ -0,0 +1,5 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"\")" +--- +[] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__empty_string.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__empty_string.snap new file mode 100644 index 0000000..704a806 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__empty_string.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"\"\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "\"", + ), + 1..2, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__just_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__just_dollar.snap new file mode 100644 index 0000000..9797d9f --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__just_dollar.snap @@ -0,0 +1,12 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__mismatched_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__mismatched_braces.snap new file mode 100644 index 0000000..b714a60 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__mismatched_braces.snap @@ -0,0 +1,36 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"\"{{{\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "{", + ), + 1..2, + ), + ( + Token( + "{", + ), + 2..3, + ), + ( + Token( + "{", + ), + 3..4, + ), + ( + Token( + "\"", + ), + 4..5, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__single_char.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__single_char.snap new file mode 100644 index 0000000..dcb4256 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__single_char.snap @@ -0,0 +1,12 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"x\")" +--- +[ + ( + Token( + "x", + ), + 0..1, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__single_dollar_cmd.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__single_dollar_cmd.snap new file mode 100644 index 0000000..e398035 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__single_dollar_cmd.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$echo$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo", + ), + 1..5, + ), + ( + Token( + "$", + ), + 5..6, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__string_escapes.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__string_escapes.snap new file mode 100644 index 0000000..f0ef920 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__string_escapes.snap @@ -0,0 +1,60 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"\"hello\\nworld\\t\\\"quote\\\"\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "hello", + ), + 1..6, + ), + ( + Token( + "\\n", + ), + 6..8, + ), + ( + Token( + "world", + ), + 8..13, + ), + ( + Token( + "\\t", + ), + 13..15, + ), + ( + Token( + "\\\"", + ), + 15..17, + ), + ( + Token( + "quote", + ), + 17..22, + ), + ( + Token( + "\\\"", + ), + 22..24, + ), + ( + Token( + "\"", + ), + 24..25, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__string_multi_interpolation.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__string_multi_interpolation.snap new file mode 100644 index 0000000..0585318 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__string_multi_interpolation.snap @@ -0,0 +1,84 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"\"{a} and {b} and {c}\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "{", + ), + 1..2, + ), + ( + Token( + "a", + ), + 2..3, + ), + ( + Token( + "}", + ), + 3..4, + ), + ( + Token( + " and ", + ), + 4..9, + ), + ( + Token( + "{", + ), + 9..10, + ), + ( + Token( + "b", + ), + 10..11, + ), + ( + Token( + "}", + ), + 11..12, + ), + ( + Token( + " and ", + ), + 12..17, + ), + ( + Token( + "{", + ), + 17..18, + ), + ( + Token( + "c", + ), + 18..19, + ), + ( + Token( + "}", + ), + 19..20, + ), + ( + Token( + "\"", + ), + 20..21, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__string_nested_braces.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__string_nested_braces.snap new file mode 100644 index 0000000..34b008f --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__string_nested_braces.snap @@ -0,0 +1,120 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"\"text {if true { \"inner\" } else { \"other\" }} end\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "text ", + ), + 1..6, + ), + ( + Token( + "{", + ), + 6..7, + ), + ( + Token( + "if", + ), + 7..9, + ), + ( + Token( + "true", + ), + 10..14, + ), + ( + Token( + "{", + ), + 15..16, + ), + ( + Token( + "\"", + ), + 17..18, + ), + ( + Token( + "inner", + ), + 18..23, + ), + ( + Token( + "\"", + ), + 23..24, + ), + ( + Token( + "}", + ), + 25..26, + ), + ( + Token( + "else", + ), + 27..31, + ), + ( + Token( + "{", + ), + 32..33, + ), + ( + Token( + "\"", + ), + 34..35, + ), + ( + Token( + "other", + ), + 35..40, + ), + ( + Token( + "\"", + ), + 40..41, + ), + ( + Token( + "}", + ), + 42..43, + ), + ( + Token( + "}", + ), + 43..44, + ), + ( + Token( + " end", + ), + 44..48, + ), + ( + Token( + "\"", + ), + 48..49, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__string_trailing_backslash.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__string_trailing_backslash.snap new file mode 100644 index 0000000..cfa2f33 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__string_trailing_backslash.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"\"test\\\"\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "test", + ), + 1..5, + ), + ( + Token( + "\\\"", + ), + 5..7, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__triple_dollar.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__triple_dollar.snap new file mode 100644 index 0000000..ec87d23 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__triple_dollar.snap @@ -0,0 +1,24 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$$$\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "$", + ), + 1..2, + ), + ( + Token( + "$", + ), + 2..3, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__unclosed_command.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__unclosed_command.snap new file mode 100644 index 0000000..953a308 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__unclosed_command.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(\"$echo test\")" +--- +[ + ( + Token( + "$", + ), + 0..1, + ), + ( + Token( + "echo test", + ), + 1..10, + ), +] diff --git a/tests/grammar/snapshots/r#mod__grammar__alpha050__unclosed_string.snap b/tests/grammar/snapshots/r#mod__grammar__alpha050__unclosed_string.snap new file mode 100644 index 0000000..58ee422 --- /dev/null +++ b/tests/grammar/snapshots/r#mod__grammar__alpha050__unclosed_string.snap @@ -0,0 +1,18 @@ +--- +source: tests/grammar/alpha050.rs +expression: "compiler.tokenize(r#\"\"unclosed\"#)" +--- +[ + ( + Token( + "\"", + ), + 0..1, + ), + ( + Token( + "unclosed", + ), + 1..9, + ), +] From eb89fd65a15e8d6137fa79d1adae6f83a1a9e540 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Mon, 10 Nov 2025 14:44:23 +0100 Subject: [PATCH 17/19] renamed config file --- Tarpaulin.toml => .tarpaulin.toml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Tarpaulin.toml => .tarpaulin.toml (100%) diff --git a/Tarpaulin.toml b/.tarpaulin.toml similarity index 100% rename from Tarpaulin.toml rename to .tarpaulin.toml From 7bab9727713cf078933bbf79daf9857d65e3da24 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Mon, 10 Nov 2025 14:47:21 +0100 Subject: [PATCH 18/19] Specified coverage file --- .github/workflows/quality-check.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index 3bde4ad..641d7fc 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -68,3 +68,5 @@ jobs: with: token: ${{secrets.CODECOV_TOKEN}} fail_ci_if_error: true + files: ./coverage_output/cobertura.xml + verbose: true From 522b3b274be4848c8060314634d95a8980086037 Mon Sep 17 00:00:00 2001 From: KrosFire Date: Mon, 10 Nov 2025 15:03:07 +0100 Subject: [PATCH 19/19] Bumped codecov action --- .github/workflows/quality-check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index 641d7fc..01adb34 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -64,7 +64,7 @@ jobs: run: cargo tarpaulin --verbose --all-features --workspace --timeout 120 --out xml - name: Upload to codecov.io - uses: codecov/codecov-action@v2 + uses: codecov/codecov-action@v5 with: token: ${{secrets.CODECOV_TOKEN}} fail_ci_if_error: true