git.delta.rocks / jrsonnet / refs/commits / 75beb619a12f

difftreelog

ci use hercules

qvomslsuLach2026-04-01parent: #4824700.patch.diff
in: master

110 files changed

modified.envrcdiffbeforeafterboth
--- a/.envrc
+++ b/.envrc
@@ -3,6 +3,6 @@
 
 use flake
 
-if ! diff .github/hooks/pre-commit .git/hooks/pre-commit >/dev/null; then
+if ! test -d .jj && ! diff .github/hooks/pre-commit .git/hooks/pre-commit >/dev/null; then
 echo -e "${RED}Hooks are updated, read .github/hooks/pre-commit, and then install it with cp .github/hooks/pre-commit .git/hooks/pre-commit${RESET}"
 fi
deleted.github/workflows/checks.yamldiffbeforeafterboth
--- a/.github/workflows/checks.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: Checks
-on: [ pull_request ]
-jobs:
-  tests:
-    name: Tests
-    uses: ./.github/workflows/test.yaml
-  lints:
-    name: Lints
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4.1.4
-      - uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
-      - uses: auguwu/clippy-action@1.3.0
-        with:
-          token: ${{ secrets.GITHUB_TOKEN }}
-    permissions:
-      checks: write
-  formatting:
-    name: Formatting
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4.1.4
-      - uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
-      - uses: actions-rust-lang/rustfmt@v1.1.0
-
deleted.github/workflows/release.yamldiffbeforeafterboth
--- a/.github/workflows/release.yaml
+++ /dev/null
@@ -1,140 +0,0 @@
-name: Release
-on:
-  push:
-    tags: [ 'v*' ]
-jobs:
-  tests:
-    uses: ./.github/workflows/test.yaml
-
-  cargo-release:
-    if: !endsWith(github.ref, '-test')
-    needs: [ tests ]
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4.1.4
-      - name: Install stable toolchain
-        uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
-        with:
-          toolchain: stable
-      - run: cargo install cargo-release
-      - run: cargo login ${{ secrets.CARGO_TOKEN }}
-      - run: cargo release --no-dev-version --skip-push --skip-tag --no-confirm
-
-  github-release:
-    needs: [ tests ]
-    strategy:
-      matrix:
-        target:
-          # Linux build notes:
-          # While musl targets are not as supported as gnu, those are most relevant to users,
-          # which want to download binaries from github, as glibc has compatibility issues
-          # with older distros
-
-          # Tier 1
-          - i686-pc-windows-msvc
-          - x86_64-apple-darwin
-          - x86_64-pc-windows-msvc
-
-          # Tier 2
-          - aarch64-apple-darwin
-          - aarch64-unknown-linux-musl
-          - i686-unknown-linux-musl
-          - x86_64-unknown-linux-musl
-        include:
-          # Linux
-          - target: aarch64-unknown-linux-musl
-            os: ubuntu-latest
-            bin: jrsonnet
-            name: jrsonnet-linux-aarch64
-          - target: i686-unknown-linux-musl
-            os: ubuntu-latest
-            bin: jrsonnet
-            name: jrsonnet-linux-i686
-          - target: x86_64-unknown-linux-musl
-            os: ubuntu-latest
-            bin: jrsonnet
-            name: jrsonnet-linux-amd64
-
-          # Windows
-          - target: i686-pc-windows-msvc
-            os: windows-latest
-            bin: jrsonnet.exe
-            name: jrsonnet-windows-i686.exe
-          - target: x86_64-pc-windows-msvc
-            os: windows-latest
-            bin: jrsonnet.exe
-            name: jrsonnet-windows-amd64.exe
-
-          # Apple
-          - target: aarch64-apple-darwin
-            os: macOS-latest
-            bin: jrsonnet
-            name: jrsonnet-darwin-aarch64
-          - target: x86_64-apple-darwin
-            os: macOS-latest
-            bin: jrsonnet
-            name: jrsonnet-darwin-amd64
-    runs-on: ${{ matrix.os }}
-    steps:
-      - name: Fetch apt repo updates
-        if: ${{ startsWith(matrix.os, 'ubuntu-') }}
-        run: sudo apt update
-
-      - name: Install stable toolchain
-        uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
-        with:
-          toolchain: stable
-          target: ${{ matrix.target }}
-
-      - uses: actions/checkout@v4.1.4
-
-      - name: Add experimental flags
-        if: ${{ endsWith(github.ref, '-test' )}}
-        run: echo 'EXPERIMENTAL_FLAGS=--features=experimental' >> $GITHUB_ENV
-
-      - name: Linux x86 cross compiler
-        if: ${{ startsWith(matrix.target, 'i686-unknown-linux-') }}
-        run: sudo apt install gcc-multilib
-
-      - name: ARM cross compiler
-        if: ${{ startsWith(matrix.target, 'aarch64-unknown-linux-') }}
-        uses: actions-rs/cargo@v1
-        with:
-          command: install
-          args: cross
-
-      - name: ARM gcc
-        if: ${{ startsWith(matrix.target, 'aarch64-unknown-linux-') }}
-        run: sudo apt install gcc-aarch64-linux-gnu
-
-      - name: Musl gcc
-        if: ${{ endsWith(matrix.target, '-musl') }}
-        run: sudo apt install musl musl-tools
-
-      - name: Run cross build
-        if: ${{ startsWith(matrix.target, 'aarch64-unknown-linux-') }}
-        shell: bash
-        run: cross build --bin=jrsonnet --release --target ${{ matrix.target }} ${{ env.EXPERIMENTAL_FLAGS }}
-
-      - name: Run build
-        if: ${{ !startsWith(matrix.target, 'aarch64-unknown-linux-') }}
-        run: cargo build --bin=jrsonnet --release --target ${{ matrix.target }} ${{ env.EXPERIMENTAL_FLAGS }}
-
-      - name: Package
-        shell: bash
-        run: |
-          cd target/${{ matrix.target }}/release
-
-          cp ${{ matrix.bin }} ../../../${{ matrix.name }}
-          cd -
-
-      - name: Generate SHA-256
-        run: shasum -a 256 ${{ matrix.name }} > ${{ matrix.name }}.sha256
-
-      - name: Publish
-        uses: softprops/action-gh-release@v2.0.4
-        with:
-          draft: true
-          files: "jrsonnet*"
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
deleted.github/workflows/test.yamldiffbeforeafterboth
--- a/.github/workflows/test.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-name: Test
-on: [ workflow_call ]
-jobs:
-  test:
-    name: Test
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4.1.4
-      - uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
-      - run: cargo test --all
-  test-stable:
-    name: Test on stable
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4.1.4
-      - name: Install the latest stable toolchain
-        uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
-        with:
-          toolchain: stable
-      - run: cargo test --all
-
modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -9,7 +9,7 @@
 checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
 dependencies = [
  "cfg-if",
- "getrandom",
+ "getrandom 0.3.4",
  "once_cell",
  "version_check",
  "zerocopy",
@@ -38,11 +38,12 @@
 
 [[package]]
 name = "annotate-snippets"
-version = "0.12.11"
+version = "0.12.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16e4850548ff4a25a77ce3bda7241874e17fb702ea551f0cc62a2dbe052f1272"
+checksum = "74fc7650eedcb2fee505aad48491529e408f0e854c2d9f63eb86c1361b9b3f93"
 dependencies = [
  "anstyle",
+ "memchr",
  "unicode-width",
 ]
 
@@ -59,9 +60,9 @@
 
 [[package]]
 name = "anstream"
-version = "0.6.21"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
+checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
 dependencies = [
  "anstyle",
  "anstyle-parse",
@@ -74,15 +75,15 @@
 
 [[package]]
 name = "anstyle"
-version = "1.0.13"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
+checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
 
 [[package]]
 name = "anstyle-parse"
-version = "0.2.7"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
+checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
 dependencies = [
  "utf8parse",
 ]
@@ -109,9 +110,9 @@
 
 [[package]]
 name = "anyhow"
-version = "1.0.101"
+version = "1.0.102"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea"
+checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
 
 [[package]]
 name = "ar_archive_writer"
@@ -142,9 +143,9 @@
 
 [[package]]
 name = "bitflags"
-version = "2.10.0"
+version = "2.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
+checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
 
 [[package]]
 name = "block-buffer"
@@ -167,18 +168,18 @@
 
 [[package]]
 name = "bumpalo"
-version = "3.19.1"
+version = "3.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
+checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
 dependencies = [
  "allocator-api2",
 ]
 
 [[package]]
 name = "cc"
-version = "1.2.55"
+version = "1.2.58"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29"
+checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1"
 dependencies = [
  "find-msvc-tools",
  "shlex",
@@ -192,9 +193,9 @@
 
 [[package]]
 name = "clap"
-version = "4.5.57"
+version = "4.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6899ea499e3fb9305a65d5ebf6e3d2248c5fab291f300ad0a704fbe142eae31a"
+checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -202,9 +203,9 @@
 
 [[package]]
 name = "clap_builder"
-version = "4.5.57"
+version = "4.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b12c8b680195a62a8364d16b8447b01b6c2c8f9aaf68bee653be34d4245e238"
+checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
 dependencies = [
  "anstream",
  "anstyle",
@@ -214,18 +215,18 @@
 
 [[package]]
 name = "clap_complete"
-version = "4.5.65"
+version = "4.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "430b4dc2b5e3861848de79627b2bedc9f3342c7da5173a14eaa5d0f8dc18ae5d"
+checksum = "19c9f1dde76b736e3681f28cec9d5a61299cbaae0fce80a68e43724ad56031eb"
 dependencies = [
  "clap",
 ]
 
 [[package]]
 name = "clap_derive"
-version = "4.5.55"
+version = "4.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5"
+checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a"
 dependencies = [
  "heck 0.5.0",
  "proc-macro2",
@@ -235,26 +236,25 @@
 
 [[package]]
 name = "clap_lex"
-version = "0.7.7"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32"
+checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
 
 [[package]]
 name = "colorchoice"
-version = "1.0.4"
+version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
+checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
 
 [[package]]
 name = "console"
-version = "0.15.11"
+version = "0.16.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8"
+checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87"
 dependencies = [
  "encode_unicode",
  "libc",
- "once_cell",
- "windows-sys 0.59.0",
+ "windows-sys 0.61.2",
 ]
 
 [[package]]
@@ -302,7 +302,7 @@
  "bumpalo",
  "hashbrown 0.15.5",
  "indexmap",
- "rustc-hash 2.1.1",
+ "rustc-hash 2.1.2",
  "serde",
  "unicode-width",
 ]
@@ -451,12 +451,25 @@
  "cfg-if",
  "js-sys",
  "libc",
- "r-efi",
+ "r-efi 5.3.0",
  "wasip2",
  "wasm-bindgen",
 ]
 
 [[package]]
+name = "getrandom"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 6.0.0",
+ "wasip2",
+ "wasip3",
+]
+
+[[package]]
 name = "globset"
 version = "0.4.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -538,6 +551,12 @@
 ]
 
 [[package]]
+name = "id-arena"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
+
+[[package]]
 name = "indexmap"
 version = "2.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -560,9 +579,9 @@
 
 [[package]]
 name = "insta"
-version = "1.46.3"
+version = "1.47.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e82db8c87c7f1ccecb34ce0c24399b8a73081427f3c7c50a5d597925356115e4"
+checksum = "7b4a6248eb93a4401ed2f37dfe8ea592d3cf05b7cf4f8efa867b6895af7e094e"
 dependencies = [
  "console",
  "globset",
@@ -589,13 +608,13 @@
 
 [[package]]
 name = "itoa"
-version = "1.0.17"
+version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
 
 [[package]]
 name = "jrsonnet"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "clap",
  "clap_complete",
@@ -612,7 +631,7 @@
 
 [[package]]
 name = "jrsonnet-cli"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "clap",
  "jrsonnet-evaluator",
@@ -623,7 +642,7 @@
 
 [[package]]
 name = "jrsonnet-deps"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "clap",
  "jrsonnet-cli",
@@ -634,7 +653,7 @@
 
 [[package]]
 name = "jrsonnet-evaluator"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "annotate-snippets",
  "anyhow",
@@ -649,7 +668,7 @@
  "jrsonnet-types",
  "num-bigint",
  "pathdiff",
- "rustc-hash 2.1.1",
+ "rustc-hash 2.1.2",
  "rustversion",
  "serde",
  "stacker",
@@ -660,7 +679,7 @@
 
 [[package]]
 name = "jrsonnet-fmt"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "clap",
  "hi-doc",
@@ -672,7 +691,7 @@
 
 [[package]]
 name = "jrsonnet-formatter"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "dprint-core",
  "hi-doc",
@@ -704,16 +723,16 @@
 
 [[package]]
 name = "jrsonnet-interner"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "hashbrown 0.16.1",
  "jrsonnet-gcmodule",
- "rustc-hash 2.1.1",
+ "rustc-hash 2.1.2",
 ]
 
 [[package]]
 name = "jrsonnet-ir"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "insta",
  "jrsonnet-gcmodule",
@@ -724,7 +743,7 @@
 
 [[package]]
 name = "jrsonnet-ir-parser"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "insta",
  "jrsonnet-gcmodule",
@@ -734,14 +753,14 @@
 
 [[package]]
 name = "jrsonnet-lexer"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "logos",
 ]
 
 [[package]]
 name = "jrsonnet-macros"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -751,7 +770,7 @@
 
 [[package]]
 name = "jrsonnet-peg-parser"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "insta",
  "jrsonnet-gcmodule",
@@ -761,7 +780,7 @@
 
 [[package]]
 name = "jrsonnet-rowan-parser"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "anyhow",
  "drop_bomb",
@@ -776,7 +795,7 @@
 
 [[package]]
 name = "jrsonnet-stdlib"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "base64",
  "jrsonnet-evaluator",
@@ -787,7 +806,7 @@
  "md5",
  "num-bigint",
  "regex",
- "rustc-hash 2.1.1",
+ "rustc-hash 2.1.2",
  "serde",
  "serde-saphyr",
  "serde_json",
@@ -798,7 +817,7 @@
 
 [[package]]
 name = "jrsonnet-types"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "jrsonnet-gcmodule",
  "peg",
@@ -806,9 +825,9 @@
 
 [[package]]
 name = "js-sys"
-version = "0.3.85"
+version = "0.3.94"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
+checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9"
 dependencies = [
  "once_cell",
  "wasm-bindgen",
@@ -816,22 +835,28 @@
 
 [[package]]
 name = "keccak"
-version = "0.1.5"
+version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654"
+checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653"
 dependencies = [
  "cpufeatures",
 ]
 
 [[package]]
+name = "leb128fmt"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
+
+[[package]]
 name = "libc"
-version = "0.2.180"
+version = "0.2.184"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
+checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
 
 [[package]]
 name = "libjsonnet"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 dependencies = [
  "jrsonnet-evaluator",
  "jrsonnet-gcmodule",
@@ -842,9 +867,9 @@
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.11.0"
+version = "0.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
+checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
 
 [[package]]
 name = "log"
@@ -970,9 +995,9 @@
 
 [[package]]
 name = "once_cell"
-version = "1.21.3"
+version = "1.21.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
 
 [[package]]
 name = "once_cell_polyfill"
@@ -1047,6 +1072,16 @@
 ]
 
 [[package]]
+name = "prettyplease"
+version = "0.2.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
+dependencies = [
+ "proc-macro2",
+ "syn",
+]
+
+[[package]]
 name = "proc-macro2"
 version = "1.0.106"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1080,9 +1115,9 @@
 
 [[package]]
 name = "quote"
-version = "1.0.44"
+version = "1.0.45"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
+checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
 dependencies = [
  "proc-macro2",
 ]
@@ -1094,6 +1129,12 @@
 checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
 
 [[package]]
+name = "r-efi"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
+
+[[package]]
 name = "rand"
 version = "0.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1119,7 +1160,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
 dependencies = [
- "getrandom",
+ "getrandom 0.3.4",
 ]
 
 [[package]]
@@ -1165,9 +1206,9 @@
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.9"
+version = "0.8.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c"
+checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
 
 [[package]]
 name = "rowan"
@@ -1189,15 +1230,15 @@
 
 [[package]]
 name = "rustc-hash"
-version = "2.1.1"
+version = "2.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
+checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
 
 [[package]]
 name = "rustix"
-version = "1.1.3"
+version = "1.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
+checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
 dependencies = [
  "bitflags",
  "errno",
@@ -1233,6 +1274,12 @@
 ]
 
 [[package]]
+name = "semver"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
+
+[[package]]
 name = "serde"
 version = "1.0.228"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1252,7 +1299,7 @@
  "annotate-snippets",
  "base64",
  "encoding_rs_io",
- "getrandom",
+ "getrandom 0.3.4",
  "nohash-hasher",
  "num-traits",
  "regex",
@@ -1401,9 +1448,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.114"
+version = "2.0.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
+checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1423,12 +1470,12 @@
 
 [[package]]
 name = "tempfile"
-version = "3.24.0"
+version = "3.27.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"
+checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
 dependencies = [
  "fastrand",
- "getrandom",
+ "getrandom 0.4.2",
  "once_cell",
  "rustix",
  "windows-sys 0.61.2",
@@ -1474,9 +1521,9 @@
 
 [[package]]
 name = "tree-sitter"
-version = "0.26.5"
+version = "0.26.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12987371f54efc9b9306a20dc87ed5aaee9f320c8a8b115e28515c412b2efe39"
+checksum = "887bd495d0582c5e3e0d8ece2233666169fa56a9644d172fc22ad179ab2d0538"
 dependencies = [
  "cc",
  "regex",
@@ -1488,9 +1535,9 @@
 
 [[package]]
 name = "tree-sitter-highlight"
-version = "0.26.5"
+version = "0.26.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b688407049ea1b55a7e872f138947d22389118b9c4d09b459cb34ca205e41c0"
+checksum = "ccde2b54a34b58313e69c02496a2a9ad38d59af79b196b5e1df063431752a7e0"
 dependencies = [
  "regex",
  "streaming-iterator",
@@ -1524,9 +1571,9 @@
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.22"
+version = "1.0.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
 
 [[package]]
 name = "unicode-width"
@@ -1535,6 +1582,12 @@
 checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
 
 [[package]]
+name = "unicode-xid"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+
+[[package]]
 name = "utf8parse"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1575,10 +1628,19 @@
 ]
 
 [[package]]
+name = "wasip3"
+version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
+dependencies = [
+ "wit-bindgen",
+]
+
+[[package]]
 name = "wasm-bindgen"
-version = "0.2.108"
+version = "0.2.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
+checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0"
 dependencies = [
  "cfg-if",
  "once_cell",
@@ -1589,9 +1651,9 @@
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.108"
+version = "0.2.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
+checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be"
 dependencies = [
  "quote",
  "wasm-bindgen-macro-support",
@@ -1599,9 +1661,9 @@
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.108"
+version = "0.2.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
+checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2"
 dependencies = [
  "bumpalo",
  "proc-macro2",
@@ -1612,14 +1674,48 @@
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.108"
+version = "0.2.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
+checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
+name = "wasm-encoder"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
+dependencies = [
+ "leb128fmt",
+ "wasmparser",
+]
+
+[[package]]
+name = "wasm-metadata"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
+dependencies = [
+ "anyhow",
+ "indexmap",
+ "wasm-encoder",
+ "wasmparser",
+]
+
+[[package]]
+name = "wasmparser"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
+dependencies = [
+ "bitflags",
+ "hashbrown 0.15.5",
+ "indexmap",
+ "semver",
+]
+
+[[package]]
 name = "winapi-util"
 version = "0.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1721,6 +1817,88 @@
 version = "0.51.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
+dependencies = [
+ "wit-bindgen-rust-macro",
+]
+
+[[package]]
+name = "wit-bindgen-core"
+version = "0.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
+dependencies = [
+ "anyhow",
+ "heck 0.5.0",
+ "wit-parser",
+]
+
+[[package]]
+name = "wit-bindgen-rust"
+version = "0.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
+dependencies = [
+ "anyhow",
+ "heck 0.5.0",
+ "indexmap",
+ "prettyplease",
+ "syn",
+ "wasm-metadata",
+ "wit-bindgen-core",
+ "wit-component",
+]
+
+[[package]]
+name = "wit-bindgen-rust-macro"
+version = "0.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
+dependencies = [
+ "anyhow",
+ "prettyplease",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wit-bindgen-core",
+ "wit-bindgen-rust",
+]
+
+[[package]]
+name = "wit-component"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
+dependencies = [
+ "anyhow",
+ "bitflags",
+ "indexmap",
+ "log",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "wasm-encoder",
+ "wasm-metadata",
+ "wasmparser",
+ "wit-parser",
+]
+
+[[package]]
+name = "wit-parser"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
+dependencies = [
+ "anyhow",
+ "id-arena",
+ "indexmap",
+ "log",
+ "semver",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "unicode-xid",
+ "wasmparser",
+]
 
 [[package]]
 name = "xshell"
@@ -1759,18 +1937,18 @@
 
 [[package]]
 name = "zerocopy"
-version = "0.8.39"
+version = "0.8.48"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a"
+checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
 dependencies = [
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.8.39"
+version = "0.8.48"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517"
+checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1779,6 +1957,6 @@
 
 [[package]]
 name = "zmij"
-version = "1.0.19"
+version = "1.0.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445"
+checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
modifiedCargo.tomldiffbeforeafterboth
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,20 +8,20 @@
 edition = "2021"
 license = "MIT"
 repository = "https://github.com/CertainLach/jrsonnet"
-version = "0.5.0-pre97"
+version = "0.5.0-pre98"
 
 [workspace.dependencies]
-jrsonnet-evaluator = { path = "./crates/jrsonnet-evaluator", version = "0.5.0-pre97" }
-jrsonnet-macros = { path = "./crates/jrsonnet-macros", version = "0.5.0-pre97" }
-jrsonnet-ir = { path = "./crates/jrsonnet-ir", version = "0.5.0-pre97" }
-jrsonnet-ir-parser = { path = "./crates/jrsonnet-ir-parser", version = "0.5.0-pre97" }
-jrsonnet-peg-parser = { path = "./crates/jrsonnet-peg-parser", version = "0.5.0-pre97" }
-jrsonnet-rowan-parser = { path = "./crates/jrsonnet-rowan-parser", version = "0.5.0-pre97" }
-jrsonnet-interner = { path = "./crates/jrsonnet-interner", version = "0.5.0-pre97" }
-jrsonnet-stdlib = { path = "./crates/jrsonnet-stdlib", version = "0.5.0-pre97" }
-jrsonnet-cli = { path = "./crates/jrsonnet-cli", version = "0.5.0-pre97" }
-jrsonnet-types = { path = "./crates/jrsonnet-types", version = "0.5.0-pre97" }
-jrsonnet-formatter = { path = "./crates/jrsonnet-formatter", version = "0.5.0-pre97" }
+jrsonnet-evaluator = { path = "./crates/jrsonnet-evaluator", version = "0.5.0-pre98" }
+jrsonnet-macros = { path = "./crates/jrsonnet-macros", version = "0.5.0-pre98" }
+jrsonnet-ir = { path = "./crates/jrsonnet-ir", version = "0.5.0-pre98" }
+jrsonnet-ir-parser = { path = "./crates/jrsonnet-ir-parser", version = "0.5.0-pre98" }
+jrsonnet-peg-parser = { path = "./crates/jrsonnet-peg-parser", version = "0.5.0-pre98" }
+jrsonnet-rowan-parser = { path = "./crates/jrsonnet-rowan-parser", version = "0.5.0-pre98" }
+jrsonnet-interner = { path = "./crates/jrsonnet-interner", version = "0.5.0-pre98" }
+jrsonnet-stdlib = { path = "./crates/jrsonnet-stdlib", version = "0.5.0-pre98" }
+jrsonnet-cli = { path = "./crates/jrsonnet-cli", version = "0.5.0-pre98" }
+jrsonnet-types = { path = "./crates/jrsonnet-types", version = "0.5.0-pre98" }
+jrsonnet-formatter = { path = "./crates/jrsonnet-formatter", version = "0.5.0-pre98" }
 jrsonnet-gcmodule = { version = "0.4.2" }
 # Diagnostics.
 # hi-doc is my library, which handles text formatting very well, but isn't polished enough yet
modifiedbindings/jsonnet/Cargo.tomldiffbeforeafterboth
--- a/bindings/jsonnet/Cargo.toml
+++ b/bindings/jsonnet/Cargo.toml
@@ -39,5 +39,8 @@
 interop-threading = []
 
 experimental = ["exp-preserve-order", "exp-destruct"]
-exp-preserve-order = ["jrsonnet-evaluator/exp-preserve-order", "jrsonnet-stdlib/exp-preserve-order"]
+exp-preserve-order = [
+  "jrsonnet-evaluator/exp-preserve-order",
+  "jrsonnet-stdlib/exp-preserve-order",
+]
 exp-destruct = ["jrsonnet-evaluator/exp-destruct"]
modifiedbindings/jsonnet/src/import.rsdiffbeforeafterboth
--- a/bindings/jsonnet/src/import.rs
+++ b/bindings/jsonnet/src/import.rs
@@ -5,16 +5,15 @@
 	cell::RefCell,
 	collections::HashMap,
 	env::current_dir,
-	ffi::{c_void, CStr, CString},
+	ffi::{CStr, CString, c_void},
 	os::raw::{c_char, c_int},
 	path::PathBuf,
 	ptr::null_mut,
 };
 
 use jrsonnet_evaluator::{
-	bail,
+	AsPathLike, ImportResolver, ResolvePath, bail,
 	error::{ErrorKind::*, Result},
-	AsPathLike, ImportResolver, ResolvePath,
 };
 use jrsonnet_gcmodule::Acyclic;
 use jrsonnet_ir::{SourceDirectory, SourceFile, SourcePath};
modifiedbindings/jsonnet/src/lib.rsdiffbeforeafterboth
--- a/bindings/jsonnet/src/lib.rs
+++ b/bindings/jsonnet/src/lib.rs
@@ -21,14 +21,13 @@
 };
 
 use jrsonnet_evaluator::{
-	apply_tla, bail,
+	AsPathLike, FileImportResolver, IStr, ImportResolver, Result, State, Val, apply_tla, bail,
 	gc::WithCapacityExt as _,
 	manifest::{JsonFormat, ManifestFormat, ToStringFormat},
 	rustc_hash::FxHashMap,
 	stack::set_stack_depth_limit,
 	tla::TlaArg,
 	trace::{CompactFormat, PathResolver, TraceFormat},
-	AsPathLike, FileImportResolver, IStr, ImportResolver, Result, State, Val,
 };
 use jrsonnet_gcmodule::Acyclic;
 use jrsonnet_ir::SourcePath;
modifiedbindings/jsonnet/src/native.rsdiffbeforeafterboth
--- a/bindings/jsonnet/src/native.rs
+++ b/bindings/jsonnet/src/native.rs
@@ -1,13 +1,13 @@
 use std::{
-	ffi::{c_void, CStr},
+	ffi::{CStr, c_void},
 	os::raw::{c_char, c_int},
 };
 
 use jrsonnet_evaluator::{
+	IStr, Val,
 	error::{Error, ErrorKind},
 	function::builtin::{NativeCallback, NativeCallbackHandler},
 	typed::FromUntyped as _,
-	IStr, Val,
 };
 
 use crate::VM;
modifiedbindings/jsonnet/src/val_make.rsdiffbeforeafterboth
--- a/bindings/jsonnet/src/val_make.rs
+++ b/bindings/jsonnet/src/val_make.rs
@@ -6,8 +6,8 @@
 };
 
 use jrsonnet_evaluator::{
+	ObjValue, Val,
 	val::{ArrValue, NumValue},
-	ObjValue, Val,
 };
 
 use crate::VM;
modifiedbindings/jsonnet/src/val_modify.rsdiffbeforeafterboth
--- a/bindings/jsonnet/src/val_modify.rs
+++ b/bindings/jsonnet/src/val_modify.rs
@@ -4,7 +4,7 @@
 
 use std::{ffi::CStr, os::raw::c_char};
 
-use jrsonnet_evaluator::{val::ArrValue, Thunk, Val};
+use jrsonnet_evaluator::{Thunk, Val, val::ArrValue};
 
 use crate::VM;
 
modifiedbindings/jsonnet/src/vars_tlas.rsdiffbeforeafterboth
--- a/bindings/jsonnet/src/vars_tlas.rs
+++ b/bindings/jsonnet/src/vars_tlas.rs
@@ -2,8 +2,7 @@
 
 use std::{ffi::CStr, os::raw::c_char};
 
-use jrsonnet_evaluator::tla::TlaArg;
-use jrsonnet_evaluator::IStr;
+use jrsonnet_evaluator::{IStr, tla::TlaArg};
 
 use crate::VM;
 
modifiedcmds/jrsonnet-deps/src/main.rsdiffbeforeafterboth
--- a/cmds/jrsonnet-deps/src/main.rs
+++ b/cmds/jrsonnet-deps/src/main.rs
@@ -1,12 +1,10 @@
-use std::collections::BTreeSet;
-use std::process::exit;
+use std::{collections::BTreeSet, process::exit};
 
 use clap::Parser;
+use jrsonnet_cli::MiscOpts;
 use jrsonnet_evaluator::{FileImportResolver, ImportResolver};
-use jrsonnet_ir::{visit::Visitor, IStr, Source, SourcePath};
+use jrsonnet_ir::{IStr, Source, SourcePath, visit::Visitor};
 use jrsonnet_ir_parser::ParserSettings;
-
-use jrsonnet_cli::MiscOpts;
 
 #[derive(Parser)]
 struct Opts {
modifiedcmds/jrsonnet-fmt/src/main.rsdiffbeforeafterboth
--- a/cmds/jrsonnet-fmt/src/main.rs
+++ b/cmds/jrsonnet-fmt/src/main.rs
@@ -6,7 +6,7 @@
 };
 
 use clap::Parser;
-use jrsonnet_formatter::{format, FormatOptions};
+use jrsonnet_formatter::{FormatOptions, format};
 
 #[derive(Parser)]
 #[allow(clippy::struct_excessive_bools)]
@@ -51,8 +51,12 @@
 }
 
 fn main_result() -> Result<(), Error> {
-	eprintln!("jrsonnet-fmt is a prototype of a jsonnet code formatter, do not expect it to produce meaningful results right now.");
-	eprintln!("It is not expected for its output to match other implementations, it will be completly separate implementation with maybe different name.");
+	eprintln!(
+		"jrsonnet-fmt is a prototype of a jsonnet code formatter, do not expect it to produce meaningful results right now."
+	);
+	eprintln!(
+		"It is not expected for its output to match other implementations, it will be completly separate implementation with maybe different name."
+	);
 	let mut opts = Opts::parse();
 	let input = if opts.exec {
 		if opts.in_place {
modifiedcmds/jrsonnet/Cargo.tomldiffbeforeafterboth
--- a/cmds/jrsonnet/Cargo.toml
+++ b/cmds/jrsonnet/Cargo.toml
@@ -12,19 +12,19 @@
 
 [features]
 experimental = [
-    "exp-preserve-order",
-    "exp-destruct",
-    "exp-null-coaelse",
-    "exp-object-iteration",
-    "exp-bigint",
-    "exp-apply",
+  "exp-preserve-order",
+  "exp-destruct",
+  "exp-null-coaelse",
+  "exp-object-iteration",
+  "exp-bigint",
+  "exp-apply",
 ]
 # Use mimalloc as allocator
 mimalloc = ["mimallocator"]
 # Experimental feature, which allows to preserve order of object fields
 exp-preserve-order = [
-    "jrsonnet-evaluator/exp-preserve-order",
-    "jrsonnet-cli/exp-preserve-order",
+  "jrsonnet-evaluator/exp-preserve-order",
+  "jrsonnet-cli/exp-preserve-order",
 ]
 # Destructuring of locals
 exp-destruct = ["jrsonnet-evaluator/exp-destruct"]
@@ -36,9 +36,9 @@
 exp-regex = ["jrsonnet-cli/exp-regex"]
 # obj?.field, obj?.['field']
 exp-null-coaelse = [
-    "jrsonnet-evaluator/exp-null-coaelse",
-    "jrsonnet-ir/exp-null-coaelse",
-    "jrsonnet-cli/exp-null-coaelse",
+  "jrsonnet-evaluator/exp-null-coaelse",
+  "jrsonnet-ir/exp-null-coaelse",
+  "jrsonnet-cli/exp-null-coaelse",
 ]
 # --exp-apply
 exp-apply = []
modifiedcmds/jrsonnet/src/main.rsdiffbeforeafterboth
--- a/cmds/jrsonnet/src/main.rs
+++ b/cmds/jrsonnet/src/main.rs
@@ -1,5 +1,5 @@
 use std::{
-	fs::{create_dir_all, File},
+	fs::{File, create_dir_all},
 	io::{Read, Write},
 };
 
@@ -7,9 +7,8 @@
 use clap_complete::Shell;
 use jrsonnet_cli::{GcOpts, ManifestOpts, MiscOpts, OutputOpts, StdOpts, TlaOpts, TraceOpts};
 use jrsonnet_evaluator::{
-	apply_tla, bail,
+	ResultExt, State, Val, apply_tla, bail,
 	error::{Error as JrError, ErrorKind},
-	ResultExt, State, Val,
 };
 use jrsonnet_ir::{SourceDefaultIgnoreJpath, SourcePath};
 
modifiedcrates/jrsonnet-cli/Cargo.tomldiffbeforeafterboth
--- a/crates/jrsonnet-cli/Cargo.toml
+++ b/crates/jrsonnet-cli/Cargo.toml
@@ -12,20 +12,15 @@
 
 [features]
 exp-preserve-order = [
-    "jrsonnet-evaluator/exp-preserve-order",
-    "jrsonnet-stdlib/exp-preserve-order",
-]
-exp-bigint = [
-    "jrsonnet-evaluator/exp-bigint",
-    "jrsonnet-stdlib/exp-bigint",
+  "jrsonnet-evaluator/exp-preserve-order",
+  "jrsonnet-stdlib/exp-preserve-order",
 ]
+exp-bigint = ["jrsonnet-evaluator/exp-bigint", "jrsonnet-stdlib/exp-bigint"]
 exp-null-coaelse = [
-    "jrsonnet-evaluator/exp-null-coaelse",
-    "jrsonnet-stdlib/exp-null-coaelse",
+  "jrsonnet-evaluator/exp-null-coaelse",
+  "jrsonnet-stdlib/exp-null-coaelse",
 ]
-exp-regex = [
-    "jrsonnet-stdlib/exp-regex",
-]
+exp-regex = ["jrsonnet-stdlib/exp-regex"]
 
 [dependencies]
 jrsonnet-evaluator = { workspace = true, features = ["explaining-traces"] }
modifiedcrates/jrsonnet-cli/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-cli/src/lib.rs
+++ b/crates/jrsonnet-cli/src/lib.rs
@@ -7,10 +7,10 @@
 
 use clap::Parser;
 use jrsonnet_evaluator::{
-	stack::{limit_stack_depth, StackDepthLimitOverrideGuard},
 	FileImportResolver,
+	stack::{StackDepthLimitOverrideGuard, limit_stack_depth},
 };
-use jrsonnet_gcmodule::{with_thread_object_space, ObjectSpace};
+use jrsonnet_gcmodule::{ObjectSpace, with_thread_object_space};
 pub use manifest::*;
 pub use stdlib::*;
 pub use tla::*;
modifiedcrates/jrsonnet-cli/src/stdlib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-cli/src/stdlib.rs
+++ b/crates/jrsonnet-cli/src/stdlib.rs
@@ -1,8 +1,7 @@
 use std::str::FromStr;
 
 use clap::Parser;
-use jrsonnet_evaluator::tla::TlaArg;
-use jrsonnet_evaluator::{trace::PathResolver, Result};
+use jrsonnet_evaluator::{Result, tla::TlaArg, trace::PathResolver};
 use jrsonnet_stdlib::ContextInitializer;
 
 #[derive(Clone)]
modifiedcrates/jrsonnet-cli/src/tla.rsdiffbeforeafterboth
--- a/crates/jrsonnet-cli/src/tla.rs
+++ b/crates/jrsonnet-cli/src/tla.rs
@@ -1,6 +1,7 @@
 use clap::Parser;
-use jrsonnet_evaluator::tla::TlaArg;
-use jrsonnet_evaluator::{error::Result, gc::WithCapacityExt as _, rustc_hash::FxHashMap, IStr};
+use jrsonnet_evaluator::{
+	IStr, error::Result, gc::WithCapacityExt as _, rustc_hash::FxHashMap, tla::TlaArg,
+};
 
 use crate::{ExtFile, ExtStr};
 
modifiedcrates/jrsonnet-evaluator/Cargo.tomldiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/Cargo.toml
+++ b/crates/jrsonnet-evaluator/Cargo.toml
@@ -26,13 +26,19 @@
 # Allows to preserve field order in objects
 exp-preserve-order = []
 # Implements field destructuring
-exp-destruct = ["jrsonnet-peg-parser?/exp-destruct", "jrsonnet-ir-parser?/exp-destruct"]
+exp-destruct = [
+  "jrsonnet-peg-parser?/exp-destruct",
+  "jrsonnet-ir-parser?/exp-destruct",
+]
 # Iteration over objects yields [key, value] elements
 exp-object-iteration = []
 # Bigint type
 exp-bigint = ["num-bigint", "jrsonnet-types/exp-bigint"]
 # obj?.field, obj?.['field']
-exp-null-coaelse = ["jrsonnet-peg-parser?/exp-null-coaelse", "jrsonnet-ir-parser?/exp-null-coaelse"]
+exp-null-coaelse = [
+  "jrsonnet-peg-parser?/exp-null-coaelse",
+  "jrsonnet-ir-parser?/exp-null-coaelse",
+]
 
 [dependencies]
 jrsonnet-interner.workspace = true
@@ -63,7 +69,13 @@
 num-bigint = { workspace = true, features = ["serde"], optional = true }
 
 stacker = "0.1.23"
-educe = { version = "0.6.0", default-features = false, features = ["Clone", "Debug", "Eq", "Hash", "PartialEq"] }
+educe = { version = "0.6.0", default-features = false, features = [
+  "Clone",
+  "Debug",
+  "Eq",
+  "Hash",
+  "PartialEq",
+] }
 
 [build-dependencies]
 rustversion = "1.0.22"
modifiedcrates/jrsonnet-evaluator/src/arr/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/arr/mod.rs
+++ b/crates/jrsonnet-evaluator/src/arr/mod.rs
@@ -5,11 +5,11 @@
 	rc::Rc,
 };
 
-use jrsonnet_gcmodule::{cc_dyn, Cc};
+use jrsonnet_gcmodule::{Cc, cc_dyn};
 use jrsonnet_interner::IBytes;
 use jrsonnet_ir::Expr;
 
-use crate::{function::NativeFn, typed::IntoUntyped, Context, Result, Thunk, Val};
+use crate::{Context, Result, Thunk, Val, function::NativeFn, typed::IntoUntyped};
 
 mod spec;
 pub use spec::{ArrayLike, *};
modifiedcrates/jrsonnet-evaluator/src/arr/spec.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/arr/spec.rs
+++ b/crates/jrsonnet-evaluator/src/arr/spec.rs
@@ -1,18 +1,17 @@
-use std::rc::Rc;
-use std::{any::Any, cell::RefCell, fmt::Debug, mem::replace};
+use std::{any::Any, cell::RefCell, fmt::Debug, mem::replace, rc::Rc};
 
 use jrsonnet_gcmodule::{Cc, Trace};
 use jrsonnet_interner::{IBytes, IStr};
 use jrsonnet_ir::Expr;
 
 use super::ArrValue;
-use crate::function::NativeFn;
 use crate::{
+	Context, Error, ObjValue, Result, Thunk, Val,
 	error::ErrorKind::InfiniteRecursionDetected,
 	evaluate,
+	function::NativeFn,
 	typed::{IntoUntyped, Typed},
 	val::ThunkValue,
-	Context, Error, ObjValue, Result, Thunk, Val,
 };
 
 pub trait ArrayLike: Any + Trace + Debug {
modifiedcrates/jrsonnet-evaluator/src/async_import.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/async_import.rs
+++ b/crates/jrsonnet-evaluator/src/async_import.rs
@@ -1,9 +1,7 @@
-use std::rc::Rc;
-use std::{any::Any, cell::RefCell, future::Future};
+use std::{any::Any, cell::RefCell, future::Future, rc::Rc};
 
 use jrsonnet_gcmodule::Acyclic;
-use jrsonnet_ir::visit::Visitor;
-use jrsonnet_ir::{IStr, Source, SourcePath};
+use jrsonnet_ir::{IStr, Source, SourcePath, visit::Visitor};
 use rustc_hash::FxHashMap;
 
 use crate::{AsPathLike, FileData, ImportResolver, ResolvePathOwned, State};
modifiedcrates/jrsonnet-evaluator/src/ctx.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/ctx.rs
+++ b/crates/jrsonnet-evaluator/src/ctx.rs
@@ -6,8 +6,8 @@
 use rustc_hash::FxHashMap;
 
 use crate::{
-	error::ErrorKind::*, gc::WithCapacityExt as _, map::LayeredHashMap, ObjValue, Pending, Result,
-	SupThis, Thunk, Val,
+	ObjValue, Pending, Result, SupThis, Thunk, Val, error::ErrorKind::*, gc::WithCapacityExt as _,
+	map::LayeredHashMap,
 };
 /// Context keeps information about current lexical code location
 ///
modifiedcrates/jrsonnet-evaluator/src/dynamic.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/dynamic.rs
+++ b/crates/jrsonnet-evaluator/src/dynamic.rs
@@ -3,7 +3,7 @@
 use educe::Educe;
 use jrsonnet_gcmodule::{Cc, Trace};
 
-use crate::{bail, error::ErrorKind::InfiniteRecursionDetected, val::ThunkValue, Result};
+use crate::{Result, bail, error::ErrorKind::InfiniteRecursionDetected, val::ThunkValue};
 
 #[derive(Trace, Educe)]
 #[educe(Clone)]
modifiedcrates/jrsonnet-evaluator/src/error.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/error.rs
+++ b/crates/jrsonnet-evaluator/src/error.rs
@@ -7,11 +7,11 @@
 use thiserror::Error;
 
 use crate::{
+	ObjValue, ResolvePathOwned,
 	function::{CallLocation, FunctionSignature, ParamName},
 	stdlib::format::FormatError,
 	typed::TypeLocError,
 	val::ConvertNumValueError,
-	ObjValue, ResolvePathOwned,
 };
 
 #[derive(Debug, Clone)]
@@ -78,7 +78,10 @@
 		if conf < 0.8 {
 			continue;
 		}
-		assert!(field.as_str() != key.as_str(), "looks like string pooling failure, please write any info regarding this crash to https://github.com/CertainLach/jrsonnet/issues/113, thanks!");
+		assert!(
+			field.as_str() != key.as_str(),
+			"looks like string pooling failure, please write any info regarding this crash to https://github.com/CertainLach/jrsonnet/issues/113, thanks!"
+		);
 
 		heap.push((conf, field));
 	}
@@ -271,11 +274,11 @@
 }
 impl fmt::Display for Error {
 	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-		writeln!(f, "{}", self.0 .0)?;
-		for el in &self.0 .1 .0 {
+		writeln!(f, "{}", self.0.0)?;
+		for el in &self.0.1.0 {
 			write!(f, "\t{}", el.desc)?;
 			if let Some(loc) = &el.location {
-				write!(f, "at {}", loc.0 .0 .0)?;
+				write!(f, "at {}", loc.0.0.0)?;
 				loc.0.map_source_locations(&[loc.1, loc.2]);
 			}
 			writeln!(f)?;
modifiedcrates/jrsonnet-evaluator/src/evaluate/destructure.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate/destructure.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate/destructure.rs
@@ -3,15 +3,14 @@
 use jrsonnet_interner::IStr;
 use jrsonnet_ir::{BindSpec, Destruct};
 
+#[cfg(feature = "exp-preserve-order")]
+use crate::evaluate;
 use crate::{
-	bail,
+	Context, Pending, Thunk, Val, bail,
 	error::{ErrorKind::*, Result},
-	evaluate_method, evaluate_named_param, Context, Pending, Thunk, Val,
+	evaluate_method, evaluate_named_param,
 };
 
-#[cfg(feature = "exp-preserve-order")]
-use crate::evaluate;
-
 #[allow(clippy::too_many_lines)]
 #[allow(unused_variables)]
 pub fn destruct<H: BuildHasher>(
@@ -107,10 +106,11 @@
 		}
 		#[cfg(feature = "exp-destruct")]
 		Destruct::Object { fields, rest } => {
-			use crate::ObjValueBuilder;
 			use jrsonnet_ir::DestructRest;
 			use rustc_hash::FxHashSet;
 
+			use crate::ObjValueBuilder;
+
 			let captured_fields: FxHashSet<_> = fields.iter().map(|f| f.0.clone()).collect();
 			let field_names: Vec<_> = fields
 				.iter()
modifiedcrates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate/mod.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate/mod.rs
@@ -3,27 +3,28 @@
 use jrsonnet_gcmodule::{Cc, Trace};
 use jrsonnet_interner::IStr;
 use jrsonnet_ir::{
-	function::ParamName, ArgsDesc, AssertStmt, BinaryOpType, BindSpec, CompSpec, Expr, ExprParams,
-	FieldMember, FieldName, ForSpecData, IfSpecData, ImportKind, LiteralType, ObjBody, ObjMembers,
-	Spanned,
+	ArgsDesc, AssertStmt, BinaryOpType, BindSpec, CompSpec, Expr, ExprParams, FieldMember,
+	FieldName, ForSpecData, IfSpecData, ImportKind, LiteralType, ObjBody, ObjMembers, Spanned,
+	function::ParamName,
 };
 use jrsonnet_types::ValType;
 use rustc_hash::FxHashMap;
 
 use self::destructure::destruct;
 use crate::{
+	Context, Error, ObjValue, ObjValueBuilder, ObjectAssertion, Pending, Result, ResultExt,
+	SupThis, Unbound, Val,
 	arr::ArrValue,
 	bail,
 	destructure::evaluate_dest,
-	error::{suggest_object_fields, ErrorKind::*},
+	error::{ErrorKind::*, suggest_object_fields},
 	evaluate::operator::{evaluate_binary_op_special, evaluate_unary_op},
 	function::{CallLocation, FuncDesc, FuncVal},
 	gc::WithCapacityExt as _,
 	in_frame,
 	typed::{FromUntyped, IntoUntyped as _, Typed},
 	val::{CachedUnbound, IndexableVal, NumValue, StrValue, Thunk},
-	with_state, Context, Error, ObjValue, ObjValueBuilder, ObjectAssertion, Pending, Result,
-	ResultExt, SupThis, Unbound, Val,
+	with_state,
 };
 pub mod destructure;
 pub mod operator;
modifiedcrates/jrsonnet-evaluator/src/evaluate/operator.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate/operator.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate/operator.rs
@@ -3,14 +3,14 @@
 use jrsonnet_ir::{BinaryOpType, Expr, UnaryOpType};
 
 use crate::{
+	Context, Result, Val,
 	arr::ArrValue,
 	bail,
 	error::ErrorKind::*,
 	evaluate,
 	stdlib::std_format,
 	typed::IntoUntyped as _,
-	val::{equals, StrValue},
-	Context, Result, Val,
+	val::{StrValue, equals},
 };
 
 pub fn evaluate_unary_op(op: UnaryOpType, b: &Val) -> Result<Val> {
modifiedcrates/jrsonnet-evaluator/src/function/builtin.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/function/builtin.rs
+++ b/crates/jrsonnet-evaluator/src/function/builtin.rs
@@ -1,6 +1,6 @@
 use std::any::Any;
 
-use jrsonnet_gcmodule::{cc_dyn, Trace, TraceBox};
+use jrsonnet_gcmodule::{Trace, TraceBox, cc_dyn};
 use jrsonnet_ir::function::{FunctionSignature, ParamDefault, ParamName, ParamParse};
 
 use super::CallLocation;
modifiedcrates/jrsonnet-evaluator/src/function/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/function/mod.rs
+++ b/crates/jrsonnet-evaluator/src/function/mod.rs
@@ -9,11 +9,11 @@
 use self::{
 	builtin::{Builtin, StaticBuiltin},
 	parse::{parse_builtin_call, parse_default_function_call, parse_function_call},
-	prepared::{parse_prepared_builtin_call, parse_prepared_function_call, PreparedCall},
+	prepared::{PreparedCall, parse_prepared_builtin_call, parse_prepared_function_call},
 };
 use crate::{
-	bail, error::ErrorKind::*, evaluate, evaluate_trivial, function::builtin::BuiltinFunc, Context,
-	Result, Thunk, Val,
+	Context, Result, Thunk, Val, bail, error::ErrorKind::*, evaluate, evaluate_trivial,
+	function::builtin::BuiltinFunc,
 };
 
 pub mod builtin;
@@ -21,10 +21,9 @@
 mod parse;
 mod prepared;
 
+pub use jrsonnet_ir::function::*;
 pub use native::NativeFn;
 pub use prepared::PreparedFuncVal;
-
-pub use jrsonnet_ir::function::*;
 
 /// Function callsite location.
 /// Either from other jsonnet code, specified by expression location, or from native (without location).
modifiedcrates/jrsonnet-evaluator/src/function/native.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/function/native.rs
+++ b/crates/jrsonnet-evaluator/src/function/native.rs
@@ -1,14 +1,14 @@
 use std::marker::PhantomData;
 
 use jrsonnet_gcmodule::Trace;
+use jrsonnet_types::{ComplexValType, ValType};
 
 use super::PreparedFuncVal;
 use crate::{
+	CallLocation, Result, Val,
 	function::FuncVal,
 	typed::{FromUntyped, IntoUntyped, Typed},
-	CallLocation, Result, Val,
 };
-use jrsonnet_types::{ComplexValType, ValType};
 
 #[derive(Debug, Trace, Clone)]
 pub struct NativeFn<D: 'static>(pub(crate) PreparedFuncVal, PhantomData<D>);
modifiedcrates/jrsonnet-evaluator/src/function/parse.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/function/parse.rs
+++ b/crates/jrsonnet-evaluator/src/function/parse.rs
@@ -1,18 +1,17 @@
 use std::rc::Rc;
 
 use jrsonnet_ir::{
+	ArgsDesc, Expr, ExprParams,
 	function::{FunctionSignature, ParamName},
-	ArgsDesc, Expr, ExprParams,
 };
 use rustc_hash::FxHashMap;
 
 use crate::{
-	bail,
+	Context, Pending, Thunk, Val, bail,
 	destructure::destruct,
 	error::{ErrorKind::*, Result},
 	evaluate, evaluate_named_param,
 	gc::WithCapacityExt as _,
-	Context, Pending, Thunk, Val,
 };
 
 fn eval_arg(ctx: Context, arg: &Rc<Expr>, tailstrict: bool) -> Result<Thunk<Val>> {
modifiedcrates/jrsonnet-evaluator/src/function/prepared.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/function/prepared.rs
+++ b/crates/jrsonnet-evaluator/src/function/prepared.rs
@@ -1,16 +1,14 @@
 use std::rc::Rc;
 
 use jrsonnet_gcmodule::{Acyclic, Trace};
-use jrsonnet_ir::function::FunctionSignature;
-use jrsonnet_ir::{ExprParams, IStr};
+use jrsonnet_ir::{ExprParams, IStr, function::FunctionSignature};
 use rustc_hash::{FxHashMap, FxHashSet};
-
-use crate::destructure::destruct;
-use crate::gc::WithCapacityExt;
-use crate::{bail, error::ErrorKind::*, Result};
-use crate::{evaluate_named_param, Context, ContextBuilder, Pending, Thunk, Val};
 
 use super::{CallLocation, FuncVal};
+use crate::{
+	Context, ContextBuilder, Pending, Result, Thunk, Val, bail, destructure::destruct,
+	error::ErrorKind::*, evaluate_named_param, gc::WithCapacityExt,
+};
 
 #[derive(Debug, Trace, Clone)]
 pub struct PreparedFuncVal {
modifiedcrates/jrsonnet-evaluator/src/integrations/serde.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/integrations/serde.rs
+++ b/crates/jrsonnet-evaluator/src/integrations/serde.rs
@@ -2,17 +2,17 @@
 
 use jrsonnet_interner::IStr;
 use serde::{
+	Deserialize, Serialize, Serializer,
 	de::{self, Visitor},
 	ser::{
 		Error, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
 		SerializeTupleStruct, SerializeTupleVariant,
 	},
-	Deserialize, Serialize, Serializer,
 };
 
 use crate::{
-	arr::ArrValue, in_description_frame, runtime_error, val::NumValue, Error as JrError, ObjValue,
-	ObjValueBuilder, Result, Val,
+	Error as JrError, ObjValue, ObjValueBuilder, Result, Val, arr::ArrValue, in_description_frame,
+	runtime_error, val::NumValue,
 };
 
 impl<'de> Deserialize<'de> for Val {
modifiedcrates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/lib.rs
+++ b/crates/jrsonnet-evaluator/src/lib.rs
@@ -40,7 +40,7 @@
 pub use evaluate::*;
 use function::CallLocation;
 pub use import::*;
-use jrsonnet_gcmodule::{cc_dyn, Cc, Trace};
+use jrsonnet_gcmodule::{Cc, Trace, cc_dyn};
 pub use jrsonnet_interner::{IBytes, IStr};
 pub use jrsonnet_ir as parser;
 use jrsonnet_ir::{Expr, Source, SourcePath};
modifiedcrates/jrsonnet-evaluator/src/manifest.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/manifest.rs
+++ b/crates/jrsonnet-evaluator/src/manifest.rs
@@ -1,6 +1,6 @@
 use std::{borrow::Cow, fmt::Write, ptr};
 
-use crate::{bail, in_description_frame, Result, ResultExt, Val};
+use crate::{Result, ResultExt, Val, bail, in_description_frame};
 
 pub trait ManifestFormat {
 	fn manifest_buf(&self, val: Val, buf: &mut String) -> Result<()>;
modifiedcrates/jrsonnet-evaluator/src/map.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/map.rs
+++ b/crates/jrsonnet-evaluator/src/map.rs
@@ -2,7 +2,7 @@
 use jrsonnet_interner::IStr;
 use rustc_hash::FxHashMap;
 
-use crate::{gc::WithCapacityExt as _, Thunk, Val};
+use crate::{Thunk, Val, gc::WithCapacityExt as _};
 
 #[derive(Trace, Debug)]
 #[trace(tracking(force))]
modifiedcrates/jrsonnet-evaluator/src/obj/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/obj/mod.rs
+++ b/crates/jrsonnet-evaluator/src/obj/mod.rs
@@ -11,7 +11,7 @@
 };
 
 use educe::Educe;
-use jrsonnet_gcmodule::{cc_dyn, Acyclic, Cc, Trace, Weak};
+use jrsonnet_gcmodule::{Acyclic, Cc, Trace, Weak, cc_dyn};
 use jrsonnet_interner::IStr;
 use jrsonnet_ir::Span;
 use rustc_hash::{FxHashMap, FxHashSet};
@@ -22,13 +22,13 @@
 pub use oop::ObjValueBuilder;
 
 use crate::{
+	CcUnbound, MaybeUnbound, Result, Thunk, Unbound, Val,
 	arr::{PickObjectKeyValues, PickObjectValues},
 	bail,
-	error::{suggest_object_fields, ErrorKind::*},
+	error::{ErrorKind::*, suggest_object_fields},
 	identity_hash,
 	operator::evaluate_add_op,
 	val::{ArrValue, ThunkValue},
-	CcUnbound, MaybeUnbound, Result, Thunk, Unbound, Val,
 };
 
 #[cfg(not(feature = "exp-preserve-order"))]
modifiedcrates/jrsonnet-evaluator/src/obj/oop.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/obj/oop.rs
+++ b/crates/jrsonnet-evaluator/src/obj/oop.rs
@@ -1,21 +1,25 @@
-use std::cell::{Cell, RefCell};
-use std::ops::ControlFlow;
-use std::{fmt, mem};
+use std::{
+	cell::{Cell, RefCell},
+	fmt, mem,
+	ops::ControlFlow,
+};
 
-use crate::function::{CallLocation, FuncVal};
-use crate::gc::WithCapacityExt as _;
-use crate::{
-	bail, error::ErrorKind::*, in_frame, CcUnbound, MaybeUnbound, Result, Thunk, Unbound, Val,
-};
 use jrsonnet_gcmodule::{Cc, Trace};
 use jrsonnet_ir::IStr;
 use rustc_hash::{FxHashMap, FxHashSet};
 
-use super::ordering::{FieldIndex, SuperDepth};
 use super::{
 	CcObjectAssertion, CcObjectCore, EnumFields, EnumFieldsHandler, FieldVisibility, GetFor,
 	HasFieldIncludeHidden, ObjMember, ObjMemberBuilder, ObjValue, ObjValueInner, ObjectAssertion,
 	ObjectCore, OmitFieldsCore, SupThis,
+	ordering::{FieldIndex, SuperDepth},
+};
+use crate::{
+	CcUnbound, MaybeUnbound, Result, Thunk, Unbound, Val, bail,
+	error::ErrorKind::*,
+	function::{CallLocation, FuncVal},
+	gc::WithCapacityExt as _,
+	in_frame,
 };
 
 #[allow(clippy::module_name_repetitions)]
modifiedcrates/jrsonnet-evaluator/src/stdlib/format.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/stdlib/format.rs
+++ b/crates/jrsonnet-evaluator/src/stdlib/format.rs
@@ -7,10 +7,9 @@
 use thiserror::Error;
 
 use crate::{
-	bail,
-	error::{format_found, suggest_object_fields, ErrorKind::*},
+	Error, ObjValue, Result, Val, bail,
+	error::{ErrorKind::*, format_found, suggest_object_fields},
 	typed::FromUntyped,
-	Error, ObjValue, Result, Val,
 };
 
 #[derive(Debug, Clone, Error, Trace)]
modifiedcrates/jrsonnet-evaluator/src/stdlib/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/stdlib/mod.rs
+++ b/crates/jrsonnet-evaluator/src/stdlib/mod.rs
@@ -3,7 +3,7 @@
 
 use format::{format_arr, format_obj};
 
-use crate::{function::CallLocation, in_frame, Result, Val};
+use crate::{Result, Val, function::CallLocation, in_frame};
 
 pub mod format;
 
modifiedcrates/jrsonnet-evaluator/src/tla.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/tla.rs
+++ b/crates/jrsonnet-evaluator/src/tla.rs
@@ -5,8 +5,9 @@
 use jrsonnet_ir::{SourceFifo, SourcePath};
 
 use crate::{
+	Result, Thunk, Val,
 	function::{CallLocation, PreparedFuncVal},
-	in_description_frame, with_state, Result, Thunk, Val,
+	in_description_frame, with_state,
 };
 
 #[derive(Clone, Trace)]
modifiedcrates/jrsonnet-evaluator/src/trace/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/trace/mod.rs
+++ b/crates/jrsonnet-evaluator/src/trace/mod.rs
@@ -10,7 +10,7 @@
 #[cfg(feature = "explaining-traces")]
 use jrsonnet_ir::Span;
 
-use crate::{error::ErrorKind, Error};
+use crate::{Error, error::ErrorKind};
 
 /// The way paths should be displayed
 #[derive(Clone, Trace)]
@@ -258,7 +258,7 @@
 		struct ResetData {
 			loc: Span,
 		}
-		use hi_doc::{source_to_ansi, Formatting, SnippetBuilder, Text};
+		use hi_doc::{Formatting, SnippetBuilder, Text, source_to_ansi};
 
 		write!(out, "{}", error.error())?;
 		if let ErrorKind::ImportSyntaxError { path, error } = error.error() {
modifiedcrates/jrsonnet-evaluator/src/typed/conversions.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/typed/conversions.rs
+++ b/crates/jrsonnet-evaluator/src/typed/conversions.rs
@@ -5,23 +5,23 @@
 use jrsonnet_types::{ComplexValType, ValType};
 
 use crate::{
+	ObjValue, ObjValueBuilder, Result, ResultExt, Thunk, Val,
 	arr::{ArrValue, BytesArray},
 	bail,
 	function::FuncVal,
 	typed::CheckType,
 	val::{IndexableVal, NumValue, StrValue, ThunkMapper},
-	ObjValue, ObjValueBuilder, Result, ResultExt, Thunk, Val,
 };
 
 #[doc(hidden)]
 pub mod __typed_macro_prelude {
 	pub use ::jrsonnet_evaluator::{
+		IStr, ObjValue, ObjValueBuilder, State, Val,
 		error::{ErrorKind, Result as JrResult},
 		typed::{
 			CheckType, ComplexValType, FromUntyped, IntoUntyped, ParseTypedObj, SerializeTypedObj,
 			Typed,
 		},
-		IStr, ObjValue, ObjValueBuilder, State, Val,
 	};
 }
 pub use jrsonnet_macros::{FromUntyped, IntoUntyped, Typed};
modifiedcrates/jrsonnet-evaluator/src/typed/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/typed/mod.rs
+++ b/crates/jrsonnet-evaluator/src/typed/mod.rs
@@ -7,8 +7,9 @@
 use thiserror::Error;
 
 use crate::{
+	Val,
 	error::{Error, ErrorKind, Result},
-	in_description_frame, Val,
+	in_description_frame,
 };
 
 #[derive(Debug, Error, Clone, Acyclic)]
modifiedcrates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/val.rs
+++ b/crates/jrsonnet-evaluator/src/val.rs
@@ -9,7 +9,7 @@
 	rc::Rc,
 };
 
-use jrsonnet_gcmodule::{cc_dyn, Acyclic, Cc, Trace};
+use jrsonnet_gcmodule::{Acyclic, Cc, Trace, cc_dyn};
 use jrsonnet_interner::IStr;
 pub use jrsonnet_macros::Thunk;
 use jrsonnet_types::ValType;
@@ -18,13 +18,12 @@
 
 pub use crate::arr::{ArrValue, ArrayLike};
 use crate::{
-	bail,
+	ObjValue, Result, SupThis, Unbound, WeakSupThis, bail,
 	error::{Error, ErrorKind::*},
 	function::FuncVal,
 	gc::WithCapacityExt as _,
 	manifest::{ManifestFormat, ToStringFormat},
 	typed::{BoundedUsize, MAX_SAFE_INTEGER, MIN_SAFE_INTEGER},
-	ObjValue, Result, SupThis, Unbound, WeakSupThis,
 };
 
 pub trait ThunkValue: Trace {
modifiedcrates/jrsonnet-formatter/src/children.rsdiffbeforeafterboth
--- a/crates/jrsonnet-formatter/src/children.rs
+++ b/crates/jrsonnet-formatter/src/children.rs
@@ -3,8 +3,8 @@
 use std::{fmt::Debug, mem};
 
 use jrsonnet_rowan_parser::{
+	AstNode, AstToken, SyntaxElement, SyntaxNode, TS,
 	nodes::{CustomError, Trivia, TriviaKind},
-	AstNode, AstToken, SyntaxElement, SyntaxNode, TS,
 };
 
 pub type ChildTrivia = Vec<Result<Trivia, String>>;
modifiedcrates/jrsonnet-formatter/src/comments.rsdiffbeforeafterboth
--- a/crates/jrsonnet-formatter/src/comments.rs
+++ b/crates/jrsonnet-formatter/src/comments.rs
@@ -1,7 +1,7 @@
 use std::string::String;
 
 use dprint_core::formatting::PrintItems;
-use jrsonnet_rowan_parser::{nodes::TriviaKind, AstToken};
+use jrsonnet_rowan_parser::{AstToken, nodes::TriviaKind};
 
 use crate::{children::ChildTrivia, p, pi};
 
modifiedcrates/jrsonnet-formatter/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-formatter/src/lib.rs
+++ b/crates/jrsonnet-formatter/src/lib.rs
@@ -2,26 +2,26 @@
 
 use children::{children_between, trivia_before};
 use dprint_core::formatting::{
+	ConditionResolver, ConditionResolverContext, LineNumber, PrintItems, PrintOptions,
 	condition_helpers::is_multiple_lines,
 	condition_resolvers::true_resolver,
 	ir_helpers::{new_line_group, with_indent},
-	ConditionResolver, ConditionResolverContext, LineNumber, PrintItems, PrintOptions,
 };
 use hi_doc::{Formatting, SnippetBuilder};
 use jrsonnet_lexer::collect_lexed_str_block;
 use jrsonnet_rowan_parser::{
+	AstNode, AstToken as _, SyntaxToken,
 	nodes::{
 		Arg, ArgsDesc, Assertion, BinaryOperator, Bind, CompSpec, Destruct, DestructArrayPart,
 		DestructRest, Expr, ExprArray, ExprBase, FieldName, ForSpec, IfSpec, ImportKind, Literal,
 		Member, Name, Number, ObjBody, ObjLocal, ParamsDesc, SliceDesc, SourceFile, Stmt, Suffix,
 		Text, TextKind, UnaryOperator, Visibility,
 	},
-	AstNode, AstToken as _, SyntaxToken,
 };
 
 use crate::{
-	children::{trivia_after, Child, EndingComments},
-	comments::{format_comments, CommentLocation},
+	children::{Child, EndingComments, trivia_after},
+	comments::{CommentLocation, format_comments},
 };
 
 mod children;
@@ -461,18 +461,10 @@
 						if mem.should_start_with_newline {
 							p!(out, nl);
 						}
-						format_comments(
-							&mem.before_trivia,
-							CommentLocation::AboveItem,
-							&mut out,
-						);
-						p!(&mut out, {mem.value});
+						format_comments(&mem.before_trivia, CommentLocation::AboveItem, &mut out);
+						p!(&mut out, { mem.value });
 						p!(out, if("trailing comma", multi_line, str(",")));
-						format_comments(
-							&mem.inline_trivia,
-							CommentLocation::ItemInline,
-							&mut out,
-						);
+						format_comments(&mem.inline_trivia, CommentLocation::ItemInline, &mut out);
 						p!(out, if_else("member-comp sep", multi_line, nl)(sonl));
 					}
 
@@ -490,17 +482,9 @@
 						if mem.should_start_with_newline {
 							p!(out, nl);
 						}
-						format_comments(
-							&mem.before_trivia,
-							CommentLocation::AboveItem,
-							&mut out,
-						);
+						format_comments(&mem.before_trivia, CommentLocation::AboveItem, &mut out);
 						p!(&mut out, { mem.value });
-						format_comments(
-							&mem.inline_trivia,
-							CommentLocation::ItemInline,
-							&mut out,
-						);
+						format_comments(&mem.inline_trivia, CommentLocation::ItemInline, &mut out);
 						p!(out, if_else("comp spec sep", multi_line, nl)(sonl));
 					}
 
modifiedcrates/jrsonnet-interner/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-interner/src/lib.rs
+++ b/crates/jrsonnet-interner/src/lib.rs
@@ -14,7 +14,7 @@
 	str,
 };
 
-use hashbrown::{hash_map::RawEntryMut, HashMap};
+use hashbrown::{HashMap, hash_map::RawEntryMut};
 use jrsonnet_gcmodule::{Acyclic, Trace};
 use rustc_hash::FxBuildHasher;
 
@@ -242,7 +242,7 @@
 pub mod interop {
 	use std::mem;
 
-	use crate::{PoolMap, POOL};
+	use crate::{POOL, PoolMap};
 
 	/// Type-erased interned string pool
 	pub enum PoolState {}
modifiedcrates/jrsonnet-ir-parser/Cargo.tomldiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/Cargo.toml
+++ b/crates/jrsonnet-ir-parser/Cargo.toml
@@ -1,5 +1,6 @@
 [package]
 name = "jrsonnet-ir-parser"
+description = "Jrsonnet hand-rolled parser which parses source directly into IR"
 authors.workspace = true
 edition.workspace = true
 license.workspace = true
modifiedcrates/jrsonnet-ir-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/lib.rs
+++ b/crates/jrsonnet-ir-parser/src/lib.rs
@@ -2,12 +2,12 @@
 
 use jrsonnet_gcmodule::Acyclic;
 use jrsonnet_ir::{
-	unescape, ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BinaryOpType, BindSpec, CompSpec,
-	Destruct, Expr, ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IfElse,
-	IfSpecData, ImportKind, IndexPart, LiteralType, Member, ObjBody, ObjComp, ObjMembers, Slice,
-	SliceDesc, Source, Span, Spanned, UnaryOpType, Visibility,
+	ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BinaryOpType, BindSpec, CompSpec, Destruct, Expr,
+	ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IfElse, IfSpecData,
+	ImportKind, IndexPart, LiteralType, Member, ObjBody, ObjComp, ObjMembers, Slice, SliceDesc,
+	Source, Span, Spanned, UnaryOpType, Visibility, unescape,
 };
-use jrsonnet_lexer::{collect_lexed_str_block, Lexeme, Lexer, SyntaxKind, T};
+use jrsonnet_lexer::{Lexeme, Lexer, SyntaxKind, T, collect_lexed_str_block};
 
 pub struct ParserSettings {
 	pub source: Source,
modifiedcrates/jrsonnet-ir/src/function.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir/src/function.rs
+++ b/crates/jrsonnet-ir/src/function.rs
@@ -1,6 +1,4 @@
-use std::fmt;
-use std::ops::Deref;
-use std::rc::Rc;
+use std::{fmt, ops::Deref, rc::Rc};
 
 use jrsonnet_gcmodule::Acyclic;
 use jrsonnet_interner::IStr;
@@ -50,11 +48,7 @@
 }
 impl ParamDefault {
 	pub const fn exists(is_exists: bool) -> Self {
-		if is_exists {
-			Self::Exists
-		} else {
-			Self::None
-		}
+		if is_exists { Self::Exists } else { Self::None }
 	}
 }
 impl fmt::Display for ParamDefault {
modifiedcrates/jrsonnet-ir/src/location.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir/src/location.rs
+++ b/crates/jrsonnet-ir/src/location.rs
@@ -85,7 +85,7 @@
 
 #[cfg(test)]
 pub mod tests {
-	use super::{offset_to_location, CodeLocation};
+	use super::{CodeLocation, offset_to_location};
 
 	#[test]
 	fn test() {
modifiedcrates/jrsonnet-ir/src/source.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir/src/source.rs
+++ b/crates/jrsonnet-ir/src/source.rs
@@ -9,7 +9,7 @@
 use jrsonnet_gcmodule::Acyclic;
 use jrsonnet_interner::{IBytes, IStr};
 
-use crate::location::{location_to_offset, offset_to_location, CodeLocation};
+use crate::location::{CodeLocation, location_to_offset, offset_to_location};
 
 macro_rules! any_ext_methods {
 	($T:ident) => {
@@ -286,22 +286,22 @@
 	}
 
 	pub fn code(&self) -> &str {
-		&self.0 .1
+		&self.0.1
 	}
 
 	pub fn source_path(&self) -> &SourcePath {
-		&self.0 .0
+		&self.0.0
 	}
 
 	pub fn map_source_locations<const S: usize>(&self, locs: &[u32; S]) -> [CodeLocation; S] {
-		offset_to_location(&self.0 .1, locs)
+		offset_to_location(&self.0.1, locs)
 	}
 	pub fn map_from_source_location(&self, line: usize, column: usize) -> Option<usize> {
-		location_to_offset(&self.0 .1, line, column)
+		location_to_offset(&self.0.1, line, column)
 	}
 }
 impl fmt::Debug for Source {
 	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-		write!(f, "{:?}", self.0 .0)
+		write!(f, "{:?}", self.0.0)
 	}
 }
modifiedcrates/jrsonnet-lexer/Cargo.tomldiffbeforeafterboth
--- a/crates/jrsonnet-lexer/Cargo.toml
+++ b/crates/jrsonnet-lexer/Cargo.toml
@@ -1,5 +1,6 @@
 [package]
 name = "jrsonnet-lexer"
+description = "Jrsonnet lexer shared between rowan and hand-rolled parser"
 authors.workspace = true
 edition.workspace = true
 license.workspace = true
modifiedcrates/jrsonnet-lexer/src/lex.rsdiffbeforeafterboth
--- a/crates/jrsonnet-lexer/src/lex.rs
+++ b/crates/jrsonnet-lexer/src/lex.rs
@@ -1,12 +1,12 @@
 use core::ops::Range;
 
 use logos::Logos;
+
 // use rowan::{TextRange, TextSize};
-
 use crate::{
+	Span,
 	generated::syntax_kinds::SyntaxKind,
-	string_block::{lex_str_block, StringBlockError},
-	Span,
+	string_block::{StringBlockError, lex_str_block},
 };
 
 pub struct Lexer<'a> {
modifiedcrates/jrsonnet-lexer/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-lexer/src/lib.rs
+++ b/crates/jrsonnet-lexer/src/lib.rs
@@ -7,4 +7,4 @@
 
 pub use generated::syntax_kinds::SyntaxKind;
 pub use lex::{Lexeme, Lexer};
-pub use string_block::{collect_lexed_str_block, CollectStrBlock};
+pub use string_block::{CollectStrBlock, collect_lexed_str_block};
modifiedcrates/jrsonnet-lexer/src/string_block.rsdiffbeforeafterboth
--- a/crates/jrsonnet-lexer/src/string_block.rs
+++ b/crates/jrsonnet-lexer/src/string_block.rs
@@ -6,8 +6,8 @@
 	MissingIndent,
 }
 
+use StringBlockError::*;
 use logos::Lexer;
-use StringBlockError::*;
 
 use crate::generated::syntax_kinds::SyntaxKind;
 
modifiedcrates/jrsonnet-macros/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-macros/src/lib.rs
+++ b/crates/jrsonnet-macros/src/lib.rs
@@ -3,14 +3,13 @@
 use proc_macro2::TokenStream;
 use quote::{quote, quote_spanned};
 use syn::{
-	parenthesized,
+	Attribute, DeriveInput, Error, Expr, ExprClosure, FnArg, GenericArgument, Ident, ItemFn,
+	LitStr, Meta, Pat, Path, PathArguments, Result, ReturnType, Token, Type, parenthesized,
 	parse::{Parse, ParseStream},
 	parse_macro_input,
 	punctuated::Punctuated,
 	spanned::Spanned,
 	token::Comma,
-	Attribute, DeriveInput, Error, Expr, ExprClosure, FnArg, GenericArgument, Ident, ItemFn,
-	LitStr, Meta, Pat, Path, PathArguments, Result, ReturnType, Token, Type,
 };
 
 use self::typed::{derive_from_untyped_inner, derive_into_untyped_inner, derive_typed_inner};
modifiedcrates/jrsonnet-macros/src/typed.rsdiffbeforeafterboth
--- a/crates/jrsonnet-macros/src/typed.rs
+++ b/crates/jrsonnet-macros/src/typed.rs
@@ -1,10 +1,13 @@
-use crate::names::Names;
-use crate::{extract_type_from_option, kw, parse_attr, type_is_path};
 use proc_macro2::TokenStream;
 use quote::quote;
-use syn::parse::{Parse, ParseStream};
-use syn::spanned::Spanned as _;
-use syn::{parenthesized, token, DeriveInput, Error, Ident, LitStr, Result, Token, Type};
+use syn::{
+	DeriveInput, Error, Ident, LitStr, Result, Token, Type, parenthesized,
+	parse::{Parse, ParseStream},
+	spanned::Spanned as _,
+	token,
+};
+
+use crate::{extract_type_from_option, kw, names::Names, parse_attr, type_is_path};
 
 #[derive(Default)]
 #[allow(clippy::struct_excessive_bools)]
modifiedcrates/jrsonnet-peg-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/lib.rs
+++ b/crates/jrsonnet-peg-parser/src/lib.rs
@@ -1,12 +1,13 @@
+use std::rc::Rc;
+
 use jrsonnet_gcmodule::Acyclic;
 use jrsonnet_ir::{
-	unescape, ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BindSpec, CompSpec, Destruct,
-	DestructRest, Expr, ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IfElse,
-	IfSpecData, ImportKind, IndexPart, LiteralType, Member, ObjBody, ObjComp, ObjMembers, Slice,
-	SliceDesc, Source, Span, Spanned, Visibility,
+	ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BindSpec, CompSpec, Destruct, DestructRest, Expr,
+	ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IfElse, IfSpecData,
+	ImportKind, IndexPart, LiteralType, Member, ObjBody, ObjComp, ObjMembers, Slice, SliceDesc,
+	Source, Span, Spanned, Visibility, unescape,
 };
 use peg::parser;
-use std::rc::Rc;
 
 pub struct ParserSettings {
 	pub source: Source,
@@ -58,7 +59,7 @@
 		rule id() -> IStr = v:$(quiet!{ !reserved() alpha() (alpha() / digit())*} / expected!("<identifier>")) { v.into() }
 
 		rule keyword(id: &'static str) -> ()
-			= ##parse_string_literal(id) end_of_ident()
+			= #parse_string_literal(id) end_of_ident()
 
 		pub rule param(s: &ParserSettings) -> ExprParam = destruct:destruct(s) expr:(_ "=" _ expr:expr(s){expr})? { ExprParam { destruct, default: expr.map(Rc::new) } }
 		pub rule params(s: &ParserSettings) -> ExprParams
@@ -429,7 +430,7 @@
 	use insta::{assert_snapshot, glob};
 	use jrsonnet_ir::{IStr, Source};
 
-	use crate::{parse, ParserSettings};
+	use crate::{ParserSettings, parse};
 
 	#[test]
 	fn snapshots() {
modifiedcrates/jrsonnet-rowan-parser/src/event.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/event.rs
+++ b/crates/jrsonnet-rowan-parser/src/event.rs
@@ -3,10 +3,10 @@
 use rowan::{GreenNodeBuilder, Language, TextRange, TextSize};
 
 use crate::{
+	AstToken, JsonnetLanguage, SyntaxKind,
 	lex::Lexeme,
 	nodes::Trivia,
 	parser::{LocatedSyntaxError, Parse, SyntaxError},
-	AstToken, JsonnetLanguage, SyntaxKind,
 };
 
 #[derive(Clone, Debug)]
modifiedcrates/jrsonnet-rowan-parser/src/generated/nodes.rsdiffbeforeafterboth
before · crates/jrsonnet-rowan-parser/src/generated/nodes.rs
1//! This is a generated file, please do not edit manually. Changes can be2//! made in codegeneration that lives in `xtask` top-level dir.34#![allow(non_snake_case, clippy::match_like_matches_macro)]5use crate::{6	ast::{support, AstChildren, AstNode, AstToken},7	SyntaxKind::{self, *},8	SyntaxNode, SyntaxToken, T,9};1011#[derive(Debug, Clone, PartialEq, Eq, Hash)]12pub struct SourceFile {13	pub(crate) syntax: SyntaxNode,14}15impl SourceFile {16	pub fn expr(&self) -> Option<Expr> {17		support::children(&self.syntax).next()18	}19}2021#[derive(Debug, Clone, PartialEq, Eq, Hash)]22pub struct Expr {23	pub(crate) syntax: SyntaxNode,24}25impl Expr {26	pub fn stmts(&self) -> AstChildren<Stmt> {27		support::children(&self.syntax)28	}29	pub fn expr_base(&self) -> Option<ExprBase> {30		support::children(&self.syntax).next()31	}32	pub fn suffixs(&self) -> AstChildren<Suffix> {33		support::children(&self.syntax)34	}35}3637#[derive(Debug, Clone, PartialEq, Eq, Hash)]38pub struct SuffixIndex {39	pub(crate) syntax: SyntaxNode,40}41impl SuffixIndex {42	pub fn question_mark_token(&self) -> Option<SyntaxToken> {43		support::token(&self.syntax, T![?])44	}45	pub fn dot_token(&self) -> Option<SyntaxToken> {46		support::token(&self.syntax, T![.])47	}48	pub fn index(&self) -> Option<Name> {49		support::children(&self.syntax).next()50	}51}5253#[derive(Debug, Clone, PartialEq, Eq, Hash)]54pub struct Name {55	pub(crate) syntax: SyntaxNode,56}57impl Name {58	pub fn ident_lit(&self) -> Option<SyntaxToken> {59		support::token(&self.syntax, IDENT)60	}61}6263#[derive(Debug, Clone, PartialEq, Eq, Hash)]64pub struct SuffixIndexExpr {65	pub(crate) syntax: SyntaxNode,66}67impl SuffixIndexExpr {68	pub fn question_mark_token(&self) -> Option<SyntaxToken> {69		support::token(&self.syntax, T![?])70	}71	pub fn dot_token(&self) -> Option<SyntaxToken> {72		support::token(&self.syntax, T![.])73	}74	pub fn l_brack_token(&self) -> Option<SyntaxToken> {75		support::token(&self.syntax, T!['['])76	}77	pub fn index(&self) -> Option<Expr> {78		support::children(&self.syntax).next()79	}80	pub fn r_brack_token(&self) -> Option<SyntaxToken> {81		support::token(&self.syntax, T![']'])82	}83}8485#[derive(Debug, Clone, PartialEq, Eq, Hash)]86pub struct SuffixSlice {87	pub(crate) syntax: SyntaxNode,88}89impl SuffixSlice {90	pub fn slice_desc(&self) -> Option<SliceDesc> {91		support::children(&self.syntax).next()92	}93}9495#[derive(Debug, Clone, PartialEq, Eq, Hash)]96pub struct SliceDesc {97	pub(crate) syntax: SyntaxNode,98}99impl SliceDesc {100	pub fn l_brack_token(&self) -> Option<SyntaxToken> {101		support::token(&self.syntax, T!['['])102	}103	pub fn from(&self) -> Option<Expr> {104		support::children(&self.syntax).next()105	}106	pub fn colon_token(&self) -> Option<SyntaxToken> {107		support::token(&self.syntax, T![:])108	}109	pub fn end(&self) -> Option<SliceDescEnd> {110		support::children(&self.syntax).next()111	}112	pub fn step(&self) -> Option<SliceDescStep> {113		support::children(&self.syntax).next()114	}115	pub fn r_brack_token(&self) -> Option<SyntaxToken> {116		support::token(&self.syntax, T![']'])117	}118}119120#[derive(Debug, Clone, PartialEq, Eq, Hash)]121pub struct SuffixApply {122	pub(crate) syntax: SyntaxNode,123}124impl SuffixApply {125	pub fn args_desc(&self) -> Option<ArgsDesc> {126		support::children(&self.syntax).next()127	}128	pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {129		support::token(&self.syntax, T![tailstrict])130	}131}132133#[derive(Debug, Clone, PartialEq, Eq, Hash)]134pub struct ArgsDesc {135	pub(crate) syntax: SyntaxNode,136}137impl ArgsDesc {138	pub fn l_paren_token(&self) -> Option<SyntaxToken> {139		support::token(&self.syntax, T!['('])140	}141	pub fn args(&self) -> AstChildren<Arg> {142		support::children(&self.syntax)143	}144	pub fn r_paren_token(&self) -> Option<SyntaxToken> {145		support::token(&self.syntax, T![')'])146	}147}148149#[derive(Debug, Clone, PartialEq, Eq, Hash)]150pub struct StmtLocal {151	pub(crate) syntax: SyntaxNode,152}153impl StmtLocal {154	pub fn local_kw_token(&self) -> Option<SyntaxToken> {155		support::token(&self.syntax, T![local])156	}157	pub fn binds(&self) -> AstChildren<Bind> {158		support::children(&self.syntax)159	}160	pub fn semi_token(&self) -> Option<SyntaxToken> {161		support::token(&self.syntax, T![;])162	}163}164165#[derive(Debug, Clone, PartialEq, Eq, Hash)]166pub struct StmtAssert {167	pub(crate) syntax: SyntaxNode,168}169impl StmtAssert {170	pub fn assertion(&self) -> Option<Assertion> {171		support::children(&self.syntax).next()172	}173	pub fn semi_token(&self) -> Option<SyntaxToken> {174		support::token(&self.syntax, T![;])175	}176}177178#[derive(Debug, Clone, PartialEq, Eq, Hash)]179pub struct Assertion {180	pub(crate) syntax: SyntaxNode,181}182impl Assertion {183	pub fn assert_kw_token(&self) -> Option<SyntaxToken> {184		support::token(&self.syntax, T![assert])185	}186	pub fn condition(&self) -> Option<Expr> {187		support::children(&self.syntax).next()188	}189	pub fn colon_token(&self) -> Option<SyntaxToken> {190		support::token(&self.syntax, T![:])191	}192	pub fn message(&self) -> Option<Expr> {193		support::children(&self.syntax).nth(1usize)194	}195}196197#[derive(Debug, Clone, PartialEq, Eq, Hash)]198pub struct ExprBinary {199	pub(crate) syntax: SyntaxNode,200}201impl ExprBinary {202	pub fn lhs(&self) -> Option<Expr> {203		support::children(&self.syntax).next()204	}205	pub fn binary_operator(&self) -> Option<BinaryOperator> {206		support::token_child(&self.syntax)207	}208	pub fn rhs(&self) -> Option<Expr> {209		support::children(&self.syntax).nth(1usize)210	}211}212213#[derive(Debug, Clone, PartialEq, Eq, Hash)]214pub struct ExprUnary {215	pub(crate) syntax: SyntaxNode,216}217impl ExprUnary {218	pub fn unary_operator(&self) -> Option<UnaryOperator> {219		support::token_child(&self.syntax)220	}221	pub fn rhs(&self) -> Option<Expr> {222		support::children(&self.syntax).next()223	}224}225226#[derive(Debug, Clone, PartialEq, Eq, Hash)]227pub struct ExprObjExtend {228	pub(crate) syntax: SyntaxNode,229}230impl ExprObjExtend {231	pub fn lhs(&self) -> Option<Expr> {232		support::children(&self.syntax).next()233	}234	pub fn rhs(&self) -> Option<Expr> {235		support::children(&self.syntax).nth(1usize)236	}237}238239#[derive(Debug, Clone, PartialEq, Eq, Hash)]240pub struct ExprParened {241	pub(crate) syntax: SyntaxNode,242}243impl ExprParened {244	pub fn l_paren_token(&self) -> Option<SyntaxToken> {245		support::token(&self.syntax, T!['('])246	}247	pub fn expr(&self) -> Option<Expr> {248		support::children(&self.syntax).next()249	}250	pub fn r_paren_token(&self) -> Option<SyntaxToken> {251		support::token(&self.syntax, T![')'])252	}253}254255#[derive(Debug, Clone, PartialEq, Eq, Hash)]256pub struct ExprLiteral {257	pub(crate) syntax: SyntaxNode,258}259impl ExprLiteral {260	pub fn literal(&self) -> Option<Literal> {261		support::token_child(&self.syntax)262	}263}264265#[derive(Debug, Clone, PartialEq, Eq, Hash)]266pub struct ExprString {267	pub(crate) syntax: SyntaxNode,268}269impl ExprString {270	pub fn text(&self) -> Option<Text> {271		support::token_child(&self.syntax)272	}273}274275#[derive(Debug, Clone, PartialEq, Eq, Hash)]276pub struct ExprNumber {277	pub(crate) syntax: SyntaxNode,278}279impl ExprNumber {280	pub fn number(&self) -> Option<Number> {281		support::token_child(&self.syntax)282	}283}284285#[derive(Debug, Clone, PartialEq, Eq, Hash)]286pub struct ExprArray {287	pub(crate) syntax: SyntaxNode,288}289impl ExprArray {290	pub fn l_brack_token(&self) -> Option<SyntaxToken> {291		support::token(&self.syntax, T!['['])292	}293	pub fn exprs(&self) -> AstChildren<Expr> {294		support::children(&self.syntax)295	}296	pub fn r_brack_token(&self) -> Option<SyntaxToken> {297		support::token(&self.syntax, T![']'])298	}299}300301#[derive(Debug, Clone, PartialEq, Eq, Hash)]302pub struct ExprObject {303	pub(crate) syntax: SyntaxNode,304}305impl ExprObject {306	pub fn obj_body(&self) -> Option<ObjBody> {307		support::children(&self.syntax).next()308	}309}310311#[derive(Debug, Clone, PartialEq, Eq, Hash)]312pub struct ExprArrayComp {313	pub(crate) syntax: SyntaxNode,314}315impl ExprArrayComp {316	pub fn l_brack_token(&self) -> Option<SyntaxToken> {317		support::token(&self.syntax, T!['['])318	}319	pub fn expr(&self) -> Option<Expr> {320		support::children(&self.syntax).next()321	}322	pub fn comma_token(&self) -> Option<SyntaxToken> {323		support::token(&self.syntax, T![,])324	}325	pub fn comp_specs(&self) -> AstChildren<CompSpec> {326		support::children(&self.syntax)327	}328	pub fn r_brack_token(&self) -> Option<SyntaxToken> {329		support::token(&self.syntax, T![']'])330	}331}332333#[derive(Debug, Clone, PartialEq, Eq, Hash)]334pub struct ExprImport {335	pub(crate) syntax: SyntaxNode,336}337impl ExprImport {338	pub fn import_kind(&self) -> Option<ImportKind> {339		support::token_child(&self.syntax)340	}341	pub fn text(&self) -> Option<Text> {342		support::token_child(&self.syntax)343	}344}345346#[derive(Debug, Clone, PartialEq, Eq, Hash)]347pub struct ExprVar {348	pub(crate) syntax: SyntaxNode,349}350impl ExprVar {351	pub fn name(&self) -> Option<Name> {352		support::children(&self.syntax).next()353	}354}355356#[derive(Debug, Clone, PartialEq, Eq, Hash)]357pub struct ExprIfThenElse {358	pub(crate) syntax: SyntaxNode,359}360impl ExprIfThenElse {361	pub fn if_kw_token(&self) -> Option<SyntaxToken> {362		support::token(&self.syntax, T![if])363	}364	pub fn cond(&self) -> Option<Expr> {365		support::children(&self.syntax).next()366	}367	pub fn then_kw_token(&self) -> Option<SyntaxToken> {368		support::token(&self.syntax, T![then])369	}370	pub fn then(&self) -> Option<TrueExpr> {371		support::children(&self.syntax).next()372	}373	pub fn else_kw_token(&self) -> Option<SyntaxToken> {374		support::token(&self.syntax, T![else])375	}376	pub fn else_(&self) -> Option<FalseExpr> {377		support::children(&self.syntax).next()378	}379}380381#[derive(Debug, Clone, PartialEq, Eq, Hash)]382pub struct TrueExpr {383	pub(crate) syntax: SyntaxNode,384}385impl TrueExpr {386	pub fn expr(&self) -> Option<Expr> {387		support::children(&self.syntax).next()388	}389}390391#[derive(Debug, Clone, PartialEq, Eq, Hash)]392pub struct FalseExpr {393	pub(crate) syntax: SyntaxNode,394}395impl FalseExpr {396	pub fn expr(&self) -> Option<Expr> {397		support::children(&self.syntax).next()398	}399}400401#[derive(Debug, Clone, PartialEq, Eq, Hash)]402pub struct ExprFunction {403	pub(crate) syntax: SyntaxNode,404}405impl ExprFunction {406	pub fn function_kw_token(&self) -> Option<SyntaxToken> {407		support::token(&self.syntax, T![function])408	}409	pub fn l_paren_token(&self) -> Option<SyntaxToken> {410		support::token(&self.syntax, T!['('])411	}412	pub fn params_desc(&self) -> Option<ParamsDesc> {413		support::children(&self.syntax).next()414	}415	pub fn r_paren_token(&self) -> Option<SyntaxToken> {416		support::token(&self.syntax, T![')'])417	}418	pub fn expr(&self) -> Option<Expr> {419		support::children(&self.syntax).next()420	}421}422423#[derive(Debug, Clone, PartialEq, Eq, Hash)]424pub struct ParamsDesc {425	pub(crate) syntax: SyntaxNode,426}427impl ParamsDesc {428	pub fn l_paren_token(&self) -> Option<SyntaxToken> {429		support::token(&self.syntax, T!['('])430	}431	pub fn params(&self) -> AstChildren<Param> {432		support::children(&self.syntax)433	}434	pub fn r_paren_token(&self) -> Option<SyntaxToken> {435		support::token(&self.syntax, T![')'])436	}437}438439#[derive(Debug, Clone, PartialEq, Eq, Hash)]440pub struct ExprError {441	pub(crate) syntax: SyntaxNode,442}443impl ExprError {444	pub fn error_kw_token(&self) -> Option<SyntaxToken> {445		support::token(&self.syntax, T![error])446	}447	pub fn expr(&self) -> Option<Expr> {448		support::children(&self.syntax).next()449	}450}451452#[derive(Debug, Clone, PartialEq, Eq, Hash)]453pub struct SliceDescEnd {454	pub(crate) syntax: SyntaxNode,455}456impl SliceDescEnd {457	pub fn expr(&self) -> Option<Expr> {458		support::children(&self.syntax).next()459	}460}461462#[derive(Debug, Clone, PartialEq, Eq, Hash)]463pub struct SliceDescStep {464	pub(crate) syntax: SyntaxNode,465}466impl SliceDescStep {467	pub fn expr(&self) -> Option<Expr> {468		support::children(&self.syntax).next()469	}470}471472#[derive(Debug, Clone, PartialEq, Eq, Hash)]473pub struct Arg {474	pub(crate) syntax: SyntaxNode,475}476impl Arg {477	pub fn name(&self) -> Option<Name> {478		support::children(&self.syntax).next()479	}480	pub fn assign_token(&self) -> Option<SyntaxToken> {481		support::token(&self.syntax, T![=])482	}483	pub fn expr(&self) -> Option<Expr> {484		support::children(&self.syntax).next()485	}486}487488#[derive(Debug, Clone, PartialEq, Eq, Hash)]489pub struct ObjBodyComp {490	pub(crate) syntax: SyntaxNode,491}492impl ObjBodyComp {493	pub fn l_brace_token(&self) -> Option<SyntaxToken> {494		support::token(&self.syntax, T!['{'])495	}496	pub fn member_comps(&self) -> AstChildren<MemberComp> {497		support::children(&self.syntax)498	}499	pub fn comp_specs(&self) -> AstChildren<CompSpec> {500		support::children(&self.syntax)501	}502	pub fn r_brace_token(&self) -> Option<SyntaxToken> {503		support::token(&self.syntax, T!['}'])504	}505}506507#[derive(Debug, Clone, PartialEq, Eq, Hash)]508pub struct ObjBodyMemberList {509	pub(crate) syntax: SyntaxNode,510}511impl ObjBodyMemberList {512	pub fn l_brace_token(&self) -> Option<SyntaxToken> {513		support::token(&self.syntax, T!['{'])514	}515	pub fn members(&self) -> AstChildren<Member> {516		support::children(&self.syntax)517	}518	pub fn r_brace_token(&self) -> Option<SyntaxToken> {519		support::token(&self.syntax, T!['}'])520	}521}522523#[derive(Debug, Clone, PartialEq, Eq, Hash)]524pub struct MemberBindStmt {525	pub(crate) syntax: SyntaxNode,526}527impl MemberBindStmt {528	pub fn obj_local(&self) -> Option<ObjLocal> {529		support::children(&self.syntax).next()530	}531}532533#[derive(Debug, Clone, PartialEq, Eq, Hash)]534pub struct ObjLocal {535	pub(crate) syntax: SyntaxNode,536}537impl ObjLocal {538	pub fn local_kw_token(&self) -> Option<SyntaxToken> {539		support::token(&self.syntax, T![local])540	}541	pub fn bind(&self) -> Option<Bind> {542		support::children(&self.syntax).next()543	}544}545546#[derive(Debug, Clone, PartialEq, Eq, Hash)]547pub struct MemberAssertStmt {548	pub(crate) syntax: SyntaxNode,549}550impl MemberAssertStmt {551	pub fn assertion(&self) -> Option<Assertion> {552		support::children(&self.syntax).next()553	}554}555556#[derive(Debug, Clone, PartialEq, Eq, Hash)]557pub struct MemberFieldNormal {558	pub(crate) syntax: SyntaxNode,559}560impl MemberFieldNormal {561	pub fn field_name(&self) -> Option<FieldName> {562		support::children(&self.syntax).next()563	}564	pub fn plus_token(&self) -> Option<SyntaxToken> {565		support::token(&self.syntax, T![+])566	}567	pub fn visibility(&self) -> Option<Visibility> {568		support::children(&self.syntax).next()569	}570	pub fn expr(&self) -> Option<Expr> {571		support::children(&self.syntax).next()572	}573}574575#[derive(Debug, Clone, PartialEq, Eq, Hash)]576pub struct Visibility {577	pub(crate) syntax: SyntaxNode,578}579impl Visibility {580	pub fn colon_token(&self) -> Option<SyntaxToken> {581		support::token(&self.syntax, T![:])582	}583}584585#[derive(Debug, Clone, PartialEq, Eq, Hash)]586pub struct MemberFieldMethod {587	pub(crate) syntax: SyntaxNode,588}589impl MemberFieldMethod {590	pub fn field_name(&self) -> Option<FieldName> {591		support::children(&self.syntax).next()592	}593	pub fn params_desc(&self) -> Option<ParamsDesc> {594		support::children(&self.syntax).next()595	}596	pub fn visibility(&self) -> Option<Visibility> {597		support::children(&self.syntax).next()598	}599	pub fn expr(&self) -> Option<Expr> {600		support::children(&self.syntax).next()601	}602}603604#[derive(Debug, Clone, PartialEq, Eq, Hash)]605pub struct FieldNameFixed {606	pub(crate) syntax: SyntaxNode,607}608impl FieldNameFixed {609	pub fn id(&self) -> Option<Name> {610		support::children(&self.syntax).next()611	}612	pub fn text(&self) -> Option<Text> {613		support::token_child(&self.syntax)614	}615}616617#[derive(Debug, Clone, PartialEq, Eq, Hash)]618pub struct FieldNameDynamic {619	pub(crate) syntax: SyntaxNode,620}621impl FieldNameDynamic {622	pub fn l_brack_token(&self) -> Option<SyntaxToken> {623		support::token(&self.syntax, T!['['])624	}625	pub fn expr(&self) -> Option<Expr> {626		support::children(&self.syntax).next()627	}628	pub fn r_brack_token(&self) -> Option<SyntaxToken> {629		support::token(&self.syntax, T![']'])630	}631}632633#[derive(Debug, Clone, PartialEq, Eq, Hash)]634pub struct ForSpec {635	pub(crate) syntax: SyntaxNode,636}637impl ForSpec {638	pub fn for_kw_token(&self) -> Option<SyntaxToken> {639		support::token(&self.syntax, T![for])640	}641	pub fn bind(&self) -> Option<Destruct> {642		support::children(&self.syntax).next()643	}644	pub fn in_kw_token(&self) -> Option<SyntaxToken> {645		support::token(&self.syntax, T![in])646	}647	pub fn expr(&self) -> Option<Expr> {648		support::children(&self.syntax).next()649	}650}651652#[derive(Debug, Clone, PartialEq, Eq, Hash)]653pub struct IfSpec {654	pub(crate) syntax: SyntaxNode,655}656impl IfSpec {657	pub fn if_kw_token(&self) -> Option<SyntaxToken> {658		support::token(&self.syntax, T![if])659	}660	pub fn expr(&self) -> Option<Expr> {661		support::children(&self.syntax).next()662	}663}664665#[derive(Debug, Clone, PartialEq, Eq, Hash)]666pub struct BindDestruct {667	pub(crate) syntax: SyntaxNode,668}669impl BindDestruct {670	pub fn into(&self) -> Option<Destruct> {671		support::children(&self.syntax).next()672	}673	pub fn assign_token(&self) -> Option<SyntaxToken> {674		support::token(&self.syntax, T![=])675	}676	pub fn value(&self) -> Option<Expr> {677		support::children(&self.syntax).next()678	}679}680681#[derive(Debug, Clone, PartialEq, Eq, Hash)]682pub struct BindFunction {683	pub(crate) syntax: SyntaxNode,684}685impl BindFunction {686	pub fn name(&self) -> Option<Name> {687		support::children(&self.syntax).next()688	}689	pub fn params(&self) -> Option<ParamsDesc> {690		support::children(&self.syntax).next()691	}692	pub fn assign_token(&self) -> Option<SyntaxToken> {693		support::token(&self.syntax, T![=])694	}695	pub fn value(&self) -> Option<Expr> {696		support::children(&self.syntax).next()697	}698}699700#[derive(Debug, Clone, PartialEq, Eq, Hash)]701pub struct Param {702	pub(crate) syntax: SyntaxNode,703}704impl Param {705	pub fn destruct(&self) -> Option<Destruct> {706		support::children(&self.syntax).next()707	}708	pub fn assign_token(&self) -> Option<SyntaxToken> {709		support::token(&self.syntax, T![=])710	}711	pub fn expr(&self) -> Option<Expr> {712		support::children(&self.syntax).next()713	}714}715716#[derive(Debug, Clone, PartialEq, Eq, Hash)]717pub struct DestructFull {718	pub(crate) syntax: SyntaxNode,719}720impl DestructFull {721	pub fn name(&self) -> Option<Name> {722		support::children(&self.syntax).next()723	}724}725726#[derive(Debug, Clone, PartialEq, Eq, Hash)]727pub struct DestructSkip {728	pub(crate) syntax: SyntaxNode,729}730impl DestructSkip {731	pub fn question_mark_token(&self) -> Option<SyntaxToken> {732		support::token(&self.syntax, T![?])733	}734}735736#[derive(Debug, Clone, PartialEq, Eq, Hash)]737pub struct DestructArray {738	pub(crate) syntax: SyntaxNode,739}740impl DestructArray {741	pub fn l_brack_token(&self) -> Option<SyntaxToken> {742		support::token(&self.syntax, T!['['])743	}744	pub fn destruct_array_parts(&self) -> AstChildren<DestructArrayPart> {745		support::children(&self.syntax)746	}747	pub fn r_brack_token(&self) -> Option<SyntaxToken> {748		support::token(&self.syntax, T![']'])749	}750}751752#[derive(Debug, Clone, PartialEq, Eq, Hash)]753pub struct DestructObject {754	pub(crate) syntax: SyntaxNode,755}756impl DestructObject {757	pub fn l_brace_token(&self) -> Option<SyntaxToken> {758		support::token(&self.syntax, T!['{'])759	}760	pub fn destruct_object_fields(&self) -> AstChildren<DestructObjectField> {761		support::children(&self.syntax)762	}763	pub fn destruct_rest(&self) -> Option<DestructRest> {764		support::children(&self.syntax).next()765	}766	pub fn comma_token(&self) -> Option<SyntaxToken> {767		support::token(&self.syntax, T![,])768	}769	pub fn r_brace_token(&self) -> Option<SyntaxToken> {770		support::token(&self.syntax, T!['}'])771	}772}773774#[derive(Debug, Clone, PartialEq, Eq, Hash)]775pub struct DestructObjectField {776	pub(crate) syntax: SyntaxNode,777}778impl DestructObjectField {779	pub fn field(&self) -> Option<Name> {780		support::children(&self.syntax).next()781	}782	pub fn colon_token(&self) -> Option<SyntaxToken> {783		support::token(&self.syntax, T![:])784	}785	pub fn destruct(&self) -> Option<Destruct> {786		support::children(&self.syntax).next()787	}788	pub fn assign_token(&self) -> Option<SyntaxToken> {789		support::token(&self.syntax, T![=])790	}791	pub fn expr(&self) -> Option<Expr> {792		support::children(&self.syntax).next()793	}794}795796#[derive(Debug, Clone, PartialEq, Eq, Hash)]797pub struct DestructRest {798	pub(crate) syntax: SyntaxNode,799}800impl DestructRest {801	pub fn dotdotdot_token(&self) -> Option<SyntaxToken> {802		support::token(&self.syntax, T![...])803	}804	pub fn into(&self) -> Option<Name> {805		support::children(&self.syntax).next()806	}807}808809#[derive(Debug, Clone, PartialEq, Eq, Hash)]810pub struct DestructArrayElement {811	pub(crate) syntax: SyntaxNode,812}813impl DestructArrayElement {814	pub fn destruct(&self) -> Option<Destruct> {815		support::children(&self.syntax).next()816	}817}818819#[derive(Debug, Clone, PartialEq, Eq, Hash)]820pub enum Suffix {821	SuffixIndex(SuffixIndex),822	SuffixIndexExpr(SuffixIndexExpr),823	SuffixSlice(SuffixSlice),824	SuffixApply(SuffixApply),825}826827#[derive(Debug, Clone, PartialEq, Eq, Hash)]828pub enum Bind {829	BindDestruct(BindDestruct),830	BindFunction(BindFunction),831}832833#[derive(Debug, Clone, PartialEq, Eq, Hash)]834pub enum Stmt {835	StmtLocal(StmtLocal),836	StmtAssert(StmtAssert),837}838839#[derive(Debug, Clone, PartialEq, Eq, Hash)]840pub enum ObjBody {841	ObjBodyComp(ObjBodyComp),842	ObjBodyMemberList(ObjBodyMemberList),843}844845#[derive(Debug, Clone, PartialEq, Eq, Hash)]846pub enum CompSpec {847	ForSpec(ForSpec),848	IfSpec(IfSpec),849}850851#[derive(Debug, Clone, PartialEq, Eq, Hash)]852pub enum ExprBase {853	ExprBinary(ExprBinary),854	ExprUnary(ExprUnary),855	ExprObjExtend(ExprObjExtend),856	ExprParened(ExprParened),857	ExprString(ExprString),858	ExprNumber(ExprNumber),859	ExprLiteral(ExprLiteral),860	ExprArray(ExprArray),861	ExprObject(ExprObject),862	ExprArrayComp(ExprArrayComp),863	ExprImport(ExprImport),864	ExprVar(ExprVar),865	ExprIfThenElse(ExprIfThenElse),866	ExprFunction(ExprFunction),867	ExprError(ExprError),868}869870#[derive(Debug, Clone, PartialEq, Eq, Hash)]871pub enum MemberComp {872	MemberBindStmt(MemberBindStmt),873	MemberFieldNormal(MemberFieldNormal),874	MemberFieldMethod(MemberFieldMethod),875}876877#[derive(Debug, Clone, PartialEq, Eq, Hash)]878pub enum Member {879	MemberBindStmt(MemberBindStmt),880	MemberAssertStmt(MemberAssertStmt),881	MemberFieldNormal(MemberFieldNormal),882	MemberFieldMethod(MemberFieldMethod),883}884885#[derive(Debug, Clone, PartialEq, Eq, Hash)]886pub enum FieldName {887	FieldNameFixed(FieldNameFixed),888	FieldNameDynamic(FieldNameDynamic),889}890891#[derive(Debug, Clone, PartialEq, Eq, Hash)]892pub enum Destruct {893	DestructFull(DestructFull),894	DestructSkip(DestructSkip),895	DestructArray(DestructArray),896	DestructObject(DestructObject),897}898899#[derive(Debug, Clone, PartialEq, Eq, Hash)]900pub enum DestructArrayPart {901	DestructArrayElement(DestructArrayElement),902	DestructRest(DestructRest),903}904905#[derive(Debug, Clone, PartialEq, Eq, Hash)]906pub struct BinaryOperator {907	syntax: SyntaxToken,908	kind: BinaryOperatorKind,909}910911#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]912pub enum BinaryOperatorKind {913	Or,914	NullCoaelse,915	And,916	BitOr,917	BitXor,918	BitAnd,919	Eq,920	Ne,921	Lt,922	Gt,923	Le,924	Ge,925	InKw,926	Lhs,927	Rhs,928	Plus,929	Minus,930	Mul,931	Div,932	Modulo,933	MetaObjectApply,934	ErrorNoOperator,935}936937#[derive(Debug, Clone, PartialEq, Eq, Hash)]938pub struct UnaryOperator {939	syntax: SyntaxToken,940	kind: UnaryOperatorKind,941}942943#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]944pub enum UnaryOperatorKind {945	Minus,946	Not,947	BitNot,948}949950#[derive(Debug, Clone, PartialEq, Eq, Hash)]951pub struct Literal {952	syntax: SyntaxToken,953	kind: LiteralKind,954}955956#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]957pub enum LiteralKind {958	NullKw,959	TrueKw,960	FalseKw,961	SelfKw,962	Dollar,963	SuperKw,964}965966#[derive(Debug, Clone, PartialEq, Eq, Hash)]967pub struct Text {968	syntax: SyntaxToken,969	kind: TextKind,970}971972#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]973pub enum TextKind {974	StringDouble,975	ErrorStringDoubleUnterminated,976	StringSingle,977	ErrorStringSingleUnterminated,978	StringDoubleVerbatim,979	ErrorStringDoubleVerbatimUnterminated,980	StringSingleVerbatim,981	ErrorStringSingleVerbatimUnterminated,982	ErrorStringVerbatimMissingQuotes,983	StringBlock,984	ErrorStringBlockUnexpectedEnd,985	ErrorStringBlockMissingNewLine,986	ErrorStringBlockMissingTermination,987	ErrorStringBlockMissingIndent,988}989990#[derive(Debug, Clone, PartialEq, Eq, Hash)]991pub struct Number {992	syntax: SyntaxToken,993	kind: NumberKind,994}995996#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]997pub enum NumberKind {998	Float,999	ErrorFloatJunkAfterPoint,1000	ErrorFloatJunkAfterExponent,1001	ErrorFloatJunkAfterExponentSign,1002}10031004#[derive(Debug, Clone, PartialEq, Eq, Hash)]1005pub struct ImportKind {1006	syntax: SyntaxToken,1007	kind: ImportKindKind,1008}10091010#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1011pub enum ImportKindKind {1012	ImportstrKw,1013	ImportbinKw,1014	ImportKw,1015}10161017#[derive(Debug, Clone, PartialEq, Eq, Hash)]1018pub struct Trivia {1019	syntax: SyntaxToken,1020	kind: TriviaKind,1021}10221023#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1024pub enum TriviaKind {1025	Whitespace,1026	MultiLineComment,1027	ErrorCommentTooShort,1028	ErrorCommentUnterminated,1029	SingleLineHashComment,1030	SingleLineSlashComment,1031}10321033#[derive(Debug, Clone, PartialEq, Eq, Hash)]1034pub struct CustomError {1035	syntax: SyntaxToken,1036	kind: CustomErrorKind,1037}10381039#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1040pub enum CustomErrorKind {1041	ErrorMissingToken,1042	ErrorUnexpectedToken,1043	ErrorCustom,1044}1045impl AstNode for SourceFile {1046	fn can_cast(kind: SyntaxKind) -> bool {1047		kind == SOURCE_FILE1048	}1049	fn cast(syntax: SyntaxNode) -> Option<Self> {1050		if Self::can_cast(syntax.kind()) {1051			Some(Self { syntax })1052		} else {1053			None1054		}1055	}1056	fn syntax(&self) -> &SyntaxNode {1057		&self.syntax1058	}1059}1060impl AstNode for Expr {1061	fn can_cast(kind: SyntaxKind) -> bool {1062		kind == EXPR1063	}1064	fn cast(syntax: SyntaxNode) -> Option<Self> {1065		if Self::can_cast(syntax.kind()) {1066			Some(Self { syntax })1067		} else {1068			None1069		}1070	}1071	fn syntax(&self) -> &SyntaxNode {1072		&self.syntax1073	}1074}1075impl AstNode for SuffixIndex {1076	fn can_cast(kind: SyntaxKind) -> bool {1077		kind == SUFFIX_INDEX1078	}1079	fn cast(syntax: SyntaxNode) -> Option<Self> {1080		if Self::can_cast(syntax.kind()) {1081			Some(Self { syntax })1082		} else {1083			None1084		}1085	}1086	fn syntax(&self) -> &SyntaxNode {1087		&self.syntax1088	}1089}1090impl AstNode for Name {1091	fn can_cast(kind: SyntaxKind) -> bool {1092		kind == NAME1093	}1094	fn cast(syntax: SyntaxNode) -> Option<Self> {1095		if Self::can_cast(syntax.kind()) {1096			Some(Self { syntax })1097		} else {1098			None1099		}1100	}1101	fn syntax(&self) -> &SyntaxNode {1102		&self.syntax1103	}1104}1105impl AstNode for SuffixIndexExpr {1106	fn can_cast(kind: SyntaxKind) -> bool {1107		kind == SUFFIX_INDEX_EXPR1108	}1109	fn cast(syntax: SyntaxNode) -> Option<Self> {1110		if Self::can_cast(syntax.kind()) {1111			Some(Self { syntax })1112		} else {1113			None1114		}1115	}1116	fn syntax(&self) -> &SyntaxNode {1117		&self.syntax1118	}1119}1120impl AstNode for SuffixSlice {1121	fn can_cast(kind: SyntaxKind) -> bool {1122		kind == SUFFIX_SLICE1123	}1124	fn cast(syntax: SyntaxNode) -> Option<Self> {1125		if Self::can_cast(syntax.kind()) {1126			Some(Self { syntax })1127		} else {1128			None1129		}1130	}1131	fn syntax(&self) -> &SyntaxNode {1132		&self.syntax1133	}1134}1135impl AstNode for SliceDesc {1136	fn can_cast(kind: SyntaxKind) -> bool {1137		kind == SLICE_DESC1138	}1139	fn cast(syntax: SyntaxNode) -> Option<Self> {1140		if Self::can_cast(syntax.kind()) {1141			Some(Self { syntax })1142		} else {1143			None1144		}1145	}1146	fn syntax(&self) -> &SyntaxNode {1147		&self.syntax1148	}1149}1150impl AstNode for SuffixApply {1151	fn can_cast(kind: SyntaxKind) -> bool {1152		kind == SUFFIX_APPLY1153	}1154	fn cast(syntax: SyntaxNode) -> Option<Self> {1155		if Self::can_cast(syntax.kind()) {1156			Some(Self { syntax })1157		} else {1158			None1159		}1160	}1161	fn syntax(&self) -> &SyntaxNode {1162		&self.syntax1163	}1164}1165impl AstNode for ArgsDesc {1166	fn can_cast(kind: SyntaxKind) -> bool {1167		kind == ARGS_DESC1168	}1169	fn cast(syntax: SyntaxNode) -> Option<Self> {1170		if Self::can_cast(syntax.kind()) {1171			Some(Self { syntax })1172		} else {1173			None1174		}1175	}1176	fn syntax(&self) -> &SyntaxNode {1177		&self.syntax1178	}1179}1180impl AstNode for StmtLocal {1181	fn can_cast(kind: SyntaxKind) -> bool {1182		kind == STMT_LOCAL1183	}1184	fn cast(syntax: SyntaxNode) -> Option<Self> {1185		if Self::can_cast(syntax.kind()) {1186			Some(Self { syntax })1187		} else {1188			None1189		}1190	}1191	fn syntax(&self) -> &SyntaxNode {1192		&self.syntax1193	}1194}1195impl AstNode for StmtAssert {1196	fn can_cast(kind: SyntaxKind) -> bool {1197		kind == STMT_ASSERT1198	}1199	fn cast(syntax: SyntaxNode) -> Option<Self> {1200		if Self::can_cast(syntax.kind()) {1201			Some(Self { syntax })1202		} else {1203			None1204		}1205	}1206	fn syntax(&self) -> &SyntaxNode {1207		&self.syntax1208	}1209}1210impl AstNode for Assertion {1211	fn can_cast(kind: SyntaxKind) -> bool {1212		kind == ASSERTION1213	}1214	fn cast(syntax: SyntaxNode) -> Option<Self> {1215		if Self::can_cast(syntax.kind()) {1216			Some(Self { syntax })1217		} else {1218			None1219		}1220	}1221	fn syntax(&self) -> &SyntaxNode {1222		&self.syntax1223	}1224}1225impl AstNode for ExprBinary {1226	fn can_cast(kind: SyntaxKind) -> bool {1227		kind == EXPR_BINARY1228	}1229	fn cast(syntax: SyntaxNode) -> Option<Self> {1230		if Self::can_cast(syntax.kind()) {1231			Some(Self { syntax })1232		} else {1233			None1234		}1235	}1236	fn syntax(&self) -> &SyntaxNode {1237		&self.syntax1238	}1239}1240impl AstNode for ExprUnary {1241	fn can_cast(kind: SyntaxKind) -> bool {1242		kind == EXPR_UNARY1243	}1244	fn cast(syntax: SyntaxNode) -> Option<Self> {1245		if Self::can_cast(syntax.kind()) {1246			Some(Self { syntax })1247		} else {1248			None1249		}1250	}1251	fn syntax(&self) -> &SyntaxNode {1252		&self.syntax1253	}1254}1255impl AstNode for ExprObjExtend {1256	fn can_cast(kind: SyntaxKind) -> bool {1257		kind == EXPR_OBJ_EXTEND1258	}1259	fn cast(syntax: SyntaxNode) -> Option<Self> {1260		if Self::can_cast(syntax.kind()) {1261			Some(Self { syntax })1262		} else {1263			None1264		}1265	}1266	fn syntax(&self) -> &SyntaxNode {1267		&self.syntax1268	}1269}1270impl AstNode for ExprParened {1271	fn can_cast(kind: SyntaxKind) -> bool {1272		kind == EXPR_PARENED1273	}1274	fn cast(syntax: SyntaxNode) -> Option<Self> {1275		if Self::can_cast(syntax.kind()) {1276			Some(Self { syntax })1277		} else {1278			None1279		}1280	}1281	fn syntax(&self) -> &SyntaxNode {1282		&self.syntax1283	}1284}1285impl AstNode for ExprLiteral {1286	fn can_cast(kind: SyntaxKind) -> bool {1287		kind == EXPR_LITERAL1288	}1289	fn cast(syntax: SyntaxNode) -> Option<Self> {1290		if Self::can_cast(syntax.kind()) {1291			Some(Self { syntax })1292		} else {1293			None1294		}1295	}1296	fn syntax(&self) -> &SyntaxNode {1297		&self.syntax1298	}1299}1300impl AstNode for ExprString {1301	fn can_cast(kind: SyntaxKind) -> bool {1302		kind == EXPR_STRING1303	}1304	fn cast(syntax: SyntaxNode) -> Option<Self> {1305		if Self::can_cast(syntax.kind()) {1306			Some(Self { syntax })1307		} else {1308			None1309		}1310	}1311	fn syntax(&self) -> &SyntaxNode {1312		&self.syntax1313	}1314}1315impl AstNode for ExprNumber {1316	fn can_cast(kind: SyntaxKind) -> bool {1317		kind == EXPR_NUMBER1318	}1319	fn cast(syntax: SyntaxNode) -> Option<Self> {1320		if Self::can_cast(syntax.kind()) {1321			Some(Self { syntax })1322		} else {1323			None1324		}1325	}1326	fn syntax(&self) -> &SyntaxNode {1327		&self.syntax1328	}1329}1330impl AstNode for ExprArray {1331	fn can_cast(kind: SyntaxKind) -> bool {1332		kind == EXPR_ARRAY1333	}1334	fn cast(syntax: SyntaxNode) -> Option<Self> {1335		if Self::can_cast(syntax.kind()) {1336			Some(Self { syntax })1337		} else {1338			None1339		}1340	}1341	fn syntax(&self) -> &SyntaxNode {1342		&self.syntax1343	}1344}1345impl AstNode for ExprObject {1346	fn can_cast(kind: SyntaxKind) -> bool {1347		kind == EXPR_OBJECT1348	}1349	fn cast(syntax: SyntaxNode) -> Option<Self> {1350		if Self::can_cast(syntax.kind()) {1351			Some(Self { syntax })1352		} else {1353			None1354		}1355	}1356	fn syntax(&self) -> &SyntaxNode {1357		&self.syntax1358	}1359}1360impl AstNode for ExprArrayComp {1361	fn can_cast(kind: SyntaxKind) -> bool {1362		kind == EXPR_ARRAY_COMP1363	}1364	fn cast(syntax: SyntaxNode) -> Option<Self> {1365		if Self::can_cast(syntax.kind()) {1366			Some(Self { syntax })1367		} else {1368			None1369		}1370	}1371	fn syntax(&self) -> &SyntaxNode {1372		&self.syntax1373	}1374}1375impl AstNode for ExprImport {1376	fn can_cast(kind: SyntaxKind) -> bool {1377		kind == EXPR_IMPORT1378	}1379	fn cast(syntax: SyntaxNode) -> Option<Self> {1380		if Self::can_cast(syntax.kind()) {1381			Some(Self { syntax })1382		} else {1383			None1384		}1385	}1386	fn syntax(&self) -> &SyntaxNode {1387		&self.syntax1388	}1389}1390impl AstNode for ExprVar {1391	fn can_cast(kind: SyntaxKind) -> bool {1392		kind == EXPR_VAR1393	}1394	fn cast(syntax: SyntaxNode) -> Option<Self> {1395		if Self::can_cast(syntax.kind()) {1396			Some(Self { syntax })1397		} else {1398			None1399		}1400	}1401	fn syntax(&self) -> &SyntaxNode {1402		&self.syntax1403	}1404}1405impl AstNode for ExprIfThenElse {1406	fn can_cast(kind: SyntaxKind) -> bool {1407		kind == EXPR_IF_THEN_ELSE1408	}1409	fn cast(syntax: SyntaxNode) -> Option<Self> {1410		if Self::can_cast(syntax.kind()) {1411			Some(Self { syntax })1412		} else {1413			None1414		}1415	}1416	fn syntax(&self) -> &SyntaxNode {1417		&self.syntax1418	}1419}1420impl AstNode for TrueExpr {1421	fn can_cast(kind: SyntaxKind) -> bool {1422		kind == TRUE_EXPR1423	}1424	fn cast(syntax: SyntaxNode) -> Option<Self> {1425		if Self::can_cast(syntax.kind()) {1426			Some(Self { syntax })1427		} else {1428			None1429		}1430	}1431	fn syntax(&self) -> &SyntaxNode {1432		&self.syntax1433	}1434}1435impl AstNode for FalseExpr {1436	fn can_cast(kind: SyntaxKind) -> bool {1437		kind == FALSE_EXPR1438	}1439	fn cast(syntax: SyntaxNode) -> Option<Self> {1440		if Self::can_cast(syntax.kind()) {1441			Some(Self { syntax })1442		} else {1443			None1444		}1445	}1446	fn syntax(&self) -> &SyntaxNode {1447		&self.syntax1448	}1449}1450impl AstNode for ExprFunction {1451	fn can_cast(kind: SyntaxKind) -> bool {1452		kind == EXPR_FUNCTION1453	}1454	fn cast(syntax: SyntaxNode) -> Option<Self> {1455		if Self::can_cast(syntax.kind()) {1456			Some(Self { syntax })1457		} else {1458			None1459		}1460	}1461	fn syntax(&self) -> &SyntaxNode {1462		&self.syntax1463	}1464}1465impl AstNode for ParamsDesc {1466	fn can_cast(kind: SyntaxKind) -> bool {1467		kind == PARAMS_DESC1468	}1469	fn cast(syntax: SyntaxNode) -> Option<Self> {1470		if Self::can_cast(syntax.kind()) {1471			Some(Self { syntax })1472		} else {1473			None1474		}1475	}1476	fn syntax(&self) -> &SyntaxNode {1477		&self.syntax1478	}1479}1480impl AstNode for ExprError {1481	fn can_cast(kind: SyntaxKind) -> bool {1482		kind == EXPR_ERROR1483	}1484	fn cast(syntax: SyntaxNode) -> Option<Self> {1485		if Self::can_cast(syntax.kind()) {1486			Some(Self { syntax })1487		} else {1488			None1489		}1490	}1491	fn syntax(&self) -> &SyntaxNode {1492		&self.syntax1493	}1494}1495impl AstNode for SliceDescEnd {1496	fn can_cast(kind: SyntaxKind) -> bool {1497		kind == SLICE_DESC_END1498	}1499	fn cast(syntax: SyntaxNode) -> Option<Self> {1500		if Self::can_cast(syntax.kind()) {1501			Some(Self { syntax })1502		} else {1503			None1504		}1505	}1506	fn syntax(&self) -> &SyntaxNode {1507		&self.syntax1508	}1509}1510impl AstNode for SliceDescStep {1511	fn can_cast(kind: SyntaxKind) -> bool {1512		kind == SLICE_DESC_STEP1513	}1514	fn cast(syntax: SyntaxNode) -> Option<Self> {1515		if Self::can_cast(syntax.kind()) {1516			Some(Self { syntax })1517		} else {1518			None1519		}1520	}1521	fn syntax(&self) -> &SyntaxNode {1522		&self.syntax1523	}1524}1525impl AstNode for Arg {1526	fn can_cast(kind: SyntaxKind) -> bool {1527		kind == ARG1528	}1529	fn cast(syntax: SyntaxNode) -> Option<Self> {1530		if Self::can_cast(syntax.kind()) {1531			Some(Self { syntax })1532		} else {1533			None1534		}1535	}1536	fn syntax(&self) -> &SyntaxNode {1537		&self.syntax1538	}1539}1540impl AstNode for ObjBodyComp {1541	fn can_cast(kind: SyntaxKind) -> bool {1542		kind == OBJ_BODY_COMP1543	}1544	fn cast(syntax: SyntaxNode) -> Option<Self> {1545		if Self::can_cast(syntax.kind()) {1546			Some(Self { syntax })1547		} else {1548			None1549		}1550	}1551	fn syntax(&self) -> &SyntaxNode {1552		&self.syntax1553	}1554}1555impl AstNode for ObjBodyMemberList {1556	fn can_cast(kind: SyntaxKind) -> bool {1557		kind == OBJ_BODY_MEMBER_LIST1558	}1559	fn cast(syntax: SyntaxNode) -> Option<Self> {1560		if Self::can_cast(syntax.kind()) {1561			Some(Self { syntax })1562		} else {1563			None1564		}1565	}1566	fn syntax(&self) -> &SyntaxNode {1567		&self.syntax1568	}1569}1570impl AstNode for MemberBindStmt {1571	fn can_cast(kind: SyntaxKind) -> bool {1572		kind == MEMBER_BIND_STMT1573	}1574	fn cast(syntax: SyntaxNode) -> Option<Self> {1575		if Self::can_cast(syntax.kind()) {1576			Some(Self { syntax })1577		} else {1578			None1579		}1580	}1581	fn syntax(&self) -> &SyntaxNode {1582		&self.syntax1583	}1584}1585impl AstNode for ObjLocal {1586	fn can_cast(kind: SyntaxKind) -> bool {1587		kind == OBJ_LOCAL1588	}1589	fn cast(syntax: SyntaxNode) -> Option<Self> {1590		if Self::can_cast(syntax.kind()) {1591			Some(Self { syntax })1592		} else {1593			None1594		}1595	}1596	fn syntax(&self) -> &SyntaxNode {1597		&self.syntax1598	}1599}1600impl AstNode for MemberAssertStmt {1601	fn can_cast(kind: SyntaxKind) -> bool {1602		kind == MEMBER_ASSERT_STMT1603	}1604	fn cast(syntax: SyntaxNode) -> Option<Self> {1605		if Self::can_cast(syntax.kind()) {1606			Some(Self { syntax })1607		} else {1608			None1609		}1610	}1611	fn syntax(&self) -> &SyntaxNode {1612		&self.syntax1613	}1614}1615impl AstNode for MemberFieldNormal {1616	fn can_cast(kind: SyntaxKind) -> bool {1617		kind == MEMBER_FIELD_NORMAL1618	}1619	fn cast(syntax: SyntaxNode) -> Option<Self> {1620		if Self::can_cast(syntax.kind()) {1621			Some(Self { syntax })1622		} else {1623			None1624		}1625	}1626	fn syntax(&self) -> &SyntaxNode {1627		&self.syntax1628	}1629}1630impl AstNode for Visibility {1631	fn can_cast(kind: SyntaxKind) -> bool {1632		kind == VISIBILITY1633	}1634	fn cast(syntax: SyntaxNode) -> Option<Self> {1635		if Self::can_cast(syntax.kind()) {1636			Some(Self { syntax })1637		} else {1638			None1639		}1640	}1641	fn syntax(&self) -> &SyntaxNode {1642		&self.syntax1643	}1644}1645impl AstNode for MemberFieldMethod {1646	fn can_cast(kind: SyntaxKind) -> bool {1647		kind == MEMBER_FIELD_METHOD1648	}1649	fn cast(syntax: SyntaxNode) -> Option<Self> {1650		if Self::can_cast(syntax.kind()) {1651			Some(Self { syntax })1652		} else {1653			None1654		}1655	}1656	fn syntax(&self) -> &SyntaxNode {1657		&self.syntax1658	}1659}1660impl AstNode for FieldNameFixed {1661	fn can_cast(kind: SyntaxKind) -> bool {1662		kind == FIELD_NAME_FIXED1663	}1664	fn cast(syntax: SyntaxNode) -> Option<Self> {1665		if Self::can_cast(syntax.kind()) {1666			Some(Self { syntax })1667		} else {1668			None1669		}1670	}1671	fn syntax(&self) -> &SyntaxNode {1672		&self.syntax1673	}1674}1675impl AstNode for FieldNameDynamic {1676	fn can_cast(kind: SyntaxKind) -> bool {1677		kind == FIELD_NAME_DYNAMIC1678	}1679	fn cast(syntax: SyntaxNode) -> Option<Self> {1680		if Self::can_cast(syntax.kind()) {1681			Some(Self { syntax })1682		} else {1683			None1684		}1685	}1686	fn syntax(&self) -> &SyntaxNode {1687		&self.syntax1688	}1689}1690impl AstNode for ForSpec {1691	fn can_cast(kind: SyntaxKind) -> bool {1692		kind == FOR_SPEC1693	}1694	fn cast(syntax: SyntaxNode) -> Option<Self> {1695		if Self::can_cast(syntax.kind()) {1696			Some(Self { syntax })1697		} else {1698			None1699		}1700	}1701	fn syntax(&self) -> &SyntaxNode {1702		&self.syntax1703	}1704}1705impl AstNode for IfSpec {1706	fn can_cast(kind: SyntaxKind) -> bool {1707		kind == IF_SPEC1708	}1709	fn cast(syntax: SyntaxNode) -> Option<Self> {1710		if Self::can_cast(syntax.kind()) {1711			Some(Self { syntax })1712		} else {1713			None1714		}1715	}1716	fn syntax(&self) -> &SyntaxNode {1717		&self.syntax1718	}1719}1720impl AstNode for BindDestruct {1721	fn can_cast(kind: SyntaxKind) -> bool {1722		kind == BIND_DESTRUCT1723	}1724	fn cast(syntax: SyntaxNode) -> Option<Self> {1725		if Self::can_cast(syntax.kind()) {1726			Some(Self { syntax })1727		} else {1728			None1729		}1730	}1731	fn syntax(&self) -> &SyntaxNode {1732		&self.syntax1733	}1734}1735impl AstNode for BindFunction {1736	fn can_cast(kind: SyntaxKind) -> bool {1737		kind == BIND_FUNCTION1738	}1739	fn cast(syntax: SyntaxNode) -> Option<Self> {1740		if Self::can_cast(syntax.kind()) {1741			Some(Self { syntax })1742		} else {1743			None1744		}1745	}1746	fn syntax(&self) -> &SyntaxNode {1747		&self.syntax1748	}1749}1750impl AstNode for Param {1751	fn can_cast(kind: SyntaxKind) -> bool {1752		kind == PARAM1753	}1754	fn cast(syntax: SyntaxNode) -> Option<Self> {1755		if Self::can_cast(syntax.kind()) {1756			Some(Self { syntax })1757		} else {1758			None1759		}1760	}1761	fn syntax(&self) -> &SyntaxNode {1762		&self.syntax1763	}1764}1765impl AstNode for DestructFull {1766	fn can_cast(kind: SyntaxKind) -> bool {1767		kind == DESTRUCT_FULL1768	}1769	fn cast(syntax: SyntaxNode) -> Option<Self> {1770		if Self::can_cast(syntax.kind()) {1771			Some(Self { syntax })1772		} else {1773			None1774		}1775	}1776	fn syntax(&self) -> &SyntaxNode {1777		&self.syntax1778	}1779}1780impl AstNode for DestructSkip {1781	fn can_cast(kind: SyntaxKind) -> bool {1782		kind == DESTRUCT_SKIP1783	}1784	fn cast(syntax: SyntaxNode) -> Option<Self> {1785		if Self::can_cast(syntax.kind()) {1786			Some(Self { syntax })1787		} else {1788			None1789		}1790	}1791	fn syntax(&self) -> &SyntaxNode {1792		&self.syntax1793	}1794}1795impl AstNode for DestructArray {1796	fn can_cast(kind: SyntaxKind) -> bool {1797		kind == DESTRUCT_ARRAY1798	}1799	fn cast(syntax: SyntaxNode) -> Option<Self> {1800		if Self::can_cast(syntax.kind()) {1801			Some(Self { syntax })1802		} else {1803			None1804		}1805	}1806	fn syntax(&self) -> &SyntaxNode {1807		&self.syntax1808	}1809}1810impl AstNode for DestructObject {1811	fn can_cast(kind: SyntaxKind) -> bool {1812		kind == DESTRUCT_OBJECT1813	}1814	fn cast(syntax: SyntaxNode) -> Option<Self> {1815		if Self::can_cast(syntax.kind()) {1816			Some(Self { syntax })1817		} else {1818			None1819		}1820	}1821	fn syntax(&self) -> &SyntaxNode {1822		&self.syntax1823	}1824}1825impl AstNode for DestructObjectField {1826	fn can_cast(kind: SyntaxKind) -> bool {1827		kind == DESTRUCT_OBJECT_FIELD1828	}1829	fn cast(syntax: SyntaxNode) -> Option<Self> {1830		if Self::can_cast(syntax.kind()) {1831			Some(Self { syntax })1832		} else {1833			None1834		}1835	}1836	fn syntax(&self) -> &SyntaxNode {1837		&self.syntax1838	}1839}1840impl AstNode for DestructRest {1841	fn can_cast(kind: SyntaxKind) -> bool {1842		kind == DESTRUCT_REST1843	}1844	fn cast(syntax: SyntaxNode) -> Option<Self> {1845		if Self::can_cast(syntax.kind()) {1846			Some(Self { syntax })1847		} else {1848			None1849		}1850	}1851	fn syntax(&self) -> &SyntaxNode {1852		&self.syntax1853	}1854}1855impl AstNode for DestructArrayElement {1856	fn can_cast(kind: SyntaxKind) -> bool {1857		kind == DESTRUCT_ARRAY_ELEMENT1858	}1859	fn cast(syntax: SyntaxNode) -> Option<Self> {1860		if Self::can_cast(syntax.kind()) {1861			Some(Self { syntax })1862		} else {1863			None1864		}1865	}1866	fn syntax(&self) -> &SyntaxNode {1867		&self.syntax1868	}1869}1870impl From<SuffixIndex> for Suffix {1871	fn from(node: SuffixIndex) -> Suffix {1872		Suffix::SuffixIndex(node)1873	}1874}1875impl From<SuffixIndexExpr> for Suffix {1876	fn from(node: SuffixIndexExpr) -> Suffix {1877		Suffix::SuffixIndexExpr(node)1878	}1879}1880impl From<SuffixSlice> for Suffix {1881	fn from(node: SuffixSlice) -> Suffix {1882		Suffix::SuffixSlice(node)1883	}1884}1885impl From<SuffixApply> for Suffix {1886	fn from(node: SuffixApply) -> Suffix {1887		Suffix::SuffixApply(node)1888	}1889}1890impl AstNode for Suffix {1891	fn can_cast(kind: SyntaxKind) -> bool {1892		match kind {1893			SUFFIX_INDEX | SUFFIX_INDEX_EXPR | SUFFIX_SLICE | SUFFIX_APPLY => true,1894			_ => false,1895		}1896	}1897	fn cast(syntax: SyntaxNode) -> Option<Self> {1898		let res = match syntax.kind() {1899			SUFFIX_INDEX => Suffix::SuffixIndex(SuffixIndex { syntax }),1900			SUFFIX_INDEX_EXPR => Suffix::SuffixIndexExpr(SuffixIndexExpr { syntax }),1901			SUFFIX_SLICE => Suffix::SuffixSlice(SuffixSlice { syntax }),1902			SUFFIX_APPLY => Suffix::SuffixApply(SuffixApply { syntax }),1903			_ => return None,1904		};1905		Some(res)1906	}1907	fn syntax(&self) -> &SyntaxNode {1908		match self {1909			Suffix::SuffixIndex(it) => &it.syntax,1910			Suffix::SuffixIndexExpr(it) => &it.syntax,1911			Suffix::SuffixSlice(it) => &it.syntax,1912			Suffix::SuffixApply(it) => &it.syntax,1913		}1914	}1915}1916impl From<BindDestruct> for Bind {1917	fn from(node: BindDestruct) -> Bind {1918		Bind::BindDestruct(node)1919	}1920}1921impl From<BindFunction> for Bind {1922	fn from(node: BindFunction) -> Bind {1923		Bind::BindFunction(node)1924	}1925}1926impl AstNode for Bind {1927	fn can_cast(kind: SyntaxKind) -> bool {1928		match kind {1929			BIND_DESTRUCT | BIND_FUNCTION => true,1930			_ => false,1931		}1932	}1933	fn cast(syntax: SyntaxNode) -> Option<Self> {1934		let res = match syntax.kind() {1935			BIND_DESTRUCT => Bind::BindDestruct(BindDestruct { syntax }),1936			BIND_FUNCTION => Bind::BindFunction(BindFunction { syntax }),1937			_ => return None,1938		};1939		Some(res)1940	}1941	fn syntax(&self) -> &SyntaxNode {1942		match self {1943			Bind::BindDestruct(it) => &it.syntax,1944			Bind::BindFunction(it) => &it.syntax,1945		}1946	}1947}1948impl From<StmtLocal> for Stmt {1949	fn from(node: StmtLocal) -> Stmt {1950		Stmt::StmtLocal(node)1951	}1952}1953impl From<StmtAssert> for Stmt {1954	fn from(node: StmtAssert) -> Stmt {1955		Stmt::StmtAssert(node)1956	}1957}1958impl AstNode for Stmt {1959	fn can_cast(kind: SyntaxKind) -> bool {1960		match kind {1961			STMT_LOCAL | STMT_ASSERT => true,1962			_ => false,1963		}1964	}1965	fn cast(syntax: SyntaxNode) -> Option<Self> {1966		let res = match syntax.kind() {1967			STMT_LOCAL => Stmt::StmtLocal(StmtLocal { syntax }),1968			STMT_ASSERT => Stmt::StmtAssert(StmtAssert { syntax }),1969			_ => return None,1970		};1971		Some(res)1972	}1973	fn syntax(&self) -> &SyntaxNode {1974		match self {1975			Stmt::StmtLocal(it) => &it.syntax,1976			Stmt::StmtAssert(it) => &it.syntax,1977		}1978	}1979}1980impl From<ObjBodyComp> for ObjBody {1981	fn from(node: ObjBodyComp) -> ObjBody {1982		ObjBody::ObjBodyComp(node)1983	}1984}1985impl From<ObjBodyMemberList> for ObjBody {1986	fn from(node: ObjBodyMemberList) -> ObjBody {1987		ObjBody::ObjBodyMemberList(node)1988	}1989}1990impl AstNode for ObjBody {1991	fn can_cast(kind: SyntaxKind) -> bool {1992		match kind {1993			OBJ_BODY_COMP | OBJ_BODY_MEMBER_LIST => true,1994			_ => false,1995		}1996	}1997	fn cast(syntax: SyntaxNode) -> Option<Self> {1998		let res = match syntax.kind() {1999			OBJ_BODY_COMP => ObjBody::ObjBodyComp(ObjBodyComp { syntax }),2000			OBJ_BODY_MEMBER_LIST => ObjBody::ObjBodyMemberList(ObjBodyMemberList { syntax }),2001			_ => return None,2002		};2003		Some(res)2004	}2005	fn syntax(&self) -> &SyntaxNode {2006		match self {2007			ObjBody::ObjBodyComp(it) => &it.syntax,2008			ObjBody::ObjBodyMemberList(it) => &it.syntax,2009		}2010	}2011}2012impl From<ForSpec> for CompSpec {2013	fn from(node: ForSpec) -> CompSpec {2014		CompSpec::ForSpec(node)2015	}2016}2017impl From<IfSpec> for CompSpec {2018	fn from(node: IfSpec) -> CompSpec {2019		CompSpec::IfSpec(node)2020	}2021}2022impl AstNode for CompSpec {2023	fn can_cast(kind: SyntaxKind) -> bool {2024		match kind {2025			FOR_SPEC | IF_SPEC => true,2026			_ => false,2027		}2028	}2029	fn cast(syntax: SyntaxNode) -> Option<Self> {2030		let res = match syntax.kind() {2031			FOR_SPEC => CompSpec::ForSpec(ForSpec { syntax }),2032			IF_SPEC => CompSpec::IfSpec(IfSpec { syntax }),2033			_ => return None,2034		};2035		Some(res)2036	}2037	fn syntax(&self) -> &SyntaxNode {2038		match self {2039			CompSpec::ForSpec(it) => &it.syntax,2040			CompSpec::IfSpec(it) => &it.syntax,2041		}2042	}2043}2044impl From<ExprBinary> for ExprBase {2045	fn from(node: ExprBinary) -> ExprBase {2046		ExprBase::ExprBinary(node)2047	}2048}2049impl From<ExprUnary> for ExprBase {2050	fn from(node: ExprUnary) -> ExprBase {2051		ExprBase::ExprUnary(node)2052	}2053}2054impl From<ExprObjExtend> for ExprBase {2055	fn from(node: ExprObjExtend) -> ExprBase {2056		ExprBase::ExprObjExtend(node)2057	}2058}2059impl From<ExprParened> for ExprBase {2060	fn from(node: ExprParened) -> ExprBase {2061		ExprBase::ExprParened(node)2062	}2063}2064impl From<ExprString> for ExprBase {2065	fn from(node: ExprString) -> ExprBase {2066		ExprBase::ExprString(node)2067	}2068}2069impl From<ExprNumber> for ExprBase {2070	fn from(node: ExprNumber) -> ExprBase {2071		ExprBase::ExprNumber(node)2072	}2073}2074impl From<ExprLiteral> for ExprBase {2075	fn from(node: ExprLiteral) -> ExprBase {2076		ExprBase::ExprLiteral(node)2077	}2078}2079impl From<ExprArray> for ExprBase {2080	fn from(node: ExprArray) -> ExprBase {2081		ExprBase::ExprArray(node)2082	}2083}2084impl From<ExprObject> for ExprBase {2085	fn from(node: ExprObject) -> ExprBase {2086		ExprBase::ExprObject(node)2087	}2088}2089impl From<ExprArrayComp> for ExprBase {2090	fn from(node: ExprArrayComp) -> ExprBase {2091		ExprBase::ExprArrayComp(node)2092	}2093}2094impl From<ExprImport> for ExprBase {2095	fn from(node: ExprImport) -> ExprBase {2096		ExprBase::ExprImport(node)2097	}2098}2099impl From<ExprVar> for ExprBase {2100	fn from(node: ExprVar) -> ExprBase {2101		ExprBase::ExprVar(node)2102	}2103}2104impl From<ExprIfThenElse> for ExprBase {2105	fn from(node: ExprIfThenElse) -> ExprBase {2106		ExprBase::ExprIfThenElse(node)2107	}2108}2109impl From<ExprFunction> for ExprBase {2110	fn from(node: ExprFunction) -> ExprBase {2111		ExprBase::ExprFunction(node)2112	}2113}2114impl From<ExprError> for ExprBase {2115	fn from(node: ExprError) -> ExprBase {2116		ExprBase::ExprError(node)2117	}2118}2119impl AstNode for ExprBase {2120	fn can_cast(kind: SyntaxKind) -> bool {2121		match kind {2122			EXPR_BINARY | EXPR_UNARY | EXPR_OBJ_EXTEND | EXPR_PARENED | EXPR_STRING2123			| EXPR_NUMBER | EXPR_LITERAL | EXPR_ARRAY | EXPR_OBJECT | EXPR_ARRAY_COMP2124			| EXPR_IMPORT | EXPR_VAR | EXPR_IF_THEN_ELSE | EXPR_FUNCTION | EXPR_ERROR => true,2125			_ => false,2126		}2127	}2128	fn cast(syntax: SyntaxNode) -> Option<Self> {2129		let res = match syntax.kind() {2130			EXPR_BINARY => ExprBase::ExprBinary(ExprBinary { syntax }),2131			EXPR_UNARY => ExprBase::ExprUnary(ExprUnary { syntax }),2132			EXPR_OBJ_EXTEND => ExprBase::ExprObjExtend(ExprObjExtend { syntax }),2133			EXPR_PARENED => ExprBase::ExprParened(ExprParened { syntax }),2134			EXPR_STRING => ExprBase::ExprString(ExprString { syntax }),2135			EXPR_NUMBER => ExprBase::ExprNumber(ExprNumber { syntax }),2136			EXPR_LITERAL => ExprBase::ExprLiteral(ExprLiteral { syntax }),2137			EXPR_ARRAY => ExprBase::ExprArray(ExprArray { syntax }),2138			EXPR_OBJECT => ExprBase::ExprObject(ExprObject { syntax }),2139			EXPR_ARRAY_COMP => ExprBase::ExprArrayComp(ExprArrayComp { syntax }),2140			EXPR_IMPORT => ExprBase::ExprImport(ExprImport { syntax }),2141			EXPR_VAR => ExprBase::ExprVar(ExprVar { syntax }),2142			EXPR_IF_THEN_ELSE => ExprBase::ExprIfThenElse(ExprIfThenElse { syntax }),2143			EXPR_FUNCTION => ExprBase::ExprFunction(ExprFunction { syntax }),2144			EXPR_ERROR => ExprBase::ExprError(ExprError { syntax }),2145			_ => return None,2146		};2147		Some(res)2148	}2149	fn syntax(&self) -> &SyntaxNode {2150		match self {2151			ExprBase::ExprBinary(it) => &it.syntax,2152			ExprBase::ExprUnary(it) => &it.syntax,2153			ExprBase::ExprObjExtend(it) => &it.syntax,2154			ExprBase::ExprParened(it) => &it.syntax,2155			ExprBase::ExprString(it) => &it.syntax,2156			ExprBase::ExprNumber(it) => &it.syntax,2157			ExprBase::ExprLiteral(it) => &it.syntax,2158			ExprBase::ExprArray(it) => &it.syntax,2159			ExprBase::ExprObject(it) => &it.syntax,2160			ExprBase::ExprArrayComp(it) => &it.syntax,2161			ExprBase::ExprImport(it) => &it.syntax,2162			ExprBase::ExprVar(it) => &it.syntax,2163			ExprBase::ExprIfThenElse(it) => &it.syntax,2164			ExprBase::ExprFunction(it) => &it.syntax,2165			ExprBase::ExprError(it) => &it.syntax,2166		}2167	}2168}2169impl From<MemberBindStmt> for MemberComp {2170	fn from(node: MemberBindStmt) -> MemberComp {2171		MemberComp::MemberBindStmt(node)2172	}2173}2174impl From<MemberFieldNormal> for MemberComp {2175	fn from(node: MemberFieldNormal) -> MemberComp {2176		MemberComp::MemberFieldNormal(node)2177	}2178}2179impl From<MemberFieldMethod> for MemberComp {2180	fn from(node: MemberFieldMethod) -> MemberComp {2181		MemberComp::MemberFieldMethod(node)2182	}2183}2184impl AstNode for MemberComp {2185	fn can_cast(kind: SyntaxKind) -> bool {2186		match kind {2187			MEMBER_BIND_STMT | MEMBER_FIELD_NORMAL | MEMBER_FIELD_METHOD => true,2188			_ => false,2189		}2190	}2191	fn cast(syntax: SyntaxNode) -> Option<Self> {2192		let res = match syntax.kind() {2193			MEMBER_BIND_STMT => MemberComp::MemberBindStmt(MemberBindStmt { syntax }),2194			MEMBER_FIELD_NORMAL => MemberComp::MemberFieldNormal(MemberFieldNormal { syntax }),2195			MEMBER_FIELD_METHOD => MemberComp::MemberFieldMethod(MemberFieldMethod { syntax }),2196			_ => return None,2197		};2198		Some(res)2199	}2200	fn syntax(&self) -> &SyntaxNode {2201		match self {2202			MemberComp::MemberBindStmt(it) => &it.syntax,2203			MemberComp::MemberFieldNormal(it) => &it.syntax,2204			MemberComp::MemberFieldMethod(it) => &it.syntax,2205		}2206	}2207}2208impl From<MemberBindStmt> for Member {2209	fn from(node: MemberBindStmt) -> Member {2210		Member::MemberBindStmt(node)2211	}2212}2213impl From<MemberAssertStmt> for Member {2214	fn from(node: MemberAssertStmt) -> Member {2215		Member::MemberAssertStmt(node)2216	}2217}2218impl From<MemberFieldNormal> for Member {2219	fn from(node: MemberFieldNormal) -> Member {2220		Member::MemberFieldNormal(node)2221	}2222}2223impl From<MemberFieldMethod> for Member {2224	fn from(node: MemberFieldMethod) -> Member {2225		Member::MemberFieldMethod(node)2226	}2227}2228impl AstNode for Member {2229	fn can_cast(kind: SyntaxKind) -> bool {2230		match kind {2231			MEMBER_BIND_STMT | MEMBER_ASSERT_STMT | MEMBER_FIELD_NORMAL | MEMBER_FIELD_METHOD => {2232				true2233			}2234			_ => false,2235		}2236	}2237	fn cast(syntax: SyntaxNode) -> Option<Self> {2238		let res = match syntax.kind() {2239			MEMBER_BIND_STMT => Member::MemberBindStmt(MemberBindStmt { syntax }),2240			MEMBER_ASSERT_STMT => Member::MemberAssertStmt(MemberAssertStmt { syntax }),2241			MEMBER_FIELD_NORMAL => Member::MemberFieldNormal(MemberFieldNormal { syntax }),2242			MEMBER_FIELD_METHOD => Member::MemberFieldMethod(MemberFieldMethod { syntax }),2243			_ => return None,2244		};2245		Some(res)2246	}2247	fn syntax(&self) -> &SyntaxNode {2248		match self {2249			Member::MemberBindStmt(it) => &it.syntax,2250			Member::MemberAssertStmt(it) => &it.syntax,2251			Member::MemberFieldNormal(it) => &it.syntax,2252			Member::MemberFieldMethod(it) => &it.syntax,2253		}2254	}2255}2256impl From<FieldNameFixed> for FieldName {2257	fn from(node: FieldNameFixed) -> FieldName {2258		FieldName::FieldNameFixed(node)2259	}2260}2261impl From<FieldNameDynamic> for FieldName {2262	fn from(node: FieldNameDynamic) -> FieldName {2263		FieldName::FieldNameDynamic(node)2264	}2265}2266impl AstNode for FieldName {2267	fn can_cast(kind: SyntaxKind) -> bool {2268		match kind {2269			FIELD_NAME_FIXED | FIELD_NAME_DYNAMIC => true,2270			_ => false,2271		}2272	}2273	fn cast(syntax: SyntaxNode) -> Option<Self> {2274		let res = match syntax.kind() {2275			FIELD_NAME_FIXED => FieldName::FieldNameFixed(FieldNameFixed { syntax }),2276			FIELD_NAME_DYNAMIC => FieldName::FieldNameDynamic(FieldNameDynamic { syntax }),2277			_ => return None,2278		};2279		Some(res)2280	}2281	fn syntax(&self) -> &SyntaxNode {2282		match self {2283			FieldName::FieldNameFixed(it) => &it.syntax,2284			FieldName::FieldNameDynamic(it) => &it.syntax,2285		}2286	}2287}2288impl From<DestructFull> for Destruct {2289	fn from(node: DestructFull) -> Destruct {2290		Destruct::DestructFull(node)2291	}2292}2293impl From<DestructSkip> for Destruct {2294	fn from(node: DestructSkip) -> Destruct {2295		Destruct::DestructSkip(node)2296	}2297}2298impl From<DestructArray> for Destruct {2299	fn from(node: DestructArray) -> Destruct {2300		Destruct::DestructArray(node)2301	}2302}2303impl From<DestructObject> for Destruct {2304	fn from(node: DestructObject) -> Destruct {2305		Destruct::DestructObject(node)2306	}2307}2308impl AstNode for Destruct {2309	fn can_cast(kind: SyntaxKind) -> bool {2310		match kind {2311			DESTRUCT_FULL | DESTRUCT_SKIP | DESTRUCT_ARRAY | DESTRUCT_OBJECT => true,2312			_ => false,2313		}2314	}2315	fn cast(syntax: SyntaxNode) -> Option<Self> {2316		let res = match syntax.kind() {2317			DESTRUCT_FULL => Destruct::DestructFull(DestructFull { syntax }),2318			DESTRUCT_SKIP => Destruct::DestructSkip(DestructSkip { syntax }),2319			DESTRUCT_ARRAY => Destruct::DestructArray(DestructArray { syntax }),2320			DESTRUCT_OBJECT => Destruct::DestructObject(DestructObject { syntax }),2321			_ => return None,2322		};2323		Some(res)2324	}2325	fn syntax(&self) -> &SyntaxNode {2326		match self {2327			Destruct::DestructFull(it) => &it.syntax,2328			Destruct::DestructSkip(it) => &it.syntax,2329			Destruct::DestructArray(it) => &it.syntax,2330			Destruct::DestructObject(it) => &it.syntax,2331		}2332	}2333}2334impl From<DestructArrayElement> for DestructArrayPart {2335	fn from(node: DestructArrayElement) -> DestructArrayPart {2336		DestructArrayPart::DestructArrayElement(node)2337	}2338}2339impl From<DestructRest> for DestructArrayPart {2340	fn from(node: DestructRest) -> DestructArrayPart {2341		DestructArrayPart::DestructRest(node)2342	}2343}2344impl AstNode for DestructArrayPart {2345	fn can_cast(kind: SyntaxKind) -> bool {2346		match kind {2347			DESTRUCT_ARRAY_ELEMENT | DESTRUCT_REST => true,2348			_ => false,2349		}2350	}2351	fn cast(syntax: SyntaxNode) -> Option<Self> {2352		let res = match syntax.kind() {2353			DESTRUCT_ARRAY_ELEMENT => {2354				DestructArrayPart::DestructArrayElement(DestructArrayElement { syntax })2355			}2356			DESTRUCT_REST => DestructArrayPart::DestructRest(DestructRest { syntax }),2357			_ => return None,2358		};2359		Some(res)2360	}2361	fn syntax(&self) -> &SyntaxNode {2362		match self {2363			DestructArrayPart::DestructArrayElement(it) => &it.syntax,2364			DestructArrayPart::DestructRest(it) => &it.syntax,2365		}2366	}2367}2368impl AstToken for BinaryOperator {2369	fn can_cast(kind: SyntaxKind) -> bool {2370		BinaryOperatorKind::can_cast(kind)2371	}2372	fn cast(syntax: SyntaxToken) -> Option<Self> {2373		let kind = BinaryOperatorKind::cast(syntax.kind())?;2374		Some(BinaryOperator { syntax, kind })2375	}2376	fn syntax(&self) -> &SyntaxToken {2377		&self.syntax2378	}2379}2380impl BinaryOperatorKind {2381	fn can_cast(kind: SyntaxKind) -> bool {2382		match kind {2383			OR | NULL_COAELSE | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE2384			| IN_KW | LHS | RHS | PLUS | MINUS | MUL | DIV | MODULO | META_OBJECT_APPLY2385			| ERROR_NO_OPERATOR => true,2386			_ => false,2387		}2388	}2389	pub fn cast(kind: SyntaxKind) -> Option<Self> {2390		let res = match kind {2391			OR => Self::Or,2392			NULL_COAELSE => Self::NullCoaelse,2393			AND => Self::And,2394			BIT_OR => Self::BitOr,2395			BIT_XOR => Self::BitXor,2396			BIT_AND => Self::BitAnd,2397			EQ => Self::Eq,2398			NE => Self::Ne,2399			LT => Self::Lt,2400			GT => Self::Gt,2401			LE => Self::Le,2402			GE => Self::Ge,2403			IN_KW => Self::InKw,2404			LHS => Self::Lhs,2405			RHS => Self::Rhs,2406			PLUS => Self::Plus,2407			MINUS => Self::Minus,2408			MUL => Self::Mul,2409			DIV => Self::Div,2410			MODULO => Self::Modulo,2411			META_OBJECT_APPLY => Self::MetaObjectApply,2412			ERROR_NO_OPERATOR => Self::ErrorNoOperator,2413			_ => return None,2414		};2415		Some(res)2416	}2417}2418impl BinaryOperator {2419	pub fn kind(&self) -> BinaryOperatorKind {2420		self.kind2421	}2422}2423impl std::fmt::Display for BinaryOperator {2424	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2425		std::fmt::Display::fmt(self.syntax(), f)2426	}2427}2428impl AstToken for UnaryOperator {2429	fn can_cast(kind: SyntaxKind) -> bool {2430		UnaryOperatorKind::can_cast(kind)2431	}2432	fn cast(syntax: SyntaxToken) -> Option<Self> {2433		let kind = UnaryOperatorKind::cast(syntax.kind())?;2434		Some(UnaryOperator { syntax, kind })2435	}2436	fn syntax(&self) -> &SyntaxToken {2437		&self.syntax2438	}2439}2440impl UnaryOperatorKind {2441	fn can_cast(kind: SyntaxKind) -> bool {2442		match kind {2443			MINUS | NOT | BIT_NOT => true,2444			_ => false,2445		}2446	}2447	pub fn cast(kind: SyntaxKind) -> Option<Self> {2448		let res = match kind {2449			MINUS => Self::Minus,2450			NOT => Self::Not,2451			BIT_NOT => Self::BitNot,2452			_ => return None,2453		};2454		Some(res)2455	}2456}2457impl UnaryOperator {2458	pub fn kind(&self) -> UnaryOperatorKind {2459		self.kind2460	}2461}2462impl std::fmt::Display for UnaryOperator {2463	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2464		std::fmt::Display::fmt(self.syntax(), f)2465	}2466}2467impl AstToken for Literal {2468	fn can_cast(kind: SyntaxKind) -> bool {2469		LiteralKind::can_cast(kind)2470	}2471	fn cast(syntax: SyntaxToken) -> Option<Self> {2472		let kind = LiteralKind::cast(syntax.kind())?;2473		Some(Literal { syntax, kind })2474	}2475	fn syntax(&self) -> &SyntaxToken {2476		&self.syntax2477	}2478}2479impl LiteralKind {2480	fn can_cast(kind: SyntaxKind) -> bool {2481		match kind {2482			NULL_KW | TRUE_KW | FALSE_KW | SELF_KW | DOLLAR | SUPER_KW => true,2483			_ => false,2484		}2485	}2486	pub fn cast(kind: SyntaxKind) -> Option<Self> {2487		let res = match kind {2488			NULL_KW => Self::NullKw,2489			TRUE_KW => Self::TrueKw,2490			FALSE_KW => Self::FalseKw,2491			SELF_KW => Self::SelfKw,2492			DOLLAR => Self::Dollar,2493			SUPER_KW => Self::SuperKw,2494			_ => return None,2495		};2496		Some(res)2497	}2498}2499impl Literal {2500	pub fn kind(&self) -> LiteralKind {2501		self.kind2502	}2503}2504impl std::fmt::Display for Literal {2505	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2506		std::fmt::Display::fmt(self.syntax(), f)2507	}2508}2509impl AstToken for Text {2510	fn can_cast(kind: SyntaxKind) -> bool {2511		TextKind::can_cast(kind)2512	}2513	fn cast(syntax: SyntaxToken) -> Option<Self> {2514		let kind = TextKind::cast(syntax.kind())?;2515		Some(Text { syntax, kind })2516	}2517	fn syntax(&self) -> &SyntaxToken {2518		&self.syntax2519	}2520}2521impl TextKind {2522	fn can_cast(kind: SyntaxKind) -> bool {2523		match kind {2524			STRING_DOUBLE2525			| ERROR_STRING_DOUBLE_UNTERMINATED2526			| STRING_SINGLE2527			| ERROR_STRING_SINGLE_UNTERMINATED2528			| STRING_DOUBLE_VERBATIM2529			| ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED2530			| STRING_SINGLE_VERBATIM2531			| ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED2532			| ERROR_STRING_VERBATIM_MISSING_QUOTES2533			| STRING_BLOCK2534			| ERROR_STRING_BLOCK_UNEXPECTED_END2535			| ERROR_STRING_BLOCK_MISSING_NEW_LINE2536			| ERROR_STRING_BLOCK_MISSING_TERMINATION2537			| ERROR_STRING_BLOCK_MISSING_INDENT => true,2538			_ => false,2539		}2540	}2541	pub fn cast(kind: SyntaxKind) -> Option<Self> {2542		let res = match kind {2543			STRING_DOUBLE => Self::StringDouble,2544			ERROR_STRING_DOUBLE_UNTERMINATED => Self::ErrorStringDoubleUnterminated,2545			STRING_SINGLE => Self::StringSingle,2546			ERROR_STRING_SINGLE_UNTERMINATED => Self::ErrorStringSingleUnterminated,2547			STRING_DOUBLE_VERBATIM => Self::StringDoubleVerbatim,2548			ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED => {2549				Self::ErrorStringDoubleVerbatimUnterminated2550			}2551			STRING_SINGLE_VERBATIM => Self::StringSingleVerbatim,2552			ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED => {2553				Self::ErrorStringSingleVerbatimUnterminated2554			}2555			ERROR_STRING_VERBATIM_MISSING_QUOTES => Self::ErrorStringVerbatimMissingQuotes,2556			STRING_BLOCK => Self::StringBlock,2557			ERROR_STRING_BLOCK_UNEXPECTED_END => Self::ErrorStringBlockUnexpectedEnd,2558			ERROR_STRING_BLOCK_MISSING_NEW_LINE => Self::ErrorStringBlockMissingNewLine,2559			ERROR_STRING_BLOCK_MISSING_TERMINATION => Self::ErrorStringBlockMissingTermination,2560			ERROR_STRING_BLOCK_MISSING_INDENT => Self::ErrorStringBlockMissingIndent,2561			_ => return None,2562		};2563		Some(res)2564	}2565}2566impl Text {2567	pub fn kind(&self) -> TextKind {2568		self.kind2569	}2570}2571impl std::fmt::Display for Text {2572	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2573		std::fmt::Display::fmt(self.syntax(), f)2574	}2575}2576impl AstToken for Number {2577	fn can_cast(kind: SyntaxKind) -> bool {2578		NumberKind::can_cast(kind)2579	}2580	fn cast(syntax: SyntaxToken) -> Option<Self> {2581		let kind = NumberKind::cast(syntax.kind())?;2582		Some(Number { syntax, kind })2583	}2584	fn syntax(&self) -> &SyntaxToken {2585		&self.syntax2586	}2587}2588impl NumberKind {2589	fn can_cast(kind: SyntaxKind) -> bool {2590		match kind {2591			FLOAT2592			| ERROR_FLOAT_JUNK_AFTER_POINT2593			| ERROR_FLOAT_JUNK_AFTER_EXPONENT2594			| ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN => true,2595			_ => false,2596		}2597	}2598	pub fn cast(kind: SyntaxKind) -> Option<Self> {2599		let res = match kind {2600			FLOAT => Self::Float,2601			ERROR_FLOAT_JUNK_AFTER_POINT => Self::ErrorFloatJunkAfterPoint,2602			ERROR_FLOAT_JUNK_AFTER_EXPONENT => Self::ErrorFloatJunkAfterExponent,2603			ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN => Self::ErrorFloatJunkAfterExponentSign,2604			_ => return None,2605		};2606		Some(res)2607	}2608}2609impl Number {2610	pub fn kind(&self) -> NumberKind {2611		self.kind2612	}2613}2614impl std::fmt::Display for Number {2615	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2616		std::fmt::Display::fmt(self.syntax(), f)2617	}2618}2619impl AstToken for ImportKind {2620	fn can_cast(kind: SyntaxKind) -> bool {2621		ImportKindKind::can_cast(kind)2622	}2623	fn cast(syntax: SyntaxToken) -> Option<Self> {2624		let kind = ImportKindKind::cast(syntax.kind())?;2625		Some(ImportKind { syntax, kind })2626	}2627	fn syntax(&self) -> &SyntaxToken {2628		&self.syntax2629	}2630}2631impl ImportKindKind {2632	fn can_cast(kind: SyntaxKind) -> bool {2633		match kind {2634			IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW => true,2635			_ => false,2636		}2637	}2638	pub fn cast(kind: SyntaxKind) -> Option<Self> {2639		let res = match kind {2640			IMPORTSTR_KW => Self::ImportstrKw,2641			IMPORTBIN_KW => Self::ImportbinKw,2642			IMPORT_KW => Self::ImportKw,2643			_ => return None,2644		};2645		Some(res)2646	}2647}2648impl ImportKind {2649	pub fn kind(&self) -> ImportKindKind {2650		self.kind2651	}2652}2653impl std::fmt::Display for ImportKind {2654	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2655		std::fmt::Display::fmt(self.syntax(), f)2656	}2657}2658impl AstToken for Trivia {2659	fn can_cast(kind: SyntaxKind) -> bool {2660		TriviaKind::can_cast(kind)2661	}2662	fn cast(syntax: SyntaxToken) -> Option<Self> {2663		let kind = TriviaKind::cast(syntax.kind())?;2664		Some(Trivia { syntax, kind })2665	}2666	fn syntax(&self) -> &SyntaxToken {2667		&self.syntax2668	}2669}2670impl TriviaKind {2671	fn can_cast(kind: SyntaxKind) -> bool {2672		match kind {2673			WHITESPACE2674			| MULTI_LINE_COMMENT2675			| ERROR_COMMENT_TOO_SHORT2676			| ERROR_COMMENT_UNTERMINATED2677			| SINGLE_LINE_HASH_COMMENT2678			| SINGLE_LINE_SLASH_COMMENT => true,2679			_ => false,2680		}2681	}2682	pub fn cast(kind: SyntaxKind) -> Option<Self> {2683		let res = match kind {2684			WHITESPACE => Self::Whitespace,2685			MULTI_LINE_COMMENT => Self::MultiLineComment,2686			ERROR_COMMENT_TOO_SHORT => Self::ErrorCommentTooShort,2687			ERROR_COMMENT_UNTERMINATED => Self::ErrorCommentUnterminated,2688			SINGLE_LINE_HASH_COMMENT => Self::SingleLineHashComment,2689			SINGLE_LINE_SLASH_COMMENT => Self::SingleLineSlashComment,2690			_ => return None,2691		};2692		Some(res)2693	}2694}2695impl Trivia {2696	pub fn kind(&self) -> TriviaKind {2697		self.kind2698	}2699}2700impl std::fmt::Display for Trivia {2701	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2702		std::fmt::Display::fmt(self.syntax(), f)2703	}2704}2705impl AstToken for CustomError {2706	fn can_cast(kind: SyntaxKind) -> bool {2707		CustomErrorKind::can_cast(kind)2708	}2709	fn cast(syntax: SyntaxToken) -> Option<Self> {2710		let kind = CustomErrorKind::cast(syntax.kind())?;2711		Some(CustomError { syntax, kind })2712	}2713	fn syntax(&self) -> &SyntaxToken {2714		&self.syntax2715	}2716}2717impl CustomErrorKind {2718	fn can_cast(kind: SyntaxKind) -> bool {2719		match kind {2720			ERROR_MISSING_TOKEN | ERROR_UNEXPECTED_TOKEN | ERROR_CUSTOM => true,2721			_ => false,2722		}2723	}2724	pub fn cast(kind: SyntaxKind) -> Option<Self> {2725		let res = match kind {2726			ERROR_MISSING_TOKEN => Self::ErrorMissingToken,2727			ERROR_UNEXPECTED_TOKEN => Self::ErrorUnexpectedToken,2728			ERROR_CUSTOM => Self::ErrorCustom,2729			_ => return None,2730		};2731		Some(res)2732	}2733}2734impl CustomError {2735	pub fn kind(&self) -> CustomErrorKind {2736		self.kind2737	}2738}2739impl std::fmt::Display for CustomError {2740	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2741		std::fmt::Display::fmt(self.syntax(), f)2742	}2743}2744impl std::fmt::Display for Suffix {2745	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2746		std::fmt::Display::fmt(self.syntax(), f)2747	}2748}2749impl std::fmt::Display for Bind {2750	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2751		std::fmt::Display::fmt(self.syntax(), f)2752	}2753}2754impl std::fmt::Display for Stmt {2755	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2756		std::fmt::Display::fmt(self.syntax(), f)2757	}2758}2759impl std::fmt::Display for ObjBody {2760	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2761		std::fmt::Display::fmt(self.syntax(), f)2762	}2763}2764impl std::fmt::Display for CompSpec {2765	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2766		std::fmt::Display::fmt(self.syntax(), f)2767	}2768}2769impl std::fmt::Display for ExprBase {2770	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2771		std::fmt::Display::fmt(self.syntax(), f)2772	}2773}2774impl std::fmt::Display for MemberComp {2775	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2776		std::fmt::Display::fmt(self.syntax(), f)2777	}2778}2779impl std::fmt::Display for Member {2780	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2781		std::fmt::Display::fmt(self.syntax(), f)2782	}2783}2784impl std::fmt::Display for FieldName {2785	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2786		std::fmt::Display::fmt(self.syntax(), f)2787	}2788}2789impl std::fmt::Display for Destruct {2790	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2791		std::fmt::Display::fmt(self.syntax(), f)2792	}2793}2794impl std::fmt::Display for DestructArrayPart {2795	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2796		std::fmt::Display::fmt(self.syntax(), f)2797	}2798}2799impl std::fmt::Display for SourceFile {2800	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2801		std::fmt::Display::fmt(self.syntax(), f)2802	}2803}2804impl std::fmt::Display for Expr {2805	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2806		std::fmt::Display::fmt(self.syntax(), f)2807	}2808}2809impl std::fmt::Display for SuffixIndex {2810	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2811		std::fmt::Display::fmt(self.syntax(), f)2812	}2813}2814impl std::fmt::Display for Name {2815	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2816		std::fmt::Display::fmt(self.syntax(), f)2817	}2818}2819impl std::fmt::Display for SuffixIndexExpr {2820	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2821		std::fmt::Display::fmt(self.syntax(), f)2822	}2823}2824impl std::fmt::Display for SuffixSlice {2825	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2826		std::fmt::Display::fmt(self.syntax(), f)2827	}2828}2829impl std::fmt::Display for SliceDesc {2830	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2831		std::fmt::Display::fmt(self.syntax(), f)2832	}2833}2834impl std::fmt::Display for SuffixApply {2835	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2836		std::fmt::Display::fmt(self.syntax(), f)2837	}2838}2839impl std::fmt::Display for ArgsDesc {2840	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2841		std::fmt::Display::fmt(self.syntax(), f)2842	}2843}2844impl std::fmt::Display for StmtLocal {2845	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2846		std::fmt::Display::fmt(self.syntax(), f)2847	}2848}2849impl std::fmt::Display for StmtAssert {2850	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2851		std::fmt::Display::fmt(self.syntax(), f)2852	}2853}2854impl std::fmt::Display for Assertion {2855	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2856		std::fmt::Display::fmt(self.syntax(), f)2857	}2858}2859impl std::fmt::Display for ExprBinary {2860	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2861		std::fmt::Display::fmt(self.syntax(), f)2862	}2863}2864impl std::fmt::Display for ExprUnary {2865	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2866		std::fmt::Display::fmt(self.syntax(), f)2867	}2868}2869impl std::fmt::Display for ExprObjExtend {2870	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2871		std::fmt::Display::fmt(self.syntax(), f)2872	}2873}2874impl std::fmt::Display for ExprParened {2875	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2876		std::fmt::Display::fmt(self.syntax(), f)2877	}2878}2879impl std::fmt::Display for ExprLiteral {2880	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2881		std::fmt::Display::fmt(self.syntax(), f)2882	}2883}2884impl std::fmt::Display for ExprString {2885	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2886		std::fmt::Display::fmt(self.syntax(), f)2887	}2888}2889impl std::fmt::Display for ExprNumber {2890	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2891		std::fmt::Display::fmt(self.syntax(), f)2892	}2893}2894impl std::fmt::Display for ExprArray {2895	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2896		std::fmt::Display::fmt(self.syntax(), f)2897	}2898}2899impl std::fmt::Display for ExprObject {2900	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2901		std::fmt::Display::fmt(self.syntax(), f)2902	}2903}2904impl std::fmt::Display for ExprArrayComp {2905	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2906		std::fmt::Display::fmt(self.syntax(), f)2907	}2908}2909impl std::fmt::Display for ExprImport {2910	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2911		std::fmt::Display::fmt(self.syntax(), f)2912	}2913}2914impl std::fmt::Display for ExprVar {2915	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2916		std::fmt::Display::fmt(self.syntax(), f)2917	}2918}2919impl std::fmt::Display for ExprIfThenElse {2920	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2921		std::fmt::Display::fmt(self.syntax(), f)2922	}2923}2924impl std::fmt::Display for TrueExpr {2925	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2926		std::fmt::Display::fmt(self.syntax(), f)2927	}2928}2929impl std::fmt::Display for FalseExpr {2930	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2931		std::fmt::Display::fmt(self.syntax(), f)2932	}2933}2934impl std::fmt::Display for ExprFunction {2935	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2936		std::fmt::Display::fmt(self.syntax(), f)2937	}2938}2939impl std::fmt::Display for ParamsDesc {2940	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2941		std::fmt::Display::fmt(self.syntax(), f)2942	}2943}2944impl std::fmt::Display for ExprError {2945	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2946		std::fmt::Display::fmt(self.syntax(), f)2947	}2948}2949impl std::fmt::Display for SliceDescEnd {2950	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2951		std::fmt::Display::fmt(self.syntax(), f)2952	}2953}2954impl std::fmt::Display for SliceDescStep {2955	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2956		std::fmt::Display::fmt(self.syntax(), f)2957	}2958}2959impl std::fmt::Display for Arg {2960	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2961		std::fmt::Display::fmt(self.syntax(), f)2962	}2963}2964impl std::fmt::Display for ObjBodyComp {2965	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2966		std::fmt::Display::fmt(self.syntax(), f)2967	}2968}2969impl std::fmt::Display for ObjBodyMemberList {2970	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2971		std::fmt::Display::fmt(self.syntax(), f)2972	}2973}2974impl std::fmt::Display for MemberBindStmt {2975	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2976		std::fmt::Display::fmt(self.syntax(), f)2977	}2978}2979impl std::fmt::Display for ObjLocal {2980	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2981		std::fmt::Display::fmt(self.syntax(), f)2982	}2983}2984impl std::fmt::Display for MemberAssertStmt {2985	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2986		std::fmt::Display::fmt(self.syntax(), f)2987	}2988}2989impl std::fmt::Display for MemberFieldNormal {2990	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2991		std::fmt::Display::fmt(self.syntax(), f)2992	}2993}2994impl std::fmt::Display for Visibility {2995	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2996		std::fmt::Display::fmt(self.syntax(), f)2997	}2998}2999impl std::fmt::Display for MemberFieldMethod {3000	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3001		std::fmt::Display::fmt(self.syntax(), f)3002	}3003}3004impl std::fmt::Display for FieldNameFixed {3005	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3006		std::fmt::Display::fmt(self.syntax(), f)3007	}3008}3009impl std::fmt::Display for FieldNameDynamic {3010	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3011		std::fmt::Display::fmt(self.syntax(), f)3012	}3013}3014impl std::fmt::Display for ForSpec {3015	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3016		std::fmt::Display::fmt(self.syntax(), f)3017	}3018}3019impl std::fmt::Display for IfSpec {3020	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3021		std::fmt::Display::fmt(self.syntax(), f)3022	}3023}3024impl std::fmt::Display for BindDestruct {3025	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3026		std::fmt::Display::fmt(self.syntax(), f)3027	}3028}3029impl std::fmt::Display for BindFunction {3030	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3031		std::fmt::Display::fmt(self.syntax(), f)3032	}3033}3034impl std::fmt::Display for Param {3035	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3036		std::fmt::Display::fmt(self.syntax(), f)3037	}3038}3039impl std::fmt::Display for DestructFull {3040	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3041		std::fmt::Display::fmt(self.syntax(), f)3042	}3043}3044impl std::fmt::Display for DestructSkip {3045	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3046		std::fmt::Display::fmt(self.syntax(), f)3047	}3048}3049impl std::fmt::Display for DestructArray {3050	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3051		std::fmt::Display::fmt(self.syntax(), f)3052	}3053}3054impl std::fmt::Display for DestructObject {3055	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3056		std::fmt::Display::fmt(self.syntax(), f)3057	}3058}3059impl std::fmt::Display for DestructObjectField {3060	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3061		std::fmt::Display::fmt(self.syntax(), f)3062	}3063}3064impl std::fmt::Display for DestructRest {3065	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3066		std::fmt::Display::fmt(self.syntax(), f)3067	}3068}3069impl std::fmt::Display for DestructArrayElement {3070	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3071		std::fmt::Display::fmt(self.syntax(), f)3072	}3073}
after · crates/jrsonnet-rowan-parser/src/generated/nodes.rs
1//! This is a generated file, please do not edit manually. Changes can be2//! made in codegeneration that lives in `xtask` top-level dir.34#![allow(non_snake_case, clippy::match_like_matches_macro)]5use crate::{6	SyntaxKind::{self, *},7	SyntaxNode, SyntaxToken, T,8	ast::{AstChildren, AstNode, AstToken, support},9};1011#[derive(Debug, Clone, PartialEq, Eq, Hash)]12pub struct SourceFile {13	pub(crate) syntax: SyntaxNode,14}15impl SourceFile {16	pub fn expr(&self) -> Option<Expr> {17		support::children(&self.syntax).next()18	}19}2021#[derive(Debug, Clone, PartialEq, Eq, Hash)]22pub struct Expr {23	pub(crate) syntax: SyntaxNode,24}25impl Expr {26	pub fn stmts(&self) -> AstChildren<Stmt> {27		support::children(&self.syntax)28	}29	pub fn expr_base(&self) -> Option<ExprBase> {30		support::children(&self.syntax).next()31	}32	pub fn suffixs(&self) -> AstChildren<Suffix> {33		support::children(&self.syntax)34	}35}3637#[derive(Debug, Clone, PartialEq, Eq, Hash)]38pub struct SuffixIndex {39	pub(crate) syntax: SyntaxNode,40}41impl SuffixIndex {42	pub fn question_mark_token(&self) -> Option<SyntaxToken> {43		support::token(&self.syntax, T![?])44	}45	pub fn dot_token(&self) -> Option<SyntaxToken> {46		support::token(&self.syntax, T![.])47	}48	pub fn index(&self) -> Option<Name> {49		support::children(&self.syntax).next()50	}51}5253#[derive(Debug, Clone, PartialEq, Eq, Hash)]54pub struct Name {55	pub(crate) syntax: SyntaxNode,56}57impl Name {58	pub fn ident_lit(&self) -> Option<SyntaxToken> {59		support::token(&self.syntax, IDENT)60	}61}6263#[derive(Debug, Clone, PartialEq, Eq, Hash)]64pub struct SuffixIndexExpr {65	pub(crate) syntax: SyntaxNode,66}67impl SuffixIndexExpr {68	pub fn question_mark_token(&self) -> Option<SyntaxToken> {69		support::token(&self.syntax, T![?])70	}71	pub fn dot_token(&self) -> Option<SyntaxToken> {72		support::token(&self.syntax, T![.])73	}74	pub fn l_brack_token(&self) -> Option<SyntaxToken> {75		support::token(&self.syntax, T!['['])76	}77	pub fn index(&self) -> Option<Expr> {78		support::children(&self.syntax).next()79	}80	pub fn r_brack_token(&self) -> Option<SyntaxToken> {81		support::token(&self.syntax, T![']'])82	}83}8485#[derive(Debug, Clone, PartialEq, Eq, Hash)]86pub struct SuffixSlice {87	pub(crate) syntax: SyntaxNode,88}89impl SuffixSlice {90	pub fn slice_desc(&self) -> Option<SliceDesc> {91		support::children(&self.syntax).next()92	}93}9495#[derive(Debug, Clone, PartialEq, Eq, Hash)]96pub struct SliceDesc {97	pub(crate) syntax: SyntaxNode,98}99impl SliceDesc {100	pub fn l_brack_token(&self) -> Option<SyntaxToken> {101		support::token(&self.syntax, T!['['])102	}103	pub fn from(&self) -> Option<Expr> {104		support::children(&self.syntax).next()105	}106	pub fn colon_token(&self) -> Option<SyntaxToken> {107		support::token(&self.syntax, T![:])108	}109	pub fn end(&self) -> Option<SliceDescEnd> {110		support::children(&self.syntax).next()111	}112	pub fn step(&self) -> Option<SliceDescStep> {113		support::children(&self.syntax).next()114	}115	pub fn r_brack_token(&self) -> Option<SyntaxToken> {116		support::token(&self.syntax, T![']'])117	}118}119120#[derive(Debug, Clone, PartialEq, Eq, Hash)]121pub struct SuffixApply {122	pub(crate) syntax: SyntaxNode,123}124impl SuffixApply {125	pub fn args_desc(&self) -> Option<ArgsDesc> {126		support::children(&self.syntax).next()127	}128	pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {129		support::token(&self.syntax, T![tailstrict])130	}131}132133#[derive(Debug, Clone, PartialEq, Eq, Hash)]134pub struct ArgsDesc {135	pub(crate) syntax: SyntaxNode,136}137impl ArgsDesc {138	pub fn l_paren_token(&self) -> Option<SyntaxToken> {139		support::token(&self.syntax, T!['('])140	}141	pub fn args(&self) -> AstChildren<Arg> {142		support::children(&self.syntax)143	}144	pub fn r_paren_token(&self) -> Option<SyntaxToken> {145		support::token(&self.syntax, T![')'])146	}147}148149#[derive(Debug, Clone, PartialEq, Eq, Hash)]150pub struct StmtLocal {151	pub(crate) syntax: SyntaxNode,152}153impl StmtLocal {154	pub fn local_kw_token(&self) -> Option<SyntaxToken> {155		support::token(&self.syntax, T![local])156	}157	pub fn binds(&self) -> AstChildren<Bind> {158		support::children(&self.syntax)159	}160	pub fn semi_token(&self) -> Option<SyntaxToken> {161		support::token(&self.syntax, T![;])162	}163}164165#[derive(Debug, Clone, PartialEq, Eq, Hash)]166pub struct StmtAssert {167	pub(crate) syntax: SyntaxNode,168}169impl StmtAssert {170	pub fn assertion(&self) -> Option<Assertion> {171		support::children(&self.syntax).next()172	}173	pub fn semi_token(&self) -> Option<SyntaxToken> {174		support::token(&self.syntax, T![;])175	}176}177178#[derive(Debug, Clone, PartialEq, Eq, Hash)]179pub struct Assertion {180	pub(crate) syntax: SyntaxNode,181}182impl Assertion {183	pub fn assert_kw_token(&self) -> Option<SyntaxToken> {184		support::token(&self.syntax, T![assert])185	}186	pub fn condition(&self) -> Option<Expr> {187		support::children(&self.syntax).next()188	}189	pub fn colon_token(&self) -> Option<SyntaxToken> {190		support::token(&self.syntax, T![:])191	}192	pub fn message(&self) -> Option<Expr> {193		support::children(&self.syntax).nth(1usize)194	}195}196197#[derive(Debug, Clone, PartialEq, Eq, Hash)]198pub struct ExprBinary {199	pub(crate) syntax: SyntaxNode,200}201impl ExprBinary {202	pub fn lhs(&self) -> Option<Expr> {203		support::children(&self.syntax).next()204	}205	pub fn binary_operator(&self) -> Option<BinaryOperator> {206		support::token_child(&self.syntax)207	}208	pub fn rhs(&self) -> Option<Expr> {209		support::children(&self.syntax).nth(1usize)210	}211}212213#[derive(Debug, Clone, PartialEq, Eq, Hash)]214pub struct ExprUnary {215	pub(crate) syntax: SyntaxNode,216}217impl ExprUnary {218	pub fn unary_operator(&self) -> Option<UnaryOperator> {219		support::token_child(&self.syntax)220	}221	pub fn rhs(&self) -> Option<Expr> {222		support::children(&self.syntax).next()223	}224}225226#[derive(Debug, Clone, PartialEq, Eq, Hash)]227pub struct ExprObjExtend {228	pub(crate) syntax: SyntaxNode,229}230impl ExprObjExtend {231	pub fn lhs(&self) -> Option<Expr> {232		support::children(&self.syntax).next()233	}234	pub fn rhs(&self) -> Option<Expr> {235		support::children(&self.syntax).nth(1usize)236	}237}238239#[derive(Debug, Clone, PartialEq, Eq, Hash)]240pub struct ExprParened {241	pub(crate) syntax: SyntaxNode,242}243impl ExprParened {244	pub fn l_paren_token(&self) -> Option<SyntaxToken> {245		support::token(&self.syntax, T!['('])246	}247	pub fn expr(&self) -> Option<Expr> {248		support::children(&self.syntax).next()249	}250	pub fn r_paren_token(&self) -> Option<SyntaxToken> {251		support::token(&self.syntax, T![')'])252	}253}254255#[derive(Debug, Clone, PartialEq, Eq, Hash)]256pub struct ExprLiteral {257	pub(crate) syntax: SyntaxNode,258}259impl ExprLiteral {260	pub fn literal(&self) -> Option<Literal> {261		support::token_child(&self.syntax)262	}263}264265#[derive(Debug, Clone, PartialEq, Eq, Hash)]266pub struct ExprString {267	pub(crate) syntax: SyntaxNode,268}269impl ExprString {270	pub fn text(&self) -> Option<Text> {271		support::token_child(&self.syntax)272	}273}274275#[derive(Debug, Clone, PartialEq, Eq, Hash)]276pub struct ExprNumber {277	pub(crate) syntax: SyntaxNode,278}279impl ExprNumber {280	pub fn number(&self) -> Option<Number> {281		support::token_child(&self.syntax)282	}283}284285#[derive(Debug, Clone, PartialEq, Eq, Hash)]286pub struct ExprArray {287	pub(crate) syntax: SyntaxNode,288}289impl ExprArray {290	pub fn l_brack_token(&self) -> Option<SyntaxToken> {291		support::token(&self.syntax, T!['['])292	}293	pub fn exprs(&self) -> AstChildren<Expr> {294		support::children(&self.syntax)295	}296	pub fn r_brack_token(&self) -> Option<SyntaxToken> {297		support::token(&self.syntax, T![']'])298	}299}300301#[derive(Debug, Clone, PartialEq, Eq, Hash)]302pub struct ExprObject {303	pub(crate) syntax: SyntaxNode,304}305impl ExprObject {306	pub fn obj_body(&self) -> Option<ObjBody> {307		support::children(&self.syntax).next()308	}309}310311#[derive(Debug, Clone, PartialEq, Eq, Hash)]312pub struct ExprArrayComp {313	pub(crate) syntax: SyntaxNode,314}315impl ExprArrayComp {316	pub fn l_brack_token(&self) -> Option<SyntaxToken> {317		support::token(&self.syntax, T!['['])318	}319	pub fn expr(&self) -> Option<Expr> {320		support::children(&self.syntax).next()321	}322	pub fn comma_token(&self) -> Option<SyntaxToken> {323		support::token(&self.syntax, T![,])324	}325	pub fn comp_specs(&self) -> AstChildren<CompSpec> {326		support::children(&self.syntax)327	}328	pub fn r_brack_token(&self) -> Option<SyntaxToken> {329		support::token(&self.syntax, T![']'])330	}331}332333#[derive(Debug, Clone, PartialEq, Eq, Hash)]334pub struct ExprImport {335	pub(crate) syntax: SyntaxNode,336}337impl ExprImport {338	pub fn import_kind(&self) -> Option<ImportKind> {339		support::token_child(&self.syntax)340	}341	pub fn text(&self) -> Option<Text> {342		support::token_child(&self.syntax)343	}344}345346#[derive(Debug, Clone, PartialEq, Eq, Hash)]347pub struct ExprVar {348	pub(crate) syntax: SyntaxNode,349}350impl ExprVar {351	pub fn name(&self) -> Option<Name> {352		support::children(&self.syntax).next()353	}354}355356#[derive(Debug, Clone, PartialEq, Eq, Hash)]357pub struct ExprIfThenElse {358	pub(crate) syntax: SyntaxNode,359}360impl ExprIfThenElse {361	pub fn if_kw_token(&self) -> Option<SyntaxToken> {362		support::token(&self.syntax, T![if])363	}364	pub fn cond(&self) -> Option<Expr> {365		support::children(&self.syntax).next()366	}367	pub fn then_kw_token(&self) -> Option<SyntaxToken> {368		support::token(&self.syntax, T![then])369	}370	pub fn then(&self) -> Option<TrueExpr> {371		support::children(&self.syntax).next()372	}373	pub fn else_kw_token(&self) -> Option<SyntaxToken> {374		support::token(&self.syntax, T![else])375	}376	pub fn else_(&self) -> Option<FalseExpr> {377		support::children(&self.syntax).next()378	}379}380381#[derive(Debug, Clone, PartialEq, Eq, Hash)]382pub struct TrueExpr {383	pub(crate) syntax: SyntaxNode,384}385impl TrueExpr {386	pub fn expr(&self) -> Option<Expr> {387		support::children(&self.syntax).next()388	}389}390391#[derive(Debug, Clone, PartialEq, Eq, Hash)]392pub struct FalseExpr {393	pub(crate) syntax: SyntaxNode,394}395impl FalseExpr {396	pub fn expr(&self) -> Option<Expr> {397		support::children(&self.syntax).next()398	}399}400401#[derive(Debug, Clone, PartialEq, Eq, Hash)]402pub struct ExprFunction {403	pub(crate) syntax: SyntaxNode,404}405impl ExprFunction {406	pub fn function_kw_token(&self) -> Option<SyntaxToken> {407		support::token(&self.syntax, T![function])408	}409	pub fn l_paren_token(&self) -> Option<SyntaxToken> {410		support::token(&self.syntax, T!['('])411	}412	pub fn params_desc(&self) -> Option<ParamsDesc> {413		support::children(&self.syntax).next()414	}415	pub fn r_paren_token(&self) -> Option<SyntaxToken> {416		support::token(&self.syntax, T![')'])417	}418	pub fn expr(&self) -> Option<Expr> {419		support::children(&self.syntax).next()420	}421}422423#[derive(Debug, Clone, PartialEq, Eq, Hash)]424pub struct ParamsDesc {425	pub(crate) syntax: SyntaxNode,426}427impl ParamsDesc {428	pub fn l_paren_token(&self) -> Option<SyntaxToken> {429		support::token(&self.syntax, T!['('])430	}431	pub fn params(&self) -> AstChildren<Param> {432		support::children(&self.syntax)433	}434	pub fn r_paren_token(&self) -> Option<SyntaxToken> {435		support::token(&self.syntax, T![')'])436	}437}438439#[derive(Debug, Clone, PartialEq, Eq, Hash)]440pub struct ExprError {441	pub(crate) syntax: SyntaxNode,442}443impl ExprError {444	pub fn error_kw_token(&self) -> Option<SyntaxToken> {445		support::token(&self.syntax, T![error])446	}447	pub fn expr(&self) -> Option<Expr> {448		support::children(&self.syntax).next()449	}450}451452#[derive(Debug, Clone, PartialEq, Eq, Hash)]453pub struct SliceDescEnd {454	pub(crate) syntax: SyntaxNode,455}456impl SliceDescEnd {457	pub fn expr(&self) -> Option<Expr> {458		support::children(&self.syntax).next()459	}460}461462#[derive(Debug, Clone, PartialEq, Eq, Hash)]463pub struct SliceDescStep {464	pub(crate) syntax: SyntaxNode,465}466impl SliceDescStep {467	pub fn expr(&self) -> Option<Expr> {468		support::children(&self.syntax).next()469	}470}471472#[derive(Debug, Clone, PartialEq, Eq, Hash)]473pub struct Arg {474	pub(crate) syntax: SyntaxNode,475}476impl Arg {477	pub fn name(&self) -> Option<Name> {478		support::children(&self.syntax).next()479	}480	pub fn assign_token(&self) -> Option<SyntaxToken> {481		support::token(&self.syntax, T![=])482	}483	pub fn expr(&self) -> Option<Expr> {484		support::children(&self.syntax).next()485	}486}487488#[derive(Debug, Clone, PartialEq, Eq, Hash)]489pub struct ObjBodyComp {490	pub(crate) syntax: SyntaxNode,491}492impl ObjBodyComp {493	pub fn l_brace_token(&self) -> Option<SyntaxToken> {494		support::token(&self.syntax, T!['{'])495	}496	pub fn member_comps(&self) -> AstChildren<MemberComp> {497		support::children(&self.syntax)498	}499	pub fn comp_specs(&self) -> AstChildren<CompSpec> {500		support::children(&self.syntax)501	}502	pub fn r_brace_token(&self) -> Option<SyntaxToken> {503		support::token(&self.syntax, T!['}'])504	}505}506507#[derive(Debug, Clone, PartialEq, Eq, Hash)]508pub struct ObjBodyMemberList {509	pub(crate) syntax: SyntaxNode,510}511impl ObjBodyMemberList {512	pub fn l_brace_token(&self) -> Option<SyntaxToken> {513		support::token(&self.syntax, T!['{'])514	}515	pub fn members(&self) -> AstChildren<Member> {516		support::children(&self.syntax)517	}518	pub fn r_brace_token(&self) -> Option<SyntaxToken> {519		support::token(&self.syntax, T!['}'])520	}521}522523#[derive(Debug, Clone, PartialEq, Eq, Hash)]524pub struct MemberBindStmt {525	pub(crate) syntax: SyntaxNode,526}527impl MemberBindStmt {528	pub fn obj_local(&self) -> Option<ObjLocal> {529		support::children(&self.syntax).next()530	}531}532533#[derive(Debug, Clone, PartialEq, Eq, Hash)]534pub struct ObjLocal {535	pub(crate) syntax: SyntaxNode,536}537impl ObjLocal {538	pub fn local_kw_token(&self) -> Option<SyntaxToken> {539		support::token(&self.syntax, T![local])540	}541	pub fn bind(&self) -> Option<Bind> {542		support::children(&self.syntax).next()543	}544}545546#[derive(Debug, Clone, PartialEq, Eq, Hash)]547pub struct MemberAssertStmt {548	pub(crate) syntax: SyntaxNode,549}550impl MemberAssertStmt {551	pub fn assertion(&self) -> Option<Assertion> {552		support::children(&self.syntax).next()553	}554}555556#[derive(Debug, Clone, PartialEq, Eq, Hash)]557pub struct MemberFieldNormal {558	pub(crate) syntax: SyntaxNode,559}560impl MemberFieldNormal {561	pub fn field_name(&self) -> Option<FieldName> {562		support::children(&self.syntax).next()563	}564	pub fn plus_token(&self) -> Option<SyntaxToken> {565		support::token(&self.syntax, T![+])566	}567	pub fn visibility(&self) -> Option<Visibility> {568		support::children(&self.syntax).next()569	}570	pub fn expr(&self) -> Option<Expr> {571		support::children(&self.syntax).next()572	}573}574575#[derive(Debug, Clone, PartialEq, Eq, Hash)]576pub struct Visibility {577	pub(crate) syntax: SyntaxNode,578}579impl Visibility {580	pub fn colon_token(&self) -> Option<SyntaxToken> {581		support::token(&self.syntax, T![:])582	}583}584585#[derive(Debug, Clone, PartialEq, Eq, Hash)]586pub struct MemberFieldMethod {587	pub(crate) syntax: SyntaxNode,588}589impl MemberFieldMethod {590	pub fn field_name(&self) -> Option<FieldName> {591		support::children(&self.syntax).next()592	}593	pub fn params_desc(&self) -> Option<ParamsDesc> {594		support::children(&self.syntax).next()595	}596	pub fn visibility(&self) -> Option<Visibility> {597		support::children(&self.syntax).next()598	}599	pub fn expr(&self) -> Option<Expr> {600		support::children(&self.syntax).next()601	}602}603604#[derive(Debug, Clone, PartialEq, Eq, Hash)]605pub struct FieldNameFixed {606	pub(crate) syntax: SyntaxNode,607}608impl FieldNameFixed {609	pub fn id(&self) -> Option<Name> {610		support::children(&self.syntax).next()611	}612	pub fn text(&self) -> Option<Text> {613		support::token_child(&self.syntax)614	}615}616617#[derive(Debug, Clone, PartialEq, Eq, Hash)]618pub struct FieldNameDynamic {619	pub(crate) syntax: SyntaxNode,620}621impl FieldNameDynamic {622	pub fn l_brack_token(&self) -> Option<SyntaxToken> {623		support::token(&self.syntax, T!['['])624	}625	pub fn expr(&self) -> Option<Expr> {626		support::children(&self.syntax).next()627	}628	pub fn r_brack_token(&self) -> Option<SyntaxToken> {629		support::token(&self.syntax, T![']'])630	}631}632633#[derive(Debug, Clone, PartialEq, Eq, Hash)]634pub struct ForSpec {635	pub(crate) syntax: SyntaxNode,636}637impl ForSpec {638	pub fn for_kw_token(&self) -> Option<SyntaxToken> {639		support::token(&self.syntax, T![for])640	}641	pub fn bind(&self) -> Option<Destruct> {642		support::children(&self.syntax).next()643	}644	pub fn in_kw_token(&self) -> Option<SyntaxToken> {645		support::token(&self.syntax, T![in])646	}647	pub fn expr(&self) -> Option<Expr> {648		support::children(&self.syntax).next()649	}650}651652#[derive(Debug, Clone, PartialEq, Eq, Hash)]653pub struct IfSpec {654	pub(crate) syntax: SyntaxNode,655}656impl IfSpec {657	pub fn if_kw_token(&self) -> Option<SyntaxToken> {658		support::token(&self.syntax, T![if])659	}660	pub fn expr(&self) -> Option<Expr> {661		support::children(&self.syntax).next()662	}663}664665#[derive(Debug, Clone, PartialEq, Eq, Hash)]666pub struct BindDestruct {667	pub(crate) syntax: SyntaxNode,668}669impl BindDestruct {670	pub fn into(&self) -> Option<Destruct> {671		support::children(&self.syntax).next()672	}673	pub fn assign_token(&self) -> Option<SyntaxToken> {674		support::token(&self.syntax, T![=])675	}676	pub fn value(&self) -> Option<Expr> {677		support::children(&self.syntax).next()678	}679}680681#[derive(Debug, Clone, PartialEq, Eq, Hash)]682pub struct BindFunction {683	pub(crate) syntax: SyntaxNode,684}685impl BindFunction {686	pub fn name(&self) -> Option<Name> {687		support::children(&self.syntax).next()688	}689	pub fn params(&self) -> Option<ParamsDesc> {690		support::children(&self.syntax).next()691	}692	pub fn assign_token(&self) -> Option<SyntaxToken> {693		support::token(&self.syntax, T![=])694	}695	pub fn value(&self) -> Option<Expr> {696		support::children(&self.syntax).next()697	}698}699700#[derive(Debug, Clone, PartialEq, Eq, Hash)]701pub struct Param {702	pub(crate) syntax: SyntaxNode,703}704impl Param {705	pub fn destruct(&self) -> Option<Destruct> {706		support::children(&self.syntax).next()707	}708	pub fn assign_token(&self) -> Option<SyntaxToken> {709		support::token(&self.syntax, T![=])710	}711	pub fn expr(&self) -> Option<Expr> {712		support::children(&self.syntax).next()713	}714}715716#[derive(Debug, Clone, PartialEq, Eq, Hash)]717pub struct DestructFull {718	pub(crate) syntax: SyntaxNode,719}720impl DestructFull {721	pub fn name(&self) -> Option<Name> {722		support::children(&self.syntax).next()723	}724}725726#[derive(Debug, Clone, PartialEq, Eq, Hash)]727pub struct DestructSkip {728	pub(crate) syntax: SyntaxNode,729}730impl DestructSkip {731	pub fn question_mark_token(&self) -> Option<SyntaxToken> {732		support::token(&self.syntax, T![?])733	}734}735736#[derive(Debug, Clone, PartialEq, Eq, Hash)]737pub struct DestructArray {738	pub(crate) syntax: SyntaxNode,739}740impl DestructArray {741	pub fn l_brack_token(&self) -> Option<SyntaxToken> {742		support::token(&self.syntax, T!['['])743	}744	pub fn destruct_array_parts(&self) -> AstChildren<DestructArrayPart> {745		support::children(&self.syntax)746	}747	pub fn r_brack_token(&self) -> Option<SyntaxToken> {748		support::token(&self.syntax, T![']'])749	}750}751752#[derive(Debug, Clone, PartialEq, Eq, Hash)]753pub struct DestructObject {754	pub(crate) syntax: SyntaxNode,755}756impl DestructObject {757	pub fn l_brace_token(&self) -> Option<SyntaxToken> {758		support::token(&self.syntax, T!['{'])759	}760	pub fn destruct_object_fields(&self) -> AstChildren<DestructObjectField> {761		support::children(&self.syntax)762	}763	pub fn destruct_rest(&self) -> Option<DestructRest> {764		support::children(&self.syntax).next()765	}766	pub fn comma_token(&self) -> Option<SyntaxToken> {767		support::token(&self.syntax, T![,])768	}769	pub fn r_brace_token(&self) -> Option<SyntaxToken> {770		support::token(&self.syntax, T!['}'])771	}772}773774#[derive(Debug, Clone, PartialEq, Eq, Hash)]775pub struct DestructObjectField {776	pub(crate) syntax: SyntaxNode,777}778impl DestructObjectField {779	pub fn field(&self) -> Option<Name> {780		support::children(&self.syntax).next()781	}782	pub fn colon_token(&self) -> Option<SyntaxToken> {783		support::token(&self.syntax, T![:])784	}785	pub fn destruct(&self) -> Option<Destruct> {786		support::children(&self.syntax).next()787	}788	pub fn assign_token(&self) -> Option<SyntaxToken> {789		support::token(&self.syntax, T![=])790	}791	pub fn expr(&self) -> Option<Expr> {792		support::children(&self.syntax).next()793	}794}795796#[derive(Debug, Clone, PartialEq, Eq, Hash)]797pub struct DestructRest {798	pub(crate) syntax: SyntaxNode,799}800impl DestructRest {801	pub fn dotdotdot_token(&self) -> Option<SyntaxToken> {802		support::token(&self.syntax, T![...])803	}804	pub fn into(&self) -> Option<Name> {805		support::children(&self.syntax).next()806	}807}808809#[derive(Debug, Clone, PartialEq, Eq, Hash)]810pub struct DestructArrayElement {811	pub(crate) syntax: SyntaxNode,812}813impl DestructArrayElement {814	pub fn destruct(&self) -> Option<Destruct> {815		support::children(&self.syntax).next()816	}817}818819#[derive(Debug, Clone, PartialEq, Eq, Hash)]820pub enum Suffix {821	SuffixIndex(SuffixIndex),822	SuffixIndexExpr(SuffixIndexExpr),823	SuffixSlice(SuffixSlice),824	SuffixApply(SuffixApply),825}826827#[derive(Debug, Clone, PartialEq, Eq, Hash)]828pub enum Bind {829	BindDestruct(BindDestruct),830	BindFunction(BindFunction),831}832833#[derive(Debug, Clone, PartialEq, Eq, Hash)]834pub enum Stmt {835	StmtLocal(StmtLocal),836	StmtAssert(StmtAssert),837}838839#[derive(Debug, Clone, PartialEq, Eq, Hash)]840pub enum ObjBody {841	ObjBodyComp(ObjBodyComp),842	ObjBodyMemberList(ObjBodyMemberList),843}844845#[derive(Debug, Clone, PartialEq, Eq, Hash)]846pub enum CompSpec {847	ForSpec(ForSpec),848	IfSpec(IfSpec),849}850851#[derive(Debug, Clone, PartialEq, Eq, Hash)]852pub enum ExprBase {853	ExprBinary(ExprBinary),854	ExprUnary(ExprUnary),855	ExprObjExtend(ExprObjExtend),856	ExprParened(ExprParened),857	ExprString(ExprString),858	ExprNumber(ExprNumber),859	ExprLiteral(ExprLiteral),860	ExprArray(ExprArray),861	ExprObject(ExprObject),862	ExprArrayComp(ExprArrayComp),863	ExprImport(ExprImport),864	ExprVar(ExprVar),865	ExprIfThenElse(ExprIfThenElse),866	ExprFunction(ExprFunction),867	ExprError(ExprError),868}869870#[derive(Debug, Clone, PartialEq, Eq, Hash)]871pub enum MemberComp {872	MemberBindStmt(MemberBindStmt),873	MemberFieldNormal(MemberFieldNormal),874	MemberFieldMethod(MemberFieldMethod),875}876877#[derive(Debug, Clone, PartialEq, Eq, Hash)]878pub enum Member {879	MemberBindStmt(MemberBindStmt),880	MemberAssertStmt(MemberAssertStmt),881	MemberFieldNormal(MemberFieldNormal),882	MemberFieldMethod(MemberFieldMethod),883}884885#[derive(Debug, Clone, PartialEq, Eq, Hash)]886pub enum FieldName {887	FieldNameFixed(FieldNameFixed),888	FieldNameDynamic(FieldNameDynamic),889}890891#[derive(Debug, Clone, PartialEq, Eq, Hash)]892pub enum Destruct {893	DestructFull(DestructFull),894	DestructSkip(DestructSkip),895	DestructArray(DestructArray),896	DestructObject(DestructObject),897}898899#[derive(Debug, Clone, PartialEq, Eq, Hash)]900pub enum DestructArrayPart {901	DestructArrayElement(DestructArrayElement),902	DestructRest(DestructRest),903}904905#[derive(Debug, Clone, PartialEq, Eq, Hash)]906pub struct BinaryOperator {907	syntax: SyntaxToken,908	kind: BinaryOperatorKind,909}910911#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]912pub enum BinaryOperatorKind {913	Or,914	NullCoaelse,915	And,916	BitOr,917	BitXor,918	BitAnd,919	Eq,920	Ne,921	Lt,922	Gt,923	Le,924	Ge,925	InKw,926	Lhs,927	Rhs,928	Plus,929	Minus,930	Mul,931	Div,932	Modulo,933	MetaObjectApply,934	ErrorNoOperator,935}936937#[derive(Debug, Clone, PartialEq, Eq, Hash)]938pub struct UnaryOperator {939	syntax: SyntaxToken,940	kind: UnaryOperatorKind,941}942943#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]944pub enum UnaryOperatorKind {945	Minus,946	Not,947	BitNot,948}949950#[derive(Debug, Clone, PartialEq, Eq, Hash)]951pub struct Literal {952	syntax: SyntaxToken,953	kind: LiteralKind,954}955956#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]957pub enum LiteralKind {958	NullKw,959	TrueKw,960	FalseKw,961	SelfKw,962	Dollar,963	SuperKw,964}965966#[derive(Debug, Clone, PartialEq, Eq, Hash)]967pub struct Text {968	syntax: SyntaxToken,969	kind: TextKind,970}971972#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]973pub enum TextKind {974	StringDouble,975	ErrorStringDoubleUnterminated,976	StringSingle,977	ErrorStringSingleUnterminated,978	StringDoubleVerbatim,979	ErrorStringDoubleVerbatimUnterminated,980	StringSingleVerbatim,981	ErrorStringSingleVerbatimUnterminated,982	ErrorStringVerbatimMissingQuotes,983	StringBlock,984	ErrorStringBlockUnexpectedEnd,985	ErrorStringBlockMissingNewLine,986	ErrorStringBlockMissingTermination,987	ErrorStringBlockMissingIndent,988}989990#[derive(Debug, Clone, PartialEq, Eq, Hash)]991pub struct Number {992	syntax: SyntaxToken,993	kind: NumberKind,994}995996#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]997pub enum NumberKind {998	Float,999	ErrorFloatJunkAfterPoint,1000	ErrorFloatJunkAfterExponent,1001	ErrorFloatJunkAfterExponentSign,1002}10031004#[derive(Debug, Clone, PartialEq, Eq, Hash)]1005pub struct ImportKind {1006	syntax: SyntaxToken,1007	kind: ImportKindKind,1008}10091010#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1011pub enum ImportKindKind {1012	ImportstrKw,1013	ImportbinKw,1014	ImportKw,1015}10161017#[derive(Debug, Clone, PartialEq, Eq, Hash)]1018pub struct Trivia {1019	syntax: SyntaxToken,1020	kind: TriviaKind,1021}10221023#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1024pub enum TriviaKind {1025	Whitespace,1026	MultiLineComment,1027	ErrorCommentTooShort,1028	ErrorCommentUnterminated,1029	SingleLineHashComment,1030	SingleLineSlashComment,1031}10321033#[derive(Debug, Clone, PartialEq, Eq, Hash)]1034pub struct CustomError {1035	syntax: SyntaxToken,1036	kind: CustomErrorKind,1037}10381039#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1040pub enum CustomErrorKind {1041	ErrorMissingToken,1042	ErrorUnexpectedToken,1043	ErrorCustom,1044}1045impl AstNode for SourceFile {1046	fn can_cast(kind: SyntaxKind) -> bool {1047		kind == SOURCE_FILE1048	}1049	fn cast(syntax: SyntaxNode) -> Option<Self> {1050		if Self::can_cast(syntax.kind()) {1051			Some(Self { syntax })1052		} else {1053			None1054		}1055	}1056	fn syntax(&self) -> &SyntaxNode {1057		&self.syntax1058	}1059}1060impl AstNode for Expr {1061	fn can_cast(kind: SyntaxKind) -> bool {1062		kind == EXPR1063	}1064	fn cast(syntax: SyntaxNode) -> Option<Self> {1065		if Self::can_cast(syntax.kind()) {1066			Some(Self { syntax })1067		} else {1068			None1069		}1070	}1071	fn syntax(&self) -> &SyntaxNode {1072		&self.syntax1073	}1074}1075impl AstNode for SuffixIndex {1076	fn can_cast(kind: SyntaxKind) -> bool {1077		kind == SUFFIX_INDEX1078	}1079	fn cast(syntax: SyntaxNode) -> Option<Self> {1080		if Self::can_cast(syntax.kind()) {1081			Some(Self { syntax })1082		} else {1083			None1084		}1085	}1086	fn syntax(&self) -> &SyntaxNode {1087		&self.syntax1088	}1089}1090impl AstNode for Name {1091	fn can_cast(kind: SyntaxKind) -> bool {1092		kind == NAME1093	}1094	fn cast(syntax: SyntaxNode) -> Option<Self> {1095		if Self::can_cast(syntax.kind()) {1096			Some(Self { syntax })1097		} else {1098			None1099		}1100	}1101	fn syntax(&self) -> &SyntaxNode {1102		&self.syntax1103	}1104}1105impl AstNode for SuffixIndexExpr {1106	fn can_cast(kind: SyntaxKind) -> bool {1107		kind == SUFFIX_INDEX_EXPR1108	}1109	fn cast(syntax: SyntaxNode) -> Option<Self> {1110		if Self::can_cast(syntax.kind()) {1111			Some(Self { syntax })1112		} else {1113			None1114		}1115	}1116	fn syntax(&self) -> &SyntaxNode {1117		&self.syntax1118	}1119}1120impl AstNode for SuffixSlice {1121	fn can_cast(kind: SyntaxKind) -> bool {1122		kind == SUFFIX_SLICE1123	}1124	fn cast(syntax: SyntaxNode) -> Option<Self> {1125		if Self::can_cast(syntax.kind()) {1126			Some(Self { syntax })1127		} else {1128			None1129		}1130	}1131	fn syntax(&self) -> &SyntaxNode {1132		&self.syntax1133	}1134}1135impl AstNode for SliceDesc {1136	fn can_cast(kind: SyntaxKind) -> bool {1137		kind == SLICE_DESC1138	}1139	fn cast(syntax: SyntaxNode) -> Option<Self> {1140		if Self::can_cast(syntax.kind()) {1141			Some(Self { syntax })1142		} else {1143			None1144		}1145	}1146	fn syntax(&self) -> &SyntaxNode {1147		&self.syntax1148	}1149}1150impl AstNode for SuffixApply {1151	fn can_cast(kind: SyntaxKind) -> bool {1152		kind == SUFFIX_APPLY1153	}1154	fn cast(syntax: SyntaxNode) -> Option<Self> {1155		if Self::can_cast(syntax.kind()) {1156			Some(Self { syntax })1157		} else {1158			None1159		}1160	}1161	fn syntax(&self) -> &SyntaxNode {1162		&self.syntax1163	}1164}1165impl AstNode for ArgsDesc {1166	fn can_cast(kind: SyntaxKind) -> bool {1167		kind == ARGS_DESC1168	}1169	fn cast(syntax: SyntaxNode) -> Option<Self> {1170		if Self::can_cast(syntax.kind()) {1171			Some(Self { syntax })1172		} else {1173			None1174		}1175	}1176	fn syntax(&self) -> &SyntaxNode {1177		&self.syntax1178	}1179}1180impl AstNode for StmtLocal {1181	fn can_cast(kind: SyntaxKind) -> bool {1182		kind == STMT_LOCAL1183	}1184	fn cast(syntax: SyntaxNode) -> Option<Self> {1185		if Self::can_cast(syntax.kind()) {1186			Some(Self { syntax })1187		} else {1188			None1189		}1190	}1191	fn syntax(&self) -> &SyntaxNode {1192		&self.syntax1193	}1194}1195impl AstNode for StmtAssert {1196	fn can_cast(kind: SyntaxKind) -> bool {1197		kind == STMT_ASSERT1198	}1199	fn cast(syntax: SyntaxNode) -> Option<Self> {1200		if Self::can_cast(syntax.kind()) {1201			Some(Self { syntax })1202		} else {1203			None1204		}1205	}1206	fn syntax(&self) -> &SyntaxNode {1207		&self.syntax1208	}1209}1210impl AstNode for Assertion {1211	fn can_cast(kind: SyntaxKind) -> bool {1212		kind == ASSERTION1213	}1214	fn cast(syntax: SyntaxNode) -> Option<Self> {1215		if Self::can_cast(syntax.kind()) {1216			Some(Self { syntax })1217		} else {1218			None1219		}1220	}1221	fn syntax(&self) -> &SyntaxNode {1222		&self.syntax1223	}1224}1225impl AstNode for ExprBinary {1226	fn can_cast(kind: SyntaxKind) -> bool {1227		kind == EXPR_BINARY1228	}1229	fn cast(syntax: SyntaxNode) -> Option<Self> {1230		if Self::can_cast(syntax.kind()) {1231			Some(Self { syntax })1232		} else {1233			None1234		}1235	}1236	fn syntax(&self) -> &SyntaxNode {1237		&self.syntax1238	}1239}1240impl AstNode for ExprUnary {1241	fn can_cast(kind: SyntaxKind) -> bool {1242		kind == EXPR_UNARY1243	}1244	fn cast(syntax: SyntaxNode) -> Option<Self> {1245		if Self::can_cast(syntax.kind()) {1246			Some(Self { syntax })1247		} else {1248			None1249		}1250	}1251	fn syntax(&self) -> &SyntaxNode {1252		&self.syntax1253	}1254}1255impl AstNode for ExprObjExtend {1256	fn can_cast(kind: SyntaxKind) -> bool {1257		kind == EXPR_OBJ_EXTEND1258	}1259	fn cast(syntax: SyntaxNode) -> Option<Self> {1260		if Self::can_cast(syntax.kind()) {1261			Some(Self { syntax })1262		} else {1263			None1264		}1265	}1266	fn syntax(&self) -> &SyntaxNode {1267		&self.syntax1268	}1269}1270impl AstNode for ExprParened {1271	fn can_cast(kind: SyntaxKind) -> bool {1272		kind == EXPR_PARENED1273	}1274	fn cast(syntax: SyntaxNode) -> Option<Self> {1275		if Self::can_cast(syntax.kind()) {1276			Some(Self { syntax })1277		} else {1278			None1279		}1280	}1281	fn syntax(&self) -> &SyntaxNode {1282		&self.syntax1283	}1284}1285impl AstNode for ExprLiteral {1286	fn can_cast(kind: SyntaxKind) -> bool {1287		kind == EXPR_LITERAL1288	}1289	fn cast(syntax: SyntaxNode) -> Option<Self> {1290		if Self::can_cast(syntax.kind()) {1291			Some(Self { syntax })1292		} else {1293			None1294		}1295	}1296	fn syntax(&self) -> &SyntaxNode {1297		&self.syntax1298	}1299}1300impl AstNode for ExprString {1301	fn can_cast(kind: SyntaxKind) -> bool {1302		kind == EXPR_STRING1303	}1304	fn cast(syntax: SyntaxNode) -> Option<Self> {1305		if Self::can_cast(syntax.kind()) {1306			Some(Self { syntax })1307		} else {1308			None1309		}1310	}1311	fn syntax(&self) -> &SyntaxNode {1312		&self.syntax1313	}1314}1315impl AstNode for ExprNumber {1316	fn can_cast(kind: SyntaxKind) -> bool {1317		kind == EXPR_NUMBER1318	}1319	fn cast(syntax: SyntaxNode) -> Option<Self> {1320		if Self::can_cast(syntax.kind()) {1321			Some(Self { syntax })1322		} else {1323			None1324		}1325	}1326	fn syntax(&self) -> &SyntaxNode {1327		&self.syntax1328	}1329}1330impl AstNode for ExprArray {1331	fn can_cast(kind: SyntaxKind) -> bool {1332		kind == EXPR_ARRAY1333	}1334	fn cast(syntax: SyntaxNode) -> Option<Self> {1335		if Self::can_cast(syntax.kind()) {1336			Some(Self { syntax })1337		} else {1338			None1339		}1340	}1341	fn syntax(&self) -> &SyntaxNode {1342		&self.syntax1343	}1344}1345impl AstNode for ExprObject {1346	fn can_cast(kind: SyntaxKind) -> bool {1347		kind == EXPR_OBJECT1348	}1349	fn cast(syntax: SyntaxNode) -> Option<Self> {1350		if Self::can_cast(syntax.kind()) {1351			Some(Self { syntax })1352		} else {1353			None1354		}1355	}1356	fn syntax(&self) -> &SyntaxNode {1357		&self.syntax1358	}1359}1360impl AstNode for ExprArrayComp {1361	fn can_cast(kind: SyntaxKind) -> bool {1362		kind == EXPR_ARRAY_COMP1363	}1364	fn cast(syntax: SyntaxNode) -> Option<Self> {1365		if Self::can_cast(syntax.kind()) {1366			Some(Self { syntax })1367		} else {1368			None1369		}1370	}1371	fn syntax(&self) -> &SyntaxNode {1372		&self.syntax1373	}1374}1375impl AstNode for ExprImport {1376	fn can_cast(kind: SyntaxKind) -> bool {1377		kind == EXPR_IMPORT1378	}1379	fn cast(syntax: SyntaxNode) -> Option<Self> {1380		if Self::can_cast(syntax.kind()) {1381			Some(Self { syntax })1382		} else {1383			None1384		}1385	}1386	fn syntax(&self) -> &SyntaxNode {1387		&self.syntax1388	}1389}1390impl AstNode for ExprVar {1391	fn can_cast(kind: SyntaxKind) -> bool {1392		kind == EXPR_VAR1393	}1394	fn cast(syntax: SyntaxNode) -> Option<Self> {1395		if Self::can_cast(syntax.kind()) {1396			Some(Self { syntax })1397		} else {1398			None1399		}1400	}1401	fn syntax(&self) -> &SyntaxNode {1402		&self.syntax1403	}1404}1405impl AstNode for ExprIfThenElse {1406	fn can_cast(kind: SyntaxKind) -> bool {1407		kind == EXPR_IF_THEN_ELSE1408	}1409	fn cast(syntax: SyntaxNode) -> Option<Self> {1410		if Self::can_cast(syntax.kind()) {1411			Some(Self { syntax })1412		} else {1413			None1414		}1415	}1416	fn syntax(&self) -> &SyntaxNode {1417		&self.syntax1418	}1419}1420impl AstNode for TrueExpr {1421	fn can_cast(kind: SyntaxKind) -> bool {1422		kind == TRUE_EXPR1423	}1424	fn cast(syntax: SyntaxNode) -> Option<Self> {1425		if Self::can_cast(syntax.kind()) {1426			Some(Self { syntax })1427		} else {1428			None1429		}1430	}1431	fn syntax(&self) -> &SyntaxNode {1432		&self.syntax1433	}1434}1435impl AstNode for FalseExpr {1436	fn can_cast(kind: SyntaxKind) -> bool {1437		kind == FALSE_EXPR1438	}1439	fn cast(syntax: SyntaxNode) -> Option<Self> {1440		if Self::can_cast(syntax.kind()) {1441			Some(Self { syntax })1442		} else {1443			None1444		}1445	}1446	fn syntax(&self) -> &SyntaxNode {1447		&self.syntax1448	}1449}1450impl AstNode for ExprFunction {1451	fn can_cast(kind: SyntaxKind) -> bool {1452		kind == EXPR_FUNCTION1453	}1454	fn cast(syntax: SyntaxNode) -> Option<Self> {1455		if Self::can_cast(syntax.kind()) {1456			Some(Self { syntax })1457		} else {1458			None1459		}1460	}1461	fn syntax(&self) -> &SyntaxNode {1462		&self.syntax1463	}1464}1465impl AstNode for ParamsDesc {1466	fn can_cast(kind: SyntaxKind) -> bool {1467		kind == PARAMS_DESC1468	}1469	fn cast(syntax: SyntaxNode) -> Option<Self> {1470		if Self::can_cast(syntax.kind()) {1471			Some(Self { syntax })1472		} else {1473			None1474		}1475	}1476	fn syntax(&self) -> &SyntaxNode {1477		&self.syntax1478	}1479}1480impl AstNode for ExprError {1481	fn can_cast(kind: SyntaxKind) -> bool {1482		kind == EXPR_ERROR1483	}1484	fn cast(syntax: SyntaxNode) -> Option<Self> {1485		if Self::can_cast(syntax.kind()) {1486			Some(Self { syntax })1487		} else {1488			None1489		}1490	}1491	fn syntax(&self) -> &SyntaxNode {1492		&self.syntax1493	}1494}1495impl AstNode for SliceDescEnd {1496	fn can_cast(kind: SyntaxKind) -> bool {1497		kind == SLICE_DESC_END1498	}1499	fn cast(syntax: SyntaxNode) -> Option<Self> {1500		if Self::can_cast(syntax.kind()) {1501			Some(Self { syntax })1502		} else {1503			None1504		}1505	}1506	fn syntax(&self) -> &SyntaxNode {1507		&self.syntax1508	}1509}1510impl AstNode for SliceDescStep {1511	fn can_cast(kind: SyntaxKind) -> bool {1512		kind == SLICE_DESC_STEP1513	}1514	fn cast(syntax: SyntaxNode) -> Option<Self> {1515		if Self::can_cast(syntax.kind()) {1516			Some(Self { syntax })1517		} else {1518			None1519		}1520	}1521	fn syntax(&self) -> &SyntaxNode {1522		&self.syntax1523	}1524}1525impl AstNode for Arg {1526	fn can_cast(kind: SyntaxKind) -> bool {1527		kind == ARG1528	}1529	fn cast(syntax: SyntaxNode) -> Option<Self> {1530		if Self::can_cast(syntax.kind()) {1531			Some(Self { syntax })1532		} else {1533			None1534		}1535	}1536	fn syntax(&self) -> &SyntaxNode {1537		&self.syntax1538	}1539}1540impl AstNode for ObjBodyComp {1541	fn can_cast(kind: SyntaxKind) -> bool {1542		kind == OBJ_BODY_COMP1543	}1544	fn cast(syntax: SyntaxNode) -> Option<Self> {1545		if Self::can_cast(syntax.kind()) {1546			Some(Self { syntax })1547		} else {1548			None1549		}1550	}1551	fn syntax(&self) -> &SyntaxNode {1552		&self.syntax1553	}1554}1555impl AstNode for ObjBodyMemberList {1556	fn can_cast(kind: SyntaxKind) -> bool {1557		kind == OBJ_BODY_MEMBER_LIST1558	}1559	fn cast(syntax: SyntaxNode) -> Option<Self> {1560		if Self::can_cast(syntax.kind()) {1561			Some(Self { syntax })1562		} else {1563			None1564		}1565	}1566	fn syntax(&self) -> &SyntaxNode {1567		&self.syntax1568	}1569}1570impl AstNode for MemberBindStmt {1571	fn can_cast(kind: SyntaxKind) -> bool {1572		kind == MEMBER_BIND_STMT1573	}1574	fn cast(syntax: SyntaxNode) -> Option<Self> {1575		if Self::can_cast(syntax.kind()) {1576			Some(Self { syntax })1577		} else {1578			None1579		}1580	}1581	fn syntax(&self) -> &SyntaxNode {1582		&self.syntax1583	}1584}1585impl AstNode for ObjLocal {1586	fn can_cast(kind: SyntaxKind) -> bool {1587		kind == OBJ_LOCAL1588	}1589	fn cast(syntax: SyntaxNode) -> Option<Self> {1590		if Self::can_cast(syntax.kind()) {1591			Some(Self { syntax })1592		} else {1593			None1594		}1595	}1596	fn syntax(&self) -> &SyntaxNode {1597		&self.syntax1598	}1599}1600impl AstNode for MemberAssertStmt {1601	fn can_cast(kind: SyntaxKind) -> bool {1602		kind == MEMBER_ASSERT_STMT1603	}1604	fn cast(syntax: SyntaxNode) -> Option<Self> {1605		if Self::can_cast(syntax.kind()) {1606			Some(Self { syntax })1607		} else {1608			None1609		}1610	}1611	fn syntax(&self) -> &SyntaxNode {1612		&self.syntax1613	}1614}1615impl AstNode for MemberFieldNormal {1616	fn can_cast(kind: SyntaxKind) -> bool {1617		kind == MEMBER_FIELD_NORMAL1618	}1619	fn cast(syntax: SyntaxNode) -> Option<Self> {1620		if Self::can_cast(syntax.kind()) {1621			Some(Self { syntax })1622		} else {1623			None1624		}1625	}1626	fn syntax(&self) -> &SyntaxNode {1627		&self.syntax1628	}1629}1630impl AstNode for Visibility {1631	fn can_cast(kind: SyntaxKind) -> bool {1632		kind == VISIBILITY1633	}1634	fn cast(syntax: SyntaxNode) -> Option<Self> {1635		if Self::can_cast(syntax.kind()) {1636			Some(Self { syntax })1637		} else {1638			None1639		}1640	}1641	fn syntax(&self) -> &SyntaxNode {1642		&self.syntax1643	}1644}1645impl AstNode for MemberFieldMethod {1646	fn can_cast(kind: SyntaxKind) -> bool {1647		kind == MEMBER_FIELD_METHOD1648	}1649	fn cast(syntax: SyntaxNode) -> Option<Self> {1650		if Self::can_cast(syntax.kind()) {1651			Some(Self { syntax })1652		} else {1653			None1654		}1655	}1656	fn syntax(&self) -> &SyntaxNode {1657		&self.syntax1658	}1659}1660impl AstNode for FieldNameFixed {1661	fn can_cast(kind: SyntaxKind) -> bool {1662		kind == FIELD_NAME_FIXED1663	}1664	fn cast(syntax: SyntaxNode) -> Option<Self> {1665		if Self::can_cast(syntax.kind()) {1666			Some(Self { syntax })1667		} else {1668			None1669		}1670	}1671	fn syntax(&self) -> &SyntaxNode {1672		&self.syntax1673	}1674}1675impl AstNode for FieldNameDynamic {1676	fn can_cast(kind: SyntaxKind) -> bool {1677		kind == FIELD_NAME_DYNAMIC1678	}1679	fn cast(syntax: SyntaxNode) -> Option<Self> {1680		if Self::can_cast(syntax.kind()) {1681			Some(Self { syntax })1682		} else {1683			None1684		}1685	}1686	fn syntax(&self) -> &SyntaxNode {1687		&self.syntax1688	}1689}1690impl AstNode for ForSpec {1691	fn can_cast(kind: SyntaxKind) -> bool {1692		kind == FOR_SPEC1693	}1694	fn cast(syntax: SyntaxNode) -> Option<Self> {1695		if Self::can_cast(syntax.kind()) {1696			Some(Self { syntax })1697		} else {1698			None1699		}1700	}1701	fn syntax(&self) -> &SyntaxNode {1702		&self.syntax1703	}1704}1705impl AstNode for IfSpec {1706	fn can_cast(kind: SyntaxKind) -> bool {1707		kind == IF_SPEC1708	}1709	fn cast(syntax: SyntaxNode) -> Option<Self> {1710		if Self::can_cast(syntax.kind()) {1711			Some(Self { syntax })1712		} else {1713			None1714		}1715	}1716	fn syntax(&self) -> &SyntaxNode {1717		&self.syntax1718	}1719}1720impl AstNode for BindDestruct {1721	fn can_cast(kind: SyntaxKind) -> bool {1722		kind == BIND_DESTRUCT1723	}1724	fn cast(syntax: SyntaxNode) -> Option<Self> {1725		if Self::can_cast(syntax.kind()) {1726			Some(Self { syntax })1727		} else {1728			None1729		}1730	}1731	fn syntax(&self) -> &SyntaxNode {1732		&self.syntax1733	}1734}1735impl AstNode for BindFunction {1736	fn can_cast(kind: SyntaxKind) -> bool {1737		kind == BIND_FUNCTION1738	}1739	fn cast(syntax: SyntaxNode) -> Option<Self> {1740		if Self::can_cast(syntax.kind()) {1741			Some(Self { syntax })1742		} else {1743			None1744		}1745	}1746	fn syntax(&self) -> &SyntaxNode {1747		&self.syntax1748	}1749}1750impl AstNode for Param {1751	fn can_cast(kind: SyntaxKind) -> bool {1752		kind == PARAM1753	}1754	fn cast(syntax: SyntaxNode) -> Option<Self> {1755		if Self::can_cast(syntax.kind()) {1756			Some(Self { syntax })1757		} else {1758			None1759		}1760	}1761	fn syntax(&self) -> &SyntaxNode {1762		&self.syntax1763	}1764}1765impl AstNode for DestructFull {1766	fn can_cast(kind: SyntaxKind) -> bool {1767		kind == DESTRUCT_FULL1768	}1769	fn cast(syntax: SyntaxNode) -> Option<Self> {1770		if Self::can_cast(syntax.kind()) {1771			Some(Self { syntax })1772		} else {1773			None1774		}1775	}1776	fn syntax(&self) -> &SyntaxNode {1777		&self.syntax1778	}1779}1780impl AstNode for DestructSkip {1781	fn can_cast(kind: SyntaxKind) -> bool {1782		kind == DESTRUCT_SKIP1783	}1784	fn cast(syntax: SyntaxNode) -> Option<Self> {1785		if Self::can_cast(syntax.kind()) {1786			Some(Self { syntax })1787		} else {1788			None1789		}1790	}1791	fn syntax(&self) -> &SyntaxNode {1792		&self.syntax1793	}1794}1795impl AstNode for DestructArray {1796	fn can_cast(kind: SyntaxKind) -> bool {1797		kind == DESTRUCT_ARRAY1798	}1799	fn cast(syntax: SyntaxNode) -> Option<Self> {1800		if Self::can_cast(syntax.kind()) {1801			Some(Self { syntax })1802		} else {1803			None1804		}1805	}1806	fn syntax(&self) -> &SyntaxNode {1807		&self.syntax1808	}1809}1810impl AstNode for DestructObject {1811	fn can_cast(kind: SyntaxKind) -> bool {1812		kind == DESTRUCT_OBJECT1813	}1814	fn cast(syntax: SyntaxNode) -> Option<Self> {1815		if Self::can_cast(syntax.kind()) {1816			Some(Self { syntax })1817		} else {1818			None1819		}1820	}1821	fn syntax(&self) -> &SyntaxNode {1822		&self.syntax1823	}1824}1825impl AstNode for DestructObjectField {1826	fn can_cast(kind: SyntaxKind) -> bool {1827		kind == DESTRUCT_OBJECT_FIELD1828	}1829	fn cast(syntax: SyntaxNode) -> Option<Self> {1830		if Self::can_cast(syntax.kind()) {1831			Some(Self { syntax })1832		} else {1833			None1834		}1835	}1836	fn syntax(&self) -> &SyntaxNode {1837		&self.syntax1838	}1839}1840impl AstNode for DestructRest {1841	fn can_cast(kind: SyntaxKind) -> bool {1842		kind == DESTRUCT_REST1843	}1844	fn cast(syntax: SyntaxNode) -> Option<Self> {1845		if Self::can_cast(syntax.kind()) {1846			Some(Self { syntax })1847		} else {1848			None1849		}1850	}1851	fn syntax(&self) -> &SyntaxNode {1852		&self.syntax1853	}1854}1855impl AstNode for DestructArrayElement {1856	fn can_cast(kind: SyntaxKind) -> bool {1857		kind == DESTRUCT_ARRAY_ELEMENT1858	}1859	fn cast(syntax: SyntaxNode) -> Option<Self> {1860		if Self::can_cast(syntax.kind()) {1861			Some(Self { syntax })1862		} else {1863			None1864		}1865	}1866	fn syntax(&self) -> &SyntaxNode {1867		&self.syntax1868	}1869}1870impl From<SuffixIndex> for Suffix {1871	fn from(node: SuffixIndex) -> Suffix {1872		Suffix::SuffixIndex(node)1873	}1874}1875impl From<SuffixIndexExpr> for Suffix {1876	fn from(node: SuffixIndexExpr) -> Suffix {1877		Suffix::SuffixIndexExpr(node)1878	}1879}1880impl From<SuffixSlice> for Suffix {1881	fn from(node: SuffixSlice) -> Suffix {1882		Suffix::SuffixSlice(node)1883	}1884}1885impl From<SuffixApply> for Suffix {1886	fn from(node: SuffixApply) -> Suffix {1887		Suffix::SuffixApply(node)1888	}1889}1890impl AstNode for Suffix {1891	fn can_cast(kind: SyntaxKind) -> bool {1892		match kind {1893			SUFFIX_INDEX | SUFFIX_INDEX_EXPR | SUFFIX_SLICE | SUFFIX_APPLY => true,1894			_ => false,1895		}1896	}1897	fn cast(syntax: SyntaxNode) -> Option<Self> {1898		let res = match syntax.kind() {1899			SUFFIX_INDEX => Suffix::SuffixIndex(SuffixIndex { syntax }),1900			SUFFIX_INDEX_EXPR => Suffix::SuffixIndexExpr(SuffixIndexExpr { syntax }),1901			SUFFIX_SLICE => Suffix::SuffixSlice(SuffixSlice { syntax }),1902			SUFFIX_APPLY => Suffix::SuffixApply(SuffixApply { syntax }),1903			_ => return None,1904		};1905		Some(res)1906	}1907	fn syntax(&self) -> &SyntaxNode {1908		match self {1909			Suffix::SuffixIndex(it) => &it.syntax,1910			Suffix::SuffixIndexExpr(it) => &it.syntax,1911			Suffix::SuffixSlice(it) => &it.syntax,1912			Suffix::SuffixApply(it) => &it.syntax,1913		}1914	}1915}1916impl From<BindDestruct> for Bind {1917	fn from(node: BindDestruct) -> Bind {1918		Bind::BindDestruct(node)1919	}1920}1921impl From<BindFunction> for Bind {1922	fn from(node: BindFunction) -> Bind {1923		Bind::BindFunction(node)1924	}1925}1926impl AstNode for Bind {1927	fn can_cast(kind: SyntaxKind) -> bool {1928		match kind {1929			BIND_DESTRUCT | BIND_FUNCTION => true,1930			_ => false,1931		}1932	}1933	fn cast(syntax: SyntaxNode) -> Option<Self> {1934		let res = match syntax.kind() {1935			BIND_DESTRUCT => Bind::BindDestruct(BindDestruct { syntax }),1936			BIND_FUNCTION => Bind::BindFunction(BindFunction { syntax }),1937			_ => return None,1938		};1939		Some(res)1940	}1941	fn syntax(&self) -> &SyntaxNode {1942		match self {1943			Bind::BindDestruct(it) => &it.syntax,1944			Bind::BindFunction(it) => &it.syntax,1945		}1946	}1947}1948impl From<StmtLocal> for Stmt {1949	fn from(node: StmtLocal) -> Stmt {1950		Stmt::StmtLocal(node)1951	}1952}1953impl From<StmtAssert> for Stmt {1954	fn from(node: StmtAssert) -> Stmt {1955		Stmt::StmtAssert(node)1956	}1957}1958impl AstNode for Stmt {1959	fn can_cast(kind: SyntaxKind) -> bool {1960		match kind {1961			STMT_LOCAL | STMT_ASSERT => true,1962			_ => false,1963		}1964	}1965	fn cast(syntax: SyntaxNode) -> Option<Self> {1966		let res = match syntax.kind() {1967			STMT_LOCAL => Stmt::StmtLocal(StmtLocal { syntax }),1968			STMT_ASSERT => Stmt::StmtAssert(StmtAssert { syntax }),1969			_ => return None,1970		};1971		Some(res)1972	}1973	fn syntax(&self) -> &SyntaxNode {1974		match self {1975			Stmt::StmtLocal(it) => &it.syntax,1976			Stmt::StmtAssert(it) => &it.syntax,1977		}1978	}1979}1980impl From<ObjBodyComp> for ObjBody {1981	fn from(node: ObjBodyComp) -> ObjBody {1982		ObjBody::ObjBodyComp(node)1983	}1984}1985impl From<ObjBodyMemberList> for ObjBody {1986	fn from(node: ObjBodyMemberList) -> ObjBody {1987		ObjBody::ObjBodyMemberList(node)1988	}1989}1990impl AstNode for ObjBody {1991	fn can_cast(kind: SyntaxKind) -> bool {1992		match kind {1993			OBJ_BODY_COMP | OBJ_BODY_MEMBER_LIST => true,1994			_ => false,1995		}1996	}1997	fn cast(syntax: SyntaxNode) -> Option<Self> {1998		let res = match syntax.kind() {1999			OBJ_BODY_COMP => ObjBody::ObjBodyComp(ObjBodyComp { syntax }),2000			OBJ_BODY_MEMBER_LIST => ObjBody::ObjBodyMemberList(ObjBodyMemberList { syntax }),2001			_ => return None,2002		};2003		Some(res)2004	}2005	fn syntax(&self) -> &SyntaxNode {2006		match self {2007			ObjBody::ObjBodyComp(it) => &it.syntax,2008			ObjBody::ObjBodyMemberList(it) => &it.syntax,2009		}2010	}2011}2012impl From<ForSpec> for CompSpec {2013	fn from(node: ForSpec) -> CompSpec {2014		CompSpec::ForSpec(node)2015	}2016}2017impl From<IfSpec> for CompSpec {2018	fn from(node: IfSpec) -> CompSpec {2019		CompSpec::IfSpec(node)2020	}2021}2022impl AstNode for CompSpec {2023	fn can_cast(kind: SyntaxKind) -> bool {2024		match kind {2025			FOR_SPEC | IF_SPEC => true,2026			_ => false,2027		}2028	}2029	fn cast(syntax: SyntaxNode) -> Option<Self> {2030		let res = match syntax.kind() {2031			FOR_SPEC => CompSpec::ForSpec(ForSpec { syntax }),2032			IF_SPEC => CompSpec::IfSpec(IfSpec { syntax }),2033			_ => return None,2034		};2035		Some(res)2036	}2037	fn syntax(&self) -> &SyntaxNode {2038		match self {2039			CompSpec::ForSpec(it) => &it.syntax,2040			CompSpec::IfSpec(it) => &it.syntax,2041		}2042	}2043}2044impl From<ExprBinary> for ExprBase {2045	fn from(node: ExprBinary) -> ExprBase {2046		ExprBase::ExprBinary(node)2047	}2048}2049impl From<ExprUnary> for ExprBase {2050	fn from(node: ExprUnary) -> ExprBase {2051		ExprBase::ExprUnary(node)2052	}2053}2054impl From<ExprObjExtend> for ExprBase {2055	fn from(node: ExprObjExtend) -> ExprBase {2056		ExprBase::ExprObjExtend(node)2057	}2058}2059impl From<ExprParened> for ExprBase {2060	fn from(node: ExprParened) -> ExprBase {2061		ExprBase::ExprParened(node)2062	}2063}2064impl From<ExprString> for ExprBase {2065	fn from(node: ExprString) -> ExprBase {2066		ExprBase::ExprString(node)2067	}2068}2069impl From<ExprNumber> for ExprBase {2070	fn from(node: ExprNumber) -> ExprBase {2071		ExprBase::ExprNumber(node)2072	}2073}2074impl From<ExprLiteral> for ExprBase {2075	fn from(node: ExprLiteral) -> ExprBase {2076		ExprBase::ExprLiteral(node)2077	}2078}2079impl From<ExprArray> for ExprBase {2080	fn from(node: ExprArray) -> ExprBase {2081		ExprBase::ExprArray(node)2082	}2083}2084impl From<ExprObject> for ExprBase {2085	fn from(node: ExprObject) -> ExprBase {2086		ExprBase::ExprObject(node)2087	}2088}2089impl From<ExprArrayComp> for ExprBase {2090	fn from(node: ExprArrayComp) -> ExprBase {2091		ExprBase::ExprArrayComp(node)2092	}2093}2094impl From<ExprImport> for ExprBase {2095	fn from(node: ExprImport) -> ExprBase {2096		ExprBase::ExprImport(node)2097	}2098}2099impl From<ExprVar> for ExprBase {2100	fn from(node: ExprVar) -> ExprBase {2101		ExprBase::ExprVar(node)2102	}2103}2104impl From<ExprIfThenElse> for ExprBase {2105	fn from(node: ExprIfThenElse) -> ExprBase {2106		ExprBase::ExprIfThenElse(node)2107	}2108}2109impl From<ExprFunction> for ExprBase {2110	fn from(node: ExprFunction) -> ExprBase {2111		ExprBase::ExprFunction(node)2112	}2113}2114impl From<ExprError> for ExprBase {2115	fn from(node: ExprError) -> ExprBase {2116		ExprBase::ExprError(node)2117	}2118}2119impl AstNode for ExprBase {2120	fn can_cast(kind: SyntaxKind) -> bool {2121		match kind {2122			EXPR_BINARY | EXPR_UNARY | EXPR_OBJ_EXTEND | EXPR_PARENED | EXPR_STRING2123			| EXPR_NUMBER | EXPR_LITERAL | EXPR_ARRAY | EXPR_OBJECT | EXPR_ARRAY_COMP2124			| EXPR_IMPORT | EXPR_VAR | EXPR_IF_THEN_ELSE | EXPR_FUNCTION | EXPR_ERROR => true,2125			_ => false,2126		}2127	}2128	fn cast(syntax: SyntaxNode) -> Option<Self> {2129		let res = match syntax.kind() {2130			EXPR_BINARY => ExprBase::ExprBinary(ExprBinary { syntax }),2131			EXPR_UNARY => ExprBase::ExprUnary(ExprUnary { syntax }),2132			EXPR_OBJ_EXTEND => ExprBase::ExprObjExtend(ExprObjExtend { syntax }),2133			EXPR_PARENED => ExprBase::ExprParened(ExprParened { syntax }),2134			EXPR_STRING => ExprBase::ExprString(ExprString { syntax }),2135			EXPR_NUMBER => ExprBase::ExprNumber(ExprNumber { syntax }),2136			EXPR_LITERAL => ExprBase::ExprLiteral(ExprLiteral { syntax }),2137			EXPR_ARRAY => ExprBase::ExprArray(ExprArray { syntax }),2138			EXPR_OBJECT => ExprBase::ExprObject(ExprObject { syntax }),2139			EXPR_ARRAY_COMP => ExprBase::ExprArrayComp(ExprArrayComp { syntax }),2140			EXPR_IMPORT => ExprBase::ExprImport(ExprImport { syntax }),2141			EXPR_VAR => ExprBase::ExprVar(ExprVar { syntax }),2142			EXPR_IF_THEN_ELSE => ExprBase::ExprIfThenElse(ExprIfThenElse { syntax }),2143			EXPR_FUNCTION => ExprBase::ExprFunction(ExprFunction { syntax }),2144			EXPR_ERROR => ExprBase::ExprError(ExprError { syntax }),2145			_ => return None,2146		};2147		Some(res)2148	}2149	fn syntax(&self) -> &SyntaxNode {2150		match self {2151			ExprBase::ExprBinary(it) => &it.syntax,2152			ExprBase::ExprUnary(it) => &it.syntax,2153			ExprBase::ExprObjExtend(it) => &it.syntax,2154			ExprBase::ExprParened(it) => &it.syntax,2155			ExprBase::ExprString(it) => &it.syntax,2156			ExprBase::ExprNumber(it) => &it.syntax,2157			ExprBase::ExprLiteral(it) => &it.syntax,2158			ExprBase::ExprArray(it) => &it.syntax,2159			ExprBase::ExprObject(it) => &it.syntax,2160			ExprBase::ExprArrayComp(it) => &it.syntax,2161			ExprBase::ExprImport(it) => &it.syntax,2162			ExprBase::ExprVar(it) => &it.syntax,2163			ExprBase::ExprIfThenElse(it) => &it.syntax,2164			ExprBase::ExprFunction(it) => &it.syntax,2165			ExprBase::ExprError(it) => &it.syntax,2166		}2167	}2168}2169impl From<MemberBindStmt> for MemberComp {2170	fn from(node: MemberBindStmt) -> MemberComp {2171		MemberComp::MemberBindStmt(node)2172	}2173}2174impl From<MemberFieldNormal> for MemberComp {2175	fn from(node: MemberFieldNormal) -> MemberComp {2176		MemberComp::MemberFieldNormal(node)2177	}2178}2179impl From<MemberFieldMethod> for MemberComp {2180	fn from(node: MemberFieldMethod) -> MemberComp {2181		MemberComp::MemberFieldMethod(node)2182	}2183}2184impl AstNode for MemberComp {2185	fn can_cast(kind: SyntaxKind) -> bool {2186		match kind {2187			MEMBER_BIND_STMT | MEMBER_FIELD_NORMAL | MEMBER_FIELD_METHOD => true,2188			_ => false,2189		}2190	}2191	fn cast(syntax: SyntaxNode) -> Option<Self> {2192		let res = match syntax.kind() {2193			MEMBER_BIND_STMT => MemberComp::MemberBindStmt(MemberBindStmt { syntax }),2194			MEMBER_FIELD_NORMAL => MemberComp::MemberFieldNormal(MemberFieldNormal { syntax }),2195			MEMBER_FIELD_METHOD => MemberComp::MemberFieldMethod(MemberFieldMethod { syntax }),2196			_ => return None,2197		};2198		Some(res)2199	}2200	fn syntax(&self) -> &SyntaxNode {2201		match self {2202			MemberComp::MemberBindStmt(it) => &it.syntax,2203			MemberComp::MemberFieldNormal(it) => &it.syntax,2204			MemberComp::MemberFieldMethod(it) => &it.syntax,2205		}2206	}2207}2208impl From<MemberBindStmt> for Member {2209	fn from(node: MemberBindStmt) -> Member {2210		Member::MemberBindStmt(node)2211	}2212}2213impl From<MemberAssertStmt> for Member {2214	fn from(node: MemberAssertStmt) -> Member {2215		Member::MemberAssertStmt(node)2216	}2217}2218impl From<MemberFieldNormal> for Member {2219	fn from(node: MemberFieldNormal) -> Member {2220		Member::MemberFieldNormal(node)2221	}2222}2223impl From<MemberFieldMethod> for Member {2224	fn from(node: MemberFieldMethod) -> Member {2225		Member::MemberFieldMethod(node)2226	}2227}2228impl AstNode for Member {2229	fn can_cast(kind: SyntaxKind) -> bool {2230		match kind {2231			MEMBER_BIND_STMT | MEMBER_ASSERT_STMT | MEMBER_FIELD_NORMAL | MEMBER_FIELD_METHOD => {2232				true2233			}2234			_ => false,2235		}2236	}2237	fn cast(syntax: SyntaxNode) -> Option<Self> {2238		let res = match syntax.kind() {2239			MEMBER_BIND_STMT => Member::MemberBindStmt(MemberBindStmt { syntax }),2240			MEMBER_ASSERT_STMT => Member::MemberAssertStmt(MemberAssertStmt { syntax }),2241			MEMBER_FIELD_NORMAL => Member::MemberFieldNormal(MemberFieldNormal { syntax }),2242			MEMBER_FIELD_METHOD => Member::MemberFieldMethod(MemberFieldMethod { syntax }),2243			_ => return None,2244		};2245		Some(res)2246	}2247	fn syntax(&self) -> &SyntaxNode {2248		match self {2249			Member::MemberBindStmt(it) => &it.syntax,2250			Member::MemberAssertStmt(it) => &it.syntax,2251			Member::MemberFieldNormal(it) => &it.syntax,2252			Member::MemberFieldMethod(it) => &it.syntax,2253		}2254	}2255}2256impl From<FieldNameFixed> for FieldName {2257	fn from(node: FieldNameFixed) -> FieldName {2258		FieldName::FieldNameFixed(node)2259	}2260}2261impl From<FieldNameDynamic> for FieldName {2262	fn from(node: FieldNameDynamic) -> FieldName {2263		FieldName::FieldNameDynamic(node)2264	}2265}2266impl AstNode for FieldName {2267	fn can_cast(kind: SyntaxKind) -> bool {2268		match kind {2269			FIELD_NAME_FIXED | FIELD_NAME_DYNAMIC => true,2270			_ => false,2271		}2272	}2273	fn cast(syntax: SyntaxNode) -> Option<Self> {2274		let res = match syntax.kind() {2275			FIELD_NAME_FIXED => FieldName::FieldNameFixed(FieldNameFixed { syntax }),2276			FIELD_NAME_DYNAMIC => FieldName::FieldNameDynamic(FieldNameDynamic { syntax }),2277			_ => return None,2278		};2279		Some(res)2280	}2281	fn syntax(&self) -> &SyntaxNode {2282		match self {2283			FieldName::FieldNameFixed(it) => &it.syntax,2284			FieldName::FieldNameDynamic(it) => &it.syntax,2285		}2286	}2287}2288impl From<DestructFull> for Destruct {2289	fn from(node: DestructFull) -> Destruct {2290		Destruct::DestructFull(node)2291	}2292}2293impl From<DestructSkip> for Destruct {2294	fn from(node: DestructSkip) -> Destruct {2295		Destruct::DestructSkip(node)2296	}2297}2298impl From<DestructArray> for Destruct {2299	fn from(node: DestructArray) -> Destruct {2300		Destruct::DestructArray(node)2301	}2302}2303impl From<DestructObject> for Destruct {2304	fn from(node: DestructObject) -> Destruct {2305		Destruct::DestructObject(node)2306	}2307}2308impl AstNode for Destruct {2309	fn can_cast(kind: SyntaxKind) -> bool {2310		match kind {2311			DESTRUCT_FULL | DESTRUCT_SKIP | DESTRUCT_ARRAY | DESTRUCT_OBJECT => true,2312			_ => false,2313		}2314	}2315	fn cast(syntax: SyntaxNode) -> Option<Self> {2316		let res = match syntax.kind() {2317			DESTRUCT_FULL => Destruct::DestructFull(DestructFull { syntax }),2318			DESTRUCT_SKIP => Destruct::DestructSkip(DestructSkip { syntax }),2319			DESTRUCT_ARRAY => Destruct::DestructArray(DestructArray { syntax }),2320			DESTRUCT_OBJECT => Destruct::DestructObject(DestructObject { syntax }),2321			_ => return None,2322		};2323		Some(res)2324	}2325	fn syntax(&self) -> &SyntaxNode {2326		match self {2327			Destruct::DestructFull(it) => &it.syntax,2328			Destruct::DestructSkip(it) => &it.syntax,2329			Destruct::DestructArray(it) => &it.syntax,2330			Destruct::DestructObject(it) => &it.syntax,2331		}2332	}2333}2334impl From<DestructArrayElement> for DestructArrayPart {2335	fn from(node: DestructArrayElement) -> DestructArrayPart {2336		DestructArrayPart::DestructArrayElement(node)2337	}2338}2339impl From<DestructRest> for DestructArrayPart {2340	fn from(node: DestructRest) -> DestructArrayPart {2341		DestructArrayPart::DestructRest(node)2342	}2343}2344impl AstNode for DestructArrayPart {2345	fn can_cast(kind: SyntaxKind) -> bool {2346		match kind {2347			DESTRUCT_ARRAY_ELEMENT | DESTRUCT_REST => true,2348			_ => false,2349		}2350	}2351	fn cast(syntax: SyntaxNode) -> Option<Self> {2352		let res = match syntax.kind() {2353			DESTRUCT_ARRAY_ELEMENT => {2354				DestructArrayPart::DestructArrayElement(DestructArrayElement { syntax })2355			}2356			DESTRUCT_REST => DestructArrayPart::DestructRest(DestructRest { syntax }),2357			_ => return None,2358		};2359		Some(res)2360	}2361	fn syntax(&self) -> &SyntaxNode {2362		match self {2363			DestructArrayPart::DestructArrayElement(it) => &it.syntax,2364			DestructArrayPart::DestructRest(it) => &it.syntax,2365		}2366	}2367}2368impl AstToken for BinaryOperator {2369	fn can_cast(kind: SyntaxKind) -> bool {2370		BinaryOperatorKind::can_cast(kind)2371	}2372	fn cast(syntax: SyntaxToken) -> Option<Self> {2373		let kind = BinaryOperatorKind::cast(syntax.kind())?;2374		Some(BinaryOperator { syntax, kind })2375	}2376	fn syntax(&self) -> &SyntaxToken {2377		&self.syntax2378	}2379}2380impl BinaryOperatorKind {2381	fn can_cast(kind: SyntaxKind) -> bool {2382		match kind {2383			OR | NULL_COAELSE | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE2384			| IN_KW | LHS | RHS | PLUS | MINUS | MUL | DIV | MODULO | META_OBJECT_APPLY2385			| ERROR_NO_OPERATOR => true,2386			_ => false,2387		}2388	}2389	pub fn cast(kind: SyntaxKind) -> Option<Self> {2390		let res = match kind {2391			OR => Self::Or,2392			NULL_COAELSE => Self::NullCoaelse,2393			AND => Self::And,2394			BIT_OR => Self::BitOr,2395			BIT_XOR => Self::BitXor,2396			BIT_AND => Self::BitAnd,2397			EQ => Self::Eq,2398			NE => Self::Ne,2399			LT => Self::Lt,2400			GT => Self::Gt,2401			LE => Self::Le,2402			GE => Self::Ge,2403			IN_KW => Self::InKw,2404			LHS => Self::Lhs,2405			RHS => Self::Rhs,2406			PLUS => Self::Plus,2407			MINUS => Self::Minus,2408			MUL => Self::Mul,2409			DIV => Self::Div,2410			MODULO => Self::Modulo,2411			META_OBJECT_APPLY => Self::MetaObjectApply,2412			ERROR_NO_OPERATOR => Self::ErrorNoOperator,2413			_ => return None,2414		};2415		Some(res)2416	}2417}2418impl BinaryOperator {2419	pub fn kind(&self) -> BinaryOperatorKind {2420		self.kind2421	}2422}2423impl std::fmt::Display for BinaryOperator {2424	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2425		std::fmt::Display::fmt(self.syntax(), f)2426	}2427}2428impl AstToken for UnaryOperator {2429	fn can_cast(kind: SyntaxKind) -> bool {2430		UnaryOperatorKind::can_cast(kind)2431	}2432	fn cast(syntax: SyntaxToken) -> Option<Self> {2433		let kind = UnaryOperatorKind::cast(syntax.kind())?;2434		Some(UnaryOperator { syntax, kind })2435	}2436	fn syntax(&self) -> &SyntaxToken {2437		&self.syntax2438	}2439}2440impl UnaryOperatorKind {2441	fn can_cast(kind: SyntaxKind) -> bool {2442		match kind {2443			MINUS | NOT | BIT_NOT => true,2444			_ => false,2445		}2446	}2447	pub fn cast(kind: SyntaxKind) -> Option<Self> {2448		let res = match kind {2449			MINUS => Self::Minus,2450			NOT => Self::Not,2451			BIT_NOT => Self::BitNot,2452			_ => return None,2453		};2454		Some(res)2455	}2456}2457impl UnaryOperator {2458	pub fn kind(&self) -> UnaryOperatorKind {2459		self.kind2460	}2461}2462impl std::fmt::Display for UnaryOperator {2463	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2464		std::fmt::Display::fmt(self.syntax(), f)2465	}2466}2467impl AstToken for Literal {2468	fn can_cast(kind: SyntaxKind) -> bool {2469		LiteralKind::can_cast(kind)2470	}2471	fn cast(syntax: SyntaxToken) -> Option<Self> {2472		let kind = LiteralKind::cast(syntax.kind())?;2473		Some(Literal { syntax, kind })2474	}2475	fn syntax(&self) -> &SyntaxToken {2476		&self.syntax2477	}2478}2479impl LiteralKind {2480	fn can_cast(kind: SyntaxKind) -> bool {2481		match kind {2482			NULL_KW | TRUE_KW | FALSE_KW | SELF_KW | DOLLAR | SUPER_KW => true,2483			_ => false,2484		}2485	}2486	pub fn cast(kind: SyntaxKind) -> Option<Self> {2487		let res = match kind {2488			NULL_KW => Self::NullKw,2489			TRUE_KW => Self::TrueKw,2490			FALSE_KW => Self::FalseKw,2491			SELF_KW => Self::SelfKw,2492			DOLLAR => Self::Dollar,2493			SUPER_KW => Self::SuperKw,2494			_ => return None,2495		};2496		Some(res)2497	}2498}2499impl Literal {2500	pub fn kind(&self) -> LiteralKind {2501		self.kind2502	}2503}2504impl std::fmt::Display for Literal {2505	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2506		std::fmt::Display::fmt(self.syntax(), f)2507	}2508}2509impl AstToken for Text {2510	fn can_cast(kind: SyntaxKind) -> bool {2511		TextKind::can_cast(kind)2512	}2513	fn cast(syntax: SyntaxToken) -> Option<Self> {2514		let kind = TextKind::cast(syntax.kind())?;2515		Some(Text { syntax, kind })2516	}2517	fn syntax(&self) -> &SyntaxToken {2518		&self.syntax2519	}2520}2521impl TextKind {2522	fn can_cast(kind: SyntaxKind) -> bool {2523		match kind {2524			STRING_DOUBLE2525			| ERROR_STRING_DOUBLE_UNTERMINATED2526			| STRING_SINGLE2527			| ERROR_STRING_SINGLE_UNTERMINATED2528			| STRING_DOUBLE_VERBATIM2529			| ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED2530			| STRING_SINGLE_VERBATIM2531			| ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED2532			| ERROR_STRING_VERBATIM_MISSING_QUOTES2533			| STRING_BLOCK2534			| ERROR_STRING_BLOCK_UNEXPECTED_END2535			| ERROR_STRING_BLOCK_MISSING_NEW_LINE2536			| ERROR_STRING_BLOCK_MISSING_TERMINATION2537			| ERROR_STRING_BLOCK_MISSING_INDENT => true,2538			_ => false,2539		}2540	}2541	pub fn cast(kind: SyntaxKind) -> Option<Self> {2542		let res = match kind {2543			STRING_DOUBLE => Self::StringDouble,2544			ERROR_STRING_DOUBLE_UNTERMINATED => Self::ErrorStringDoubleUnterminated,2545			STRING_SINGLE => Self::StringSingle,2546			ERROR_STRING_SINGLE_UNTERMINATED => Self::ErrorStringSingleUnterminated,2547			STRING_DOUBLE_VERBATIM => Self::StringDoubleVerbatim,2548			ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED => {2549				Self::ErrorStringDoubleVerbatimUnterminated2550			}2551			STRING_SINGLE_VERBATIM => Self::StringSingleVerbatim,2552			ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED => {2553				Self::ErrorStringSingleVerbatimUnterminated2554			}2555			ERROR_STRING_VERBATIM_MISSING_QUOTES => Self::ErrorStringVerbatimMissingQuotes,2556			STRING_BLOCK => Self::StringBlock,2557			ERROR_STRING_BLOCK_UNEXPECTED_END => Self::ErrorStringBlockUnexpectedEnd,2558			ERROR_STRING_BLOCK_MISSING_NEW_LINE => Self::ErrorStringBlockMissingNewLine,2559			ERROR_STRING_BLOCK_MISSING_TERMINATION => Self::ErrorStringBlockMissingTermination,2560			ERROR_STRING_BLOCK_MISSING_INDENT => Self::ErrorStringBlockMissingIndent,2561			_ => return None,2562		};2563		Some(res)2564	}2565}2566impl Text {2567	pub fn kind(&self) -> TextKind {2568		self.kind2569	}2570}2571impl std::fmt::Display for Text {2572	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2573		std::fmt::Display::fmt(self.syntax(), f)2574	}2575}2576impl AstToken for Number {2577	fn can_cast(kind: SyntaxKind) -> bool {2578		NumberKind::can_cast(kind)2579	}2580	fn cast(syntax: SyntaxToken) -> Option<Self> {2581		let kind = NumberKind::cast(syntax.kind())?;2582		Some(Number { syntax, kind })2583	}2584	fn syntax(&self) -> &SyntaxToken {2585		&self.syntax2586	}2587}2588impl NumberKind {2589	fn can_cast(kind: SyntaxKind) -> bool {2590		match kind {2591			FLOAT2592			| ERROR_FLOAT_JUNK_AFTER_POINT2593			| ERROR_FLOAT_JUNK_AFTER_EXPONENT2594			| ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN => true,2595			_ => false,2596		}2597	}2598	pub fn cast(kind: SyntaxKind) -> Option<Self> {2599		let res = match kind {2600			FLOAT => Self::Float,2601			ERROR_FLOAT_JUNK_AFTER_POINT => Self::ErrorFloatJunkAfterPoint,2602			ERROR_FLOAT_JUNK_AFTER_EXPONENT => Self::ErrorFloatJunkAfterExponent,2603			ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN => Self::ErrorFloatJunkAfterExponentSign,2604			_ => return None,2605		};2606		Some(res)2607	}2608}2609impl Number {2610	pub fn kind(&self) -> NumberKind {2611		self.kind2612	}2613}2614impl std::fmt::Display for Number {2615	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2616		std::fmt::Display::fmt(self.syntax(), f)2617	}2618}2619impl AstToken for ImportKind {2620	fn can_cast(kind: SyntaxKind) -> bool {2621		ImportKindKind::can_cast(kind)2622	}2623	fn cast(syntax: SyntaxToken) -> Option<Self> {2624		let kind = ImportKindKind::cast(syntax.kind())?;2625		Some(ImportKind { syntax, kind })2626	}2627	fn syntax(&self) -> &SyntaxToken {2628		&self.syntax2629	}2630}2631impl ImportKindKind {2632	fn can_cast(kind: SyntaxKind) -> bool {2633		match kind {2634			IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW => true,2635			_ => false,2636		}2637	}2638	pub fn cast(kind: SyntaxKind) -> Option<Self> {2639		let res = match kind {2640			IMPORTSTR_KW => Self::ImportstrKw,2641			IMPORTBIN_KW => Self::ImportbinKw,2642			IMPORT_KW => Self::ImportKw,2643			_ => return None,2644		};2645		Some(res)2646	}2647}2648impl ImportKind {2649	pub fn kind(&self) -> ImportKindKind {2650		self.kind2651	}2652}2653impl std::fmt::Display for ImportKind {2654	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2655		std::fmt::Display::fmt(self.syntax(), f)2656	}2657}2658impl AstToken for Trivia {2659	fn can_cast(kind: SyntaxKind) -> bool {2660		TriviaKind::can_cast(kind)2661	}2662	fn cast(syntax: SyntaxToken) -> Option<Self> {2663		let kind = TriviaKind::cast(syntax.kind())?;2664		Some(Trivia { syntax, kind })2665	}2666	fn syntax(&self) -> &SyntaxToken {2667		&self.syntax2668	}2669}2670impl TriviaKind {2671	fn can_cast(kind: SyntaxKind) -> bool {2672		match kind {2673			WHITESPACE2674			| MULTI_LINE_COMMENT2675			| ERROR_COMMENT_TOO_SHORT2676			| ERROR_COMMENT_UNTERMINATED2677			| SINGLE_LINE_HASH_COMMENT2678			| SINGLE_LINE_SLASH_COMMENT => true,2679			_ => false,2680		}2681	}2682	pub fn cast(kind: SyntaxKind) -> Option<Self> {2683		let res = match kind {2684			WHITESPACE => Self::Whitespace,2685			MULTI_LINE_COMMENT => Self::MultiLineComment,2686			ERROR_COMMENT_TOO_SHORT => Self::ErrorCommentTooShort,2687			ERROR_COMMENT_UNTERMINATED => Self::ErrorCommentUnterminated,2688			SINGLE_LINE_HASH_COMMENT => Self::SingleLineHashComment,2689			SINGLE_LINE_SLASH_COMMENT => Self::SingleLineSlashComment,2690			_ => return None,2691		};2692		Some(res)2693	}2694}2695impl Trivia {2696	pub fn kind(&self) -> TriviaKind {2697		self.kind2698	}2699}2700impl std::fmt::Display for Trivia {2701	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2702		std::fmt::Display::fmt(self.syntax(), f)2703	}2704}2705impl AstToken for CustomError {2706	fn can_cast(kind: SyntaxKind) -> bool {2707		CustomErrorKind::can_cast(kind)2708	}2709	fn cast(syntax: SyntaxToken) -> Option<Self> {2710		let kind = CustomErrorKind::cast(syntax.kind())?;2711		Some(CustomError { syntax, kind })2712	}2713	fn syntax(&self) -> &SyntaxToken {2714		&self.syntax2715	}2716}2717impl CustomErrorKind {2718	fn can_cast(kind: SyntaxKind) -> bool {2719		match kind {2720			ERROR_MISSING_TOKEN | ERROR_UNEXPECTED_TOKEN | ERROR_CUSTOM => true,2721			_ => false,2722		}2723	}2724	pub fn cast(kind: SyntaxKind) -> Option<Self> {2725		let res = match kind {2726			ERROR_MISSING_TOKEN => Self::ErrorMissingToken,2727			ERROR_UNEXPECTED_TOKEN => Self::ErrorUnexpectedToken,2728			ERROR_CUSTOM => Self::ErrorCustom,2729			_ => return None,2730		};2731		Some(res)2732	}2733}2734impl CustomError {2735	pub fn kind(&self) -> CustomErrorKind {2736		self.kind2737	}2738}2739impl std::fmt::Display for CustomError {2740	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2741		std::fmt::Display::fmt(self.syntax(), f)2742	}2743}2744impl std::fmt::Display for Suffix {2745	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2746		std::fmt::Display::fmt(self.syntax(), f)2747	}2748}2749impl std::fmt::Display for Bind {2750	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2751		std::fmt::Display::fmt(self.syntax(), f)2752	}2753}2754impl std::fmt::Display for Stmt {2755	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2756		std::fmt::Display::fmt(self.syntax(), f)2757	}2758}2759impl std::fmt::Display for ObjBody {2760	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2761		std::fmt::Display::fmt(self.syntax(), f)2762	}2763}2764impl std::fmt::Display for CompSpec {2765	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2766		std::fmt::Display::fmt(self.syntax(), f)2767	}2768}2769impl std::fmt::Display for ExprBase {2770	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2771		std::fmt::Display::fmt(self.syntax(), f)2772	}2773}2774impl std::fmt::Display for MemberComp {2775	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2776		std::fmt::Display::fmt(self.syntax(), f)2777	}2778}2779impl std::fmt::Display for Member {2780	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2781		std::fmt::Display::fmt(self.syntax(), f)2782	}2783}2784impl std::fmt::Display for FieldName {2785	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2786		std::fmt::Display::fmt(self.syntax(), f)2787	}2788}2789impl std::fmt::Display for Destruct {2790	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2791		std::fmt::Display::fmt(self.syntax(), f)2792	}2793}2794impl std::fmt::Display for DestructArrayPart {2795	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2796		std::fmt::Display::fmt(self.syntax(), f)2797	}2798}2799impl std::fmt::Display for SourceFile {2800	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2801		std::fmt::Display::fmt(self.syntax(), f)2802	}2803}2804impl std::fmt::Display for Expr {2805	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2806		std::fmt::Display::fmt(self.syntax(), f)2807	}2808}2809impl std::fmt::Display for SuffixIndex {2810	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2811		std::fmt::Display::fmt(self.syntax(), f)2812	}2813}2814impl std::fmt::Display for Name {2815	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2816		std::fmt::Display::fmt(self.syntax(), f)2817	}2818}2819impl std::fmt::Display for SuffixIndexExpr {2820	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2821		std::fmt::Display::fmt(self.syntax(), f)2822	}2823}2824impl std::fmt::Display for SuffixSlice {2825	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2826		std::fmt::Display::fmt(self.syntax(), f)2827	}2828}2829impl std::fmt::Display for SliceDesc {2830	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2831		std::fmt::Display::fmt(self.syntax(), f)2832	}2833}2834impl std::fmt::Display for SuffixApply {2835	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2836		std::fmt::Display::fmt(self.syntax(), f)2837	}2838}2839impl std::fmt::Display for ArgsDesc {2840	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2841		std::fmt::Display::fmt(self.syntax(), f)2842	}2843}2844impl std::fmt::Display for StmtLocal {2845	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2846		std::fmt::Display::fmt(self.syntax(), f)2847	}2848}2849impl std::fmt::Display for StmtAssert {2850	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2851		std::fmt::Display::fmt(self.syntax(), f)2852	}2853}2854impl std::fmt::Display for Assertion {2855	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2856		std::fmt::Display::fmt(self.syntax(), f)2857	}2858}2859impl std::fmt::Display for ExprBinary {2860	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2861		std::fmt::Display::fmt(self.syntax(), f)2862	}2863}2864impl std::fmt::Display for ExprUnary {2865	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2866		std::fmt::Display::fmt(self.syntax(), f)2867	}2868}2869impl std::fmt::Display for ExprObjExtend {2870	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2871		std::fmt::Display::fmt(self.syntax(), f)2872	}2873}2874impl std::fmt::Display for ExprParened {2875	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2876		std::fmt::Display::fmt(self.syntax(), f)2877	}2878}2879impl std::fmt::Display for ExprLiteral {2880	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2881		std::fmt::Display::fmt(self.syntax(), f)2882	}2883}2884impl std::fmt::Display for ExprString {2885	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2886		std::fmt::Display::fmt(self.syntax(), f)2887	}2888}2889impl std::fmt::Display for ExprNumber {2890	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2891		std::fmt::Display::fmt(self.syntax(), f)2892	}2893}2894impl std::fmt::Display for ExprArray {2895	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2896		std::fmt::Display::fmt(self.syntax(), f)2897	}2898}2899impl std::fmt::Display for ExprObject {2900	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2901		std::fmt::Display::fmt(self.syntax(), f)2902	}2903}2904impl std::fmt::Display for ExprArrayComp {2905	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2906		std::fmt::Display::fmt(self.syntax(), f)2907	}2908}2909impl std::fmt::Display for ExprImport {2910	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2911		std::fmt::Display::fmt(self.syntax(), f)2912	}2913}2914impl std::fmt::Display for ExprVar {2915	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2916		std::fmt::Display::fmt(self.syntax(), f)2917	}2918}2919impl std::fmt::Display for ExprIfThenElse {2920	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2921		std::fmt::Display::fmt(self.syntax(), f)2922	}2923}2924impl std::fmt::Display for TrueExpr {2925	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2926		std::fmt::Display::fmt(self.syntax(), f)2927	}2928}2929impl std::fmt::Display for FalseExpr {2930	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2931		std::fmt::Display::fmt(self.syntax(), f)2932	}2933}2934impl std::fmt::Display for ExprFunction {2935	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2936		std::fmt::Display::fmt(self.syntax(), f)2937	}2938}2939impl std::fmt::Display for ParamsDesc {2940	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2941		std::fmt::Display::fmt(self.syntax(), f)2942	}2943}2944impl std::fmt::Display for ExprError {2945	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2946		std::fmt::Display::fmt(self.syntax(), f)2947	}2948}2949impl std::fmt::Display for SliceDescEnd {2950	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2951		std::fmt::Display::fmt(self.syntax(), f)2952	}2953}2954impl std::fmt::Display for SliceDescStep {2955	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2956		std::fmt::Display::fmt(self.syntax(), f)2957	}2958}2959impl std::fmt::Display for Arg {2960	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2961		std::fmt::Display::fmt(self.syntax(), f)2962	}2963}2964impl std::fmt::Display for ObjBodyComp {2965	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2966		std::fmt::Display::fmt(self.syntax(), f)2967	}2968}2969impl std::fmt::Display for ObjBodyMemberList {2970	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2971		std::fmt::Display::fmt(self.syntax(), f)2972	}2973}2974impl std::fmt::Display for MemberBindStmt {2975	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2976		std::fmt::Display::fmt(self.syntax(), f)2977	}2978}2979impl std::fmt::Display for ObjLocal {2980	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2981		std::fmt::Display::fmt(self.syntax(), f)2982	}2983}2984impl std::fmt::Display for MemberAssertStmt {2985	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2986		std::fmt::Display::fmt(self.syntax(), f)2987	}2988}2989impl std::fmt::Display for MemberFieldNormal {2990	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2991		std::fmt::Display::fmt(self.syntax(), f)2992	}2993}2994impl std::fmt::Display for Visibility {2995	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2996		std::fmt::Display::fmt(self.syntax(), f)2997	}2998}2999impl std::fmt::Display for MemberFieldMethod {3000	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3001		std::fmt::Display::fmt(self.syntax(), f)3002	}3003}3004impl std::fmt::Display for FieldNameFixed {3005	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3006		std::fmt::Display::fmt(self.syntax(), f)3007	}3008}3009impl std::fmt::Display for FieldNameDynamic {3010	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3011		std::fmt::Display::fmt(self.syntax(), f)3012	}3013}3014impl std::fmt::Display for ForSpec {3015	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3016		std::fmt::Display::fmt(self.syntax(), f)3017	}3018}3019impl std::fmt::Display for IfSpec {3020	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3021		std::fmt::Display::fmt(self.syntax(), f)3022	}3023}3024impl std::fmt::Display for BindDestruct {3025	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3026		std::fmt::Display::fmt(self.syntax(), f)3027	}3028}3029impl std::fmt::Display for BindFunction {3030	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3031		std::fmt::Display::fmt(self.syntax(), f)3032	}3033}3034impl std::fmt::Display for Param {3035	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3036		std::fmt::Display::fmt(self.syntax(), f)3037	}3038}3039impl std::fmt::Display for DestructFull {3040	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3041		std::fmt::Display::fmt(self.syntax(), f)3042	}3043}3044impl std::fmt::Display for DestructSkip {3045	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3046		std::fmt::Display::fmt(self.syntax(), f)3047	}3048}3049impl std::fmt::Display for DestructArray {3050	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3051		std::fmt::Display::fmt(self.syntax(), f)3052	}3053}3054impl std::fmt::Display for DestructObject {3055	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3056		std::fmt::Display::fmt(self.syntax(), f)3057	}3058}3059impl std::fmt::Display for DestructObjectField {3060	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3061		std::fmt::Display::fmt(self.syntax(), f)3062	}3063}3064impl std::fmt::Display for DestructRest {3065	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3066		std::fmt::Display::fmt(self.syntax(), f)3067	}3068}3069impl std::fmt::Display for DestructArrayElement {3070	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3071		std::fmt::Display::fmt(self.syntax(), f)3072	}3073}
modifiedcrates/jrsonnet-rowan-parser/src/marker.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/marker.rs
+++ b/crates/jrsonnet-rowan-parser/src/marker.rs
@@ -3,9 +3,9 @@
 use drop_bomb::DropBomb;
 
 use crate::{
+	SyntaxKind,
 	event::Event,
 	parser::{ExpectedSyntax, Parser, SyntaxError},
-	SyntaxKind,
 };
 
 // pub struct Ranger {
modifiedcrates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/parser.rs
+++ b/crates/jrsonnet-rowan-parser/src/parser.rs
@@ -3,13 +3,13 @@
 use rowan::{GreenNode, TextRange};
 
 use crate::{
+	AstToken, SyntaxKind,
+	SyntaxKind::*,
+	SyntaxNode, T, TS,
 	event::Event,
 	marker::{CompletedMarker, Marker},
 	nodes::{BinaryOperatorKind, Literal, Number, Text, UnaryOperatorKind},
 	token_set::SyntaxKindSet,
-	AstToken, SyntaxKind,
-	SyntaxKind::*,
-	SyntaxNode, T, TS,
 };
 
 pub struct Parse {
@@ -923,8 +923,7 @@
 
 		let m = p.start();
 		p.bump();
-		let _ = expr_binding_power(p, right_binding_power)
-			.map(|v| v.precede(p).complete(p, EXPR));
+		let _ = expr_binding_power(p, right_binding_power).map(|v| v.precede(p).complete(p, EXPR));
 		m.complete(p, EXPR_UNARY)
 	} else if p.at(T!['(']) {
 		let m = p.start();
modifiedcrates/jrsonnet-rowan-parser/src/tests.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/tests.rs
+++ b/crates/jrsonnet-rowan-parser/src/tests.rs
@@ -3,7 +3,7 @@
 
 use hi_doc::{Formatting, SnippetBuilder, Text};
 
-use crate::{parse, AstNode};
+use crate::{AstNode, parse};
 
 fn process(text: &str) -> String {
 	use std::fmt::Write;
modifiedcrates/jrsonnet-stdlib/Cargo.tomldiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/Cargo.toml
+++ b/crates/jrsonnet-stdlib/Cargo.toml
@@ -17,8 +17,8 @@
 exp-bigint = ["dep:num-bigint", "jrsonnet-evaluator/exp-bigint"]
 
 exp-null-coaelse = [
-	"jrsonnet-ir/exp-null-coaelse",
-	"jrsonnet-evaluator/exp-null-coaelse",
+  "jrsonnet-ir/exp-null-coaelse",
+  "jrsonnet-evaluator/exp-null-coaelse",
 ]
 # std.regexMatch and other helpers
 exp-regex = ["dep:regex", "dep:lru", "dep:rustc-hash"]
modifiedcrates/jrsonnet-stdlib/src/arrays.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/arrays.rs
+++ b/crates/jrsonnet-stdlib/src/arrays.rs
@@ -1,12 +1,11 @@
 #![allow(non_snake_case)]
 
 use jrsonnet_evaluator::{
-	bail,
-	function::{builtin, FuncVal, NativeFn},
+	Either, IStr, ObjValue, ObjValueBuilder, Result, ResultExt, Thunk, Val, bail,
+	function::{FuncVal, NativeFn, builtin},
 	runtime_error,
 	typed::{BoundedI32, BoundedUsize, Either2, FromUntyped},
-	val::{equals, ArrValue, IndexableVal},
-	Either, IStr, ObjValue, ObjValueBuilder, Result, ResultExt, Thunk, Val,
+	val::{ArrValue, IndexableVal, equals},
 };
 
 pub fn eval_on_empty(on_empty: Option<Thunk<Val>>) -> Result<Val> {
modifiedcrates/jrsonnet-stdlib/src/compat.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/compat.rs
+++ b/crates/jrsonnet-stdlib/src/compat.rs
@@ -1,7 +1,7 @@
 use std::cmp::Ordering;
 
 use jrsonnet_evaluator::{
-	function::builtin, operator::evaluate_compare_op, val::ArrValue, Result, Val,
+	Result, Val, function::builtin, operator::evaluate_compare_op, val::ArrValue,
 };
 
 #[builtin]
modifiedcrates/jrsonnet-stdlib/src/encoding.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/encoding.rs
+++ b/crates/jrsonnet-stdlib/src/encoding.rs
@@ -1,10 +1,9 @@
-use base64::{engine::general_purpose::STANDARD, Engine};
+use base64::{Engine, engine::general_purpose::STANDARD};
 use jrsonnet_evaluator::{
-	bail,
+	IBytes, IStr, Result, bail,
 	function::builtin,
 	runtime_error,
 	typed::{Either, Either2},
-	IBytes, IStr, Result,
 };
 
 #[builtin]
modifiedcrates/jrsonnet-stdlib/src/hash.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/hash.rs
+++ b/crates/jrsonnet-stdlib/src/hash.rs
@@ -1,4 +1,4 @@
-use jrsonnet_evaluator::{function::builtin, IStr};
+use jrsonnet_evaluator::{IStr, function::builtin};
 
 #[builtin]
 pub fn builtin_md5(s: IStr) -> String {
modifiedcrates/jrsonnet-stdlib/src/keyf.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/keyf.rs
+++ b/crates/jrsonnet-stdlib/src/keyf.rs
@@ -1,6 +1,8 @@
-use jrsonnet_evaluator::function::{CallLocation, FuncVal, PreparedFuncVal};
-use jrsonnet_evaluator::typed::{ComplexValType, FromUntyped, Typed, ValType};
-use jrsonnet_evaluator::{Error, Result, Thunk, Val};
+use jrsonnet_evaluator::{
+	Error, Result, Thunk, Val,
+	function::{CallLocation, FuncVal, PreparedFuncVal},
+	typed::{ComplexValType, FromUntyped, Typed, ValType},
+};
 
 #[derive(Default, Clone)]
 pub enum KeyF {
modifiedcrates/jrsonnet-stdlib/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/lib.rs
+++ b/crates/jrsonnet-stdlib/src/lib.rs
@@ -12,12 +12,12 @@
 pub use encoding::*;
 pub use hash::*;
 use jrsonnet_evaluator::{
+	ContextBuilder, IStr, ObjValue, ObjValueBuilder, Thunk, Val,
 	error::Result,
 	function::{CallLocation, FuncVal},
 	tla::TlaArg,
 	trace::PathResolver,
 	val::NumValue,
-	ContextBuilder, IStr, ObjValue, ObjValueBuilder, Thunk, Val,
 };
 use jrsonnet_gcmodule::{Acyclic, Cc, Trace};
 use jrsonnet_ir::Source;
modifiedcrates/jrsonnet-stdlib/src/manifest/ini.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/manifest/ini.rs
+++ b/crates/jrsonnet-stdlib/src/manifest/ini.rs
@@ -1,9 +1,9 @@
 use std::collections::BTreeMap;
 
 use jrsonnet_evaluator::{
+	IStr, ObjValue, Result, ResultExt, Val,
 	manifest::{ManifestFormat, ToStringFormat},
 	typed::{FromUntyped, Typed},
-	IStr, ObjValue, Result, ResultExt, Val,
 };
 
 pub struct IniFormat {
modifiedcrates/jrsonnet-stdlib/src/manifest/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/manifest/mod.rs
+++ b/crates/jrsonnet-stdlib/src/manifest/mod.rs
@@ -6,9 +6,9 @@
 
 pub use ini::IniFormat;
 use jrsonnet_evaluator::{
+	IStr, ObjValue, Result, Val,
 	function::builtin,
-	manifest::{escape_string_json, JsonFormat, YamlStreamFormat},
-	IStr, ObjValue, Result, Val,
+	manifest::{JsonFormat, YamlStreamFormat, escape_string_json},
 };
 pub use python::{PythonFormat, PythonVarsFormat};
 pub use toml::TomlFormat;
modifiedcrates/jrsonnet-stdlib/src/manifest/python.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/manifest/python.rs
+++ b/crates/jrsonnet-stdlib/src/manifest/python.rs
@@ -1,7 +1,6 @@
 use jrsonnet_evaluator::{
-	bail,
-	manifest::{escape_string_json_buf, ManifestFormat, ToStringFormat},
-	Result, Val,
+	Result, Val, bail,
+	manifest::{ManifestFormat, ToStringFormat, escape_string_json_buf},
 };
 
 pub struct PythonFormat {
modifiedcrates/jrsonnet-stdlib/src/manifest/toml.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/manifest/toml.rs
+++ b/crates/jrsonnet-stdlib/src/manifest/toml.rs
@@ -1,10 +1,9 @@
 use std::borrow::Cow;
 
 use jrsonnet_evaluator::{
-	bail, in_description_frame,
-	manifest::{escape_string_json_buf, ManifestFormat},
+	IStr, ObjValue, Result, ResultExt, Val, bail, in_description_frame,
+	manifest::{ManifestFormat, escape_string_json_buf},
 	val::ArrValue,
-	IStr, ObjValue, Result, ResultExt, Val,
 };
 
 pub struct TomlFormat<'s> {
modifiedcrates/jrsonnet-stdlib/src/manifest/xml.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/manifest/xml.rs
+++ b/crates/jrsonnet-stdlib/src/manifest/xml.rs
@@ -1,9 +1,8 @@
 use jrsonnet_evaluator::{
-	bail, in_description_frame,
+	Either, ObjValue, Result, ResultExt, Val, bail, in_description_frame,
 	manifest::{ManifestFormat, ToStringFormat},
 	typed::{ComplexValType, Either2, FromUntyped, Typed, ValType},
 	val::ArrValue,
-	Either, ObjValue, Result, ResultExt, Val,
 };
 
 pub struct XmlJsonmlFormat {
modifiedcrates/jrsonnet-stdlib/src/manifest/yaml.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/manifest/yaml.rs
+++ b/crates/jrsonnet-stdlib/src/manifest/yaml.rs
@@ -1,9 +1,8 @@
 use std::{borrow::Cow, fmt::Write};
 
 use jrsonnet_evaluator::{
-	bail, in_description_frame,
-	manifest::{escape_string_json_buf, ManifestFormat},
-	Result, ResultExt, Val,
+	Result, ResultExt, Val, bail, in_description_frame,
+	manifest::{ManifestFormat, escape_string_json_buf},
 };
 
 pub struct YamlFormat<'s> {
modifiedcrates/jrsonnet-stdlib/src/math.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/math.rs
+++ b/crates/jrsonnet-stdlib/src/math.rs
@@ -9,11 +9,7 @@
 
 #[builtin]
 pub fn builtin_sign(n: f64) -> f64 {
-	if n == 0. {
-		0.
-	} else {
-		n.signum()
-	}
+	if n == 0. { 0. } else { n.signum() }
 }
 
 #[builtin]
modifiedcrates/jrsonnet-stdlib/src/misc.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/misc.rs
+++ b/crates/jrsonnet-stdlib/src/misc.rs
@@ -1,13 +1,12 @@
 use std::{cell::RefCell, collections::BTreeSet};
 
 use jrsonnet_evaluator::{
-	bail,
+	Either, IStr, ObjValue, ObjValueBuilder, ResultExt, Thunk, Val, bail,
 	error::{ErrorKind::*, Result},
-	function::{builtin, CallLocation, FuncVal},
+	function::{CallLocation, FuncVal, builtin},
 	manifest::JsonFormat,
 	typed::{Either2, Either4},
-	val::{equals, ArrValue},
-	Either, IStr, ObjValue, ObjValueBuilder, ResultExt, Thunk, Val,
+	val::{ArrValue, equals},
 };
 use jrsonnet_gcmodule::Cc;
 
@@ -202,7 +201,9 @@
 	for field in target_fields.union(&patch_fields) {
 		let Some(field_patch) = patch.get(field.clone())? else {
 			// All lazy fields might be unified into a single filtered object core instead of creating a thunk per, but this implementation is good enough.
-			let target_field = target.get_lazy(field.clone()).expect("we're iterating over fields union, if field is missing in patch - it exists in target");
+			let target_field = target.get_lazy(field.clone()).expect(
+				"we're iterating over fields union, if field is missing in patch - it exists in target",
+			);
 			out.field(field.clone()).thunk(target_field);
 			continue;
 		};
modifiedcrates/jrsonnet-stdlib/src/objects.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/objects.rs
+++ b/crates/jrsonnet-stdlib/src/objects.rs
@@ -1,9 +1,9 @@
 use jrsonnet_evaluator::{
+	IStr, ObjValue, ObjValueBuilder,
 	function::builtin,
 	gc::WithCapacityExt,
 	rustc_hash::FxHashSet,
 	val::{ArrValue, Val},
-	IStr, ObjValue, ObjValueBuilder,
 };
 
 #[builtin]
modifiedcrates/jrsonnet-stdlib/src/operator.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/operator.rs
+++ b/crates/jrsonnet-stdlib/src/operator.rs
@@ -2,12 +2,12 @@
 //! However, in our case we instead implement them in native, and implement native functions on top of core for backwards compatibility
 
 use jrsonnet_evaluator::{
+	IStr, Result, Val,
 	function::builtin,
 	operator::evaluate_mod_op,
 	stdlib::std_format,
 	typed::{Either, Either2},
-	val::{equals, primitive_equals, NumValue},
-	IStr, Result, Val,
+	val::{NumValue, equals, primitive_equals},
 };
 
 #[builtin]
modifiedcrates/jrsonnet-stdlib/src/parse.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/parse.rs
+++ b/crates/jrsonnet-stdlib/src/parse.rs
@@ -1,4 +1,4 @@
-use jrsonnet_evaluator::{function::builtin, runtime_error, IStr, Result, Val};
+use jrsonnet_evaluator::{IStr, Result, Val, function::builtin, runtime_error};
 
 #[builtin]
 pub fn builtin_parse_json(str: IStr) -> Result<Val> {
modifiedcrates/jrsonnet-stdlib/src/regex.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/regex.rs
+++ b/crates/jrsonnet-stdlib/src/regex.rs
@@ -2,11 +2,11 @@
 
 use ::regex::Regex;
 use jrsonnet_evaluator::{
+	IStr, ObjValue, ObjValueBuilder,
 	error::{ErrorKind::*, Result},
 	rustc_hash::FxBuildHasher,
 	typed::{IntoUntyped, Typed},
 	val::StrValue,
-	IStr, ObjValue, ObjValueBuilder,
 };
 use jrsonnet_gcmodule::Acyclic;
 use jrsonnet_macros::builtin;
modifiedcrates/jrsonnet-stdlib/src/sets.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/sets.rs
+++ b/crates/jrsonnet-stdlib/src/sets.rs
@@ -1,7 +1,7 @@
 use std::cmp::Ordering;
 
 use jrsonnet_evaluator::{
-	function::builtin, operator::evaluate_compare_op, val::ArrValue, Result, Thunk, Val,
+	Result, Thunk, Val, function::builtin, operator::evaluate_compare_op, val::ArrValue,
 };
 use jrsonnet_ir::BinaryOpType;
 
modifiedcrates/jrsonnet-stdlib/src/sort.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/sort.rs
+++ b/crates/jrsonnet-stdlib/src/sort.rs
@@ -3,11 +3,10 @@
 use std::cmp::Ordering;
 
 use jrsonnet_evaluator::{
-	bail,
+	Result, Thunk, Val, bail,
 	function::builtin,
 	operator::evaluate_compare_op,
-	val::{equals, ArrValue},
-	Result, Thunk, Val,
+	val::{ArrValue, equals},
 };
 use jrsonnet_ir::BinaryOpType;
 
modifiedcrates/jrsonnet-stdlib/src/strings.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/strings.rs
+++ b/crates/jrsonnet-stdlib/src/strings.rs
@@ -1,12 +1,11 @@
 use std::collections::BTreeSet;
 
 use jrsonnet_evaluator::{
-	bail,
+	Either, IStr, Val, bail,
 	error::{ErrorKind::*, Result},
 	function::builtin,
 	typed::{Either2, FromUntyped, M1},
 	val::{ArrValue, IndexableVal},
-	Either, IStr, Val,
 };
 
 #[builtin]
@@ -206,8 +205,8 @@
 #[cfg(feature = "exp-bigint")]
 #[builtin]
 pub fn builtin_bigint(v: Either![f64, IStr]) -> Result<Val> {
+	use Either2::*;
 	use jrsonnet_evaluator::runtime_error;
-	use Either2::*;
 	Ok(match v {
 		A(a) => {
 			Val::BigInt(Box::new(a.to_string().parse().map_err(|e| {
modifiedcrates/jrsonnet-stdlib/src/types.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/types.rs
+++ b/crates/jrsonnet-stdlib/src/types.rs
@@ -1,4 +1,4 @@
-use jrsonnet_evaluator::{function::builtin, IStr, Val};
+use jrsonnet_evaluator::{IStr, Val, function::builtin};
 
 #[builtin]
 pub fn builtin_type(x: Val) -> IStr {
modifiedflake.lockdiffbeforeafterboth
--- a/flake.lock
+++ b/flake.lock
@@ -2,18 +2,40 @@
   "nodes": {
     "crane": {
       "locked": {
-        "lastModified": 1770419512,
-        "owner": "ipetkov",
+        "lastModified": 1775245625,
+        "owner": "CertainLach",
         "repo": "crane",
-        "rev": "2510f2cbc3ccd237f700bb213756a8f35c32d8d7",
+        "rev": "9c67a3098774323d0270004eed7d7291ddcfe918",
         "type": "github"
       },
       "original": {
-        "owner": "ipetkov",
+        "owner": "CertainLach",
+        "ref": "refactor/drop-remarshal",
         "repo": "crane",
         "type": "github"
       }
     },
+    "fenix": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "rust-analyzer-src": "rust-analyzer-src"
+      },
+      "locked": {
+        "lastModified": 1775272531,
+        "owner": "CertainLach",
+        "repo": "fenix",
+        "rev": "831116e5887552af53f2998dcb46e1d55dc0850e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "CertainLach",
+        "ref": "fix/libatomic",
+        "repo": "fenix",
+        "type": "github"
+      }
+    },
     "flake-parts": {
       "inputs": {
         "nixpkgs-lib": [
@@ -21,10 +43,10 @@
         ]
       },
       "locked": {
-        "lastModified": 1769996383,
+        "lastModified": 1775087534,
         "owner": "hercules-ci",
         "repo": "flake-parts",
-        "rev": "57928607ea566b5db3ad13af0e57e921e6b12381",
+        "rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b",
         "type": "github"
       },
       "original": {
@@ -33,12 +55,34 @@
         "type": "github"
       }
     },
+    "hercules-ci-effects": {
+      "inputs": {
+        "flake-parts": [
+          "flake-parts"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1773550609,
+        "owner": "hercules-ci",
+        "repo": "hercules-ci-effects",
+        "rev": "554f6ed448ca74c00aa2371cde901ae1e73005b9",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "hercules-ci-effects",
+        "type": "github"
+      }
+    },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1770468184,
+        "lastModified": 1775270577,
         "owner": "nixos",
         "repo": "nixpkgs",
-        "rev": "a124a10ea33a73329c42d67f30efcdbfb60a4e04",
+        "rev": "9370b0614498381a0019e082c10e9cf8413e7c2c",
         "type": "github"
       },
       "original": {
@@ -51,28 +95,28 @@
     "root": {
       "inputs": {
         "crane": "crane",
+        "fenix": "fenix",
         "flake-parts": "flake-parts",
+        "hercules-ci-effects": "hercules-ci-effects",
         "nixpkgs": "nixpkgs",
-        "rust-overlay": "rust-overlay",
-        "shelly": "shelly"
+        "shelly": "shelly",
+        "treefmt-nix": "treefmt-nix"
       }
     },
-    "rust-overlay": {
-      "inputs": {
-        "nixpkgs": [
-          "nixpkgs"
-        ]
-      },
+    "rust-analyzer-src": {
+      "flake": false,
       "locked": {
-        "lastModified": 1770433312,
-        "owner": "oxalica",
-        "repo": "rust-overlay",
-        "rev": "9922ff9f99a6436756cbe6f5d11f9c3630e58cf0",
+        "lastModified": 1775174431,
+        "narHash": "sha256-jSw1C5MuyySiCpPgjdR+H0wPR3AgPRuylLunw+yd7A0=",
+        "owner": "rust-lang",
+        "repo": "rust-analyzer",
+        "rev": "9767050b2db436f5a770c5f91a548c88fd91ec71",
         "type": "github"
       },
       "original": {
-        "owner": "oxalica",
-        "repo": "rust-overlay",
+        "owner": "rust-lang",
+        "ref": "nightly",
+        "repo": "rust-analyzer",
         "type": "github"
       }
     },
@@ -89,6 +133,25 @@
         "repo": "shelly",
         "type": "github"
       }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1775125835,
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "75925962939880974e3ab417879daffcba36c4a3",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
     }
   },
   "root": "root",
modifiedflake.nixdiffbeforeafterboth
--- a/flake.nix
+++ b/flake.nix
@@ -2,46 +2,219 @@
   description = "Jrsonnet";
   inputs = {
     nixpkgs.url = "github:nixos/nixpkgs/release-25.11";
-    rust-overlay = {
-      url = "github:oxalica/rust-overlay";
+    fenix = {
+      url = "github:CertainLach/fenix/fix/libatomic";
       inputs.nixpkgs.follows = "nixpkgs";
     };
     flake-parts = {
       url = "github:hercules-ci/flake-parts";
       inputs.nixpkgs-lib.follows = "nixpkgs";
     };
-    crane.url = "github:ipetkov/crane";
+    hercules-ci-effects = {
+      url = "github:hercules-ci/hercules-ci-effects";
+      inputs.flake-parts.follows = "flake-parts";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+    treefmt-nix = {
+      url = "github:numtide/treefmt-nix";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+    crane.url = "github:CertainLach/crane/refactor/drop-remarshal";
     shelly.url = "github:CertainLach/shelly";
   };
   outputs =
-    inputs@{
-      nixpkgs,
-      flake-parts,
-      rust-overlay,
-      crane,
-      shelly,
-      ...
-    }:
-    flake-parts.lib.mkFlake { inherit inputs; } {
-      imports = [ shelly.flakeModule ];
-      systems = inputs.nixpkgs.lib.systems.flakeExposed;
+    inputs:
+    let
+      inherit (inputs.nixpkgs.lib)
+        mkIf
+        mkForce
+        optionals
+        optionalAttrs
+        ;
+    in
+    inputs.flake-parts.lib.mkFlake { inherit inputs; } {
+      imports = [
+        inputs.shelly.flakeModule
+        inputs.hercules-ci-effects.flakeModule
+      ];
+      systems = [
+        "x86_64-linux"
+        "i686-linux"
+        "aarch64-linux"
+        "armv7l-linux"
+        "aarch64-darwin"
+      ];
       perSystem =
         {
           config,
+          self',
           system,
           ...
         }:
         let
-          pkgs = import nixpkgs {
+          pkgs = import inputs.nixpkgs {
             inherit system;
-            overlays = [ rust-overlay.overlays.default ];
+            overlays = [ inputs.fenix.overlays.default ];
             config.allowUnsupportedSystem = true;
+            config.allowUnfreePredicate = pkg: pkg.name == "Xcode.app";
+          };
+          targetArch = pkgs.stdenv.hostPlatform.parsed.cpu.name;
+          rustfmt = (pkgs.fenix.complete or pkgs.fenix.stable).rustfmt;
+          toolchain = pkgs.fenix.combine [
+            (pkgs.fenix.stable.withComponents [
+              "cargo"
+              "clippy"
+              "rustc"
+              "rust-src"
+            ])
+            rustfmt
+          ];
+          craneLib = (inputs.crane.mkLib pkgs).overrideToolchain toolchain;
+          treefmt =
+            (inputs.treefmt-nix.lib.evalModule pkgs (import ./treefmt.nix { inherit rustfmt; })).config.build;
+
+          # Cross-compilation toolchains
+          crossToolchain = pkgs.fenix.combine [
+            (pkgs.fenix.stable.withComponents [
+              "cargo"
+              "rustc"
+            ])
+            pkgs.fenix.targets."${targetArch}-unknown-linux-musl".stable.rust-std
+            pkgs.fenix.targets."${targetArch}-apple-darwin".stable.rust-std
+          ];
+          craneLibCross = (inputs.crane.mkLib pkgs).overrideToolchain crossToolchain;
+
+          # Windows cross-compilation
+          pkgsWindows = import inputs.nixpkgs {
+            overlays = [ inputs.fenix.overlays.default ];
+            localSystem = system;
+            crossSystem = {
+              config = "${targetArch}-w64-mingw32";
+              libc = "msvcrt";
+            };
           };
-          rust = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
-          craneLib = (crane.mkLib pkgs).overrideToolchain rust;
+          windowsToolchain = pkgs.fenix.combine [
+            (pkgs.fenix.stable.withComponents [
+              "cargo"
+              "rustc"
+            ])
+            pkgs.fenix.targets."${targetArch}-pc-windows-gnu".stable.rust-std
+          ];
+          craneLibWindows = (inputs.crane.mkLib pkgsWindows).overrideToolchain (_: windowsToolchain);
+
         in
         {
           legacyPackages = {
+            release = optionalAttrs pkgs.stdenv.hostPlatform.isLinux (
+              {
+                jrsonnet-linux-glibc = self'.packages.jrsonnet;
+                jrsonnet-experimental-linux-glibc = self'.packages.jrsonnet-experimental;
+              }
+              // optionalAttrs pkgs.stdenv.hostPlatform.is64bit rec {
+                jrsonnet-linux-musl = pkgs.callPackage ./nix/jrsonnet-cross-musl.nix {
+                  craneLib = craneLibCross;
+                  targetTriple = "${targetArch}-unknown-linux-musl";
+                  muslCC = pkgs.pkgsMusl.stdenv.cc;
+                };
+                jrsonnet-experimental-linux-musl = jrsonnet-linux-musl.override {
+                  withExperimentalFeatures = true;
+                };
+              }
+              // optionalAttrs (targetArch == "aarch64") rec {
+                jrsonnet-darwin = pkgs.callPackage ./nix/jrsonnet-cross-darwin.nix {
+                  craneLib = craneLibCross;
+                  targetTriple = "${targetArch}-apple-darwin";
+                };
+                jrsonnet-experimental-darwin = jrsonnet-darwin.override {
+                  withExperimentalFeatures = true;
+                };
+              }
+              // optionalAttrs (targetArch == "x86_64") rec {
+                jrsonnet-windows = pkgsWindows.callPackage ./nix/jrsonnet-cross-windows.nix {
+                  craneLib = craneLibWindows;
+                  targetTriple = "${targetArch}-pc-windows-gnu";
+                };
+                jrsonnet-experimental-windows = jrsonnet-windows.override {
+                  withExperimentalFeatures = true;
+                };
+              }
+            );
+            benchmarks = optionalAttrs (system == "x86_64-linux" || system == "aarch64-linux") {
+              default = pkgs.callPackage ./nix/benchmarks.nix {
+                inherit (config.legacyPackages.jsonnetImpls)
+                  go-jsonnet
+                  sjsonnet
+                  cpp-jsonnet
+                  rsjsonnet
+                  ;
+                jrsonnetVariants = [
+                  {
+                    drv = self'.packages.jrsonnet.override { forBenchmarks = true; };
+                    name = "";
+                  }
+                ];
+              };
+              quick = pkgs.callPackage ./nix/benchmarks.nix {
+                inherit (config.legacyPackages.jsonnetImpls)
+                  go-jsonnet
+                  sjsonnet
+                  cpp-jsonnet
+                  rsjsonnet
+                  ;
+                quick = true;
+                jrsonnetVariants = [
+                  {
+                    drv = self'.packages.jrsonnet.override { forBenchmarks = true; };
+                    name = "";
+                  }
+                ];
+              };
+              against-release = pkgs.callPackage ./nix/benchmarks.nix {
+                inherit (config.legacyPackages.jsonnetImpls)
+                  go-jsonnet
+                  sjsonnet
+                  cpp-jsonnet
+                  rsjsonnet
+                  ;
+                jrsonnetVariants = [
+                  {
+                    drv = self'.packages.jrsonnet.override { forBenchmarks = true; };
+                    name = "current";
+                  }
+                  {
+                    drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };
+                    name = "current-experimental";
+                  }
+                  {
+                    drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };
+                    name = "release";
+                  }
+                ];
+              };
+              quick-against-release = pkgs.callPackage ./nix/benchmarks.nix {
+                inherit (config.legacyPackages.jsonnetImpls)
+                  go-jsonnet
+                  sjsonnet
+                  cpp-jsonnet
+                  rsjsonnet
+                  ;
+                quick = true;
+                jrsonnetVariants = [
+                  {
+                    drv = self'.packages.jrsonnet.override { forBenchmarks = true; };
+                    name = "current";
+                  }
+                  {
+                    drv = self'.packages.jrsonnet-experimental.override { forBenchmarks = true; };
+                    name = "current-experimental";
+                  }
+                  {
+                    drv = self'.legacyPackages.jsonnetImpls.jrsonnet-release.override { forBenchmarks = true; };
+                    name = "release";
+                  }
+                ];
+              };
+            };
             jsonnetImpls = {
               go-jsonnet = pkgs.callPackage ./nix/go-jsonnet.nix { };
               sjsonnet = pkgs.callPackage ./nix/sjsonnet.nix { };
@@ -49,101 +222,33 @@
               # I didn't managed to build it, and nixpkgs version is marked as broken
               # haskell-jsonnet = pkgs.callPackage ./nix/haskell-jsonnet.nix { };
               rsjsonnet = pkgs.callPackage ./nix/rsjsonnet.nix { };
+              # Older released version of jrsonnet itself, for benchmarking purposes
+              jrsonnet-release = pkgs.callPackage ./nix/jrsonnet-release.nix {
+                rustPlatform = pkgs.makeRustPlatform {
+                  rustc = toolchain;
+                  cargo = toolchain;
+                };
+              };
             };
           };
-          packages = rec {
-            default = jrsonnet;
-
-            jrsonnet = pkgs.callPackage ./nix/jrsonnet.nix {
-              inherit craneLib;
-            };
-            jrsonnet-experimental = pkgs.callPackage ./nix/jrsonnet.nix {
-              inherit craneLib;
-              withExperimentalFeatures = true;
-            };
-
-            jrsonnet-release = pkgs.callPackage ./nix/jrsonnet-release.nix {
-              rustPlatform = pkgs.makeRustPlatform {
-                rustc = rust;
-                cargo = rust;
+          packages =
+            let
+              jrsonnet = pkgs.callPackage ./nix/jrsonnet.nix {
+                inherit craneLib;
               };
-            };
-
-            benchmarks = pkgs.callPackage ./nix/benchmarks.nix {
-              inherit (config.legacyPackages.jsonnetImpls)
-                go-jsonnet
-                sjsonnet
-                cpp-jsonnet
-                rsjsonnet
-                ;
-              jrsonnetVariants = [
-                {
-                  drv = jrsonnet.override { forBenchmarks = true; };
-                  name = "";
-                }
-              ];
+              jrsonnet-experimental = pkgs.callPackage ./nix/jrsonnet.nix {
+                inherit craneLib;
+                withExperimentalFeatures = true;
+              };
+            in
+            {
+              default = jrsonnet;
+              inherit jrsonnet jrsonnet-experimental;
             };
-            benchmarks-quick = pkgs.callPackage ./nix/benchmarks.nix {
-              inherit (config.legacyPackages.jsonnetImpls)
-                go-jsonnet
-                sjsonnet
-                cpp-jsonnet
-                rsjsonnet
-                ;
-              quick = true;
-              jrsonnetVariants = [
-                {
-                  drv = jrsonnet.override { forBenchmarks = true; };
-                  name = "";
-                }
-              ];
-            };
-            benchmarks-against-release = pkgs.callPackage ./nix/benchmarks.nix {
-              inherit (config.legacyPackages.jsonnetImpls)
-                go-jsonnet
-                sjsonnet
-                cpp-jsonnet
-                rsjsonnet
-                ;
-              jrsonnetVariants = [
-                {
-                  drv = jrsonnet.override { forBenchmarks = true; };
-                  name = "current";
-                }
-                {
-                  drv = jrsonnet-experimental.override { forBenchmarks = true; };
-                  name = "current-experimental";
-                }
-                {
-                  drv = jrsonnet-release.override { forBenchmarks = true; };
-                  name = "release";
-                }
-              ];
-            };
-            benchmarks-quick-against-release = pkgs.callPackage ./nix/benchmarks.nix {
-              inherit (config.legacyPackages.jsonnetImpls)
-                go-jsonnet
-                sjsonnet
-                cpp-jsonnet
-                rsjsonnet
-                ;
-              quick = true;
-              jrsonnetVariants = [
-                {
-                  drv = jrsonnet.override { forBenchmarks = true; };
-                  name = "current";
-                }
-                {
-                  drv = jrsonnet-experimental.override { forBenchmarks = true; };
-                  name = "current-experimental";
-                }
-                {
-                  drv = jrsonnet-release.override { forBenchmarks = true; };
-                  name = "release";
-                }
-              ];
-            };
+          checks = optionalAttrs (system != "armv7l-linux") {
+            formatting = treefmt.check inputs.self;
           };
+          formatter = mkIf (system != "armv7l-linux") treefmt.wrapper;
           shelly.shells.default = {
             factory = craneLib.devShell;
             packages =
@@ -158,11 +263,126 @@
                 hyperfine
                 graphviz
               ]
-              ++ lib.optionals (!stdenv.isDarwin) [
+              ++ optionals (!stdenv.isDarwin) [
                 valgrind
                 kdePackages.kcachegrind
               ];
           };
         };
+      hercules-ci.github-releases.files =
+        let
+          rel = system: inputs.self.legacyPackages.${system}.release;
+          bin = drv: "${drv}/bin/jrsonnet";
+          exe = drv: "${drv}/bin/jrsonnet.exe";
+        in
+        [
+          {
+            label = "jrsonnet-x86_64-linux-musl";
+            path = bin (rel "x86_64-linux").jrsonnet-linux-musl;
+          }
+          {
+            label = "jrsonnet-experimental-x86_64-linux-musl";
+            path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-musl;
+          }
+          {
+            label = "jrsonnet-aarch64-darwin";
+            path = bin (rel "aarch64-linux").jrsonnet-darwin;
+          }
+          {
+            label = "jrsonnet-experimental-aarch64-darwin";
+            path = bin (rel "aarch64-linux").jrsonnet-experimental-darwin;
+          }
+          {
+            label = "jrsonnet-x86_64-windows.exe";
+            path = exe (rel "x86_64-linux").jrsonnet-windows;
+          }
+          {
+            label = "jrsonnet-experimental-x86_64-windows.exe";
+            path = exe (rel "x86_64-linux").jrsonnet-experimental-windows;
+          }
+
+          {
+            label = "jrsonnet-aarch64-linux-musl";
+            path = bin (rel "aarch64-linux").jrsonnet-linux-musl;
+          }
+          {
+            label = "jrsonnet-experimental-aarch64-linux-musl";
+            path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-musl;
+          }
+
+          {
+            label = "jrsonnet-x86_64-linux-glibc";
+            path = bin (rel "x86_64-linux").jrsonnet-linux-glibc;
+          }
+          {
+            label = "jrsonnet-experimental-x86_64-linux-glibc";
+            path = bin (rel "x86_64-linux").jrsonnet-experimental-linux-glibc;
+          }
+          {
+            label = "jrsonnet-aarch64-linux-glibc";
+            path = bin (rel "aarch64-linux").jrsonnet-linux-glibc;
+          }
+          {
+            label = "jrsonnet-experimental-aarch64-linux-glibc";
+            path = bin (rel "aarch64-linux").jrsonnet-experimental-linux-glibc;
+          }
+          {
+            label = "jrsonnet-i686-linux-glibc";
+            path = bin (rel "i686-linux").jrsonnet-linux-glibc;
+          }
+          {
+            label = "jrsonnet-experimental-i686-linux-glibc";
+            path = bin (rel "i686-linux").jrsonnet-experimental-linux-glibc;
+          }
+          {
+            label = "jrsonnet-armv7l-linux-glibc";
+            path = bin (rel "armv7l-linux").jrsonnet-linux-glibc;
+          }
+          {
+            label = "jrsonnet-experimental-armv7l-linux-glibc";
+            path = bin (rel "armv7l-linux").jrsonnet-experimental-linux-glibc;
+          }
+        ];
+      hercules-ci.cargo-publish = {
+        enable = true;
+        secretName = "crates-io";
+      };
+      hercules-ci.flake-update = {
+        enable = true;
+        baseMerge.enable = true;
+        baseMerge.method = "fast-forward";
+        when = {
+          dayOfWeek = [ "Sat" ];
+        };
+      };
+      herculesCI =
+        { lib, config, ... }:
+        {
+          ciSystems = [
+            "x86_64-linux"
+            "i686-linux"
+            "aarch64-linux"
+            "armv7l-linux"
+            # TODO: add workers for these platforms
+            # "aarch64-darwin"
+          ];
+          onPush.default.outputs = {
+            benchmarks.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.benchmarks.default;
+
+            # Cross: musl/mingw/darwin-zigbuild
+            release.x86_64-linux = inputs.self.legacyPackages.x86_64-linux.release;
+            release.aarch64-linux = inputs.self.legacyPackages.aarch64-linux.release;
+            release.armv7l-linux = inputs.self.legacyPackages.armv7l-linux.release;
+            release.i686-linux = inputs.self.legacyPackages.i686-linux.release;
+
+            # Too much to build for CI purposes
+            devShells = mkForce { };
+            formatter = mkForce { };
+
+            # No need to run them on different arch, pretty large derivations and might try to compile GHC
+            checks.i686-linux.formatting = mkForce { };
+            checks.aarch64-linux.formatting = mkForce { };
+          };
+        };
     };
 }
modifiednix/benchmarks.nixdiffbeforeafterboth
--- a/nix/benchmarks.nix
+++ b/nix/benchmarks.nix
@@ -53,7 +53,7 @@
 in
 stdenv.mkDerivation {
   name = "benchmarks";
-  __impure = true;
+  # __impure = true; # not supported by hercules-ci
   unpackPhase = "true";
 
   buildInputs = [
@@ -143,7 +143,9 @@
                 "\"sjsonnet-native $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala (native)\""
             } \
             ${
-              optionalString (skipScala == "")
+              # My aarch64-linux machine can't run graalvm image:
+              # The current machine does not support all of the following CPU features that are required by the image: [FP, ASIMD, CRC32, LSE].
+              optionalString (skipScala == "" && stdenv.hostPlatform.system != "aarch64-linux")
                 "\"sjsonnet-graalvm $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala (GraalVM)\""
             } \
             ${optionalString (skipCpp == "")
@@ -174,9 +176,14 @@
         echo "* C++: $(jsonnet --version)" >> $out
         echo "* Scala (native/GraalVM): $(sjsonnet-native 2>&1 | grep -oP 'Sjsonnet \S+')" >> $out
         echo "* Rust (alternative): rsjsonnet ${rsjsonnet.version} (${rsjsonnet.src.rev})" >> $out
-        ${concatStringsSep "\n" (forEach jrsonnetVariants (variant:
-          "echo \"* Rust${if variant.name != "" then " (${variant.name})" else ""}: $(${variant.drv}/bin/jrsonnet --version 2>&1)\" >> $out"
-        ))}
+        ${concatStringsSep "\n" (
+          forEach jrsonnetVariants (
+            variant:
+            "echo \"* Rust${
+              if variant.name != "" then " (${variant.name})" else ""
+            }: $(${variant.drv}/bin/jrsonnet --version 2>&1)\" >> $out"
+          )
+        )}
         echo "====" >> $out
         echo >> $out
       ''}
addednix/jrsonnet-cross-darwin.nixdiffbeforeafterboth
--- /dev/null
+++ b/nix/jrsonnet-cross-darwin.nix
@@ -0,0 +1,49 @@
+{
+  lib,
+  craneLib,
+  cargo-zigbuild,
+  zig,
+  darwin,
+  targetTriple,
+  withExperimentalFeatures ? false,
+}:
+let
+  inherit (lib) optionalString;
+in
+craneLib.buildPackage {
+  src = lib.cleanSourceWith {
+    src = ../.;
+    filter = path: type: (lib.hasSuffix ".jsonnet" path) || (craneLib.filterCargoSources path type);
+  };
+  pname = "jrsonnet";
+  version = "current${optionalString withExperimentalFeatures "-experimental"}";
+  strictDeps = true;
+
+  depsBuildBuild = [
+    zig
+    cargo-zigbuild
+  ];
+
+  nativeBuildInputs = [
+    darwin.xcode_12_2
+  ];
+
+  cargoExtraArgs = "-p jrsonnet";
+
+  buildPhaseCargoCommand = ''
+    export SDKROOT=${darwin.xcode_12_2}/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
+    export XDG_CACHE_HOME=$TMPDIR/xdg_cache
+    mkdir -p $XDG_CACHE_HOME
+    export CARGO_ZIGBUILD_CACHE_DIR=$TMPDIR/cargo-zigbuild-cache
+    mkdir -p $CARGO_ZIGBUILD_CACHE_DIR
+
+    HOME=$(mktemp -d)
+    cargo zigbuild --release --locked ${optionalString withExperimentalFeatures "--features=experimental"} --target=${targetTriple}
+  '';
+
+  doNotPostBuildInstallCargoBinaries = true;
+  installPhaseCommand = ''
+    mkdir -p $out/bin
+    cp target/${targetTriple}/release/jrsonnet $out/bin/jrsonnet
+  '';
+}
addednix/jrsonnet-cross-musl.nixdiffbeforeafterboth
--- /dev/null
+++ b/nix/jrsonnet-cross-musl.nix
@@ -0,0 +1,31 @@
+{
+  lib,
+  craneLib,
+  muslCC,
+  targetTriple,
+  withExperimentalFeatures ? false,
+}:
+let
+  targetEnv = builtins.replaceStrings [ "-" ] [ "_" ] targetTriple;
+  inherit (lib) optionalString;
+in
+craneLib.buildPackage {
+  src = lib.cleanSourceWith {
+    src = ../.;
+    filter = path: type: (lib.hasSuffix ".jsonnet" path) || (craneLib.filterCargoSources path type);
+  };
+  pname = "jrsonnet";
+  version = "current${optionalString withExperimentalFeatures "-experimental"}";
+  strictDeps = true;
+
+  cargoExtraArgs = "--locked --features=mimalloc${optionalString withExperimentalFeatures ",experimental"} --target=${targetTriple}";
+
+  "CC_${targetEnv}" = "${muslCC}/bin/${muslCC.targetPrefix}cc";
+  "CARGO_TARGET_${lib.toUpper targetEnv}_LINKER" = "${muslCC}/bin/${muslCC.targetPrefix}cc";
+
+  doNotPostBuildInstallCargoBinaries = true;
+  installPhaseCommand = ''
+    mkdir -p $out/bin
+    cp target/${targetTriple}/release/jrsonnet $out/bin/jrsonnet
+  '';
+}
addednix/jrsonnet-cross-windows.nixdiffbeforeafterboth
--- /dev/null
+++ b/nix/jrsonnet-cross-windows.nix
@@ -0,0 +1,26 @@
+{
+  lib,
+  craneLib,
+  targetTriple,
+  withExperimentalFeatures ? false,
+}:
+let
+  inherit (lib) optionalString;
+in
+craneLib.buildPackage {
+  src = lib.cleanSourceWith {
+    src = ../.;
+    filter = path: type: (lib.hasSuffix ".jsonnet" path) || (craneLib.filterCargoSources path type);
+  };
+  pname = "jrsonnet";
+  version = "current${optionalString withExperimentalFeatures "-experimental"}";
+  strictDeps = true;
+
+  cargoExtraArgs = "--locked ${optionalString withExperimentalFeatures "--features=experimental"} --target=${targetTriple}";
+
+  doNotPostBuildInstallCargoBinaries = true;
+  installPhaseCommand = ''
+    mkdir -p $out/bin
+    cp target/${targetTriple}/release/jrsonnet.exe $out/bin/jrsonnet.exe
+  '';
+}
modifiednix/jrsonnet-release.nixdiffbeforeafterboth
--- a/nix/jrsonnet-release.nix
+++ b/nix/jrsonnet-release.nix
@@ -18,10 +18,10 @@
   };
   cargoHash = "sha256-ZHmdlqakucapzXJz6L7ZJpmvqTutelN8qkWAD4uDJr8=";
 
-  cargoTestFlags = ["--package=jrsonnet --features=mimalloc,legacy-this-file"];
-  cargoBuildFlags = ["--package=jrsonnet --features=mimalloc,legacy-this-file"];
+  cargoTestFlags = [ "--package=jrsonnet --features=mimalloc,legacy-this-file" ];
+  cargoBuildFlags = [ "--package=jrsonnet --features=mimalloc,legacy-this-file" ];
 
-  buildInputs = [makeWrapper];
+  buildInputs = [ makeWrapper ];
 
   postInstall = ''
     wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000"
modifiednix/jrsonnet.nixdiffbeforeafterboth
--- a/nix/jrsonnet.nix
+++ b/nix/jrsonnet.nix
@@ -5,23 +5,23 @@
   withExperimentalFeatures ? false,
   forBenchmarks ? false,
 }:
-with lib;
-  craneLib.buildPackage {
-    src = lib.cleanSourceWith {
-      src = ../.;
-      filter = path: type:
-        (lib.hasSuffix "\.jsonnet" path)
-        || (craneLib.filterCargoSources path type);
-    };
-    pname = "jrsonnet";
-    version = "current${optionalString withExperimentalFeatures "-experimental"}";
+let
+  inherit (lib) optionalString;
+in
+craneLib.buildPackage {
+  src = lib.cleanSourceWith {
+    src = ../.;
+    filter = path: type: (lib.hasSuffix "\.jsonnet" path) || (craneLib.filterCargoSources path type);
+  };
+  pname = "jrsonnet";
+  version = "current${optionalString withExperimentalFeatures "-experimental"}";
 
-    cargoExtraArgs = "--locked --features=mimalloc${optionalString withExperimentalFeatures ",experimental"}";
+  cargoExtraArgs = "--locked --features=mimalloc${optionalString withExperimentalFeatures ",experimental"}";
 
-    nativeBuildInputs = [makeWrapper];
+  nativeBuildInputs = [ makeWrapper ];
 
-    # To clean-up hyperfine output
-    postInstall = optionalString forBenchmarks ''
-      wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000"
-    '';
-  }
+  # To clean-up hyperfine output
+  postInstall = optionalString forBenchmarks ''
+    wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000"
+  '';
+}
modifiednix/rsjsonnet.nixdiffbeforeafterboth
--- a/nix/rsjsonnet.nix
+++ b/nix/rsjsonnet.nix
@@ -16,7 +16,7 @@
 
   cargoHash = "sha256-0IDAxm4J2rEqfUGNYoQTP0RPrEZe4YPe2E6TT7A4THo=";
 
-  nativeBuildInputs = [makeWrapper];
+  nativeBuildInputs = [ makeWrapper ];
 
   postInstall = ''
     wrapProgram $out/bin/rsjsonnet --add-flags "--max-stack=200000"
modifiednix/sjsonnet.nixdiffbeforeafterboth
--- a/nix/sjsonnet.nix
+++ b/nix/sjsonnet.nix
@@ -17,29 +17,35 @@
   version = "0.6.2";
   baseUrl = "https://github.com/databricks/sjsonnet/releases/download/${version}";
 
-  nativePlatform = {
-    x86_64-linux = "linux-x86_64";
-    aarch64-linux = "linux-arm64";
-    aarch64-darwin = "darwin-arm64";
-    # Nobody cares about darwin on intel
-  }.${stdenv.hostPlatform.system} or (throw "unsupported system: ${stdenv.hostPlatform.system}");
+  nativePlatform =
+    {
+      x86_64-linux = "linux-x86_64";
+      aarch64-linux = "linux-arm64";
+      aarch64-darwin = "darwin-arm64";
+      # Nobody cares about darwin on intel
+    }
+    .${stdenv.hostPlatform.system} or (throw "unsupported system: ${stdenv.hostPlatform.system}");
 
   nativeSrc = fetchurl {
     url = "${baseUrl}/sjsonnet-${version}-${nativePlatform}";
-    hash = {
-      x86_64-linux = "sha256-r79Q6SovcPIomDDUYTGIP35/y5t9Xo5Z3ohP7pxsF8I=";
-      aarch64-linux = "sha256-LxWR94u1Oncau57Kmtzj2UFEofWGT4+laDTbRDkwv08=";
-      aarch64-darwin = "sha256-gNZ6XekMm+ebeD7UFeRfoapXw/90gHk8MoeGD86dzKk=";
-    }.${stdenv.hostPlatform.system};
+    hash =
+      {
+        x86_64-linux = "sha256-r79Q6SovcPIomDDUYTGIP35/y5t9Xo5Z3ohP7pxsF8I=";
+        aarch64-linux = "sha256-LxWR94u1Oncau57Kmtzj2UFEofWGT4+laDTbRDkwv08=";
+        aarch64-darwin = "sha256-gNZ6XekMm+ebeD7UFeRfoapXw/90gHk8MoeGD86dzKk=";
+      }
+      .${stdenv.hostPlatform.system};
   };
 
   graalvmSrc = fetchurl {
     url = "${baseUrl}/sjsonnet-graalvm-${version}-${nativePlatform}";
-    hash = {
-      x86_64-linux = "sha256-XNJCnQlwVFySrUevn1nLN/DY8UBGgvCFAitkedLB+yM=";
-      aarch64-linux = "sha256-J+C3pmiBEmo8M00IDHp9jznonibXmHVRlhsvQ4apVWw=";
-      aarch64-darwin = "sha256-TXNL52sS4NE3GjbOFtgf6aCP268qGKMFaoTwAfJfgGc=";
-    }.${stdenv.hostPlatform.system};
+    hash =
+      {
+        x86_64-linux = "sha256-XNJCnQlwVFySrUevn1nLN/DY8UBGgvCFAitkedLB+yM=";
+        aarch64-linux = "sha256-J+C3pmiBEmo8M00IDHp9jznonibXmHVRlhsvQ4apVWw=";
+        aarch64-darwin = "sha256-TXNL52sS4NE3GjbOFtgf6aCP268qGKMFaoTwAfJfgGc=";
+      }
+      .${stdenv.hostPlatform.system};
   };
 in
 stdenv.mkDerivation {
@@ -52,10 +58,18 @@
   };
 
   unpackPhase = "true";
-  nativeBuildInputs = [ makeWrapper ]
-    ++ lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook ];
-  buildInputs = [ java ]
-    ++ lib.optionals stdenv.hostPlatform.isLinux [ zlib openssl stdenv.cc.cc.lib ];
+  nativeBuildInputs = [
+    makeWrapper
+  ]
+  ++ lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook ];
+  buildInputs = [
+    java
+  ]
+  ++ lib.optionals stdenv.hostPlatform.isLinux [
+    zlib
+    openssl
+    stdenv.cc.cc.lib
+  ];
 
   installPhase = ''
     mkdir -p $out/bin $out/lib
modifiedrust-toolchain.tomldiffbeforeafterboth
--- a/rust-toolchain.toml
+++ b/rust-toolchain.toml
@@ -1,3 +1,3 @@
 [toolchain]
-channel = "1.93.0"
+channel = "stable"
 components = ["rustfmt", "clippy", "rust-analyzer", "rust-src"]
addedtreefmt.nixdiffbeforeafterboth
--- /dev/null
+++ b/treefmt.nix
@@ -0,0 +1,14 @@
+{ rustfmt }:
+{
+  settings.global.excludes = [
+    "*.jsonnet"
+    "*.libsonnet"
+  ];
+
+  programs.nixfmt.enable = true;
+  programs.rustfmt = {
+    enable = true;
+    package = rustfmt;
+  };
+  programs.taplo.enable = true;
+}
modifiedxtask/Cargo.tomldiffbeforeafterboth
--- a/xtask/Cargo.toml
+++ b/xtask/Cargo.toml
@@ -16,4 +16,4 @@
 quote.workspace = true
 ungrammar.workspace = true
 xshell.workspace = true
-clap = {workspace = true, features = ["derive"]}
+clap = { workspace = true, features = ["derive"] }
modifiedxtask/src/main.rsdiffbeforeafterboth
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -1,6 +1,6 @@
 use anyhow::Result;
 use clap::Parser;
-use xshell::{cmd, Shell};
+use xshell::{Shell, cmd};
 
 mod sourcegen;
 
@@ -68,7 +68,11 @@
 			if cachegrind {
 				let mut cachegrind_out = out.path().to_owned();
 				cachegrind_out.push("cachegrind.out.1");
-				cmd!(sh, "valgrind --tool=cachegrind --cachegrind-out-file={cachegrind_out} {built} {args...}").run()?;
+				cmd!(
+					sh,
+					"valgrind --tool=cachegrind --cachegrind-out-file={cachegrind_out} {built} {args...}"
+				)
+				.run()?;
 				cmd!(sh, "kcachegrind {cachegrind_out}").run()?;
 			}
 
modifiedxtask/src/sourcegen/ast.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/ast.rs
+++ b/xtask/src/sourcegen/ast.rs
@@ -5,8 +5,8 @@
 use ungrammar::{Grammar, Rule};
 
 use super::{
+	KindsSrc,
 	util::{pluralize, to_lower_snake_case},
-	KindsSrc,
 };
 
 impl AstNodeSrc {
@@ -282,9 +282,11 @@
 		_ => return false,
 	};
 	let (node, repeat, trailing_comma) = match rule.as_slice() {
-		[Rule::Node(node), Rule::Rep(repeat), Rule::Opt(trailing_comma)] => {
-			(node, repeat, trailing_comma)
-		}
+		[
+			Rule::Node(node),
+			Rule::Rep(repeat),
+			Rule::Opt(trailing_comma),
+		] => (node, repeat, trailing_comma),
 		_ => return false,
 	};
 	let repeat = match &**repeat {
modifiedxtask/src/sourcegen/mod.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/mod.rs
+++ b/xtask/src/sourcegen/mod.rs
@@ -1,7 +1,7 @@
 use std::{collections::HashMap, path::PathBuf};
 
 use anyhow::Result;
-use ast::{lower, AstSrc};
+use ast::{AstSrc, lower};
 use itertools::Itertools;
 use kinds::{KindsSrc, TokenKind};
 use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
@@ -56,7 +56,9 @@
 						});
 					}
 					SpecialName::Error => {
-						panic!("error token ERROR_{name} must be explicitly defined in jsonnet_kinds()");
+						panic!(
+							"error token ERROR_{name} must be explicitly defined in jsonnet_kinds()"
+						);
 					}
 				}
 				continue;
modifiedxtask/src/sourcegen/util.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/util.rs
+++ b/xtask/src/sourcegen/util.rs
@@ -3,7 +3,7 @@
 use std::{fs, path::Path};
 
 use anyhow::Result;
-use xshell::{cmd, Shell};
+use xshell::{Shell, cmd};
 
 /// Checks that the `file` has the specified `contents`. If that is not the
 /// case, updates the file and then fails the test.