From 75beb619a12fe8c7bf19347e251a9b2c54a0bf08 Mon Sep 17 00:00:00 2001 From: Lach Date: Wed, 01 Apr 2026 23:51:19 +0000 Subject: [PATCH] ci: use hercules --- --- 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 --- 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 - --- 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 }} --- 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 - --- 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" --- 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 --- 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"] --- 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}; --- 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; --- 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; --- 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; --- 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; --- 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; --- 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 { --- 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 { --- 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 = [] --- 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}; --- 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"] } --- 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::*; --- 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)] --- 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}; --- 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" --- 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, *}; --- 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 { --- 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}; --- 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 /// --- 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)] --- 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)?; --- 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( @@ -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() --- 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; --- 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 { --- 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; --- 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). --- 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(pub(crate) PreparedFuncVal, PhantomData); --- 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, tailstrict: bool) -> Result> { --- 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 { --- 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 { --- 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}; --- 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<()>; --- 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))] --- 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"))] --- 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)] --- 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)] --- 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; --- 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)] --- 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() { --- 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}; --- 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)] --- 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 { --- 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>; --- 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}; --- 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)); } --- 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 {} --- 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 --- 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, --- 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 { --- 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() { --- 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(&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 { - 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) } } --- 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 --- 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> { --- 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}; --- 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; --- 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}; --- 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)] --- 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!("")) { 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() { --- 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)] --- a/crates/jrsonnet-rowan-parser/src/generated/nodes.rs +++ b/crates/jrsonnet-rowan-parser/src/generated/nodes.rs @@ -3,9 +3,9 @@ #![allow(non_snake_case, clippy::match_like_matches_macro)] use crate::{ - ast::{support, AstChildren, AstNode, AstToken}, SyntaxKind::{self, *}, SyntaxNode, SyntaxToken, T, + ast::{AstChildren, AstNode, AstToken, support}, }; #[derive(Debug, Clone, PartialEq, Eq, Hash)] --- 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 { --- 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(); --- 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; --- 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"] --- 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>) -> Result { --- 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] --- 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] --- 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 { --- 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 { --- 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; --- 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 { --- 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; --- 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 { --- 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> { --- 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 { --- 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> { --- 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] --- 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; }; --- 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] --- 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] --- 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 { --- 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; --- 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; --- 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; --- 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 { + 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| { --- 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 { --- 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", --- 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 { }; + }; + }; }; } --- 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 ''} --- /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 + ''; +} --- /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 + ''; +} --- /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 + ''; +} --- 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" --- 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" + ''; +} --- 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" --- 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 --- 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"] --- /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; +} --- 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"] } --- 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()?; } --- 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 { --- 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; --- 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. -- gitstuff