difftreelog
slop: implement ir parser
in: master
86 files changed
Cargo.lockdiffbeforeafterboth195 packageslockfile v4
Might be heavy and slow!
ahash
0.8.12crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75used byaho-corasick
1.1.4crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301depends onaliasable
0.1.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fdused byallocator-api2
0.2.21crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923annotate-snippets
0.12.11crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum16e4850548ff4a25a77ce3bda7241874e17fb702ea551f0cc62a2dbe052f1272depends onannotated-string
0.3.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum298ed730801db3c02f2edba003c9420a0f57ea48d37fdc5601c536113668c059used byanstream
0.6.21crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4adepends onused byanstyle
1.0.13crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78anstyle-parse
0.2.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2depends onused byanstyle-query
1.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadcdepends onused byanstyle-wincon
3.0.11crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747dused byanyhow
1.0.101crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75eaar_archive_writer
0.5.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340bdepends onused byarraydeque
0.5.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236used byautocfg
1.5.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8used bybase64
0.22.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6bitflags
2.10.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3used byblock-buffer
0.10.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71depends onused bybstr
1.12.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cabdepends onused bybumpalo
3.19.1crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510depends oncc
1.2.55crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29depends oncfg-if
1.0.4crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801clap
4.5.57crates.io↘ 2↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6899ea499e3fb9305a65d5ebf6e3d2248c5fab291f300ad0a704fbe142eae31adepends onclap_builder
4.5.57crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7b12c8b680195a62a8364d16b8447b01b6c2c8f9aaf68bee653be34d4245e238used byclap_complete
4.5.65crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum430b4dc2b5e3861848de79627b2bedc9f3342c7da5173a14eaa5d0f8dc18ae5ddepends onused byclap_derive
4.5.55crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5used byclap_lex
0.7.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32used bycolorchoice
1.0.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75used byconsole
0.15.11crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8used bycountme
3.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636used bycpufeatures
0.2.17crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280depends oncrypto-common
0.1.7crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60adepends onused bydifflib
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8used bydigest
0.10.7crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292depends ondprint-core
0.67.4crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2c1d827947704a9495f705d6aeed270fa21a67f825f22902c28f38dc3af7a9aedepends ondrop_bomb
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1educe
0.6.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417either
1.15.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719used byencode_unicode
1.0.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0used byencoding_rs
0.8.35crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3depends onused byencoding_rs_io
0.1.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1cc3c5651fb62ab8aa3103998dade57efdd028544bd300516baa31840c252a83depends onused byenum-ordinalize
4.3.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0depends onused byenum-ordinalize-derive
4.3.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631depends onused byequivalent
1.0.2crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0ferrno
0.3.14crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efebdepends onused byextension-trait
1.0.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdd65f1b59dd22d680c7a626cc4a000c1e03d241c51c3e034d2bc9f1e90734f9bdepends onused byfastrand
2.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411beused byfind-msvc-tools
0.1.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582used byfnv
1.0.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1used byfoldhash
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2used byfoldhash
0.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdbused bygeneric-array
0.14.7crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9adepends ongetrandom
0.3.4crates.io↘ 6↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fdglobset
0.4.18crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3used byhashbrown
0.14.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1used byhashbrown
0.15.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1used byhashbrown
0.16.1crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100heck
0.4.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8used byheck
0.5.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55eaused byhi-doc
0.3.0crates.io↘ 10↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf70fb920ba34768415fb239d7d607486083bfc38ad35e3f1d558697f9f646f11depends onhi-doc-jumprope
1.2.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum236c25809a9c0a0249b3488feb57744e12aa64e4f3db851980eab303719c7bdddepends onused byindexmap
2.13.0crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017indoc
2.0.7crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706depends oninsta
1.46.3crates.io↘ 6↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume82db8c87c7f1ccecb34ce0c24399b8a73081427f3c7c50a5d597925356115e4is_terminal_polyfill
1.70.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695used byitertools
0.14.0crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285depends onitoa
1.0.17crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2used byjrsonnet-cli
0.5.0-pre97workspace↘ 5↖ 1jrsonnet-evaluator
0.5.0-pre97workspace↘ 19↖ 5depends on- annotate-snippets
0.12.11 - anyhow
1.0.101 - educe
0.6.0 - hi-doc
0.3.0 - jrsonnet-gcmodule
0.4.2 - jrsonnet-interner
0.5.0-pre97 - jrsonnet-ir
0.5.0-pre97 - jrsonnet-macros
0.5.0-pre97 - jrsonnet-peg-parser
0.5.0-pre97 - jrsonnet-types
0.5.0-pre97 - num-bigint
0.4.6 - pathdiff
0.2.3 - rustc-hash
2.1.1 - rustversion
1.0.22 - serde
1.0.228 - stacker
0.1.23 - static_assertions
1.1.0 - strsim
0.11.1 - thiserror
2.0.18
- annotate-snippets
jrsonnet-fmt
0.5.0-pre97workspace↘ 6↖ 0jrsonnet-formatter
0.5.0-pre97workspace↘ 6↖ 1jrsonnet-gcmodule
0.4.2crates.io↘ 1↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf95b976a79e4000bb9e07ff0709dca0ea27bcf1952d4c17d91fb7364d6145683depends onjrsonnet-gcmodule-derive
0.4.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum51d928626220a310ff0cec815e80cf7fe104697184352ca21c40534e0b0d72d9depends onused byjrsonnet-interner
0.5.0-pre97workspace↘ 3↖ 3jrsonnet-ir
0.5.0-pre97workspace↘ 5↖ 7jrsonnet-ir-parser
0.5.0-pre97workspace↘ 4↖ 0jrsonnet-lexer
0.5.0-pre97workspace↘ 1↖ 3jrsonnet-macros
0.5.0-pre97workspace↘ 4↖ 2jrsonnet-peg-parser
0.5.0-pre97workspace↘ 4↖ 1jrsonnet-rowan-parser
0.5.0-pre97workspace↘ 9↖ 1jrsonnet-stdlib
0.5.0-pre97workspace↘ 16↖ 3depends onjrsonnet-types
0.5.0-pre97workspace↘ 2↖ 1depends onjs-sys
0.3.85crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3depends onused byjson-structural-diff
0.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume878e36a8a44c158505c2c818abdc1350413ad83dcb774a0459f6a7ef2b65cbfdepends onused bykeccak
0.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654depends onused bylibc
0.2.180crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fclibjsonnet
0.5.0-pre97workspace↘ 5↖ 0linux-raw-sys
0.11.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdf1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039used bylog
0.4.29crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897used bylogos
0.16.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeb2c55a318a87600ea870ff8c2012148b44bf18b74fad48d0f835c38c7d07c5fdepends onused bylogos-codegen
0.16.1crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum58b3ffaa284e1350d017a57d04ada118c4583cf260c8fb01e0fe28a2e9cf8970used bylogos-derive
0.16.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52d3a9855747c17eaf4383823f135220716ab49bea5fbea7dd42cc9a92f8aa31depends onused bylru
0.16.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593depends onused bymd5
0.8.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0used bymemchr
2.8.0crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79mimalloc-sys
0.1.6crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4aa3cefb626f6ae3d0b2f71c5378c89d2b1d4d7bc246b0ca9a7ee61a4daad291depends onused bymimallocator
0.1.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2d44fe4ebf6b538fcf39d9975c2b90bb3232d1ba8e8bffeacd004f27b20c577adepends onused bynohash-hasher
0.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451used bynum-bigint
0.4.6crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9num-integer
0.1.46crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858fdepends onused bynum-traits
0.2.19crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841depends onobject
0.37.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fedepends onused byonce_cell
1.21.3crates.io↘ 0↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2donce_cell_polyfill
1.70.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4feused byouroboros
0.18.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59used byouroboros_macro
0.18.5crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0used bypathdiff
0.2.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdf94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3peg
0.8.5crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9928cfca101b36ec5163e70049ee5368a8a1c3c6efc9ca9c5f9cc2f816152477depends onpeg-macros
0.8.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6298ab04c202fa5b5d52ba03269fb7b74550b150323038878fe6c372d8280f71used bypeg-runtime
0.8.5crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum132dca9b868d927b35b5dd728167b2dee150eb1ad686008fc71ccb298b776fcaused byppv-lite86
0.2.21crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9depends onused byproc-macro2
1.0.106crates.io↘ 1↖ 18sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934depends onused by- clap_derive
4.5.55 - educe
0.6.0 - enum-ordinalize-derive
4.3.2 - extension-trait
1.0.2 - jrsonnet-gcmodule-derive
0.4.2 - jrsonnet-macros
0.5.0-pre97 - logos-codegen
0.16.1 - ouroboros_macro
0.18.5 - peg-macros
0.8.5 - proc-macro2-diagnostics
0.10.1 - quote
1.0.44 - serde_derive
1.0.228 - syn
2.0.114 - syn-dissect-closure
0.1.0 - thiserror-impl
2.0.18 - wasm-bindgen-macro-support
0.2.108 - xtask
0.1.0 - zerocopy-derive
0.8.39
- clap_derive
proc-macro2-diagnostics
0.10.1crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumaf066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8used bypsm
0.1.30crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8depends onused byquote
1.0.44crates.io↘ 1↖ 18sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4depends onused by- clap_derive
4.5.55 - educe
0.6.0 - enum-ordinalize-derive
4.3.2 - extension-trait
1.0.2 - jrsonnet-gcmodule-derive
0.4.2 - jrsonnet-macros
0.5.0-pre97 - logos-codegen
0.16.1 - ouroboros_macro
0.18.5 - peg-macros
0.8.5 - proc-macro2-diagnostics
0.10.1 - serde_derive
1.0.228 - syn
2.0.114 - syn-dissect-closure
0.1.0 - thiserror-impl
2.0.18 - wasm-bindgen-macro
0.2.108 - wasm-bindgen-macro-support
0.2.108 - xtask
0.1.0 - zerocopy-derive
0.8.39
- clap_derive
r-efi
5.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0fused byrand
0.9.2crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1depends onrand_chacha
0.9.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cbdepends onused byrand_core
0.9.5crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83cdepends onused byrandom_color
1.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd635c5e80ae160390ac62ca027d2d06c94c1dc69e5c0a12f1e3a53664dc84966depends onused byrange-map
0.2.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum12a5a2d6c7039059af621472a4389be1215a816df61aa4d531cfe85264aee95fdepends onused byregex
1.12.3crates.io↘ 4↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276regex-automata
0.4.14crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8fregex-syntax
0.8.9crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4crowan
0.16.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum417a3a9f582e349834051b8a10c8d71ca88da4211e4093528e36b9845f6b5f21rustc-hash
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2used byrustc-hash
2.1.1crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0drustix
1.1.3crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34used byrustversion
1.0.22crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46dsame-file
1.0.6crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502depends onused bysaphyr-parser-bw
0.0.607crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2f9bae8d059bf1ca32753cf3cdafbf5d391502de2fc2ca54510811fe9c100d90used byserde
1.0.228crates.io↘ 2↖ 10sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9edepends onserde_core
1.0.228crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67addepends onserde_derive
1.0.228crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79depends onserde_json
1.0.149crates.io↘ 6↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86serde-saphyr
0.0.17crates.io↘ 13↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbc14a55107113a16346915d7e3d78acc539a923458385db89670e22cac106d7adepends onused bysha1
0.10.6crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6badepends onused bysha2
0.10.9crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283depends onused bysha3
0.10.8crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60depends onused bysimilar
2.7.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daaused bysmallvec
1.15.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03used bysmallvec
2.0.0-alpha.12crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumef784004ca8777809dcdad6ac37629f0a97caee4c685fcea805278d81dd8b857stacker
0.1.23crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013static_assertions
1.1.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543fstr_indices
0.4.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd08889ec5408683408db66ad89e0e1f93dff55c73a4ccc71c427d5b277ee47e6used bystreaming-iterator
0.1.9crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520strip-ansi-escapes
0.2.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025depends onstrsim
0.11.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4fsyn
2.0.114crates.io↘ 3↖ 14sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2aused by- clap_derive
4.5.55 - educe
0.6.0 - enum-ordinalize-derive
4.3.2 - extension-trait
1.0.2 - jrsonnet-gcmodule-derive
0.4.2 - jrsonnet-macros
0.5.0-pre97 - logos-codegen
0.16.1 - ouroboros_macro
0.18.5 - proc-macro2-diagnostics
0.10.1 - serde_derive
1.0.228 - syn-dissect-closure
0.1.0 - thiserror-impl
2.0.18 - wasm-bindgen-macro-support
0.2.108 - zerocopy-derive
0.8.39
- clap_derive
syn-dissect-closure
0.1.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum343bae741672e4b94421cbe93f9794ba9a061434272f7e3a29ff43be26be3ac9depends onused bytempfile
3.24.0crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9ctext-size
1.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233used bythiserror
2.0.18crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4depends onthiserror-impl
2.0.18crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5depends onused bytree-sitter
0.26.5crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum12987371f54efc9b9306a20dc87ed5aaee9f320c8a8b115e28515c412b2efe39depends onused bytree-sitter-highlight
0.26.5crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b688407049ea1b55a7e872f138947d22389118b9c4d09b459cb34ca205e41c0used bytree-sitter-language
0.1.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782used bytypenum
1.19.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bbungrammar
1.16.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma3e5df347f0bf3ec1d670aad6ca5c6a1859cd9ea61d2113125794654ccced68fused byunicode-box-drawing
0.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2a1f97719cf40224391201fc11e7f5b0cc0ba21416367cfc914e2d45af4e42efused byunicode-ident
1.0.22crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5unicode-width
0.2.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254utf8parse
0.2.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821version_check
0.9.5crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105avte
0.14.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077depends onused bywalkdir
2.5.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4bdepends onused bywasip2
1.0.2+wasi-0.2.9crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5depends onused bywasm-bindgen
0.2.108crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566depends onused bywasm-bindgen-macro
0.2.108crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608used bywasm-bindgen-macro-support
0.2.108crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55used bywinapi-util
0.1.11crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22depends onused bywindows_aarch64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3used bywindows_aarch64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469used bywindows_i686_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0bused bywindows_i686_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66used bywindows_i686_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66used bywindows_x86_64_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78used bywindows_x86_64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0dused bywindows_x86_64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ecused bywindows-link
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5used bywindows-sys
0.59.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853bdepends onused bywindows-sys
0.61.2crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fcdepends onwindows-targets
0.52.6crates.io↘ 8↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973depends onused bywit-bindgen
0.51.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5used byxshell
0.2.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9e7290c623014758632efe00737145b6867b66292c42167f2ec381eb566a373ddepends onused byxshell-macros
0.2.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547used byxtask
0.1.0workspace↘ 8↖ 0yansi
1.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049zerocopy
0.8.39crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdb6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4adepends onused byzerocopy-derive
0.8.39crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517depends onused byzmij
1.0.19crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445
195 packageslockfile v4
Might be heavy and slow!
ahash
0.8.12crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75used byaho-corasick
1.1.4crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301depends onaliasable
0.1.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fdused byallocator-api2
0.2.21crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923annotate-snippets
0.12.11crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum16e4850548ff4a25a77ce3bda7241874e17fb702ea551f0cc62a2dbe052f1272depends onannotated-string
0.3.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum298ed730801db3c02f2edba003c9420a0f57ea48d37fdc5601c536113668c059used byanstream
0.6.21crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4adepends onused byanstyle
1.0.13crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78anstyle-parse
0.2.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2depends onused byanstyle-query
1.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadcdepends onused byanstyle-wincon
3.0.11crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747dused byanyhow
1.0.101crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75eaar_archive_writer
0.5.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340bdepends onused byarraydeque
0.5.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236used byautocfg
1.5.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8used bybase64
0.22.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6bitflags
2.10.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3used byblock-buffer
0.10.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71depends onused bybstr
1.12.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cabdepends onused bybumpalo
3.19.1crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510depends oncc
1.2.55crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29depends oncfg-if
1.0.4crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801clap
4.5.57crates.io↘ 2↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6899ea499e3fb9305a65d5ebf6e3d2248c5fab291f300ad0a704fbe142eae31adepends onclap_builder
4.5.57crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7b12c8b680195a62a8364d16b8447b01b6c2c8f9aaf68bee653be34d4245e238used byclap_complete
4.5.65crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum430b4dc2b5e3861848de79627b2bedc9f3342c7da5173a14eaa5d0f8dc18ae5ddepends onused byclap_derive
4.5.55crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5used byclap_lex
0.7.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32used bycolorchoice
1.0.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75used byconsole
0.15.11crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8used bycountme
3.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636used bycpufeatures
0.2.17crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280depends oncrypto-common
0.1.7crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60adepends onused bydifflib
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8used bydigest
0.10.7crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292depends ondprint-core
0.67.4crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2c1d827947704a9495f705d6aeed270fa21a67f825f22902c28f38dc3af7a9aedepends ondrop_bomb
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1educe
0.6.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417either
1.15.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719used byencode_unicode
1.0.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0used byencoding_rs
0.8.35crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3depends onused byencoding_rs_io
0.1.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1cc3c5651fb62ab8aa3103998dade57efdd028544bd300516baa31840c252a83depends onused byenum-ordinalize
4.3.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0depends onused byenum-ordinalize-derive
4.3.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631depends onused byequivalent
1.0.2crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0ferrno
0.3.14crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efebdepends onused byextension-trait
1.0.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdd65f1b59dd22d680c7a626cc4a000c1e03d241c51c3e034d2bc9f1e90734f9bdepends onused byfastrand
2.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411beused byfind-msvc-tools
0.1.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582used byfnv
1.0.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1used byfoldhash
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2used byfoldhash
0.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdbused bygeneric-array
0.14.7crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9adepends ongetrandom
0.3.4crates.io↘ 6↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fdglobset
0.4.18crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3used byhashbrown
0.14.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1used byhashbrown
0.15.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1used byhashbrown
0.16.1crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100heck
0.4.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8used byheck
0.5.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55eaused byhi-doc
0.3.0crates.io↘ 10↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf70fb920ba34768415fb239d7d607486083bfc38ad35e3f1d558697f9f646f11depends onhi-doc-jumprope
1.2.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum236c25809a9c0a0249b3488feb57744e12aa64e4f3db851980eab303719c7bdddepends onused byindexmap
2.13.0crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017indoc
2.0.7crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706depends oninsta
1.46.3crates.io↘ 6↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume82db8c87c7f1ccecb34ce0c24399b8a73081427f3c7c50a5d597925356115e4is_terminal_polyfill
1.70.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695used byitertools
0.14.0crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285depends onitoa
1.0.17crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2used byjrsonnet-cli
0.5.0-pre97workspace↘ 5↖ 1jrsonnet-evaluator
0.5.0-pre97workspace↘ 20↖ 5depends on- annotate-snippets
0.12.11 - anyhow
1.0.101 - educe
0.6.0 - hi-doc
0.3.0 - jrsonnet-gcmodule
0.4.2 - jrsonnet-interner
0.5.0-pre97 - jrsonnet-ir
0.5.0-pre97 - jrsonnet-ir-parser
0.5.0-pre97 - jrsonnet-macros
0.5.0-pre97 - jrsonnet-peg-parser
0.5.0-pre97 - jrsonnet-types
0.5.0-pre97 - num-bigint
0.4.6 - pathdiff
0.2.3 - rustc-hash
2.1.1 - rustversion
1.0.22 - serde
1.0.228 - stacker
0.1.23 - static_assertions
1.1.0 - strsim
0.11.1 - thiserror
2.0.18
- annotate-snippets
jrsonnet-fmt
0.5.0-pre97workspace↘ 6↖ 0jrsonnet-formatter
0.5.0-pre97workspace↘ 6↖ 1jrsonnet-gcmodule
0.4.2crates.io↘ 1↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf95b976a79e4000bb9e07ff0709dca0ea27bcf1952d4c17d91fb7364d6145683depends onjrsonnet-gcmodule-derive
0.4.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum51d928626220a310ff0cec815e80cf7fe104697184352ca21c40534e0b0d72d9depends onused byjrsonnet-interner
0.5.0-pre97workspace↘ 3↖ 3jrsonnet-ir
0.5.0-pre97workspace↘ 5↖ 7jrsonnet-ir-parser
0.5.0-pre97workspace↘ 4↖ 1jrsonnet-lexer
0.5.0-pre97workspace↘ 1↖ 3jrsonnet-macros
0.5.0-pre97workspace↘ 4↖ 2jrsonnet-peg-parser
0.5.0-pre97workspace↘ 4↖ 1jrsonnet-rowan-parser
0.5.0-pre97workspace↘ 9↖ 1jrsonnet-stdlib
0.5.0-pre97workspace↘ 16↖ 3depends onjrsonnet-types
0.5.0-pre97workspace↘ 2↖ 1depends onjs-sys
0.3.85crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3depends onused byjson-structural-diff
0.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume878e36a8a44c158505c2c818abdc1350413ad83dcb774a0459f6a7ef2b65cbfdepends onused bykeccak
0.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654depends onused bylibc
0.2.180crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fclibjsonnet
0.5.0-pre97workspace↘ 5↖ 0linux-raw-sys
0.11.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdf1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039used bylog
0.4.29crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897used bylogos
0.16.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeb2c55a318a87600ea870ff8c2012148b44bf18b74fad48d0f835c38c7d07c5fdepends onused bylogos-codegen
0.16.1crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum58b3ffaa284e1350d017a57d04ada118c4583cf260c8fb01e0fe28a2e9cf8970used bylogos-derive
0.16.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52d3a9855747c17eaf4383823f135220716ab49bea5fbea7dd42cc9a92f8aa31depends onused bylru
0.16.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593depends onused bymd5
0.8.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0used bymemchr
2.8.0crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79mimalloc-sys
0.1.6crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4aa3cefb626f6ae3d0b2f71c5378c89d2b1d4d7bc246b0ca9a7ee61a4daad291depends onused bymimallocator
0.1.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2d44fe4ebf6b538fcf39d9975c2b90bb3232d1ba8e8bffeacd004f27b20c577adepends onused bynohash-hasher
0.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451used bynum-bigint
0.4.6crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9num-integer
0.1.46crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858fdepends onused bynum-traits
0.2.19crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841depends onobject
0.37.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fedepends onused byonce_cell
1.21.3crates.io↘ 0↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2donce_cell_polyfill
1.70.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4feused byouroboros
0.18.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59used byouroboros_macro
0.18.5crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0used bypathdiff
0.2.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdf94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3peg
0.8.5crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9928cfca101b36ec5163e70049ee5368a8a1c3c6efc9ca9c5f9cc2f816152477depends onpeg-macros
0.8.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6298ab04c202fa5b5d52ba03269fb7b74550b150323038878fe6c372d8280f71used bypeg-runtime
0.8.5crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum132dca9b868d927b35b5dd728167b2dee150eb1ad686008fc71ccb298b776fcaused byppv-lite86
0.2.21crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9depends onused byproc-macro2
1.0.106crates.io↘ 1↖ 18sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934depends onused by- clap_derive
4.5.55 - educe
0.6.0 - enum-ordinalize-derive
4.3.2 - extension-trait
1.0.2 - jrsonnet-gcmodule-derive
0.4.2 - jrsonnet-macros
0.5.0-pre97 - logos-codegen
0.16.1 - ouroboros_macro
0.18.5 - peg-macros
0.8.5 - proc-macro2-diagnostics
0.10.1 - quote
1.0.44 - serde_derive
1.0.228 - syn
2.0.114 - syn-dissect-closure
0.1.0 - thiserror-impl
2.0.18 - wasm-bindgen-macro-support
0.2.108 - xtask
0.1.0 - zerocopy-derive
0.8.39
- clap_derive
proc-macro2-diagnostics
0.10.1crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumaf066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8used bypsm
0.1.30crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8depends onused byquote
1.0.44crates.io↘ 1↖ 18sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4depends onused by- clap_derive
4.5.55 - educe
0.6.0 - enum-ordinalize-derive
4.3.2 - extension-trait
1.0.2 - jrsonnet-gcmodule-derive
0.4.2 - jrsonnet-macros
0.5.0-pre97 - logos-codegen
0.16.1 - ouroboros_macro
0.18.5 - peg-macros
0.8.5 - proc-macro2-diagnostics
0.10.1 - serde_derive
1.0.228 - syn
2.0.114 - syn-dissect-closure
0.1.0 - thiserror-impl
2.0.18 - wasm-bindgen-macro
0.2.108 - wasm-bindgen-macro-support
0.2.108 - xtask
0.1.0 - zerocopy-derive
0.8.39
- clap_derive
r-efi
5.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0fused byrand
0.9.2crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1depends onrand_chacha
0.9.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cbdepends onused byrand_core
0.9.5crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83cdepends onused byrandom_color
1.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd635c5e80ae160390ac62ca027d2d06c94c1dc69e5c0a12f1e3a53664dc84966depends onused byrange-map
0.2.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum12a5a2d6c7039059af621472a4389be1215a816df61aa4d531cfe85264aee95fdepends onused byregex
1.12.3crates.io↘ 4↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276regex-automata
0.4.14crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8fregex-syntax
0.8.9crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4crowan
0.16.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum417a3a9f582e349834051b8a10c8d71ca88da4211e4093528e36b9845f6b5f21rustc-hash
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2used byrustc-hash
2.1.1crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0drustix
1.1.3crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34used byrustversion
1.0.22crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46dsame-file
1.0.6crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502depends onused bysaphyr-parser-bw
0.0.607crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2f9bae8d059bf1ca32753cf3cdafbf5d391502de2fc2ca54510811fe9c100d90used byserde
1.0.228crates.io↘ 2↖ 10sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9edepends onserde_core
1.0.228crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67addepends onserde_derive
1.0.228crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79depends onserde_json
1.0.149crates.io↘ 6↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86serde-saphyr
0.0.17crates.io↘ 13↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbc14a55107113a16346915d7e3d78acc539a923458385db89670e22cac106d7adepends onused bysha1
0.10.6crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6badepends onused bysha2
0.10.9crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283depends onused bysha3
0.10.8crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60depends onused bysimilar
2.7.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daaused bysmallvec
1.15.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03used bysmallvec
2.0.0-alpha.12crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumef784004ca8777809dcdad6ac37629f0a97caee4c685fcea805278d81dd8b857stacker
0.1.23crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013static_assertions
1.1.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543fstr_indices
0.4.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd08889ec5408683408db66ad89e0e1f93dff55c73a4ccc71c427d5b277ee47e6used bystreaming-iterator
0.1.9crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520strip-ansi-escapes
0.2.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025depends onstrsim
0.11.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4fsyn
2.0.114crates.io↘ 3↖ 14sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2aused by- clap_derive
4.5.55 - educe
0.6.0 - enum-ordinalize-derive
4.3.2 - extension-trait
1.0.2 - jrsonnet-gcmodule-derive
0.4.2 - jrsonnet-macros
0.5.0-pre97 - logos-codegen
0.16.1 - ouroboros_macro
0.18.5 - proc-macro2-diagnostics
0.10.1 - serde_derive
1.0.228 - syn-dissect-closure
0.1.0 - thiserror-impl
2.0.18 - wasm-bindgen-macro-support
0.2.108 - zerocopy-derive
0.8.39
- clap_derive
syn-dissect-closure
0.1.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum343bae741672e4b94421cbe93f9794ba9a061434272f7e3a29ff43be26be3ac9depends onused bytempfile
3.24.0crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9ctext-size
1.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233used bythiserror
2.0.18crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4depends onthiserror-impl
2.0.18crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5depends onused bytree-sitter
0.26.5crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum12987371f54efc9b9306a20dc87ed5aaee9f320c8a8b115e28515c412b2efe39depends onused bytree-sitter-highlight
0.26.5crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b688407049ea1b55a7e872f138947d22389118b9c4d09b459cb34ca205e41c0used bytree-sitter-language
0.1.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782used bytypenum
1.19.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bbungrammar
1.16.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma3e5df347f0bf3ec1d670aad6ca5c6a1859cd9ea61d2113125794654ccced68fused byunicode-box-drawing
0.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2a1f97719cf40224391201fc11e7f5b0cc0ba21416367cfc914e2d45af4e42efused byunicode-ident
1.0.22crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5unicode-width
0.2.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254utf8parse
0.2.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821version_check
0.9.5crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105avte
0.14.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077depends onused bywalkdir
2.5.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4bdepends onused bywasip2
1.0.2+wasi-0.2.9crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5depends onused bywasm-bindgen
0.2.108crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566depends onused bywasm-bindgen-macro
0.2.108crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608used bywasm-bindgen-macro-support
0.2.108crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55used bywinapi-util
0.1.11crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22depends onused bywindows_aarch64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3used bywindows_aarch64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469used bywindows_i686_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0bused bywindows_i686_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66used bywindows_i686_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66used bywindows_x86_64_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78used bywindows_x86_64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0dused bywindows_x86_64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ecused bywindows-link
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5used bywindows-sys
0.59.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853bdepends onused bywindows-sys
0.61.2crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fcdepends onwindows-targets
0.52.6crates.io↘ 8↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973depends onused bywit-bindgen
0.51.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5used byxshell
0.2.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9e7290c623014758632efe00737145b6867b66292c42167f2ec381eb566a373ddepends onused byxshell-macros
0.2.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547used byxtask
0.1.0workspace↘ 8↖ 0yansi
1.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049zerocopy
0.8.39crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdb6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4adepends onused byzerocopy-derive
0.8.39crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517depends onused byzmij
1.0.19crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445
crates/jrsonnet-evaluator/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-evaluator/Cargo.toml
+++ b/crates/jrsonnet-evaluator/Cargo.toml
@@ -13,11 +13,13 @@
workspace = true
[features]
-default = ["explaining-traces"]
+default = ["explaining-traces", "ir-parser"]
# Rustc-like trace visualization
explaining-traces = ["annotate-snippets", "hi-doc"]
# Allows library authors to throw custom errors
anyhow-error = ["anyhow"]
+# Use hand-written recursive descent parser instead of PEG parser
+ir-parser = ["dep:jrsonnet-ir-parser"]
# Allows to preserve field order in objects
exp-preserve-order = []
@@ -28,12 +30,13 @@
# Bigint type
exp-bigint = ["num-bigint", "jrsonnet-types/exp-bigint"]
# obj?.field, obj?.['field']
-exp-null-coaelse = ["jrsonnet-peg-parser/exp-null-coaelse"]
+exp-null-coaelse = ["jrsonnet-peg-parser/exp-null-coaelse", "jrsonnet-ir-parser?/exp-null-coaelse"]
[dependencies]
jrsonnet-interner.workspace = true
jrsonnet-ir.workspace = true
jrsonnet-peg-parser.workspace = true
+jrsonnet-ir-parser = { workspace = true, optional = true }
jrsonnet-types.workspace = true
jrsonnet-macros.workspace = true
jrsonnet-gcmodule.workspace = true
crates/jrsonnet-evaluator/src/async_import.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/async_import.rs
+++ b/crates/jrsonnet-evaluator/src/async_import.rs
@@ -7,6 +7,9 @@
FieldMember, FieldName, ForSpecData, IfElse, IfSpecData, ImportKind, ObjBody, Slice, SliceDesc,
Source, SourcePath, Spanned,
};
+#[cfg(feature = "ir-parser")]
+use jrsonnet_ir_parser::ParserSettings;
+#[cfg(not(feature = "ir-parser"))]
use jrsonnet_peg_parser::ParserSettings;
use rustc_hash::FxHashMap;
@@ -323,7 +326,7 @@
};
let source = Source::new(path.clone(), code.clone());
// If failed - then skip import
- file.parsed = jrsonnet_peg_parser::parse(&code, &ParserSettings { source })
+ file.parsed = crate::parse_jsonnet(&code, &ParserSettings { source })
.map(Rc::new)
.ok();
if let Some(parsed) = &file.parsed {
crates/jrsonnet-evaluator/src/error.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/error.rs
+++ b/crates/jrsonnet-evaluator/src/error.rs
@@ -154,6 +154,7 @@
ImportNotSupported(SourcePath, ResolvePathOwned),
#[error("can't import from virtual file")]
CantImportFromVirtualFile,
+ #[cfg(not(feature = "ir-parser"))]
#[error(
"syntax error: {}",
// Peg has no fancier way to handle critical parsing errors https://github.com/kevinmehall/rust-peg/issues/225
@@ -172,6 +173,14 @@
error: Box<jrsonnet_peg_parser::ParseError>,
},
+ #[cfg(feature = "ir-parser")]
+ #[error("syntax error: {error}")]
+ ImportSyntaxError {
+ path: Source,
+ #[trace(skip)]
+ error: Box<jrsonnet_ir_parser::ParseError>,
+ },
+
#[error("runtime error: {}", format_empty_str(.0))]
RuntimeError(IStr),
#[error("stack overflow, try to reduce recursion, or set --max-stack to bigger value")]
crates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/lib.rs
+++ b/crates/jrsonnet-evaluator/src/lib.rs
@@ -46,6 +46,9 @@
use jrsonnet_ir::{Expr, Source, SourcePath};
#[doc(hidden)]
pub use jrsonnet_macros;
+#[cfg(feature = "ir-parser")]
+use jrsonnet_ir_parser::ParserSettings;
+#[cfg(not(feature = "ir-parser"))]
use jrsonnet_peg_parser::ParserSettings;
pub use obj::*;
pub use rustc_hash;
@@ -56,6 +59,22 @@
use crate::gc::WithCapacityExt as _;
+#[cfg(feature = "ir-parser")]
+pub(crate) fn parse_jsonnet(
+ code: &str,
+ settings: &ParserSettings,
+) -> Result<Expr, jrsonnet_ir_parser::ParseError> {
+ jrsonnet_ir_parser::parse(code, settings)
+}
+
+#[cfg(not(feature = "ir-parser"))]
+pub(crate) fn parse_jsonnet(
+ code: &str,
+ settings: &ParserSettings,
+) -> Result<Expr, jrsonnet_peg_parser::ParseError> {
+ jrsonnet_peg_parser::parse(code, settings)
+}
+
cc_dyn!(
#[derive(Clone)]
CcUnbound<V>,
@@ -345,7 +364,7 @@
let file_name = Source::new(path.clone(), code.clone());
if file.parsed.is_none() {
file.parsed = Some(
- jrsonnet_peg_parser::parse(
+ parse_jsonnet(
&code,
&ParserSettings {
source: file_name.clone(),
@@ -461,7 +480,7 @@
pub fn evaluate_snippet(&self, name: impl Into<IStr>, code: impl Into<IStr>) -> Result<Val> {
let code = code.into();
let source = Source::new_virtual(name.into(), code.clone());
- let parsed = jrsonnet_peg_parser::parse(
+ let parsed = parse_jsonnet(
&code,
&ParserSettings {
source: source.clone(),
@@ -482,7 +501,7 @@
) -> Result<Val> {
let code = code.into();
let source = Source::new_virtual(name.into(), code.clone());
- let parsed = jrsonnet_peg_parser::parse(
+ let parsed = parse_jsonnet(
&code,
&ParserSettings {
source: source.clone(),
crates/jrsonnet-ir-parser/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-ir-parser/Cargo.toml
+++ b/crates/jrsonnet-ir-parser/Cargo.toml
@@ -6,6 +6,9 @@
repository.workspace = true
version.workspace = true
+[features]
+exp-null-coaelse = ["jrsonnet-ir/exp-null-coaelse"]
+
[dependencies]
insta.workspace = true
jrsonnet-gcmodule.workspace = true
crates/jrsonnet-ir-parser/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-ir-parser/src/lib.rs
+++ b/crates/jrsonnet-ir-parser/src/lib.rs
@@ -1,13 +1,37 @@
use std::rc::Rc;
-use insta::assert_snapshot;
use jrsonnet_gcmodule::Acyclic;
use jrsonnet_ir::{
- AssertExpr, AssertStmt, Expr, IfElse, IfSpecData, LiteralType, Slice, SliceDesc, Source,
- SourceVirtual, Span, Spanned,
+ 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,
};
-use jrsonnet_lexer::{Lexeme, Lexer, SyntaxKind, T};
+use jrsonnet_lexer::{collect_lexed_str_block, Lexeme, Lexer, SyntaxKind, T};
+pub struct ParserSettings {
+ pub source: Source,
+}
+
+#[derive(Debug, Clone)]
+pub struct ParseErrorLocation {
+ pub offset: usize,
+}
+
+#[derive(Debug, Clone)]
+pub struct ParseError {
+ pub message: String,
+ pub location: ParseErrorLocation,
+}
+
+impl std::fmt::Display for ParseError {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "{}", self.message)
+ }
+}
+
+type R<T> = Result<T, ParseError>;
+
struct Parser<'a> {
lexemes: Vec<Lexeme<'a>>,
offset: usize,
@@ -15,30 +39,46 @@
}
impl<'a> Parser<'a> {
- fn new(s: &'a str) -> Self {
+ fn new(code: &'a str, source: Source) -> Self {
Self {
- lexemes: Lexer::new(s)
- .filter(|l| l.kind != SyntaxKind::WHITESPACE)
+ lexemes: Lexer::new(code)
+ .filter(|l| {
+ !matches!(
+ l.kind,
+ SyntaxKind::WHITESPACE
+ | SyntaxKind::SINGLE_LINE_SLASH_COMMENT
+ | SyntaxKind::SINGLE_LINE_HASH_COMMENT
+ | SyntaxKind::MULTI_LINE_COMMENT
+ )
+ })
.collect(),
offset: 0,
- source: Source::new_virtual("<test>".into(), s.into()),
+ source,
}
}
+
fn peek(&self) -> SyntaxKind {
- self.lexemes[self.offset].kind
+ if self.at_eof() {
+ SyntaxKind::EOF
+ } else {
+ self.lexemes[self.offset].kind
+ }
}
- fn text(&self) -> &str {
+
+ fn text(&self) -> &'a str {
self.lexemes[self.offset].text
}
+
fn at(&self, kind: SyntaxKind) -> bool {
!self.at_eof() && self.peek() == kind
}
+
fn eat_any(&mut self) {
- self.offset += 1
+ self.offset += 1;
}
fn at_eof(&self) -> bool {
- self.offset == self.lexemes.len()
+ self.offset >= self.lexemes.len()
}
fn try_eat(&mut self, t: SyntaxKind) -> bool {
@@ -48,17 +88,165 @@
}
false
}
- fn eat(&mut self, t: SyntaxKind) {
- assert_eq!(self.peek(), t);
+
+ fn current_desc(&self) -> String {
+ if self.at_eof() {
+ return "end of file".to_owned();
+ }
+ let kind = self.peek();
+ let text = self.text();
+ let name = kind.display_name();
+ if matches!(kind, SyntaxKind::IDENT | SyntaxKind::FLOAT) {
+ format!("{name} \"{text}\"")
+ } else {
+ name.to_owned()
+ }
+ }
+
+ fn eat(&mut self, t: SyntaxKind) -> R<()> {
+ if !self.at(t) {
+ return Err(self.error(format!(
+ "expected {}, got {}",
+ t.display_name(),
+ self.current_desc(),
+ )));
+ }
self.eat_any();
+ Ok(())
}
fn span_start(&self) -> u32 {
+ if self.at_eof() {
+ if let Some(last) = self.lexemes.last() {
+ return last.range.1;
+ }
+ return 0;
+ }
self.lexemes[self.offset].range.0
}
+
fn span_end(&self) -> u32 {
self.lexemes[self.offset - 1].range.1
}
+
+ fn error(&self, message: String) -> ParseError {
+ ParseError {
+ location: ParseErrorLocation {
+ offset: self.span_start() as usize,
+ },
+ message,
+ }
+ }
+
+ fn expect_ident(&mut self) -> R<IStr> {
+ if !self.at(SyntaxKind::IDENT) {
+ return Err(self.error(format!("expected identifier, got {}", self.current_desc())));
+ }
+ let text = self.text();
+ if is_reserved(text) {
+ return Err(self.error(format!(
+ "expected identifier, got reserved word '{text}'"
+ )));
+ }
+ let s: IStr = text.into();
+ self.eat_any();
+ Ok(s)
+ }
+
+ fn at_ident(&self) -> bool {
+ self.at(SyntaxKind::IDENT) && !is_reserved(self.lexemes[self.offset].text)
+ }
+}
+
+fn is_reserved(s: &str) -> bool {
+ matches!(
+ s,
+ "assert"
+ | "else" | "error"
+ | "false" | "for"
+ | "function" | "if"
+ | "import" | "importstr"
+ | "importbin" | "in"
+ | "local" | "null"
+ | "tailstrict" | "then"
+ | "self" | "super"
+ | "true"
+ )
+}
+
+fn spanned<T: Acyclic>(p: &mut Parser<'_>, cb: impl FnOnce(&mut Parser<'_>) -> R<T>) -> R<Spanned<T>> {
+ let start = p.span_start();
+ let v = cb(p)?;
+ let end = p.span_end();
+ Ok(Spanned::new(v, Span(p.source.clone(), start, end)))
+}
+
+fn parse_string_content(p: &mut Parser<'_>) -> R<IStr> {
+ let kind = p.peek();
+ let text = p.text();
+ let s = match kind {
+ SyntaxKind::STRING_DOUBLE => {
+ let inner = &text[1..text.len() - 1];
+ unescape::unescape(inner)
+ .ok_or_else(|| p.error("invalid string escape".into()))?
+ }
+ SyntaxKind::STRING_SINGLE => {
+ let inner = &text[1..text.len() - 1];
+ unescape::unescape(inner)
+ .ok_or_else(|| p.error("invalid string escape".into()))?
+ }
+ SyntaxKind::STRING_DOUBLE_VERBATIM => {
+ let inner = &text[2..text.len() - 1];
+ inner.replace("\"\"", "\"")
+ }
+ SyntaxKind::STRING_SINGLE_VERBATIM => {
+ let inner = &text[2..text.len() - 1];
+ inner.replace("''", "'")
+ }
+ SyntaxKind::STRING_BLOCK => {
+ let inner = &text[3..];
+ let collected = collect_lexed_str_block(inner)
+ .map_err(|_| p.error("invalid string block".into()))?;
+ let mut result = String::new();
+ for (i, line) in collected.lines.iter().enumerate() {
+ if i > 0 {
+ result.push('\n');
+ }
+ result.push_str(line);
+ }
+ if !collected.truncate {
+ result.push('\n');
+ }
+ result
+ }
+ _ => return Err(p.error(format!("expected string, got {}", p.current_desc()))),
+ };
+ p.eat_any();
+ Ok(s.into())
+}
+
+fn is_string_token(kind: SyntaxKind) -> bool {
+ matches!(
+ kind,
+ SyntaxKind::STRING_DOUBLE
+ | SyntaxKind::STRING_SINGLE
+ | SyntaxKind::STRING_DOUBLE_VERBATIM
+ | SyntaxKind::STRING_SINGLE_VERBATIM
+ | SyntaxKind::STRING_BLOCK
+ )
+}
+
+fn parse_number(p: &mut Parser<'_>) -> R<f64> {
+ let text = p.text();
+ let n: f64 = text
+ .replace('_', "")
+ .parse()
+ .map_err(|_| p.error(format!("invalid number literal: {text}")))?;
+ if !n.is_finite() {
+ return Err(p.error("numbers are finite".into()));
+ }
+ p.eat_any();
+ Ok(n)
}
fn literal(p: &mut Parser<'_>) -> Option<LiteralType> {
@@ -75,109 +263,816 @@
Some(t)
}
-fn spanned<T: Acyclic>(p: &mut Parser<'_>, cb: impl FnOnce(&mut Parser<'_>) -> T) -> Spanned<T> {
- let start = p.span_start();
- let v = cb(p);
- let end = p.span_end();
-
- Spanned::new(v, Span(p.source.clone(), start, end))
-}
-
-fn assert_stmt(p: &mut Parser<'_>) -> AssertStmt {
- p.eat(T![assert]);
- let cond = spanned(p, expr);
- dbg!(p.peek());
+fn assert_stmt(p: &mut Parser<'_>) -> R<AssertStmt> {
+ p.eat(T![assert])?;
+ let cond = spanned(p, expr)?;
let msg = if p.try_eat(T![:]) {
- Some(spanned(p, expr))
+ Some(spanned(p, expr)?)
} else {
None
};
- dbg!(AssertStmt(cond, msg))
+ Ok(AssertStmt(cond, msg))
}
-fn if_spec_data(p: &mut Parser<'_>) -> IfSpecData {
- let v = spanned(p, |p| p.eat(T![if]));
- let cond = expr(p);
- IfSpecData { span: v.span, cond }
+fn if_spec_data(p: &mut Parser<'_>) -> R<IfSpecData> {
+ let v = spanned(p, |p| p.eat(T![if]))?;
+ let cond = expr(p)?;
+ Ok(IfSpecData { span: v.span, cond })
}
-fn if_else(p: &mut Parser<'_>) -> IfElse {
- let cond = if_spec_data(p);
- p.eat(T![then]);
- let cond_then = expr(p);
- let cond_else = if p.at(T![else]) { Some(expr(p)) } else { None };
- IfElse {
+fn if_else(p: &mut Parser<'_>) -> R<IfElse> {
+ let cond = if_spec_data(p)?;
+ p.eat(T![then])?;
+ let cond_then = expr(p)?;
+ let cond_else = if p.try_eat(T![else]) {
+ Some(expr(p)?)
+ } else {
+ None
+ };
+ Ok(IfElse {
cond,
cond_then,
cond_else,
- }
+ })
}
-fn slice_desc(p: &mut Parser<'_>, start: Option<Spanned<Expr>>) -> SliceDesc {
- // start
- p.eat(T![:]);
+fn slice_desc(p: &mut Parser<'_>, start: Option<Spanned<Expr>>) -> R<SliceDesc> {
+ p.eat(T![:])?;
let end = if !p.at(T![:]) && !p.at(T![']']) {
- Some(spanned(p, expr))
+ Some(spanned(p, expr)?)
} else {
None
};
- let step = if p.try_eat(T![:]) && !p.at(T![']']) {
- Some(spanned(p, expr))
+ let step = if p.try_eat(T![:]) {
+ if !p.at(T![']']) {
+ Some(spanned(p, expr)?)
+ } else {
+ None
+ }
} else {
None
};
- SliceDesc { start, end, step }
+ Ok(SliceDesc { start, end, step })
+}
+
+fn destruct(p: &mut Parser<'_>) -> R<Destruct> {
+ Ok(Destruct::Full(p.expect_ident()?))
+}
+
+fn params(p: &mut Parser<'_>) -> R<ExprParams> {
+ if p.at(T![')']) {
+ return Ok(ExprParams::new(Vec::new()));
+ }
+ let mut result = Vec::new();
+ loop {
+ let d = destruct(p)?;
+ let default = if p.try_eat(T![=]) {
+ Some(Rc::new(expr(p)?))
+ } else {
+ None
+ };
+ result.push(ExprParam {
+ destruct: d,
+ default,
+ });
+ if !p.try_eat(T![,]) {
+ break;
+ }
+ if p.at(T![')']) {
+ break;
+ }
+ }
+ Ok(ExprParams::new(result))
}
-fn expr_simple(p: &mut Parser<'_>) -> Expr {
- let mut e = if let Some(literal) = literal(p) {
- Expr::Literal(literal)
+fn args(p: &mut Parser<'_>) -> R<ArgsDesc> {
+ if p.at(T![')']) {
+ return Ok(ArgsDesc::new(Vec::new(), Vec::new()));
+ }
+ let mut unnamed = Vec::new();
+ let mut named = Vec::new();
+ let mut named_started = false;
+ loop {
+ let is_named = p.at_ident() && {
+ let next_offset = p.offset + 1;
+ next_offset < p.lexemes.len() && p.lexemes[next_offset].kind == T![=] && {
+ let after_eq = next_offset + 1;
+ after_eq >= p.lexemes.len() || p.lexemes[after_eq].kind != T![=]
+ }
+ };
+ if is_named {
+ let name: IStr = p.expect_ident()?;
+ p.eat(T![=])?;
+ let value = Rc::new(expr(p)?);
+ named.push((name, value));
+ named_started = true;
+ } else {
+ if named_started {
+ return Err(p.error("positional argument after named argument".into()));
+ }
+ unnamed.push(Rc::new(expr(p)?));
+ }
+ if !p.try_eat(T![,]) {
+ break;
+ }
+ if p.at(T![')']) {
+ break;
+ }
+ }
+ Ok(ArgsDesc::new(unnamed, named))
+}
+
+fn bind(p: &mut Parser<'_>) -> R<BindSpec> {
+ let name = p.expect_ident()?;
+ if p.try_eat(T!['(']) {
+ let ps = params(p)?;
+ p.eat(T![')'])?;
+ p.eat(T![=])?;
+ let value = Rc::new(expr(p)?);
+ Ok(BindSpec::Function {
+ name,
+ params: ps,
+ value,
+ })
+ } else {
+ p.eat(T![=])?;
+ let value = Rc::new(expr(p)?);
+ Ok(BindSpec::Field {
+ into: Destruct::Full(name),
+ value,
+ })
+ }
+}
+
+fn visibility(p: &mut Parser<'_>) -> R<Visibility> {
+ p.eat(T![:])?;
+ if p.try_eat(T![:]) {
+ if p.try_eat(T![:]) {
+ Ok(Visibility::Unhide)
+ } else {
+ Ok(Visibility::Hidden)
+ }
+ } else {
+ Ok(Visibility::Normal)
+ }
+}
+
+fn field_name(p: &mut Parser<'_>) -> R<FieldName> {
+ if p.at_ident() {
+ Ok(FieldName::Fixed(p.expect_ident()?))
+ } else if is_string_token(p.peek()) {
+ Ok(FieldName::Fixed(parse_string_content(p)?))
+ } else if p.at(T!['[']) {
+ p.eat(T!['['])?;
+ let e = expr(p)?;
+ p.eat(T![']'])?;
+ Ok(FieldName::Dyn(e))
+ } else {
+ Err(p.error(format!("expected field name, got {}", p.current_desc())))
+ }
+}
+
+fn field(p: &mut Parser<'_>) -> R<FieldMember> {
+ let name = spanned(p, field_name)?;
+
+ if p.at(T!['(']) {
+ p.eat(T!['('])?;
+ let ps = params(p)?;
+ p.eat(T![')'])?;
+ let vis = visibility(p)?;
+ let value = Rc::new(expr(p)?);
+ Ok(FieldMember {
+ name,
+ plus: false,
+ params: Some(ps),
+ visibility: vis,
+ value,
+ })
+ } else {
+ let plus = p.try_eat(T![+]);
+ let vis = visibility(p)?;
+ let value = Rc::new(expr(p)?);
+ Ok(FieldMember {
+ name,
+ plus,
+ params: None,
+ visibility: vis,
+ value,
+ })
+ }
+}
+
+fn member(p: &mut Parser<'_>) -> R<Member> {
+ if p.at(T![local]) {
+ p.eat(T![local])?;
+ Ok(Member::BindStmt(bind(p)?))
} else if p.at(T![assert]) {
- let assert = assert_stmt(p);
- p.eat(T![;]);
- let rest = expr(p);
- Expr::AssertExpr(Rc::new(AssertExpr { assert, rest }))
- } else if p.at(T![if]) {
- Expr::IfElse(Box::new(if_else(p)))
+ Ok(Member::AssertStmt(assert_stmt(p)?))
+ } else {
+ Ok(Member::Field(field(p)?))
+ }
+}
+
+fn for_spec(p: &mut Parser<'_>) -> R<ForSpecData> {
+ p.eat(T![for])?;
+ let d = destruct(p)?;
+ p.eat(T![in])?;
+ let over = expr(p)?;
+ Ok(ForSpecData { destruct: d, over })
+}
+
+fn compspecs(p: &mut Parser<'_>) -> R<Vec<CompSpec>> {
+ let mut specs = Vec::new();
+ specs.push(CompSpec::ForSpec(for_spec(p)?));
+ loop {
+ if p.at(T![for]) {
+ specs.push(CompSpec::ForSpec(for_spec(p)?));
+ } else if p.at(T![if]) {
+ let isd = if_spec_data(p)?;
+ specs.push(CompSpec::IfSpec(isd));
+ } else {
+ break;
+ }
+ }
+ Ok(specs)
+}
+
+fn objinside(p: &mut Parser<'_>) -> R<ObjBody> {
+ if p.at(T!['}']) {
+ return Ok(ObjBody::MemberList(ObjMembers {
+ locals: Rc::new(Vec::new()),
+ asserts: Rc::new(Vec::new()),
+ fields: Vec::new(),
+ }));
+ }
+
+ let mut members = Vec::new();
+ loop {
+ members.push(member(p)?);
+ if !p.try_eat(T![,]) {
+ break;
+ }
+ if p.at(T!['}']) || p.at(T![for]) {
+ break;
+ }
+ }
+
+ if p.at(T![for]) {
+ let specs = compspecs(p)?;
+ let mut locals = Vec::new();
+ let mut field_member = None;
+ for m in members {
+ match m {
+ Member::Field(f) => {
+ if field_member.is_some() {
+ return Err(p.error(
+ "object comprehension can only contain one field".into(),
+ ));
+ }
+ field_member = Some(f);
+ }
+ Member::BindStmt(b) => locals.push(b),
+ Member::AssertStmt(_) => {
+ return Err(p.error(
+ "asserts are unsupported in object comprehension".into(),
+ ));
+ }
+ }
+ }
+ Ok(ObjBody::ObjComp(ObjComp {
+ locals: Rc::new(locals),
+ field: Rc::new(
+ field_member.ok_or_else(|| {
+ p.error("missing object comprehension field".into())
+ })?,
+ ),
+ compspecs: specs,
+ }))
} else {
- panic!("unexpected token: {:?}", p.peek());
+ let mut locals = Vec::new();
+ let mut asserts = Vec::new();
+ let mut fields = Vec::new();
+ for m in members {
+ match m {
+ Member::Field(f) => fields.push(f),
+ Member::BindStmt(b) => locals.push(b),
+ Member::AssertStmt(a) => asserts.push(a),
+ }
+ }
+ Ok(ObjBody::MemberList(ObjMembers {
+ locals: Rc::new(locals),
+ asserts: Rc::new(asserts),
+ fields,
+ }))
+ }
+}
+
+fn expr_basic(p: &mut Parser<'_>) -> R<Expr> {
+ if let Some(lit) = literal(p) {
+ return Ok(Expr::Literal(lit));
+ }
+
+ match p.peek() {
+ SyntaxKind::STRING_DOUBLE
+ | SyntaxKind::STRING_SINGLE
+ | SyntaxKind::STRING_DOUBLE_VERBATIM
+ | SyntaxKind::STRING_SINGLE_VERBATIM
+ | SyntaxKind::STRING_BLOCK => Ok(Expr::Str(parse_string_content(p)?)),
+
+ SyntaxKind::FLOAT => Ok(Expr::Num(parse_number(p)?)),
+
+ T!['('] => {
+ p.eat(T!['('])?;
+ let e = expr(p)?;
+ p.eat(T![')'])?;
+ Ok(e)
+ }
+
+ T!['['] => {
+ p.eat(T!['['])?;
+ if p.at(T![']']) {
+ p.eat(T![']'])?;
+ return Ok(Expr::Arr(Rc::new(Vec::new())));
+ }
+ let first = expr(p)?;
+ if p.at(T![for]) {
+ let specs = compspecs(p)?;
+ p.eat(T![']'])?;
+ Ok(Expr::ArrComp(Rc::new(first), specs))
+ } else if p.at(T![,]) && {
+ let next = p.offset + 1;
+ next < p.lexemes.len() && p.lexemes[next].kind == T![for]
+ } {
+ p.eat(T![,])?;
+ let specs = compspecs(p)?;
+ p.eat(T![']'])?;
+ Ok(Expr::ArrComp(Rc::new(first), specs))
+ } else {
+ let mut elems = vec![first];
+ while p.try_eat(T![,]) {
+ if p.at(T![']']) {
+ break;
+ }
+ elems.push(expr(p)?);
+ }
+ p.eat(T![']'])?;
+ Ok(Expr::Arr(Rc::new(elems)))
+ }
+ }
+
+ T!['{'] => {
+ p.eat(T!['{'])?;
+ let body = objinside(p)?;
+ p.eat(T!['}'])?;
+ Ok(Expr::Obj(body))
+ }
+
+ T![local] => {
+ p.eat(T![local])?;
+ let mut binds = Vec::new();
+ loop {
+ binds.push(bind(p)?);
+ if !p.try_eat(T![,]) {
+ break;
+ }
+ }
+ p.eat(T![;])?;
+ let body = expr(p)?;
+ Ok(Expr::LocalExpr(binds, Box::new(body)))
+ }
+
+ T![if] => Ok(Expr::IfElse(Box::new(if_else(p)?))),
+
+ T![function] => {
+ p.eat(T![function])?;
+ p.eat(T!['('])?;
+ let ps = params(p)?;
+ p.eat(T![')'])?;
+ let body = expr(p)?;
+ Ok(Expr::Function(ps, Rc::new(body)))
+ }
+
+ T![assert] => {
+ let a = assert_stmt(p)?;
+ p.eat(T![;])?;
+ let rest = expr(p)?;
+ Ok(Expr::AssertExpr(Rc::new(AssertExpr { assert: a, rest })))
+ }
+
+ T![error] => {
+ let span = spanned(p, |p| p.eat(T![error]))?;
+ let e = expr(p)?;
+ Ok(Expr::ErrorStmt(span.span, Box::new(e)))
+ }
+
+ T![importstr] => {
+ let kind = spanned(p, |p| {
+ p.eat(T![importstr])?;
+ Ok(ImportKind::Str)
+ })?;
+ let path = expr(p)?;
+ Ok(Expr::Import(kind, Box::new(path)))
+ }
+
+ T![importbin] => {
+ let kind = spanned(p, |p| {
+ p.eat(T![importbin])?;
+ Ok(ImportKind::Bin)
+ })?;
+ let path = expr(p)?;
+ Ok(Expr::Import(kind, Box::new(path)))
+ }
+
+ T![import] => {
+ let kind = spanned(p, |p| {
+ p.eat(T![import])?;
+ Ok(ImportKind::Normal)
+ })?;
+ let path = expr(p)?;
+ Ok(Expr::Import(kind, Box::new(path)))
+ }
+
+ SyntaxKind::IDENT => {
+ let text = p.text();
+ if is_reserved(text) {
+ return Err(p.error(format!("unexpected reserved word '{text}'")));
+ }
+ let n = spanned(p, |p| {
+ let s: IStr = p.text().into();
+ p.eat_any();
+ Ok(s)
+ })?;
+ Ok(Expr::Var(n))
+ }
+
+ _ => Err(p.error(format!("unexpected {}", p.current_desc()))),
+ }
+}
+
+/// Flush accumulated index parts into an Expr::Index wrapping `e`.
+fn flush_index_parts(e: &mut Expr, parts: &mut Vec<IndexPart>) {
+ if parts.is_empty() {
+ return;
+ }
+ let old = std::mem::replace(e, Expr::Literal(LiteralType::Null));
+ *e = Expr::Index {
+ indexable: Box::new(old),
+ parts: std::mem::take(parts),
};
+}
- dbg!(&e);
+fn expr_suffix(p: &mut Parser<'_>) -> R<Expr> {
+ let mut e = expr_basic(p)?;
+ // Accumulate consecutive index parts (.field, [expr], ?.field, ?.[expr])
+ // into a single Expr::Index. This is critical for null-coalesce semantics:
+ // a?.b.c needs all parts in one Index so the evaluator can skip .c when .b is null.
+ let mut parts: Vec<IndexPart> = Vec::new();
loop {
- if p.try_eat(T!['[']) {
- if p.at(T![:]) {
- let slice = slice_desc(p, None);
- e = Expr::Slice(Box::new(Slice { value: e, slice }));
- p.eat(T![']']);
- continue;
+ #[cfg(feature = "exp-null-coaelse")]
+ if p.at(T![?]) {
+ p.eat_any();
+ if p.try_eat(T![.]) {
+ if p.at(T!['[']) {
+ // ?.[expr]
+ p.eat(T!['['])?;
+ let idx = spanned(p, expr)?;
+ p.eat(T![']'])?;
+ parts.push(IndexPart {
+ span: idx.span,
+ value: idx.value,
+ null_coaelse: true,
+ });
+ } else {
+ // ?.field
+ let id_spanned = spanned(p, |p| {
+ let name = p.expect_ident()?;
+ Ok(Expr::Str(name))
+ })?;
+ parts.push(IndexPart {
+ span: id_spanned.span,
+ value: id_spanned.value,
+ null_coaelse: true,
+ });
+ }
+ } else {
+ return Err(p.error("expected '.' after '?'".into()));
}
+ continue;
+ }
- let idx = spanned(p, expr);
+ if p.at(T![.]) {
+ p.eat(T![.])?;
+ let id_spanned = spanned(p, |p| {
+ let name = p.expect_ident()?;
+ Ok(Expr::Str(name))
+ })?;
+ parts.push(IndexPart {
+ span: id_spanned.span,
+ value: id_spanned.value,
+ #[cfg(feature = "exp-null-coaelse")]
+ null_coaelse: false,
+ });
+ } else if p.at(T!['[']) {
+ p.eat(T!['['])?;
+
if p.at(T![:]) {
- let slice = slice_desc(p, Some(idx));
+ // Slice: flush index parts first, then handle slice
+ flush_index_parts(&mut e, &mut parts);
+ let slice = slice_desc(p, None)?;
+ p.eat(T![']'])?;
e = Expr::Slice(Box::new(Slice { value: e, slice }));
} else {
+ let idx = spanned(p, expr)?;
+ if p.at(T![:]) {
+ // Slice with start: flush index parts first
+ flush_index_parts(&mut e, &mut parts);
+ let slice = slice_desc(p, Some(idx))?;
+ p.eat(T![']'])?;
+ e = Expr::Slice(Box::new(Slice { value: e, slice }));
+ } else {
+ // Bracket index: add to parts
+ p.eat(T![']'])?;
+ parts.push(IndexPart {
+ span: idx.span,
+ value: idx.value,
+ #[cfg(feature = "exp-null-coaelse")]
+ null_coaelse: false,
+ });
+ }
}
- p.eat(T![']']);
+ } else if p.at(T!['(']) {
+ flush_index_parts(&mut e, &mut parts);
+ let args_spanned = spanned(p, |p| {
+ p.eat(T!['('])?;
+ let a = args(p)?;
+ p.eat(T![')'])?;
+ Ok(a)
+ })?;
+ let tailstrict = p.try_eat(T![tailstrict]);
+ e = Expr::Apply(Box::new(e), args_spanned, tailstrict);
+ } else if p.at(T!['{']) {
+ flush_index_parts(&mut e, &mut parts);
+ p.eat(T!['{'])?;
+ let body = objinside(p)?;
+ p.eat(T!['}'])?;
+ e = Expr::ObjExtend(Rc::new(e), body);
} else {
break;
}
}
- dbg!(e)
+ flush_index_parts(&mut e, &mut parts);
+ Ok(e)
}
-fn expr(p: &mut Parser<'_>) -> Expr {
- expr_simple(p)
+fn prefix_binding_power(op: UnaryOpType) -> u8 {
+ match op {
+ UnaryOpType::Plus | UnaryOpType::Minus | UnaryOpType::Not | UnaryOpType::BitNot => 20,
+ }
+}
+
+fn infix_binding_power(op: BinaryOpType) -> (u8, u8) {
+ match op {
+ BinaryOpType::Or => (2, 3),
+ #[cfg(feature = "exp-null-coaelse")]
+ BinaryOpType::NullCoaelse => (2, 3),
+ BinaryOpType::And => (4, 5),
+ BinaryOpType::BitOr => (6, 7),
+ BinaryOpType::BitXor => (8, 9),
+ BinaryOpType::BitAnd => (10, 11),
+ BinaryOpType::Eq | BinaryOpType::Neq => (12, 13),
+ BinaryOpType::Lt
+ | BinaryOpType::Gt
+ | BinaryOpType::Lte
+ | BinaryOpType::Gte
+ | BinaryOpType::In => (14, 15),
+ BinaryOpType::Lhs | BinaryOpType::Rhs => (16, 17),
+ BinaryOpType::Add | BinaryOpType::Sub => (18, 19),
+ BinaryOpType::Mul | BinaryOpType::Div | BinaryOpType::Mod => (20, 21),
+ }
}
-#[test]
-fn basic_test() {
- let mut parser = Parser::new(" assert true[false] : false ; true ");
- let e = expr(&mut parser);
- let l = &parser.lexemes;
+fn unary_op(kind: SyntaxKind) -> Option<UnaryOpType> {
+ match kind {
+ T![+] => Some(UnaryOpType::Plus),
+ T![-] => Some(UnaryOpType::Minus),
+ T![!] => Some(UnaryOpType::Not),
+ T![~] => Some(UnaryOpType::BitNot),
+ _ => None,
+ }
+}
- assert_snapshot!(format!("{l:#?}\n\n---\n\n{e:#?}"));
+fn binary_op(p: &Parser<'_>) -> Option<BinaryOpType> {
+ match p.peek() {
+ T![||] => Some(BinaryOpType::Or),
+ T![&&] => Some(BinaryOpType::And),
+ T![|] => Some(BinaryOpType::BitOr),
+ T![^] => Some(BinaryOpType::BitXor),
+ T![&] => Some(BinaryOpType::BitAnd),
+ T![==] => Some(BinaryOpType::Eq),
+ T![!=] => Some(BinaryOpType::Neq),
+ T![<] => Some(BinaryOpType::Lt),
+ T![>] => Some(BinaryOpType::Gt),
+ T![<=] => Some(BinaryOpType::Lte),
+ T![>=] => Some(BinaryOpType::Gte),
+ T![<<] => Some(BinaryOpType::Lhs),
+ T![>>] => Some(BinaryOpType::Rhs),
+ T![+] => Some(BinaryOpType::Add),
+ T![-] => Some(BinaryOpType::Sub),
+ T![*] => Some(BinaryOpType::Mul),
+ T![/] => Some(BinaryOpType::Div),
+ T![%] => Some(BinaryOpType::Mod),
+ T![in] => Some(BinaryOpType::In),
+ #[cfg(feature = "exp-null-coaelse")]
+ T![??] => Some(BinaryOpType::NullCoaelse),
+ _ => None,
+ }
+}
+
+fn expr_bp(p: &mut Parser<'_>, min_bp: u8) -> R<Expr> {
+ let mut lhs = if let Some(op) = unary_op(p.peek()) {
+ p.eat_any();
+ let rbp = prefix_binding_power(op);
+ let rhs = expr_bp(p, rbp)?;
+ Expr::UnaryOp(op, Box::new(rhs))
+ } else {
+ expr_suffix(p)?
+ };
+
+ loop {
+ if p.at_eof() {
+ break;
+ }
+
+ let Some(op) = binary_op(p) else {
+ break;
+ };
+
+ let (lbp, rbp) = infix_binding_power(op);
+ if lbp < min_bp {
+ break;
+ }
+
+ p.eat_any();
+ let rhs = expr_bp(p, rbp)?;
+ lhs = Expr::BinaryOp(Box::new(BinaryOp { lhs, op, rhs }));
+ }
+
+ Ok(lhs)
+}
+
+fn expr(p: &mut Parser<'_>) -> R<Expr> {
+ expr_bp(p, 0)
+}
+
+pub fn parse(str: &str, settings: &ParserSettings) -> Result<Expr, ParseError> {
+ let mut p = Parser::new(str, settings.source.clone());
+ for lexeme in &p.lexemes {
+ if let Some(desc) = lexeme.kind.error_description() {
+ return Err(ParseError {
+ message: desc.to_owned(),
+ location: ParseErrorLocation {
+ offset: lexeme.range.0 as usize,
+ },
+ });
+ }
+ }
+ let e = expr(&mut p)?;
+ if !p.at_eof() {
+ return Err(p.error(format!(
+ "expected end of file, got {}",
+ p.current_desc(),
+ )));
+ }
+ Ok(e)
+}
+
+pub fn string_to_expr(s: IStr, settings: &ParserSettings) -> Spanned<Expr> {
+ let len = s.len();
+ Spanned::new(
+ Expr::Str(s),
+ Span(settings.source.clone(), 0, len as u32),
+ )
+}
+
+#[cfg(test)]
+mod tests {
+ use std::fs;
+
+ use insta::{assert_snapshot, glob};
+ use jrsonnet_ir::{IStr, Source};
+
+ use super::*;
+
+ fn parse_str(input: &str) -> Expr {
+ let source = Source::new_virtual("<test>".into(), input.into());
+ let settings = ParserSettings { source };
+ parse(input, &settings).unwrap()
+ }
+
+ #[test]
+ #[cfg(not(feature = "exp-null-coaelse"))]
+ fn basic_test() {
+ let v = parse_str("assert true[false] : false ; true");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn literals() {
+ let v = parse_str("[null, true, false, self, super, $]");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn basic_math() {
+ let v = parse_str("2+2*2");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn underscore_numbers() {
+ let v = parse_str("[1_000, 1_000.000_1, 1_0e1_0]");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn strings() {
+ let v = parse_str(r#"["hello", 'world', @"raw""str", @'raw''str']"#);
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn object() {
+ let v = parse_str("{a: 1, b:: 2, c::: 3}");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn function_and_call() {
+ let v = parse_str("local f(x, y=1) = x + y; f(2, y=3)");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn if_then_else() {
+ let v = parse_str("if true then 1 else 2");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn imports() {
+ let v = parse_str(r#"[import "a", importstr "b", importbin "c"]"#);
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn array_comp() {
+ let v = parse_str("[x for x in arr]");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ #[cfg(not(feature = "exp-null-coaelse"))]
+ fn index_and_suffix() {
+ let v = parse_str("std.test(2).field[0]");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn obj_extend() {
+ let v = parse_str("{} { x: 1 }");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn unary_ops() {
+ let v = parse_str("!a && !b");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn error_expr() {
+ let v = parse_str("error \"bad\"");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ fn slice() {
+ let v = parse_str("[a[1:], a[1::], a[:1:], a[::1]]");
+ assert_snapshot!(format!("{v:#?}"));
+ }
+
+ #[test]
+ #[cfg(not(feature = "exp-null-coaelse"))]
+ fn peg_snapshots() {
+ glob!("../../jrsonnet-peg-parser/src", "tests/*.jsonnet", |path| {
+ let input = fs::read_to_string(path).expect("read test file");
+ let source = Source::new_virtual("<test>".into(), IStr::empty());
+ let settings = ParserSettings { source };
+ let v = parse(&input, &settings).unwrap();
+ let v = format!("{v:#?}");
+ assert_snapshot!(v);
+ });
+ }
}
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__array_comp.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__array_comp.snap
@@ -0,0 +1,21 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+ArrComp(
+ Var(
+ "x" from virtual:<test>:1-2,
+ ),
+ [
+ ForSpec(
+ ForSpecData {
+ destruct: Full(
+ "x",
+ ),
+ over: Var(
+ "arr" from virtual:<test>:12-15,
+ ),
+ },
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_math.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_math.snap
@@ -0,0 +1,23 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Add,
+ rhs: BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Mul,
+ rhs: Num(
+ 2.0,
+ ),
+ },
+ ),
+ },
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snap
@@ -0,0 +1,31 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+AssertExpr(
+ AssertExpr {
+ assert: AssertStmt(
+ Index {
+ indexable: Literal(
+ True,
+ ),
+ parts: [
+ IndexPart {
+ span: virtual:<test>:12-17,
+ value: Literal(
+ False,
+ ),
+ },
+ ],
+ } from virtual:<test>:7-18,
+ Some(
+ Literal(
+ False,
+ ) from virtual:<test>:21-26,
+ ),
+ ),
+ rest: Literal(
+ True,
+ ),
+ },
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__error_expr.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__error_expr.snap
@@ -0,0 +1,10 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+ErrorStmt(
+ virtual:<test>:0-5,
+ Str(
+ "bad",
+ ),
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__function_and_call.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__function_and_call.snap
@@ -0,0 +1,80 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+LocalExpr(
+ [
+ Function {
+ name: "f",
+ params: ExprParams {
+ exprs: [
+ ExprParam {
+ destruct: Full(
+ "x",
+ ),
+ default: None,
+ },
+ ExprParam {
+ destruct: Full(
+ "y",
+ ),
+ default: Some(
+ Num(
+ 1.0,
+ ),
+ ),
+ },
+ ],
+ signature: FunctionSignature(
+ [
+ ParamParse {
+ name: Named(
+ "x",
+ ),
+ default: None,
+ },
+ ParamParse {
+ name: Named(
+ "y",
+ ),
+ default: Exists,
+ },
+ ],
+ ),
+ binds_len: 2,
+ },
+ value: BinaryOp(
+ BinaryOp {
+ lhs: Var(
+ "x" from virtual:<test>:18-19,
+ ),
+ op: Add,
+ rhs: Var(
+ "y" from virtual:<test>:22-23,
+ ),
+ },
+ ),
+ },
+ ],
+ Apply(
+ Var(
+ "f" from virtual:<test>:25-26,
+ ),
+ ArgsDesc {
+ unnamed: [
+ Num(
+ 2.0,
+ ),
+ ],
+ named: [
+ (
+ "y",
+ Num(
+ 3.0,
+ ),
+ ),
+ ],
+ } from virtual:<test>:26-34,
+ false,
+ ),
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__if_then_else.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__if_then_else.snap
@@ -0,0 +1,22 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+IfElse(
+ IfElse {
+ cond: IfSpecData {
+ span: virtual:<test>:0-2,
+ cond: Literal(
+ True,
+ ),
+ },
+ cond_then: Num(
+ 1.0,
+ ),
+ cond_else: Some(
+ Num(
+ 2.0,
+ ),
+ ),
+ },
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__imports.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__imports.snap
@@ -0,0 +1,26 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+Arr(
+ [
+ Import(
+ Normal from virtual:<test>:1-7,
+ Str(
+ "a",
+ ),
+ ),
+ Import(
+ Str from virtual:<test>:13-22,
+ Str(
+ "b",
+ ),
+ ),
+ Import(
+ Bin from virtual:<test>:28-37,
+ Str(
+ "c",
+ ),
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__index_and_suffix.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__index_and_suffix.snap
@@ -0,0 +1,44 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+Index {
+ indexable: Apply(
+ Index {
+ indexable: Var(
+ "std" from virtual:<test>:0-3,
+ ),
+ parts: [
+ IndexPart {
+ span: virtual:<test>:4-8,
+ value: Str(
+ "test",
+ ),
+ },
+ ],
+ },
+ ArgsDesc {
+ unnamed: [
+ Num(
+ 2.0,
+ ),
+ ],
+ named: [],
+ } from virtual:<test>:8-11,
+ false,
+ ),
+ parts: [
+ IndexPart {
+ span: virtual:<test>:12-17,
+ value: Str(
+ "field",
+ ),
+ },
+ IndexPart {
+ span: virtual:<test>:18-19,
+ value: Num(
+ 0.0,
+ ),
+ },
+ ],
+}
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__literals.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__literals.snap
@@ -0,0 +1,26 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+Arr(
+ [
+ Literal(
+ Null,
+ ),
+ Literal(
+ True,
+ ),
+ Literal(
+ False,
+ ),
+ Literal(
+ This,
+ ),
+ Literal(
+ Super,
+ ),
+ Literal(
+ Dollar,
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__obj_extend.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__obj_extend.snap
@@ -0,0 +1,34 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+ObjExtend(
+ Obj(
+ MemberList(
+ ObjMembers {
+ locals: [],
+ asserts: [],
+ fields: [],
+ },
+ ),
+ ),
+ MemberList(
+ ObjMembers {
+ locals: [],
+ asserts: [],
+ fields: [
+ FieldMember {
+ name: Fixed(
+ "x",
+ ) from virtual:<test>:5-6,
+ plus: false,
+ params: None,
+ visibility: Normal,
+ value: Num(
+ 1.0,
+ ),
+ },
+ ],
+ },
+ ),
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__object.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__object.snap
@@ -0,0 +1,47 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+Obj(
+ MemberList(
+ ObjMembers {
+ locals: [],
+ asserts: [],
+ fields: [
+ FieldMember {
+ name: Fixed(
+ "a",
+ ) from virtual:<test>:1-2,
+ plus: false,
+ params: None,
+ visibility: Normal,
+ value: Num(
+ 1.0,
+ ),
+ },
+ FieldMember {
+ name: Fixed(
+ "b",
+ ) from virtual:<test>:7-8,
+ plus: false,
+ params: None,
+ visibility: Hidden,
+ value: Num(
+ 2.0,
+ ),
+ },
+ FieldMember {
+ name: Fixed(
+ "c",
+ ) from virtual:<test>:14-15,
+ plus: false,
+ params: None,
+ visibility: Unhide,
+ value: Num(
+ 3.0,
+ ),
+ },
+ ],
+ },
+ ),
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@array_comp.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@array_comp.jsonnet.snap
@@ -0,0 +1,82 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/array_comp.jsonnet
+---
+Arr(
+ [
+ ArrComp(
+ Apply(
+ Index {
+ indexable: Var(
+ "std" from virtual:<test>:3-6,
+ ),
+ parts: [
+ IndexPart {
+ span: virtual:<test>:7-15,
+ value: Str(
+ "deepJoin",
+ ),
+ },
+ ],
+ },
+ ArgsDesc {
+ unnamed: [
+ Var(
+ "x" from virtual:<test>:16-17,
+ ),
+ ],
+ named: [],
+ } from virtual:<test>:15-18,
+ false,
+ ),
+ [
+ ForSpec(
+ ForSpecData {
+ destruct: Full(
+ "x",
+ ),
+ over: Var(
+ "arr" from virtual:<test>:28-31,
+ ),
+ },
+ ),
+ ],
+ ),
+ ArrComp(
+ Var(
+ "a" from virtual:<test>:35-36,
+ ),
+ [
+ ForSpec(
+ ForSpecData {
+ destruct: Full(
+ "a",
+ ),
+ over: Var(
+ "b" from virtual:<test>:46-47,
+ ),
+ },
+ ),
+ IfSpec(
+ IfSpecData {
+ span: virtual:<test>:48-50,
+ cond: Var(
+ "c" from virtual:<test>:51-52,
+ ),
+ },
+ ),
+ ForSpec(
+ ForSpecData {
+ destruct: Full(
+ "e",
+ ),
+ over: Var(
+ "f" from virtual:<test>:62-63,
+ ),
+ },
+ ),
+ ],
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@basic_math.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@basic_math.jsonnet.snap
@@ -0,0 +1,120 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/basic_math.jsonnet
+---
+Arr(
+ [
+ BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Add,
+ rhs: BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Mul,
+ rhs: Num(
+ 2.0,
+ ),
+ },
+ ),
+ },
+ ),
+ BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Add,
+ rhs: BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Mul,
+ rhs: Num(
+ 2.0,
+ ),
+ },
+ ),
+ },
+ ),
+ BinaryOp(
+ BinaryOp {
+ lhs: BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Add,
+ rhs: Num(
+ 2.0,
+ ),
+ },
+ ),
+ op: Add,
+ rhs: BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Mul,
+ rhs: Num(
+ 2.0,
+ ),
+ },
+ ),
+ },
+ ),
+ BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Add,
+ rhs: BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Add,
+ rhs: BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Mul,
+ rhs: Num(
+ 2.0,
+ ),
+ },
+ ),
+ },
+ ),
+ },
+ ),
+ BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 2.0,
+ ),
+ op: Add,
+ rhs: BinaryOp(
+ BinaryOp {
+ lhs: Num(
+ 3.0,
+ ),
+ op: Mul,
+ rhs: Num(
+ 4.0,
+ ),
+ },
+ ),
+ },
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@comment_eof.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@comment_eof.jsonnet.snap
@@ -0,0 +1,26 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/comment_eof.jsonnet
+---
+Obj(
+ MemberList(
+ ObjMembers {
+ locals: [],
+ asserts: [],
+ fields: [
+ FieldMember {
+ name: Fixed(
+ "a",
+ ) from virtual:<test>:1-2,
+ plus: false,
+ params: None,
+ visibility: Normal,
+ value: Num(
+ 1.0,
+ ),
+ },
+ ],
+ },
+ ),
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@default_nondefault.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@default_nondefault.jsonnet.snap
@@ -0,0 +1,55 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/default_nondefault.jsonnet
+---
+LocalExpr(
+ [
+ Function {
+ name: "x",
+ params: ExprParams {
+ exprs: [
+ ExprParam {
+ destruct: Full(
+ "foo",
+ ),
+ default: Some(
+ Str(
+ "foo",
+ ),
+ ),
+ },
+ ExprParam {
+ destruct: Full(
+ "bar",
+ ),
+ default: None,
+ },
+ ],
+ signature: FunctionSignature(
+ [
+ ParamParse {
+ name: Named(
+ "foo",
+ ),
+ default: Exists,
+ },
+ ParamParse {
+ name: Named(
+ "bar",
+ ),
+ default: None,
+ },
+ ],
+ ),
+ binds_len: 2,
+ },
+ value: Literal(
+ Null,
+ ),
+ },
+ ],
+ Literal(
+ Null,
+ ),
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@empty_object.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@empty_object.jsonnet.snap
@@ -0,0 +1,14 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/empty_object.jsonnet
+---
+Obj(
+ MemberList(
+ ObjMembers {
+ locals: [],
+ asserts: [],
+ fields: [],
+ },
+ ),
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@imports.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@imports.jsonnet.snap
@@ -0,0 +1,27 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/imports.jsonnet
+---
+Arr(
+ [
+ Import(
+ Normal from virtual:<test>:2-8,
+ Str(
+ "hello",
+ ),
+ ),
+ Import(
+ Str from virtual:<test>:18-27,
+ Str(
+ "garnish.txt",
+ ),
+ ),
+ Import(
+ Bin from virtual:<test>:43-52,
+ Str(
+ "garnish.bin",
+ ),
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@infix.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@infix.jsonnet.snap
@@ -0,0 +1,52 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/infix.jsonnet
+---
+Arr(
+ [
+ BinaryOp(
+ BinaryOp {
+ lhs: UnaryOp(
+ Not,
+ Var(
+ "a" from virtual:<test>:3-4,
+ ),
+ ),
+ op: And,
+ rhs: UnaryOp(
+ Not,
+ Var(
+ "b" from virtual:<test>:9-10,
+ ),
+ ),
+ },
+ ),
+ UnaryOp(
+ Not,
+ BinaryOp(
+ BinaryOp {
+ lhs: Var(
+ "a" from virtual:<test>:13-14,
+ ),
+ op: Div,
+ rhs: UnaryOp(
+ Not,
+ Var(
+ "b" from virtual:<test>:18-19,
+ ),
+ ),
+ },
+ ),
+ ),
+ UnaryOp(
+ Not,
+ UnaryOp(
+ Not,
+ Var(
+ "a" from virtual:<test>:23-24,
+ ),
+ ),
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@multiline.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@multiline.jsonnet.snap
@@ -0,0 +1,21 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/multiline.jsonnet
+---
+Arr(
+ [
+ Str(
+ "Hello world!\na\n",
+ ),
+ Str(
+ "Hello world!\na\n",
+ ),
+ Str(
+ "Hello world!\n\ta\n",
+ ),
+ Str(
+ "Hello world!\n a\n",
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@reserved.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@reserved.jsonnet.snap
@@ -0,0 +1,32 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/reserved.jsonnet
+---
+Arr(
+ [
+ Literal(
+ Null,
+ ),
+ Var(
+ "nulla" from virtual:<test>:8-13,
+ ),
+ Apply(
+ Var(
+ "a" from virtual:<test>:15-16,
+ ),
+ ArgsDesc {
+ unnamed: [
+ Var(
+ "b" from virtual:<test>:17-18,
+ ),
+ Var(
+ "null_fields" from virtual:<test>:20-31,
+ ),
+ ],
+ named: [],
+ } from virtual:<test>:16-32,
+ false,
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@slice.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@slice.jsonnet.snap
@@ -0,0 +1,97 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/slice.jsonnet
+---
+Arr(
+ [
+ Slice(
+ Slice {
+ value: Var(
+ "a" from virtual:<test>:2-3,
+ ),
+ slice: SliceDesc {
+ start: Some(
+ Num(
+ 1.0,
+ ) from virtual:<test>:4-5,
+ ),
+ end: None,
+ step: None,
+ },
+ },
+ ),
+ Slice(
+ Slice {
+ value: Var(
+ "a" from virtual:<test>:9-10,
+ ),
+ slice: SliceDesc {
+ start: Some(
+ Num(
+ 1.0,
+ ) from virtual:<test>:11-12,
+ ),
+ end: None,
+ step: None,
+ },
+ },
+ ),
+ Slice(
+ Slice {
+ value: Var(
+ "a" from virtual:<test>:17-18,
+ ),
+ slice: SliceDesc {
+ start: None,
+ end: Some(
+ Num(
+ 1.0,
+ ) from virtual:<test>:20-21,
+ ),
+ step: None,
+ },
+ },
+ ),
+ Slice(
+ Slice {
+ value: Var(
+ "a" from virtual:<test>:25-26,
+ ),
+ slice: SliceDesc {
+ start: None,
+ end: None,
+ step: Some(
+ Num(
+ 1.0,
+ ) from virtual:<test>:29-30,
+ ),
+ },
+ },
+ ),
+ Slice(
+ Slice {
+ value: Var(
+ "str" from virtual:<test>:33-36,
+ ),
+ slice: SliceDesc {
+ start: None,
+ end: Some(
+ BinaryOp(
+ BinaryOp {
+ lhs: Var(
+ "len" from virtual:<test>:38-41,
+ ),
+ op: Sub,
+ rhs: Num(
+ 1.0,
+ ),
+ },
+ ) from virtual:<test>:38-45,
+ ),
+ step: None,
+ },
+ },
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@string_escaping.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@string_escaping.jsonnet.snap
@@ -0,0 +1,24 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/string_escaping.jsonnet
+---
+Arr(
+ [
+ Str(
+ "Hello, \"world\"!",
+ ),
+ Str(
+ "Hello 'world'!",
+ ),
+ Str(
+ "\\\\",
+ ),
+ Str(
+ "Hello\nWorld",
+ ),
+ Str(
+ "Hello\\n\"World\"",
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@subexp.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@subexp.jsonnet.snap
@@ -0,0 +1,58 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/subexp.jsonnet
+---
+BinaryOp(
+ BinaryOp {
+ lhs: ObjExtend(
+ Obj(
+ MemberList(
+ ObjMembers {
+ locals: [],
+ asserts: [],
+ fields: [],
+ },
+ ),
+ ),
+ MemberList(
+ ObjMembers {
+ locals: [
+ Field {
+ into: Full(
+ "x",
+ ),
+ value: Num(
+ 1.0,
+ ),
+ },
+ ],
+ asserts: [],
+ fields: [
+ FieldMember {
+ name: Fixed(
+ "x",
+ ) from virtual:<test>:18-19,
+ plus: false,
+ params: None,
+ visibility: Normal,
+ value: Var(
+ "x" from virtual:<test>:21-22,
+ ),
+ },
+ ],
+ },
+ ),
+ ),
+ op: Add,
+ rhs: Obj(
+ MemberList(
+ ObjMembers {
+ locals: [],
+ asserts: [],
+ fields: [],
+ },
+ ),
+ ),
+ },
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@suffix.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@suffix.jsonnet.snap
@@ -0,0 +1,73 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/suffix.jsonnet
+---
+Arr(
+ [
+ Index {
+ indexable: Var(
+ "std" from virtual:<test>:2-5,
+ ),
+ parts: [
+ IndexPart {
+ span: virtual:<test>:6-10,
+ value: Str(
+ "test",
+ ),
+ },
+ ],
+ },
+ Apply(
+ Var(
+ "std" from virtual:<test>:12-15,
+ ),
+ ArgsDesc {
+ unnamed: [
+ Num(
+ 2.0,
+ ),
+ ],
+ named: [],
+ } from virtual:<test>:15-18,
+ false,
+ ),
+ Apply(
+ Index {
+ indexable: Var(
+ "std" from virtual:<test>:20-23,
+ ),
+ parts: [
+ IndexPart {
+ span: virtual:<test>:24-28,
+ value: Str(
+ "test",
+ ),
+ },
+ ],
+ },
+ ArgsDesc {
+ unnamed: [
+ Num(
+ 2.0,
+ ),
+ ],
+ named: [],
+ } from virtual:<test>:28-31,
+ false,
+ ),
+ Index {
+ indexable: Var(
+ "a" from virtual:<test>:33-34,
+ ),
+ parts: [
+ IndexPart {
+ span: virtual:<test>:35-36,
+ value: Var(
+ "b" from virtual:<test>:35-36,
+ ),
+ },
+ ],
+ },
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__slice.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__slice.snap
@@ -0,0 +1,72 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+Arr(
+ [
+ Slice(
+ Slice {
+ value: Var(
+ "a" from virtual:<test>:1-2,
+ ),
+ slice: SliceDesc {
+ start: Some(
+ Num(
+ 1.0,
+ ) from virtual:<test>:3-4,
+ ),
+ end: None,
+ step: None,
+ },
+ },
+ ),
+ Slice(
+ Slice {
+ value: Var(
+ "a" from virtual:<test>:8-9,
+ ),
+ slice: SliceDesc {
+ start: Some(
+ Num(
+ 1.0,
+ ) from virtual:<test>:10-11,
+ ),
+ end: None,
+ step: None,
+ },
+ },
+ ),
+ Slice(
+ Slice {
+ value: Var(
+ "a" from virtual:<test>:16-17,
+ ),
+ slice: SliceDesc {
+ start: None,
+ end: Some(
+ Num(
+ 1.0,
+ ) from virtual:<test>:19-20,
+ ),
+ step: None,
+ },
+ },
+ ),
+ Slice(
+ Slice {
+ value: Var(
+ "a" from virtual:<test>:24-25,
+ ),
+ slice: SliceDesc {
+ start: None,
+ end: None,
+ step: Some(
+ Num(
+ 1.0,
+ ) from virtual:<test>:28-29,
+ ),
+ },
+ },
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__strings.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__strings.snap
@@ -0,0 +1,20 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+Arr(
+ [
+ Str(
+ "hello",
+ ),
+ Str(
+ "world",
+ ),
+ Str(
+ "raw\"str",
+ ),
+ Str(
+ "raw'str",
+ ),
+ ],
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__unary_ops.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__unary_ops.snap
@@ -0,0 +1,21 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+BinaryOp(
+ BinaryOp {
+ lhs: UnaryOp(
+ Not,
+ Var(
+ "a" from virtual:<test>:1-2,
+ ),
+ ),
+ op: And,
+ rhs: UnaryOp(
+ Not,
+ Var(
+ "b" from virtual:<test>:7-8,
+ ),
+ ),
+ },
+)
crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__underscore_numbers.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__underscore_numbers.snap
@@ -0,0 +1,17 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{v:#?}\")"
+---
+Arr(
+ [
+ Num(
+ 1000.0,
+ ),
+ Num(
+ 1000.0001,
+ ),
+ Num(
+ 100000000000.0,
+ ),
+ ],
+)
tests/Cargo.tomldiffbeforeafterboth--- a/tests/Cargo.toml
+++ b/tests/Cargo.toml
@@ -4,6 +4,11 @@
edition = "2024"
publish = false
+[features]
+default = ["ir-parser"]
+ir-parser = ["jrsonnet-evaluator/ir-parser"]
+exp-null-coaelse = ["jrsonnet-evaluator/exp-null-coaelse"]
+
[lints]
workspace = true
tests/cpp_test_suite_golden_override/error.parse.array_comma.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.array_comma.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.array_comma.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", ".", "?", "[", "]", "{", <binary op>, <comma>, got "3"
+syntax error: expected R_BRACK, got "3"
error.parse.array_comma.jsonnet:17:7
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.function_arg_positional_after_named.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.function_arg_positional_after_named.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.function_arg_positional_after_named.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", ".", "?", "[", "{", <binary op>, <comma>, <named argument>, got ")"
- error.parse.function_arg_positional_after_named.jsonnet:19:11
\ No newline at end of file
+syntax error: positional argument after named argument
+ error.parse.function_arg_positional_after_named.jsonnet:19:10
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.index_unterminated.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.index_unterminated.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.index_unterminated.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", ":", "[", "{", <identifier>, <number>, <string>, <unary op>, ['"'], ['\''], got "EOF"
- error.parse.index_unterminated.jsonnet:17:4
\ No newline at end of file
+syntax error: unexpected token in expression: EOF
+ error.parse.index_unterminated.jsonnet:17:3
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.method_plus.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.method_plus.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.method_plus.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of ":", "::", ":::", got "+"
+syntax error: expected COLON, got "+"
error.parse.method_plus.jsonnet:17:18
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.object_comma.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.object_comma.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.object_comma.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", ".", "?", "[", "{", "}", <binary op>, got "z"
+syntax error: expected R_BRACE, got "z"
error.parse.object_comma.jsonnet:17:11
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.object_comprehension_local_clash.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.object_comprehension_local_clash.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.object_comprehension_local_clash.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", ".", "?", "[", "{", "}", <binary op>, <comma>, got ":"
+syntax error: expected R_BRACE, got ":"
error.parse.object_comprehension_local_clash.jsonnet:17:29
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.self_in_computed_field.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.self_in_computed_field.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.self_in_computed_field.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "[", "}", <identifier>, <string>, ['"'], ['\''], got "s"
+syntax error: expected field name, got SELF_KW
error.parse.self_in_computed_field.jsonnet:17:15
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.static_error_bad_number.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.static_error_bad_number.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.static_error_bad_number.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", "[", "{", <identifier>, <number>, <string>, <unary op>, ['"'], ['\''], got "."
+syntax error: unexpected token in expression: DOT
error.parse.static_error_bad_number.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected <escape character>, got "o"
- error.parse.string.invalid_escape.jsonnet:17:3
\ No newline at end of file
+syntax error: invalid string escape
+ error.parse.string.invalid_escape.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_non_hex.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_non_hex.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_non_hex.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected <hex char>, got "t"
- error.parse.string.invalid_escape_unicode_non_hex.jsonnet:17:7
\ No newline at end of file
+syntax error: invalid string escape
+ error.parse.string.invalid_escape_unicode_non_hex.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_short.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_short.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_short.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected <hex char>, got "\n"
- error.parse.string.invalid_escape_unicode_short.jsonnet:17:7
\ No newline at end of file
+syntax error: unexpected token: ERROR_STRING_DOUBLE_UNTERMINATED
+ error.parse.string.invalid_escape_unicode_short.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_short2.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_short2.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_short2.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected <hex char>, got "\""
- error.parse.string.invalid_escape_unicode_short2.jsonnet:17:7
\ No newline at end of file
+syntax error: invalid string escape
+ error.parse.string.invalid_escape_unicode_short2.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_short3.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_short3.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.string.invalid_escape_unicode_short3.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected <hex char>, got "\n"
- error.parse.string.invalid_escape_unicode_short3.jsonnet:17:7
\ No newline at end of file
+syntax error: unexpected token: ERROR_STRING_DOUBLE_UNTERMINATED
+ error.parse.string.invalid_escape_unicode_short3.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.string.unfinished.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.string.unfinished.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.string.unfinished.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "\\\\", "\\u", "\\x", ['"'], ['\\'], [_], got "EOF"
- error.parse.string.unfinished.jsonnet:17:3
\ No newline at end of file
+syntax error: unexpected token: ERROR_STRING_DOUBLE_UNTERMINATED
+ error.parse.string.unfinished.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.string.unfinished2.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.string.unfinished2.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.string.unfinished2.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "\\\\", "\\u", "\\x", ['\''], ['\\'], [_], got "EOF"
- error.parse.string.unfinished2.jsonnet:17:3
\ No newline at end of file
+syntax error: unexpected token: ERROR_STRING_SINGLE_UNTERMINATED
+ error.parse.string.unfinished2.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.string_multi_no_newline.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.string_multi_no_newline.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.string_multi_no_newline.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", "[", "{", <identifier>, <number>, <string>, <unary op>, ['"'], ['\''], got "|"
+syntax error: unexpected token: ERROR_STRING_BLOCK_MISSING_NEW_LINE
error.parse.string_multi_no_newline.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.text_block_bad_whitespace.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.text_block_bad_whitespace.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.text_block_bad_whitespace.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", "[", "{", <identifier>, <number>, <string>, <unary op>, ['"'], ['\''], got "|"
+syntax error: unexpected token: ERROR_STRING_BLOCK_MISSING_TERMINATION
error.parse.text_block_bad_whitespace.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.text_block_eof.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.text_block_eof.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.text_block_eof.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", "[", "{", <identifier>, <number>, <string>, <unary op>, ['"'], ['\''], got "|"
+syntax error: unexpected token: ERROR_STRING_BLOCK_UNEXPECTED_END
error.parse.text_block_eof.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override/error.parse.text_block_not_terminated.jsonnet.goldendiffbeforeafterboth--- a/tests/cpp_test_suite_golden_override/error.parse.text_block_not_terminated.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse.text_block_not_terminated.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", "[", "{", <identifier>, <number>, <string>, <unary op>, ['"'], ['\''], got "|"
+syntax error: unexpected token: ERROR_STRING_BLOCK_UNEXPECTED_END
error.parse.text_block_not_terminated.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.import_syntax-error.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.import_syntax-error.jsonnet.golden
@@ -0,0 +1,3 @@
+syntax error: unterminated double-quoted string
+ syntax_error.jsonnet:1:1
+ error.import_syntax-error.jsonnet:1:1-8: import "lib/syntax_error.jsonnet"
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.overflow.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.overflow.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: numbers are finite
+ error.overflow.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.overflow3.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.overflow3.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: numbers are finite
+ error.overflow3.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.array_comma.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.array_comma.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected ']', got number "3"
+ error.parse.array_comma.jsonnet:17:7
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.index_unterminated.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.index_unterminated.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unexpected end of file
+ error.parse.index_unterminated.jsonnet:17:3
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.method_plus.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.method_plus.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected ':', got '+'
+ error.parse.method_plus.jsonnet:17:18
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.object_comma.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.object_comma.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected '}', got identifier "z"
+ error.parse.object_comma.jsonnet:17:11
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.object_comprehension_local_clash.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.object_comprehension_local_clash.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected '}', got ':'
+ error.parse.object_comprehension_local_clash.jsonnet:17:29
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.self_in_computed_field.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.self_in_computed_field.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected field name, got 'self'
+ error.parse.self_in_computed_field.jsonnet:17:15
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.static_error_bad_number.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.static_error_bad_number.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unexpected '.'
+ error.parse.static_error_bad_number.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.string.invalid_escape_unicode_short.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.string.invalid_escape_unicode_short.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unterminated double-quoted string
+ error.parse.string.invalid_escape_unicode_short.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.string.invalid_escape_unicode_short3.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.string.invalid_escape_unicode_short3.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unterminated double-quoted string
+ error.parse.string.invalid_escape_unicode_short3.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.string.unfinished.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.string.unfinished.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unterminated double-quoted string
+ error.parse.string.unfinished.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.string.unfinished2.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.string.unfinished2.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unterminated single-quoted string
+ error.parse.string.unfinished2.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.string_multi_no_newline.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.string_multi_no_newline.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: text block requires new line after |||
+ error.parse.string_multi_no_newline.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.text_block_bad_whitespace.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.text_block_bad_whitespace.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unterminated text block
+ error.parse.text_block_bad_whitespace.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.text_block_eof.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.text_block_eof.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unexpected end of text block
+ error.parse.text_block_eof.jsonnet:17:1
\ No newline at end of file
tests/cpp_test_suite_golden_override_ir_parser/error.parse.text_block_not_terminated.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/cpp_test_suite_golden_override_ir_parser/error.parse.text_block_not_terminated.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unexpected end of text block
+ error.parse.text_block_not_terminated.jsonnet:17:1
\ No newline at end of file
tests/go_testdata_golden_override_ir_parser/error_hexnumber.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override_ir_parser/error_hexnumber.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected end of file, got identifier "x42"
+ error_hexnumber.jsonnet:1:2
\ No newline at end of file
tests/go_testdata_golden_override_ir_parser/import_syntax_error.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override_ir_parser/import_syntax_error.jsonnet.golden
@@ -0,0 +1,3 @@
+syntax error: unexpected end of file
+ syntax_error.jsonnet:1:4
+ import_syntax_error.jsonnet:1:1-8: import "syntax_error.jsonnet"
\ No newline at end of file
tests/go_testdata_golden_override_ir_parser/object_comp_assert.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override_ir_parser/object_comp_assert.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: asserts are unsupported in object comprehension
+ object_comp_assert.jsonnet:1:46
\ No newline at end of file
tests/go_testdata_golden_override_ir_parser/object_comp_illegal.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override_ir_parser/object_comp_illegal.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: missing object comprehension field
+ object_comp_illegal.jsonnet:1:34
\ No newline at end of file
tests/go_testdata_golden_override_ir_parser/static_error_eof.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override_ir_parser/static_error_eof.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected ';', got end of file
+ static_error_eof.jsonnet:1:12
\ No newline at end of file
tests/go_testdata_golden_override_ir_parser/syntax_error.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override_ir_parser/syntax_error.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: unexpected end of file
+ syntax_error.jsonnet:1:4
\ No newline at end of file
tests/go_testdata_golden_override_ir_parser/unfinished_args.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override_ir_parser/unfinished_args.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected ')', got end of file
+ unfinished_args.jsonnet:1:17
\ No newline at end of file
tests/golden/null_coalesce_chain.jsonnetdiffbeforeafterboth--- /dev/null
+++ b/tests/golden/null_coalesce_chain.jsonnet
@@ -0,0 +1,10 @@
+// Regression test: chained index a.b.c.d should produce a single
+// Index { a, [b, c, d] } not nested Index nodes.
+// This matters for exp-null-coaelse where a?.b.c should skip .c if .b is null.
+
+local obj = { a: { b: { c: 42 } } };
+
+[
+ obj.a.b.c,
+ {a: {b: 1}}.a.b,
+]
tests/golden_null_coalesce/null_coalesce_access.jsonnetdiffbeforeafterboth--- /dev/null
+++ b/tests/golden_null_coalesce/null_coalesce_access.jsonnet
@@ -0,0 +1,18 @@
+// Test null-coalesce chained access: a?.b.c should return null when b is missing,
+// not fail with "field c not found on null".
+
+local obj = { a: { b: { c: 42 } } };
+
+[
+ // null-coalesce on missing field should return null, not error
+ obj?.missing.b.c,
+
+ // null-coalesce on present field continues
+ obj?.a.b.c,
+
+ // null-coalesce with bracket index
+ obj?.["missing"].b.c,
+
+ // chained null-coalesce
+ obj?.a?.missing.c,
+]
tests/tests/cpp_test_suite.rsdiffbeforeafterboth--- a/tests/tests/cpp_test_suite.rs
+++ b/tests/tests/cpp_test_suite.rs
@@ -241,9 +241,26 @@
golden = Some(golden_path);
}
+ // ir-parser has its own override layer
+ #[cfg(feature = "ir-parser")]
+ let ir_parser_override_path = {
+ let p = root_tests
+ .join(format!("{root_dir}_golden_override_ir_parser"))
+ .join(golden_path.file_name().expect("file has basename"));
+ if let Some(golden_path) = read_file(&p)? {
+ golden = Some(golden_path);
+ }
+ p
+ };
+
// Otherwise assume test should just not fail and return true.
let golden = golden.unwrap_or_else(|| "true".to_owned());
+ #[cfg(feature = "ir-parser")]
+ let update_golden_path = &ir_parser_override_path;
+ #[cfg(not(feature = "ir-parser"))]
+ let update_golden_path = &golden_override;
+
match (serde_json::from_str(&result), serde_json::from_str(&golden)) {
(Err(_), Ok(_)) => panic!(
"unexpected error for golden {}:\n<got>\n{result}\n</got>\n<golden>\n{golden}\n</golden>",
@@ -258,7 +275,7 @@
let diff = JsonDiff::diff_string(&golden, &result_v, false);
if let Some(diff) = diff {
if env::var_os("UPDATE_GOLDEN").is_some() {
- fs::write(golden_override, result)?;
+ fs::write(update_golden_path, result)?;
} else {
panic!(
"Result \n{result_v:#}\n\
@@ -273,7 +290,7 @@
(Err(_), Err(_)) => {
if result != golden.trim_end() {
if env::var_os("UPDATE_GOLDEN").is_some() {
- fs::write(golden_override, result)?;
+ fs::write(update_golden_path, result)?;
} else {
panic!(
"golden didn't match for {}:\n<got>\n{result}\n</got>\n<golden>\n{golden}\n</golden>",
tests/tests/golden.rsdiffbeforeafterboth--- a/tests/tests/golden.rs
+++ b/tests/tests/golden.rs
@@ -45,3 +45,13 @@
assert_snapshot!(result);
});
}
+
+#[test]
+#[cfg(feature = "exp-null-coaelse")]
+fn golden_null_coalesce() {
+ glob!("../", "golden_null_coalesce/*.jsonnet", |path| {
+ let result = run(path);
+
+ assert_snapshot!(result);
+ });
+}
tests/tests/snapshots/golden__golden@null_coalesce_chain.jsonnet.snapdiffbeforeafterboth--- /dev/null
+++ b/tests/tests/snapshots/golden__golden@null_coalesce_chain.jsonnet.snap
@@ -0,0 +1,9 @@
+---
+source: tests/tests/golden.rs
+expression: result
+input_file: tests/golden/null_coalesce_chain.jsonnet
+---
+[
+ 42,
+ 1
+]
tests/tests/snapshots/golden__golden_null_coalesce.snapdiffbeforeafterboth--- /dev/null
+++ b/tests/tests/snapshots/golden__golden_null_coalesce.snap
@@ -0,0 +1,11 @@
+---
+source: tests/tests/golden.rs
+expression: result
+input_file: tests/golden_null_coalesce/null_coalesce_access.jsonnet
+---
+[
+ null,
+ 42,
+ null,
+ null
+]