difftreelog
refactor split lexer from rowan parser
in: master
15 files changed
Cargo.lockdiffbeforeafterboth193 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↖ 5sourceregistry+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↘ 5↖ 1jrsonnet-gcmodule
0.4.2crates.io↘ 1↖ 10sourceregistry+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-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 onlogos-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
Cargo.tomldiffbeforeafterboth--- a/Cargo.toml
+++ b/Cargo.toml
@@ -81,9 +81,6 @@
itertools = "0.14.0"
xshell = "0.2.7"
-lsp-server = "0.7.9"
-lsp-types = "0.97.0"
-
regex = "1.12"
lru = "0.16.3"
crates/jrsonnet-lexer/Cargo.tomldiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-lexer/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "jrsonnet-lexer"
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+repository.workspace = true
+version.workspace = true
+
+[dependencies]
+logos.workspace = true
+
+[lints]
+workspace = true
crates/jrsonnet-lexer/src/generated/mod.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-lexer/src/generated/mod.rs
@@ -0,0 +1 @@
+pub mod syntax_kinds;
crates/jrsonnet-lexer/src/generated/syntax_kinds.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-lexer/src/generated/syntax_kinds.rs
@@ -0,0 +1,210 @@
+//! This is a generated file, please do not edit manually. Changes can be
+//! made in codegeneration that lives in `xtask` top-level dir.
+
+#![allow(
+ bad_style,
+ missing_docs,
+ unreachable_pub,
+ clippy::manual_non_exhaustive,
+ clippy::match_like_matches_macro
+)]
+#[doc = r" The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`."]
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, logos :: Logos)]
+#[repr(u16)]
+pub enum SyntaxKind {
+ #[doc(hidden)]
+ TOMBSTONE,
+ #[doc(hidden)]
+ EOF,
+ #[token("||")]
+ OR,
+ #[token("??")]
+ NULL_COAELSE,
+ #[token("&&")]
+ AND,
+ #[token("|")]
+ BIT_OR,
+ #[token("^")]
+ BIT_XOR,
+ #[token("&")]
+ BIT_AND,
+ #[token("==")]
+ EQ,
+ #[token("!=")]
+ NE,
+ #[token("<")]
+ LT,
+ #[token(">")]
+ GT,
+ #[token("<=")]
+ LE,
+ #[token(">=")]
+ GE,
+ #[token("<<")]
+ LHS,
+ #[token(">>")]
+ RHS,
+ #[token("+")]
+ PLUS,
+ #[token("-")]
+ MINUS,
+ #[token("*")]
+ MUL,
+ #[token("/")]
+ DIV,
+ #[token("%")]
+ MODULO,
+ #[token("!")]
+ NOT,
+ #[token("~")]
+ BIT_NOT,
+ #[token("[")]
+ L_BRACK,
+ #[token("]")]
+ R_BRACK,
+ #[token("(")]
+ L_PAREN,
+ #[token(")")]
+ R_PAREN,
+ #[token("{")]
+ L_BRACE,
+ #[token("}")]
+ R_BRACE,
+ #[token(":")]
+ COLON,
+ #[token("::")]
+ COLONCOLON,
+ #[token(":::")]
+ COLONCOLONCOLON,
+ #[token(";")]
+ SEMI,
+ #[token(".")]
+ DOT,
+ #[token("...")]
+ DOTDOTDOT,
+ #[token(",")]
+ COMMA,
+ #[token("$")]
+ DOLLAR,
+ #[token("=")]
+ ASSIGN,
+ #[token("?")]
+ QUESTION_MARK,
+ #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?")]
+ FLOAT,
+ #[regex("(?:0|[1-9][0-9]*)\\.[^0-9]")]
+ ERROR_FLOAT_JUNK_AFTER_POINT,
+ #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[eE][^+\\-0-9]")]
+ ERROR_FLOAT_JUNK_AFTER_EXPONENT,
+ #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[eE][+-][^0-9]")]
+ ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN,
+ #[regex("\"(?s:[^\"\\\\]|\\\\.)*\"")]
+ STRING_DOUBLE,
+ #[regex("\"(?s:[^\"\\\\]|\\\\.)*")]
+ ERROR_STRING_DOUBLE_UNTERMINATED,
+ #[regex("'(?s:[^'\\\\]|\\\\.)*'")]
+ STRING_SINGLE,
+ #[regex("'(?s:[^'\\\\]|\\\\.)*")]
+ ERROR_STRING_SINGLE_UNTERMINATED,
+ #[regex("@\"(?:[^\"]|\"\")*\"")]
+ STRING_DOUBLE_VERBATIM,
+ #[regex("@\"(?:[^\"]|\"\")*")]
+ ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED,
+ #[regex("@'(?:[^']|'')*'")]
+ STRING_SINGLE_VERBATIM,
+ #[regex("@'(?:[^']|'')*")]
+ ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED,
+ #[regex("@[^\"'\\s]\\S+")]
+ ERROR_STRING_VERBATIM_MISSING_QUOTES,
+ #[regex("\\|\\|\\|", crate::string_block::lex_str_block_test)]
+ STRING_BLOCK,
+ ERROR_STRING_BLOCK_UNEXPECTED_END,
+ ERROR_STRING_BLOCK_MISSING_NEW_LINE,
+ ERROR_STRING_BLOCK_MISSING_TERMINATION,
+ ERROR_STRING_BLOCK_MISSING_INDENT,
+ #[regex("[_a-zA-Z][_a-zA-Z0-9]*")]
+ IDENT,
+ #[regex("[ \\t\\n\\r]+")]
+ WHITESPACE,
+ #[regex("//[^\\r\\n]*?(\\r\\n|\\n)?")]
+ SINGLE_LINE_SLASH_COMMENT,
+ #[regex("#[^\\r\\n]*?(\\r\\n|\\n)?")]
+ SINGLE_LINE_HASH_COMMENT,
+ #[regex("/\\*([^*]|\\*[^/])*\\*/")]
+ MULTI_LINE_COMMENT,
+ #[regex("/\\*/")]
+ ERROR_COMMENT_TOO_SHORT,
+ #[regex("/\\*([^*/]|\\*[^/])+")]
+ ERROR_COMMENT_UNTERMINATED,
+ #[token("tailstrict")]
+ TAILSTRICT_KW,
+ #[token("local")]
+ LOCAL_KW,
+ #[token("importstr")]
+ IMPORTSTR_KW,
+ #[token("importbin")]
+ IMPORTBIN_KW,
+ #[token("import")]
+ IMPORT_KW,
+ #[token("if")]
+ IF_KW,
+ #[token("then")]
+ THEN_KW,
+ #[token("else")]
+ ELSE_KW,
+ #[token("function")]
+ FUNCTION_KW,
+ #[token("error")]
+ ERROR_KW,
+ #[token("in")]
+ IN_KW,
+ META_OBJECT_APPLY,
+ ERROR_NO_OPERATOR,
+ #[token("null")]
+ NULL_KW,
+ #[token("true")]
+ TRUE_KW,
+ #[token("false")]
+ FALSE_KW,
+ #[token("self")]
+ SELF_KW,
+ #[token("super")]
+ SUPER_KW,
+ #[token("for")]
+ FOR_KW,
+ #[token("assert")]
+ ASSERT_KW,
+ ERROR_MISSING_TOKEN,
+ ERROR_UNEXPECTED_TOKEN,
+ ERROR_CUSTOM,
+ LEXING_ERROR,
+ __LAST_TOKEN,
+ #[doc(hidden)]
+ __LAST,
+}
+use self::SyntaxKind::*;
+impl SyntaxKind {
+ pub fn is_keyword(self) -> bool {
+ match self {
+ OR | NULL_COAELSE | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE
+ | LHS | RHS | PLUS | MINUS | MUL | DIV | MODULO | NOT | BIT_NOT | L_BRACK | R_BRACK
+ | L_PAREN | R_PAREN | L_BRACE | R_BRACE | COLON | COLONCOLON | COLONCOLONCOLON
+ | SEMI | DOT | DOTDOTDOT | COMMA | DOLLAR | ASSIGN | QUESTION_MARK | TAILSTRICT_KW
+ | LOCAL_KW | IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW | IF_KW | THEN_KW | ELSE_KW
+ | FUNCTION_KW | ERROR_KW | IN_KW | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW
+ | SUPER_KW | FOR_KW | ASSERT_KW => true,
+ _ => false,
+ }
+ }
+ pub fn from_raw(r: u16) -> Self {
+ assert!(r < Self::__LAST as u16);
+ unsafe { std::mem::transmute(r) }
+ }
+ pub fn into_raw(self) -> u16 {
+ self as u16
+ }
+}
+#[macro_export]
+macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [??] => { $ crate :: SyntaxKind :: NULL_COAELSE } ; [&&] => { $ crate :: SyntaxKind :: AND } ; [|] => { $ crate :: SyntaxKind :: BIT_OR } ; [^] => { $ crate :: SyntaxKind :: BIT_XOR } ; [&] => { $ crate :: SyntaxKind :: BIT_AND } ; [==] => { $ crate :: SyntaxKind :: EQ } ; [!=] => { $ crate :: SyntaxKind :: NE } ; [<] => { $ crate :: SyntaxKind :: LT } ; [>] => { $ crate :: SyntaxKind :: GT } ; [<=] => { $ crate :: SyntaxKind :: LE } ; [>=] => { $ crate :: SyntaxKind :: GE } ; [<<] => { $ crate :: SyntaxKind :: LHS } ; [>>] => { $ crate :: SyntaxKind :: RHS } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [*] => { $ crate :: SyntaxKind :: MUL } ; [/] => { $ crate :: SyntaxKind :: DIV } ; [%] => { $ crate :: SyntaxKind :: MODULO } ; [!] => { $ crate :: SyntaxKind :: NOT } ; [~] => { $ crate :: SyntaxKind :: BIT_NOT } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_BRACE } ; ['}'] => { $ crate :: SyntaxKind :: R_BRACE } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLONCOLON } ; [:::] => { $ crate :: SyntaxKind :: COLONCOLONCOLON } ; [;] => { $ crate :: SyntaxKind :: SEMI } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [...] => { $ crate :: SyntaxKind :: DOTDOTDOT } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['$'] => { $ crate :: SyntaxKind :: DOLLAR } ; [=] => { $ crate :: SyntaxKind :: ASSIGN } ; [?] => { $ crate :: SyntaxKind :: QUESTION_MARK } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [then] => { $ crate :: SyntaxKind :: THEN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [function] => { $ crate :: SyntaxKind :: FUNCTION_KW } ; [error] => { $ crate :: SyntaxKind :: ERROR_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [null] => { $ crate :: SyntaxKind :: NULL_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [assert] => { $ crate :: SyntaxKind :: ASSERT_KW } }
+#[allow(unused_imports)]
+pub use T;
crates/jrsonnet-lexer/src/lex.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-lexer/src/lex.rs
@@ -0,0 +1,78 @@
+use core::ops::Range;
+
+use logos::Logos;
+// use rowan::{TextRange, TextSize};
+
+use crate::{
+ generated::syntax_kinds::SyntaxKind,
+ string_block::{lex_str_block, StringBlockError},
+ Span,
+};
+
+pub struct Lexer<'a> {
+ inner: logos::Lexer<'a, SyntaxKind>,
+}
+
+impl<'a> Lexer<'a> {
+ pub fn new(input: &'a str) -> Self {
+ Self {
+ inner: SyntaxKind::lexer(input),
+ }
+ }
+}
+
+impl<'a> Iterator for Lexer<'a> {
+ type Item = Lexeme<'a>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ use SyntaxKind::*;
+
+ let mut kind = self.inner.next()?;
+ let text = self.inner.slice();
+
+ if kind == Ok(STRING_BLOCK) {
+ // We use custom lexer, which skips enough bytes, but not returns error
+ // Instead we should call lexer again to verify if there is something wrong with string block
+ let mut lexer = logos::Lexer::<SyntaxKind>::new(text);
+ // In kinds, string blocks is parsed at least as `|||`
+ lexer.bump(3);
+ let res = lex_str_block(&mut lexer);
+ let next = lexer.next();
+ assert!(next.is_none(), "str_block is lexed");
+ match res {
+ Ok(()) => {}
+ Err(e) => {
+ kind = Ok(match e {
+ StringBlockError::UnexpectedEnd => ERROR_STRING_BLOCK_UNEXPECTED_END,
+ StringBlockError::MissingNewLine => ERROR_STRING_BLOCK_MISSING_NEW_LINE,
+ StringBlockError::MissingTermination => {
+ ERROR_STRING_BLOCK_MISSING_TERMINATION
+ }
+ StringBlockError::MissingIndent => ERROR_STRING_BLOCK_MISSING_INDENT,
+ });
+ }
+ }
+ }
+
+ Some(Self::Item {
+ kind: kind.unwrap_or(SyntaxKind::LEXING_ERROR),
+ text,
+ range: {
+ let Range { start, end } = self.inner.span();
+
+ Span(start as u32, end as u32)
+ },
+ })
+ }
+}
+
+#[derive(Clone, Copy, Debug)]
+pub struct Lexeme<'s> {
+ pub kind: SyntaxKind,
+ pub text: &'s str,
+ pub range: Span,
+}
+
+pub fn lex(input: &str) -> Vec<Lexeme<'_>> {
+ Lexer::new(input).collect()
+}
crates/jrsonnet-lexer/src/lib.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-lexer/src/lib.rs
@@ -0,0 +1,8 @@
+mod generated;
+mod lex;
+mod string_block;
+
+#[derive(Clone, Copy, Debug)]
+pub struct Span(pub u32, pub u32);
+
+pub use lex::{Lexeme, Lexer};
crates/jrsonnet-lexer/src/string_block.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-lexer/src/string_block.rs
@@ -0,0 +1,282 @@
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub enum StringBlockError {
+ UnexpectedEnd,
+ MissingNewLine,
+ MissingTermination,
+ MissingIndent,
+}
+
+use logos::Lexer;
+use StringBlockError::*;
+
+use crate::generated::syntax_kinds::SyntaxKind;
+
+pub(crate) fn lex_str_block_test(lex: &mut Lexer<'_, SyntaxKind>) {
+ let _ = lex_str_block(lex);
+}
+
+pub(crate) struct Context<'a> {
+ source: &'a str,
+ index: usize,
+}
+
+impl<'a> Context<'a> {
+ fn rest(&self) -> &'a str {
+ &self.source[self.index..]
+ }
+
+ fn next(&mut self) -> Option<char> {
+ if self.index == self.source.len() {
+ return None;
+ }
+
+ match self.rest().chars().next() {
+ None => None,
+ Some(c) => {
+ self.index += c.len_utf8();
+ Some(c)
+ }
+ }
+ }
+
+ fn peek(&self) -> Option<char> {
+ if self.index == self.source.len() {
+ return None;
+ }
+
+ self.rest().chars().next()
+ }
+
+ fn eat_if(&mut self, f: impl Fn(char) -> bool) -> usize {
+ if self.peek().is_some_and(f) {
+ self.index += 1;
+ return 1;
+ }
+ 0
+ }
+
+ fn eat_while(&mut self, f: impl Fn(char) -> bool) -> usize {
+ if self.index == self.source.len() {
+ return 0;
+ }
+
+ let next_char = self.rest().char_indices().find(|(_, c)| !f(*c));
+
+ match next_char {
+ None => {
+ let diff = self.source.len() - self.index;
+ self.index = self.source.len();
+ diff
+ }
+ Some((idx, _)) => {
+ self.index += idx;
+ idx
+ }
+ }
+ }
+
+ fn skip(&mut self, len: usize) {
+ self.index = match self.index + len {
+ n if n > self.source.len() => self.source.len(),
+ n => n,
+ };
+ }
+}
+
+// Check that b has at least the same whitespace prefix as a and returns the
+// amount of this whitespace, otherwise returns 0. If a has no whitespace
+// prefix than return 0.
+fn check_whitespace(a: &str, b: &str) -> usize {
+ let a = a.as_bytes();
+ let b = b.as_bytes();
+
+ for i in 0..a.len() {
+ if a[i] != b' ' && a[i] != b'\t' {
+ // a has run out of whitespace and b matched up to this point. Return result.
+ return i;
+ }
+
+ if i >= b.len() {
+ // We ran off the edge of b while a still has whitespace. Return 0 as failure.
+ return 0;
+ }
+
+ if a[i] != b[i] {
+ // a has whitespace but b does not. Return 0 as failure.
+ return 0;
+ }
+ }
+
+ // We ran off the end of a and b kept up
+ a.len()
+}
+
+pub(crate) trait StrBlockLexCtx<'d> {
+ fn remainder(&self) -> &'d str;
+ fn eat_error(&mut self, ctx: &Context<'d>);
+ fn bump_pos(&mut self, s: usize);
+ fn mark_truncating(&mut self);
+ fn mark_line(&mut self, line: &'d str);
+}
+
+impl<'d> StrBlockLexCtx<'d> for Lexer<'d, SyntaxKind> {
+ fn remainder(&self) -> &'d str {
+ self.remainder()
+ }
+ fn eat_error(&mut self, ctx: &Context<'d>) {
+ let end_index = ctx
+ .rest()
+ .find("|||")
+ .map_or_else(|| ctx.rest().len(), |v| v + 3);
+ self.bump(ctx.index + end_index);
+ }
+ fn bump_pos(&mut self, s: usize) {
+ self.bump(s);
+ }
+ fn mark_truncating(&mut self) {
+ // Lexer test doesn't collect anything
+ }
+ fn mark_line(&mut self, _line: &'d str) {
+ // Lexer test doesn't collect anything
+ }
+}
+
+pub fn collect_lexed_str_block(input: &str) -> Result<CollectStrBlock<'_>, StringBlockError> {
+ let mut collect = CollectStrBlock {
+ truncate: false,
+ lines: vec![],
+ input,
+ offset: 0,
+ };
+ lex_str_block(&mut collect)?;
+ Ok(collect)
+}
+
+pub struct CollectStrBlock<'s> {
+ pub truncate: bool,
+ pub lines: Vec<&'s str>,
+ input: &'s str,
+ offset: usize,
+}
+
+impl<'d> StrBlockLexCtx<'d> for CollectStrBlock<'d> {
+ fn remainder(&self) -> &'d str {
+ self.input
+ }
+
+ fn eat_error(&mut self, _ctx: &Context<'d>) {
+ // Error will be returned, no need to record it here
+ }
+
+ fn bump_pos(&mut self, s: usize) {
+ self.offset += s;
+ }
+
+ fn mark_truncating(&mut self) {
+ self.truncate = true;
+ }
+
+ fn mark_line(&mut self, line: &'d str) {
+ self.lines.push(line);
+ }
+}
+
+pub(crate) fn lex_str_block<'a>(lex: &mut impl StrBlockLexCtx<'a>) -> Result<(), StringBlockError> {
+ // debug_assert_eq!(lex.slice(), "|||");
+ let mut ctx = Context::<'a> {
+ source: lex.remainder(),
+ index: 0,
+ };
+
+ if ctx.eat_if(|v| v == '-') != 0 {
+ lex.mark_truncating();
+ }
+
+ // Skip whitespaces
+ ctx.eat_while(|r| r == ' ' || r == '\t' || r == '\r');
+
+ // Skip \n
+ match ctx.next() {
+ Some('\n') => (),
+ None => {
+ lex.eat_error(&ctx);
+ return Err(UnexpectedEnd);
+ }
+ // Text block requires new line after |||.
+ Some(_) => {
+ lex.eat_error(&ctx);
+ return Err(MissingNewLine);
+ }
+ }
+
+ // Process leading blank lines before calculating string block indent
+ while ctx.peek() == Some('\n') {
+ ctx.next();
+ }
+
+ let mut num_whitespace = check_whitespace(ctx.rest(), ctx.rest());
+ let str_block_indent = &ctx.rest()[..num_whitespace];
+
+ if num_whitespace == 0 {
+ // Text block's first line must start with whitespace
+ lex.eat_error(&ctx);
+ return Err(MissingIndent);
+ }
+
+ loop {
+ debug_assert_ne!(num_whitespace, 0, "Unexpected value for num_whitespace");
+ ctx.skip(num_whitespace);
+
+ let line_start = ctx.index;
+ let mut line_size = 0;
+ loop {
+ match ctx.next() {
+ None => {
+ lex.eat_error(&ctx);
+ return Err(UnexpectedEnd);
+ }
+ Some('\n') => {
+ lex.mark_line(&ctx.source[line_start..line_start + line_size]);
+ break;
+ }
+ Some(c) => {
+ line_size += c.len_utf8();
+ }
+ }
+ }
+
+ // Skip any blank lines
+ while ctx.peek() == Some('\n') {
+ lex.mark_line("");
+ ctx.next();
+ }
+
+ // Look at the next line
+ num_whitespace = check_whitespace(str_block_indent, ctx.rest());
+ if num_whitespace == 0 {
+ // End of the text block
+ // let mut term_indent = String::with_capacity(num_whitespace);
+ while let Some(' ' | '\t') = ctx.peek() {
+ // term_indent.push(
+ ctx.next().unwrap();
+ // );
+ }
+
+ if !ctx.rest().starts_with("|||") {
+ if ctx.rest().is_empty() {
+ lex.bump_pos(ctx.index);
+ return Err(UnexpectedEnd);
+ }
+ lex.eat_error(&ctx);
+ return Err(MissingTermination);
+ }
+
+ // Skip '|||'
+ ctx.skip(3);
+ break;
+ }
+ }
+
+ lex.bump_pos(ctx.index);
+ Ok(())
+}
crates/jrsonnet-rowan-parser/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/Cargo.toml
+++ b/crates/jrsonnet-rowan-parser/Cargo.toml
@@ -14,7 +14,7 @@
drop_bomb.workspace = true
hi-doc.workspace = true
indoc.workspace = true
-logos.workspace = true
+jrsonnet-lexer = { version = "0.5.0-pre97", path = "../jrsonnet-lexer" }
rowan.workspace = true
thiserror.workspace = true
crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs
+++ b/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs
@@ -8,172 +8,95 @@
clippy::manual_non_exhaustive,
clippy::match_like_matches_macro
)]
-use logos::Logos;
#[doc = r" The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`."]
-#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Logos)]
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
#[repr(u16)]
pub enum SyntaxKind {
#[doc(hidden)]
TOMBSTONE,
#[doc(hidden)]
EOF,
- #[token("||")]
OR,
- #[token("??")]
NULL_COAELSE,
- #[token("&&")]
AND,
- #[token("|")]
BIT_OR,
- #[token("^")]
BIT_XOR,
- #[token("&")]
BIT_AND,
- #[token("==")]
EQ,
- #[token("!=")]
NE,
- #[token("<")]
LT,
- #[token(">")]
GT,
- #[token("<=")]
LE,
- #[token(">=")]
GE,
- #[token("<<")]
LHS,
- #[token(">>")]
RHS,
- #[token("+")]
PLUS,
- #[token("-")]
MINUS,
- #[token("*")]
MUL,
- #[token("/")]
DIV,
- #[token("%")]
MODULO,
- #[token("!")]
NOT,
- #[token("~")]
BIT_NOT,
- #[token("[")]
L_BRACK,
- #[token("]")]
R_BRACK,
- #[token("(")]
L_PAREN,
- #[token(")")]
R_PAREN,
- #[token("{")]
L_BRACE,
- #[token("}")]
R_BRACE,
- #[token(":")]
COLON,
- #[token("::")]
COLONCOLON,
- #[token(":::")]
COLONCOLONCOLON,
- #[token(";")]
SEMI,
- #[token(".")]
DOT,
- #[token("...")]
DOTDOTDOT,
- #[token(",")]
COMMA,
- #[token("$")]
DOLLAR,
- #[token("=")]
ASSIGN,
- #[token("?")]
QUESTION_MARK,
- #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?")]
FLOAT,
- #[regex("(?:0|[1-9][0-9]*)\\.[^0-9]")]
ERROR_FLOAT_JUNK_AFTER_POINT,
- #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[eE][^+\\-0-9]")]
ERROR_FLOAT_JUNK_AFTER_EXPONENT,
- #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[eE][+-][^0-9]")]
ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN,
- #[regex("\"(?s:[^\"\\\\]|\\\\.)*\"")]
STRING_DOUBLE,
- #[regex("\"(?s:[^\"\\\\]|\\\\.)*")]
ERROR_STRING_DOUBLE_UNTERMINATED,
- #[regex("'(?s:[^'\\\\]|\\\\.)*'")]
STRING_SINGLE,
- #[regex("'(?s:[^'\\\\]|\\\\.)*")]
ERROR_STRING_SINGLE_UNTERMINATED,
- #[regex("@\"(?:[^\"]|\"\")*\"")]
STRING_DOUBLE_VERBATIM,
- #[regex("@\"(?:[^\"]|\"\")*")]
ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED,
- #[regex("@'(?:[^']|'')*'")]
STRING_SINGLE_VERBATIM,
- #[regex("@'(?:[^']|'')*")]
ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED,
- #[regex("@[^\"'\\s]\\S+")]
ERROR_STRING_VERBATIM_MISSING_QUOTES,
- #[regex("\\|\\|\\|", crate::string_block::lex_str_block_test)]
STRING_BLOCK,
ERROR_STRING_BLOCK_UNEXPECTED_END,
ERROR_STRING_BLOCK_MISSING_NEW_LINE,
ERROR_STRING_BLOCK_MISSING_TERMINATION,
ERROR_STRING_BLOCK_MISSING_INDENT,
- #[regex("[_a-zA-Z][_a-zA-Z0-9]*")]
IDENT,
- #[regex("[ \\t\\n\\r]+")]
WHITESPACE,
- #[regex("//[^\\r\\n]*?(\\r\\n|\\n)?")]
SINGLE_LINE_SLASH_COMMENT,
- #[regex("#[^\\r\\n]*?(\\r\\n|\\n)?")]
SINGLE_LINE_HASH_COMMENT,
- #[regex("/\\*([^*]|\\*[^/])*\\*/")]
MULTI_LINE_COMMENT,
- #[regex("/\\*/")]
ERROR_COMMENT_TOO_SHORT,
- #[regex("/\\*([^*/]|\\*[^/])+")]
ERROR_COMMENT_UNTERMINATED,
- #[token("tailstrict")]
TAILSTRICT_KW,
- #[token("local")]
LOCAL_KW,
- #[token("importstr")]
IMPORTSTR_KW,
- #[token("importbin")]
IMPORTBIN_KW,
- #[token("import")]
IMPORT_KW,
- #[token("if")]
IF_KW,
- #[token("then")]
THEN_KW,
- #[token("else")]
ELSE_KW,
- #[token("function")]
FUNCTION_KW,
- #[token("error")]
ERROR_KW,
- #[token("in")]
IN_KW,
META_OBJECT_APPLY,
ERROR_NO_OPERATOR,
- #[token("null")]
NULL_KW,
- #[token("true")]
TRUE_KW,
- #[token("false")]
FALSE_KW,
- #[token("self")]
SELF_KW,
- #[token("super")]
SUPER_KW,
- #[token("for")]
FOR_KW,
- #[token("assert")]
ASSERT_KW,
ERROR_MISSING_TOKEN,
ERROR_UNEXPECTED_TOKEN,
crates/jrsonnet-rowan-parser/src/lex.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/lex.rs
+++ b/crates/jrsonnet-rowan-parser/src/lex.rs
@@ -1,81 +1,19 @@
-use core::ops::Range;
-use std::convert::TryFrom;
-
-use logos::Logos;
+use jrsonnet_lexer::Lexer;
use rowan::{TextRange, TextSize};
-use crate::{
- string_block::{lex_str_block, StringBlockError},
- SyntaxKind,
-};
-
-pub struct Lexer<'a> {
- inner: logos::Lexer<'a, SyntaxKind>,
-}
-
-impl<'a> Lexer<'a> {
- pub fn new(input: &'a str) -> Self {
- Self {
- inner: SyntaxKind::lexer(input),
- }
- }
-}
-
-impl<'a> Iterator for Lexer<'a> {
- type Item = Lexeme<'a>;
-
- fn next(&mut self) -> Option<Self::Item> {
- use SyntaxKind::*;
-
- let mut kind = self.inner.next()?;
- let text = self.inner.slice();
-
- if kind == Ok(STRING_BLOCK) {
- // We use custom lexer, which skips enough bytes, but not returns error
- // Instead we should call lexer again to verify if there is something wrong with string block
- let mut lexer = logos::Lexer::<SyntaxKind>::new(text);
- // In kinds, string blocks is parsed at least as `|||`
- lexer.bump(3);
- let res = lex_str_block(&mut lexer);
- let next = lexer.next();
- assert!(next.is_none(), "str_block is lexed");
- match res {
- Ok(()) => {}
- Err(e) => {
- kind = Ok(match e {
- StringBlockError::UnexpectedEnd => ERROR_STRING_BLOCK_UNEXPECTED_END,
- StringBlockError::MissingNewLine => ERROR_STRING_BLOCK_MISSING_NEW_LINE,
- StringBlockError::MissingTermination => {
- ERROR_STRING_BLOCK_MISSING_TERMINATION
- }
- StringBlockError::MissingIndent => ERROR_STRING_BLOCK_MISSING_INDENT,
- });
- }
- }
- }
-
- Some(Self::Item {
- kind: kind.unwrap_or(SyntaxKind::LEXING_ERROR),
- text,
- range: {
- let Range { start, end } = self.inner.span();
-
- TextRange::new(
- TextSize::try_from(start).unwrap(),
- TextSize::try_from(end).unwrap(),
- )
- },
- })
- }
-}
+use crate::SyntaxKind;
#[derive(Clone, Copy, Debug)]
-pub struct Lexeme<'i> {
+pub struct Lexeme<'s> {
pub kind: SyntaxKind,
- pub text: &'i str,
+ pub text: &'s str,
pub range: TextRange,
}
pub fn lex(input: &str) -> Vec<Lexeme<'_>> {
- Lexer::new(input).collect()
+ Lexer::new(input).map(|l| Lexeme {
+ kind: SyntaxKind::from_raw(l.kind.into_raw()),
+ text: l.text,
+ range: TextRange::new(TextSize::from(l.range.0), TextSize::from(l.range.1)),
+ }).collect()
}
crates/jrsonnet-rowan-parser/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/lib.rs
+++ b/crates/jrsonnet-rowan-parser/src/lib.rs
@@ -2,7 +2,6 @@
use event::Sink;
use generated::nodes::{SourceFile, Trivia};
-use lex::lex;
use parser::{LocatedSyntaxError, Parser};
pub use rowan;
@@ -14,14 +13,12 @@
mod marker;
mod parser;
mod precedence;
-mod string_block;
mod tests;
mod token_set;
pub use ast::{AstChildren, AstNode, AstToken};
pub use generated::{nodes, syntax_kinds::SyntaxKind};
pub use language::*;
-pub use string_block::{collect_lexed_str_block, CollectStrBlock};
pub use token_set::SyntaxKindSet;
use self::{
@@ -30,7 +27,7 @@
};
pub fn parse(input: &str) -> (SourceFile, Vec<LocatedSyntaxError>) {
- let lexemes = lex(input);
+ let lexemes = lex::lex(input);
let kinds = lexemes
.iter()
.map(|l| l.kind)
crates/jrsonnet-rowan-parser/src/string_block.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/string_block.rs
+++ /dev/null
@@ -1,282 +0,0 @@
-#[derive(Clone, Copy, Debug, PartialEq, Eq)]
-pub enum StringBlockError {
- UnexpectedEnd,
- MissingNewLine,
- MissingTermination,
- MissingIndent,
-}
-
-use logos::Lexer;
-use StringBlockError::*;
-
-use crate::SyntaxKind;
-
-pub(crate) fn lex_str_block_test(lex: &mut Lexer<'_, SyntaxKind>) {
- let _ = lex_str_block(lex);
-}
-
-pub(crate) struct Context<'a> {
- source: &'a str,
- index: usize,
-}
-
-impl<'a> Context<'a> {
- fn rest(&self) -> &'a str {
- &self.source[self.index..]
- }
-
- fn next(&mut self) -> Option<char> {
- if self.index == self.source.len() {
- return None;
- }
-
- match self.rest().chars().next() {
- None => None,
- Some(c) => {
- self.index += c.len_utf8();
- Some(c)
- }
- }
- }
-
- fn peek(&self) -> Option<char> {
- if self.index == self.source.len() {
- return None;
- }
-
- self.rest().chars().next()
- }
-
- fn eat_if(&mut self, f: impl Fn(char) -> bool) -> usize {
- if self.peek().is_some_and(f) {
- self.index += 1;
- return 1;
- }
- 0
- }
-
- fn eat_while(&mut self, f: impl Fn(char) -> bool) -> usize {
- if self.index == self.source.len() {
- return 0;
- }
-
- let next_char = self.rest().char_indices().find(|(_, c)| !f(*c));
-
- match next_char {
- None => {
- let diff = self.source.len() - self.index;
- self.index = self.source.len();
- diff
- }
- Some((idx, _)) => {
- self.index += idx;
- idx
- }
- }
- }
-
- fn skip(&mut self, len: usize) {
- self.index = match self.index + len {
- n if n > self.source.len() => self.source.len(),
- n => n,
- };
- }
-}
-
-// Check that b has at least the same whitespace prefix as a and returns the
-// amount of this whitespace, otherwise returns 0. If a has no whitespace
-// prefix than return 0.
-fn check_whitespace(a: &str, b: &str) -> usize {
- let a = a.as_bytes();
- let b = b.as_bytes();
-
- for i in 0..a.len() {
- if a[i] != b' ' && a[i] != b'\t' {
- // a has run out of whitespace and b matched up to this point. Return result.
- return i;
- }
-
- if i >= b.len() {
- // We ran off the edge of b while a still has whitespace. Return 0 as failure.
- return 0;
- }
-
- if a[i] != b[i] {
- // a has whitespace but b does not. Return 0 as failure.
- return 0;
- }
- }
-
- // We ran off the end of a and b kept up
- a.len()
-}
-
-pub(crate) trait StrBlockLexCtx<'d> {
- fn remainder(&self) -> &'d str;
- fn eat_error(&mut self, ctx: &Context<'d>);
- fn bump_pos(&mut self, s: usize);
- fn mark_truncating(&mut self);
- fn mark_line(&mut self, line: &'d str);
-}
-
-impl<'d> StrBlockLexCtx<'d> for Lexer<'d, SyntaxKind> {
- fn remainder(&self) -> &'d str {
- self.remainder()
- }
- fn eat_error(&mut self, ctx: &Context<'d>) {
- let end_index = ctx
- .rest()
- .find("|||")
- .map_or_else(|| ctx.rest().len(), |v| v + 3);
- self.bump(ctx.index + end_index);
- }
- fn bump_pos(&mut self, s: usize) {
- self.bump(s);
- }
- fn mark_truncating(&mut self) {
- // Lexer test doesn't collect anything
- }
- fn mark_line(&mut self, _line: &'d str) {
- // Lexer test doesn't collect anything
- }
-}
-
-pub fn collect_lexed_str_block(input: &str) -> Result<CollectStrBlock<'_>, StringBlockError> {
- let mut collect = CollectStrBlock {
- truncate: false,
- lines: vec![],
- input,
- offset: 0,
- };
- lex_str_block(&mut collect)?;
- Ok(collect)
-}
-
-pub struct CollectStrBlock<'s> {
- pub truncate: bool,
- pub lines: Vec<&'s str>,
- input: &'s str,
- offset: usize,
-}
-
-impl<'d> StrBlockLexCtx<'d> for CollectStrBlock<'d> {
- fn remainder(&self) -> &'d str {
- self.input
- }
-
- fn eat_error(&mut self, _ctx: &Context<'d>) {
- // Error will be returned, no need to record it here
- }
-
- fn bump_pos(&mut self, s: usize) {
- self.offset += s;
- }
-
- fn mark_truncating(&mut self) {
- self.truncate = true;
- }
-
- fn mark_line(&mut self, line: &'d str) {
- self.lines.push(line);
- }
-}
-
-pub(crate) fn lex_str_block<'a>(lex: &mut impl StrBlockLexCtx<'a>) -> Result<(), StringBlockError> {
- // debug_assert_eq!(lex.slice(), "|||");
- let mut ctx = Context::<'a> {
- source: lex.remainder(),
- index: 0,
- };
-
- if ctx.eat_if(|v| v == '-') != 0 {
- lex.mark_truncating();
- }
-
- // Skip whitespaces
- ctx.eat_while(|r| r == ' ' || r == '\t' || r == '\r');
-
- // Skip \n
- match ctx.next() {
- Some('\n') => (),
- None => {
- lex.eat_error(&ctx);
- return Err(UnexpectedEnd);
- }
- // Text block requires new line after |||.
- Some(_) => {
- lex.eat_error(&ctx);
- return Err(MissingNewLine);
- }
- }
-
- // Process leading blank lines before calculating string block indent
- while ctx.peek() == Some('\n') {
- ctx.next();
- }
-
- let mut num_whitespace = check_whitespace(ctx.rest(), ctx.rest());
- let str_block_indent = &ctx.rest()[..num_whitespace];
-
- if num_whitespace == 0 {
- // Text block's first line must start with whitespace
- lex.eat_error(&ctx);
- return Err(MissingIndent);
- }
-
- loop {
- debug_assert_ne!(num_whitespace, 0, "Unexpected value for num_whitespace");
- ctx.skip(num_whitespace);
-
- let line_start = ctx.index;
- let mut line_size = 0;
- loop {
- match ctx.next() {
- None => {
- lex.eat_error(&ctx);
- return Err(UnexpectedEnd);
- }
- Some('\n') => {
- lex.mark_line(&ctx.source[line_start..line_start + line_size]);
- break;
- }
- Some(c) => {
- line_size += c.len_utf8();
- }
- }
- }
-
- // Skip any blank lines
- while ctx.peek() == Some('\n') {
- lex.mark_line("");
- ctx.next();
- }
-
- // Look at the next line
- num_whitespace = check_whitespace(str_block_indent, ctx.rest());
- if num_whitespace == 0 {
- // End of the text block
- // let mut term_indent = String::with_capacity(num_whitespace);
- while let Some(' ' | '\t') = ctx.peek() {
- // term_indent.push(
- ctx.next().unwrap();
- // );
- }
-
- if !ctx.rest().starts_with("|||") {
- if ctx.rest().is_empty() {
- lex.bump_pos(ctx.index);
- return Err(UnexpectedEnd);
- }
- lex.eat_error(&ctx);
- return Err(MissingTermination);
- }
-
- // Skip '|||'
- ctx.skip(3);
- break;
- }
- }
-
- lex.bump_pos(ctx.index);
- Ok(())
-}
xtask/src/sourcegen/kinds.rsdiffbeforeafterboth--- a/xtask/src/sourcegen/kinds.rs
+++ b/xtask/src/sourcegen/kinds.rs
@@ -56,7 +56,7 @@
| Self::Error { name, .. } => name,
}
}
- pub fn expand_kind(&self) -> TokenStream {
+ pub fn expand_kind(&self, lexer: bool) -> TokenStream {
let name = format_ident!("{}", self.name());
let attr = match self {
Self::Keyword { code, .. } => quote! {#[token(#code)]},
@@ -75,6 +75,11 @@
}
_ => quote! {},
};
+ let attr = if lexer {
+ attr
+ } else {
+ quote! {}
+ };
quote! {
#attr
#name
xtask/src/sourcegen/mod.rsdiffbeforeafterboth--- a/xtask/src/sourcegen/mod.rs
+++ b/xtask/src/sourcegen/mod.rs
@@ -89,7 +89,7 @@
kinds.define_node(&name);
}
- let syntax_kinds = generate_syntax_kinds(&kinds, &ast)?;
+ let syntax_kinds = generate_syntax_kinds(&kinds, &ast, false)?;
let nodes = generate_nodes(&kinds, &ast)?;
ensure_file_contents(
@@ -106,12 +106,21 @@
)),
&nodes,
);
+
+ let lexer_syntax_kinds = generate_syntax_kinds(&kinds, &ast, true)?;
+ ensure_file_contents(
+ &PathBuf::from(concat!(
+ env!("CARGO_MANIFEST_DIR"),
+ "/../crates/jrsonnet-lexer/src/generated/syntax_kinds.rs",
+ )),
+ &lexer_syntax_kinds,
+ );
Ok(())
}
-fn generate_syntax_kinds(kinds: &KindsSrc, grammar: &AstSrc) -> Result<String> {
+fn generate_syntax_kinds(kinds: &KindsSrc, grammar: &AstSrc, lexer: bool) -> Result<String> {
let t_macros = kinds.tokens().filter_map(TokenKind::expand_t_macros);
- let token_kinds = kinds.tokens().map(TokenKind::expand_kind);
+ let token_kinds = kinds.tokens().map(|t| t.expand_kind(lexer));
let keywords = kinds
.tokens()
@@ -119,12 +128,16 @@
.map(TokenKind::name)
.map(|n| format_ident!("{n}"));
- let nodes = kinds
+ let mut nodes = kinds
.nodes
.iter()
.map(|name| format_ident!("{}", name))
.collect::<Vec<_>>();
+ if lexer {
+ nodes.clear();
+ }
+
let enums = grammar
.enums
.iter()
@@ -134,14 +147,34 @@
.token_enums
.iter()
.map(|e| format_ident!("{}", to_upper_snake_case(&e.name))),
- );
+ )
+ .collect::<Vec<_>>();
+ let is_enum = if lexer {
+ quote! {}
+ } else {
+ quote! {
+ pub fn is_enum(self) -> bool {
+ match self {
+ #(#enums)|* => true,
+ _ => false,
+ }
+ }
+ }
+ };
+ let derive_logos = if lexer {
+ quote! {
+ , logos::Logos
+ }
+ } else {
+ quote! {}
+ };
+
let ast = quote! {
#![allow(bad_style, missing_docs, unreachable_pub, clippy::manual_non_exhaustive, clippy::match_like_matches_macro)]
- use logos::Logos;
/// The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`.
- #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Logos)]
+ #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug #derive_logos)]
#[repr(u16)]
pub enum SyntaxKind {
#[doc(hidden)]
@@ -164,13 +197,9 @@
_ => false,
}
}
- pub fn is_enum(self) -> bool {
- match self {
- #(#enums)|* => true,
- _ => false,
- }
- }
+ #is_enum
+
pub fn from_raw(r: u16) -> Self {
assert!(r < Self::__LAST as u16);
unsafe { std::mem::transmute(r) }