From e1b822af721d58a291039604090817febf25e055 Mon Sep 17 00:00:00 2001 From: Amejonah1200 Date: Tue, 6 Feb 2024 21:23:58 +0100 Subject: [PATCH] Update chumsky and uplift Ids (dep & struct) --- Cargo.lock | 1258 +-------------------------- Cargo.toml | 10 +- src/main.rs | 22 +- src/parsing/parsers/declarations.rs | 26 +- src/parsing/parsers/expressions.rs | 25 +- src/parsing/parsers/file.rs | 7 +- src/parsing/parsers/mod.rs | 25 +- src/parsing/parsers/statements.rs | 2 +- src/parsing/parsers/string.rs | 2 +- src/parsing/tokenizer.rs | 2 +- src/project/mod.rs | 201 +++-- src/project/readers.rs | 39 +- src/project/std_lib.rs | 23 +- src/resolution/fir.rs | 10 +- src/resolution/mod.rs | 131 ++- src/resolution/name_resolution.rs | 85 +- src/resolution/type_resolution.rs | 91 +- src/typing/mod.rs | 6 +- 18 files changed, 389 insertions(+), 1576 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b862dd..ff9af26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "ahash" version = "0.8.3" @@ -15,7 +9,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if", - "getrandom", "once_cell", "version_check", ] @@ -66,16 +59,10 @@ dependencies = [ "thiserror", "toml", "traversal", - "walkdir 2.3.3 (git+https://github.com/APLanguage/walkdir.git)", + "walkdir", "winapi-util", ] -[[package]] -name = "arc-swap" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" - [[package]] name = "ariadne" version = "0.3.0" @@ -109,38 +96,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" - -[[package]] -name = "bstr" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" -dependencies = [ - "memchr", - "regex-automata", - "serde", -] - -[[package]] -name = "btoi" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd6407f73a9b8b6162d8a2ef999fe6afd7cc15902ebf42c5cd296addf17e0ad" -dependencies = [ - "num-traits", -] - [[package]] name = "cc" version = "1.0.83" @@ -158,64 +113,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chumsky" -version = "1.0.0-alpha.4" -source = "git+https://github.com/zesterer/chumsky.git?rev=56762fe5c965880066a068038a18b5ac07afd75c#56762fe5c965880066a068038a18b5ac07afd75c" +version = "1.0.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c28d4e5dd9a9262a38b231153591da6ce1471b818233f4727985d3dd0ed93c" dependencies = [ "hashbrown 0.14.0", - "regex-automata", + "regex-automata 0.3.6", "serde", "stacker", "unicode-ident", - "vergen", -] - -[[package]] -name = "clru" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "deranged" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", ] -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - [[package]] name = "either" version = "1.9.0" @@ -228,627 +136,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" -[[package]] -name = "errno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "fastrand" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" - -[[package]] -name = "filetime" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.3.5", - "windows-sys", -] - -[[package]] -name = "flate2" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gix" -version = "0.43.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c256ea71cc1967faaefdaad15f334146b7c806f12460dcafd3afed845c8c78dd" -dependencies = [ - "gix-actor", - "gix-attributes", - "gix-config", - "gix-credentials", - "gix-date", - "gix-diff", - "gix-discover", - "gix-features 0.28.1", - "gix-glob", - "gix-hash 0.10.4", - "gix-hashtable", - "gix-index", - "gix-lock", - "gix-mailmap", - "gix-object", - "gix-odb", - "gix-pack", - "gix-path", - "gix-prompt", - "gix-ref", - "gix-refspec", - "gix-revision", - "gix-sec", - "gix-tempfile", - "gix-traverse", - "gix-url", - "gix-validate", - "gix-worktree", - "log", - "once_cell", - "signal-hook", - "smallvec", - "thiserror", - "unicode-normalization", -] - -[[package]] -name = "gix-actor" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc22b0cdc52237667c301dd7cdc6ead8f8f73c9f824e9942c8ebd6b764f6c0bf" -dependencies = [ - "bstr", - "btoi", - "gix-date", - "itoa", - "nom", - "thiserror", -] - -[[package]] -name = "gix-attributes" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2231a25934a240d0a4b6f4478401c73ee81d8be52de0293eedbc172334abf3e1" -dependencies = [ - "bstr", - "gix-features 0.28.1", - "gix-glob", - "gix-path", - "gix-quote", - "thiserror", - "unicode-bom", -] - -[[package]] -name = "gix-bitmap" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ccab4bc576844ddb51b78d81b4a42d73e6229660fa614dfc3d3999c874d1959" -dependencies = [ - "thiserror", -] - -[[package]] -name = "gix-chunk" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b42ea64420f7994000130328f3c7a2038f639120518870436d31b8bde704493" -dependencies = [ - "thiserror", -] - -[[package]] -name = "gix-command" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f28f654184b5f725c5737c7e4f466cbd8f0102ac352d5257eeab19647ee4256" -dependencies = [ - "bstr", -] - -[[package]] -name = "gix-config" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbad5ce54a8fc997acc50febd89ec80fa6e97cb7f8d0654cb229936407489d8" -dependencies = [ - "bstr", - "gix-config-value", - "gix-features 0.28.1", - "gix-glob", - "gix-path", - "gix-ref", - "gix-sec", - "log", - "memchr", - "nom", - "once_cell", - "smallvec", - "thiserror", - "unicode-bom", -] - -[[package]] -name = "gix-config-value" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d09154c0c8677e4da0ec35e896f56ee3e338e741b9599fae06075edd83a4081c" -dependencies = [ - "bitflags 1.3.2", - "bstr", - "gix-path", - "libc", - "thiserror", -] - -[[package]] -name = "gix-credentials" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "750b684197374518ea057e0a0594713e07683faa0a3f43c0f93d97f64130ad8d" -dependencies = [ - "bstr", - "gix-command", - "gix-config-value", - "gix-path", - "gix-prompt", - "gix-sec", - "gix-url", - "thiserror", -] - -[[package]] -name = "gix-date" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96271912ce39822501616f177dea7218784e6c63be90d5f36322ff3a722aae2" -dependencies = [ - "bstr", - "itoa", - "thiserror", - "time", -] - -[[package]] -name = "gix-diff" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "103a0fa79b0d438f5ecb662502f052e530ace4fe1fe8e1c83c0c6da76d728e67" -dependencies = [ - "gix-hash 0.10.4", - "gix-object", - "imara-diff", - "thiserror", -] - -[[package]] -name = "gix-discover" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eba8ba458cb8f4a6c33409b0fe650b1258655175a7ffd1d24fafd3ed31d880b" -dependencies = [ - "bstr", - "dunce", - "gix-hash 0.10.4", - "gix-path", - "gix-ref", - "gix-sec", - "thiserror", -] - -[[package]] -name = "gix-features" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b76f9a80f6dd7be66442ae86e1f534effad9546676a392acc95e269d0c21c22" -dependencies = [ - "crc32fast", - "flate2", - "gix-hash 0.10.4", - "libc", - "once_cell", - "prodash", - "sha1_smol", - "thiserror", - "walkdir 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "gix-features" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf69b0f5c701cc3ae22d3204b671907668f6437ca88862d355eaf9bc47a4f897" -dependencies = [ - "gix-hash 0.11.4", - "libc", -] - -[[package]] -name = "gix-fs" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b37a1832f691fdc09910bd267f9a2e413737c1f9ec68c6e31f9e802616278a9" -dependencies = [ - "gix-features 0.29.0", -] - -[[package]] -name = "gix-glob" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e43efd776bc543f46f0fd0ca3d920c37af71a764a16f2aebd89765e9ff2993" -dependencies = [ - "bitflags 1.3.2", - "bstr", -] - -[[package]] -name = "gix-hash" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a258595457bc192d1f1c59d0d168a1e34e2be9b97a614e14995416185de41a7" -dependencies = [ - "hex", - "thiserror", -] - -[[package]] -name = "gix-hash" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b422ff2ad9a0628baaad6da468cf05385bf3f5ab495ad5a33cce99b9f41092f" -dependencies = [ - "hex", - "thiserror", -] - -[[package]] -name = "gix-hashtable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e55e40dfd694884f0eb78796c5bddcf2f8b295dace47039099dd7e76534973" -dependencies = [ - "gix-hash 0.10.4", - "hashbrown 0.13.2", - "parking_lot", -] - -[[package]] -name = "gix-index" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "717ab601ece7921f59fe86849dbe27d44a46ebb883b5885732c4f30df4996177" -dependencies = [ - "bitflags 1.3.2", - "bstr", - "btoi", - "filetime", - "gix-bitmap", - "gix-features 0.28.1", - "gix-hash 0.10.4", - "gix-lock", - "gix-object", - "gix-traverse", - "itoa", - "memmap2", - "smallvec", - "thiserror", -] - -[[package]] -name = "gix-lock" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c693d7f05730fa74a7c467150adc7cea393518410c65f0672f80226b8111555" -dependencies = [ - "gix-tempfile", - "gix-utils", - "thiserror", -] - -[[package]] -name = "gix-mailmap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b66aea5e52875cd4915f4957a6f4b75831a36981e2ec3f5fad9e370e444fe1a" -dependencies = [ - "bstr", - "gix-actor", - "thiserror", -] - -[[package]] -name = "gix-object" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df068db9180ee935fbb70504848369e270bdcb576b05c0faa8b9fd3b86fc017" -dependencies = [ - "bstr", - "btoi", - "gix-actor", - "gix-features 0.28.1", - "gix-hash 0.10.4", - "gix-validate", - "hex", - "itoa", - "nom", - "smallvec", - "thiserror", -] - -[[package]] -name = "gix-odb" -version = "0.43.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83af2e3e36005bfe010927f0dff41fb5acc3e3d89c6f1174135b3a34086bda2" -dependencies = [ - "arc-swap", - "gix-features 0.28.1", - "gix-hash 0.10.4", - "gix-object", - "gix-pack", - "gix-path", - "gix-quote", - "parking_lot", - "tempfile", - "thiserror", -] - -[[package]] -name = "gix-pack" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9401911c7fe032ad7b31c6a6b5be59cb283d1d6c999417a8215056efe6d635f3" -dependencies = [ - "clru", - "gix-chunk", - "gix-diff", - "gix-features 0.28.1", - "gix-hash 0.10.4", - "gix-hashtable", - "gix-object", - "gix-path", - "gix-tempfile", - "gix-traverse", - "memmap2", - "parking_lot", - "smallvec", - "thiserror", -] - -[[package]] -name = "gix-path" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32370dce200bb951df013e03dff35b4233fc7a89458642b047629b91734a7e19" -dependencies = [ - "bstr", - "thiserror", -] - -[[package]] -name = "gix-prompt" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3034d4d935aef2c7bf719aaa54b88c520e82413118d886ae880a31d5bdee57" -dependencies = [ - "gix-command", - "gix-config-value", - "nix", - "parking_lot", - "thiserror", -] - -[[package]] -name = "gix-quote" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475c86a97dd0127ba4465fbb239abac9ea10e68301470c9791a6dd5351cdc905" -dependencies = [ - "bstr", - "btoi", - "thiserror", -] - -[[package]] -name = "gix-ref" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e909396ed3b176823991ccc391c276ae2a015e54edaafa3566d35123cfac9d" -dependencies = [ - "gix-actor", - "gix-features 0.28.1", - "gix-hash 0.10.4", - "gix-lock", - "gix-object", - "gix-path", - "gix-tempfile", - "gix-validate", - "memmap2", - "nom", - "thiserror", -] - -[[package]] -name = "gix-refspec" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba332462bda2e8efeae4302b39a6ed01ad56ef772fd5b7ef197cf2798294d65" -dependencies = [ - "bstr", - "gix-hash 0.10.4", - "gix-revision", - "gix-validate", - "smallvec", - "thiserror", -] - -[[package]] -name = "gix-revision" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6f6ff53f888858afc24bf12628446a14279ceec148df6194481f306f553ad2" -dependencies = [ - "bstr", - "gix-date", - "gix-hash 0.10.4", - "gix-hashtable", - "gix-object", - "thiserror", -] - -[[package]] -name = "gix-sec" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ffa5bf0772f9b01de501c035b6b084cf9b8bb07dec41e3afc6a17336a65f47" -dependencies = [ - "bitflags 1.3.2", - "dirs", - "gix-path", - "libc", - "windows", -] - -[[package]] -name = "gix-tempfile" -version = "5.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71a0d32f34e71e86586124225caefd78dabc605d0486de580d717653addf182" -dependencies = [ - "gix-fs", - "libc", - "once_cell", - "parking_lot", - "signal-hook", - "signal-hook-registry", - "tempfile", -] - -[[package]] -name = "gix-traverse" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd9a4a07bb22168dc79c60e1a6a41919d198187ca83d8a5940ad8d7122a45df3" -dependencies = [ - "gix-hash 0.10.4", - "gix-hashtable", - "gix-object", - "thiserror", -] - -[[package]] -name = "gix-url" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a22b4b32ad14d68f7b7fb6458fa58d44b01797d94c1b8f4db2d9c7b3c366b5" -dependencies = [ - "bstr", - "gix-features 0.28.1", - "gix-path", - "home", - "thiserror", - "url", -] - -[[package]] -name = "gix-utils" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b85d89dc728613e26e0ed952a19583744e7f5240fcd4aa30d6c824ffd8b52f0f" -dependencies = [ - "fastrand", -] - -[[package]] -name = "gix-validate" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba9b3737b2cef3dcd014633485f0034b0f1a931ee54aeb7d8f87f177f3c89040" -dependencies = [ - "bstr", - "thiserror", -] - -[[package]] -name = "gix-worktree" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ec9a000b4f24af706c3cc680c7cda235656cbe3216336522f5692773b8a301" -dependencies = [ - "bstr", - "gix-attributes", - "gix-features 0.28.1", - "gix-glob", - "gix-hash 0.10.4", - "gix-index", - "gix-object", - "gix-path", - "io-close", - "thiserror", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.13.2" @@ -859,56 +152,21 @@ dependencies = [ ] [[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "home" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "imara-diff" -version = "0.1.5" +name = "hashbrown" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98c1d0ad70fc91b8b9654b1f33db55e59579d3b3de2bffdced0fdb810570cb8" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" dependencies = [ "ahash", - "hashbrown 0.12.3", + "allocator-api2", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "indexmap" version = "2.0.0" @@ -925,16 +183,6 @@ version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c40411d0e5c63ef1323c3d09ce5ec6d84d71531e18daed0743fccea279d7deb6" -[[package]] -name = "io-close" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadcf447f06744f8ce713d2d6239bb5bde2c357a452397a9ed90c625da390bc" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "itertools" version = "0.11.0" @@ -944,12 +192,6 @@ dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - [[package]] name = "lasso" version = "0.7.2" @@ -971,28 +213,6 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" -[[package]] -name = "linux-raw-sys" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - [[package]] name = "logos" version = "0.13.0" @@ -1027,54 +247,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "num" @@ -1152,56 +327,18 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.3.5", - "smallvec", - "windows-targets", -] - [[package]] name = "paste" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - [[package]] name = "proc-macro2" version = "1.0.66" @@ -1211,12 +348,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prodash" -version = "23.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9516b775656bc3e8985e19cd4b8c0c0de045095074e453d2c0a513b5f978392d" - [[package]] name = "psm" version = "0.1.21" @@ -1236,55 +367,37 @@ dependencies = [ ] [[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.3" +name = "regex" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ - "getrandom", - "redox_syscall 0.2.16", - "thiserror", + "aho-corasick", + "memchr", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] -name = "regex" -version = "1.9.3" +name = "regex-automata" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ "aho-corasick", "memchr", - "regex-automata", "regex-syntax 0.7.4", ] [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax 0.8.2", ] [[package]] @@ -1300,17 +413,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] -name = "rustix" -version = "0.38.11" +name = "regex-syntax" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rustversion" @@ -1327,12 +433,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "serde" version = "1.0.186" @@ -1355,38 +455,13 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - -[[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - [[package]] name = "slotmap" version = "1.0.6" @@ -1396,12 +471,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - [[package]] name = "stacker" version = "0.1.15" @@ -1445,19 +514,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tempfile" -version = "3.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" -dependencies = [ - "cfg-if", - "fastrand", - "redox_syscall 0.3.5", - "rustix", - "windows-sys", -] - [[package]] name = "thiserror" version = "1.0.47" @@ -1478,56 +534,11 @@ dependencies = [ "syn", ] -[[package]] -name = "time" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" -dependencies = [ - "deranged", - "itoa", - "libc", - "num_threads", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" -dependencies = [ - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "toml" -version = "0.7.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", @@ -1537,18 +548,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ "indexmap", "serde", @@ -1563,78 +574,24 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0ec9745d7517c8b8e8c0a65cba2d84e42f95fd348a01693c5e4da1bc6d00c99" -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-bom" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63ec69f541d875b783ca40184d655f2927c95f0bffd486faa83cd3ac3529ec32" - [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-width" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" -[[package]] -name = "url" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "vergen" -version = "8.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b86a8af1dedf089b1c78338678e4c7492b6045649042d94faf19690499d236" -dependencies = [ - "anyhow", - "gix", - "rustversion", - "time", -] - [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "walkdir" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "walkdir" version = "2.3.3" @@ -1644,12 +601,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - [[package]] name = "winapi" version = "0.3.9" @@ -1668,9 +619,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -1681,129 +632,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.43.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "winnow" version = "0.5.15" diff --git a/Cargo.toml b/Cargo.toml index b2dd222..e04c13d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,15 +7,13 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -chumsky = { git = "https://github.com/zesterer/chumsky.git", rev = "56762fe5c965880066a068038a18b5ac07afd75c", features = [ - "label", -] } +chumsky = { version = "1.0.0-alpha.6", features = [ "label" ] } walkdir = { git = "https://github.com/APLanguage/walkdir.git" } # chumsky = { version = "1.0.0-alpha.4", features = ["label"] } num = "0.4.1" num-traits = "0.2" # num-derive = "0.3" -regex = "1.9" +regex = "1.10" logos = "0.13" paste = "1.0" # clap = "4.1" @@ -28,7 +26,7 @@ indextree = "4.6" slotmap = "1.0.6" ariadne = { git = "https://github.com/APLanguage/ariadne.git", rev = "bdc392368fb45e71aff0feca58d0bf66f56698ae" } itertools = "0.11" -toml = "0.7.6" +toml = "0.8.8" serde = { version = "1.0", features = ["derive"] } same-file = "1.0.6" strum = "0.25" @@ -36,4 +34,4 @@ strum_macros = "0.25" bigdecimal = { git = "https://github.com/APLanguage/bigdecimal-rs.git", rev = "864927641721a39299e460deebdc85d01ea0930b" } [target.'cfg(windows)'.dependencies.winapi-util] -version = "0.1.5" +version = "0.1.6" diff --git a/src/main.rs b/src/main.rs index 72a0e0d..a0e2d49 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,6 @@ #![allow(incomplete_features)] #![allow(unused_macros)] #![feature(trait_alias)] -#![feature(return_position_impl_trait_in_trait)] #![feature(iter_collect_into)] // #![feature(iter_map_windows)] @@ -15,9 +14,7 @@ use crate::{ Spanned, }, project::{ - display_integer_type, - readers::{read_workspace, ReadWorkspaceError, ReadWorkspaceResult}, - Workspace, TypeRegistry, + display_integer_type, readers::{read_workspace, ReadWorkspaceError, ReadWorkspaceResult}, ProjectLink, TypeRegistry, Workspace }, resolution::{ name_resolution::resolve_workspace_outlines, @@ -85,8 +82,7 @@ fn main() { { let mut is_errors = false; println!("Resolving..."); - let dependency_id = workspace.project_dep_id(); - for (file_id, errs) in resolve_workspace_outlines(&mut rodeo, &mut workspace, dependency_id) + for (file_id, errs) in resolve_workspace_outlines(&mut rodeo, &mut workspace, ProjectLink::Project) { is_errors = true; let file = workspace.project().files.file_by_id(file_id).unwrap(); @@ -113,7 +109,7 @@ fn main() { // } return; } - for (file_id, errs) in resolve_and_typecheck_functions(&rodeo, &mut workspace, dependency_id) { + for (file_id, errs) in resolve_and_typecheck_functions(&rodeo, &mut workspace, ProjectLink::Project) { is_errors = true; let file = workspace.project().files.file_by_id(file_id).unwrap(); // Generate & choose some colours for each of our elements @@ -188,14 +184,12 @@ fn main() { ) }, FieldNotFound( - Spanned((dep, struct_id), base_span), + Spanned(struct_link, base_span), Spanned(name, name_span), ) => { - let dep = workspace.dependencies.get_dependency(dep).unwrap(); - let project_name = rodeo.resolve(&dep.name); - let struct_path = &dep - .project - .struct_path(struct_id) + let project_name = rodeo.resolve(&workspace.get_dependency_name(struct_link.project_link)); + let struct_path = workspace.get_project(struct_link.project_link) + .struct_path(struct_link.struct_id) .map(|s| rodeo.resolve(&s)) .join("::"); let struct_color = colors.next(); @@ -203,7 +197,7 @@ fn main() { "No field `{}` found for struct ({}) {}", rodeo.resolve(&name).fg(ariadne::Color::Red), project_name.fg(struct_color), - struct_path.fg(struct_color), + (&struct_path).fg(struct_color), )) .with_label({ ariadne::Label::new((&input_name as &str, base_span.into_range())) diff --git a/src/parsing/parsers/declarations.rs b/src/parsing/parsers/declarations.rs index ec85445..ff18b63 100644 --- a/src/parsing/parsers/declarations.rs +++ b/src/parsing/parsers/declarations.rs @@ -5,7 +5,6 @@ use crate::parsing::{ }, parsers::{expressions::expression_parser, TokenInput, TokenParser}, tokenizer::{ident, keyword, Identifier, Token}, - Spanned, }; use chumsky::{ primitive::{choice, group, just}, @@ -21,8 +20,8 @@ fn field_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, Field> { keyword(Identifier::Var).to(true), keyword(Identifier::Val).to(false), )) - .map_with_span(Spanned), - ident().spur().map_with_span(Spanned), + .spanned(), + ident().spur().spanned(), just(Token::Colon).paddedln(), type_parser() .spanned() @@ -44,7 +43,7 @@ pub fn struct_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, Struct> .ignore_then( ident() .spur() - .map_with_span(Spanned) + .spanned() .paddedln() .labelled("data-identifier") .boxed(), @@ -70,7 +69,7 @@ pub fn struct_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, Struct> pub fn type_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, ParsedType> + Clone { recursive(|p| { choice(( - ident().spur().map_with_span(Spanned).map(ParsedType::Data), + ident().spur().spanned().map(ParsedType::Data), p.delimited_by(just(Token::BracketOpen), just(Token::BracketClosed)) .map(|t| ParsedType::Array(Box::new(t))), )) @@ -84,12 +83,12 @@ pub fn variable_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, Varia keyword(Identifier::Var).to(true), keyword(Identifier::Val).to(false), )) - .map_with_span(Spanned) + .spanned() .labelled("var-modifier") .boxed(), ident() .spur() - .map_with_span(Spanned) + .spanned() .paddedln() .labelled("var-name") .boxed(), @@ -122,13 +121,10 @@ fn parameter_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, Paramete keyword(Identifier::Var).to(true), keyword(Identifier::Val).to(false), )) - .map_with_span(Spanned) + .spanned() .or_not() .labelled("fn-param-reassignable"), - ident() - .spur() - .map_with_span(Spanned) - .labelled("fn-param-name"), + ident().spur().spanned().labelled("fn-param-name"), just(Token::Colon).paddedln().ignored(), type_parser() .spanned() @@ -146,11 +142,7 @@ fn parameter_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, Paramete pub fn function_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, Function> { keyword(Identifier::Fn) .ignore_then(group(( - ident() - .spur() - .map_with_span(Spanned) - .paddedln() - .labelled("fn-name"), + ident().spur().spanned().paddedln().labelled("fn-name"), parameter_parser() .paddedln() .separated_by(just(Token::Comma)) diff --git a/src/parsing/parsers/expressions.rs b/src/parsing/parsers/expressions.rs index 86fedfc..8648ebe 100644 --- a/src/parsing/parsers/expressions.rs +++ b/src/parsing/parsers/expressions.rs @@ -1,11 +1,11 @@ use chumsky::{ + prelude::Rich, primitive::{choice, group, just}, recursive::recursive, select, span::SimpleSpan, - IterParser, Parser, prelude::Rich, + Parser, }; -use itertools::Itertools; use crate::parsing::{ ast::expressions::{CallKind, Expression}, @@ -32,7 +32,7 @@ pub fn call<'a, EP, I: TokenInput<'a>>( where EP: TokenParser<'a, I, Expression> + Clone + 'a { ident() .spur() - .map_with_span(Spanned) + .spanned() .then( expr_parser .spanned() @@ -82,7 +82,7 @@ where EP: TokenParser<'a, I, Expression> + Clone + 'a { LessLessEqual ) .boxed() - .map_with_span(Spanned) + .spanned() .labelled("assignement_operator") .paddedln(), expr_parser @@ -131,7 +131,7 @@ pub fn unary_parser<'a, EP, I: TokenInput<'a>>( ) -> impl TokenParser<'a, I, Expression> + Clone where EP: TokenParser<'a, I, Expression> + Clone + 'a { ops_parser!(Minus, Bang, Tilde) - .map_with_span(Spanned) + .spanned() .repeated() .at_least(1) .collect_boxed_slice() @@ -218,7 +218,7 @@ pub fn expression_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, Exp use paste::paste; -use super::{string::string_parser, TokenParserExt}; +use super::{string::string_parser, TokenParserExt, just_span}; macro_rules! binary_parser { ($what:ident, $name: ident, $next_name: ident, $ops:expr) => { paste! { @@ -244,14 +244,11 @@ macro_rules! binary_parser { #[rustfmt::skip] binary_parser!(binary, factor, bitops, ops_parser!(Asterisk, SlashSlash, Slash, Percent)); #[rustfmt::skip] binary_parser!(binary, bitops, unary, ops_parser!(Bar, Ampersand, LessLess) .or( - just(Token::Greater).span().repeated().at_least(2).at_most(3).collect_boxed_slice() - .try_map(|slice, _span| - if slice.iter().tuple_windows().all(|(a, b)| a.end == b.start) { - Ok(if slice.len() == 2 { Operation::ShiftRight } else { Operation::ShiftRightUnsigned }) - } else { - Err(Rich::custom(_span, "there is a whitespace between the two/three >")) - } - ) + choice(( + group((just_span(Token::Greater), just_span(Token::Greater), just_span(Token::Greater))).map(|(a, b, c)| (a.end == b.start && b.end == c.start).then_some(Operation::ShiftRightUnsigned)), + group((just_span(Token::Greater), just_span(Token::Greater))).map(|(a, b)| (a.end == b.start).then_some(Operation::ShiftRight)), + )) + .try_map(|op, span| op.ok_or_else(|| Rich::custom(span, "there is a whitespace between the two/three >"))) ) ); diff --git a/src/parsing/parsers/file.rs b/src/parsing/parsers/file.rs index 4218b88..be1e861 100644 --- a/src/parsing/parsers/file.rs +++ b/src/parsing/parsers/file.rs @@ -4,7 +4,6 @@ use chumsky::{ prelude::Rich, primitive::{choice, just}, recursive::recursive, - span::SimpleSpan, IterParser, Parser, }; use either::Either; @@ -49,8 +48,10 @@ pub fn use_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, UseDeclara .separated_by(just(Token::Minus)) .at_least(1) .ignored() - .src().boxed() - .validate(|s, span: SimpleSpan, emitter| { + .src() + .boxed() + .validate(|s: &'a str, extra, emitter| { + let span = extra.span(); if s.chars().any(|c: char| c.is_whitespace()) { emitter.emit(Rich::custom(span, "No whitespaces are allowed. Should match [a-zA-Z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*")) } diff --git a/src/parsing/parsers/mod.rs b/src/parsing/parsers/mod.rs index 59a0f91..a4f4de3 100644 --- a/src/parsing/parsers/mod.rs +++ b/src/parsing/parsers/mod.rs @@ -1,7 +1,8 @@ use std::{fmt::Debug, ops::Range}; use chumsky::{ - extra::Full, input::ValueInput, prelude::Rich, span::SimpleSpan, IterParser, Parser, + container::OrderedSeq, extra::Full, input::ValueInput, prelude::Rich, primitive::just, + span::SimpleSpan, IterParser, Parser, }; use lasso::{Rodeo, Spur}; @@ -87,8 +88,17 @@ where self.padded_by(newline().repeated()) } + #[inline] + fn map_with_state) -> R) + Clone>( + self, + f: F, + ) -> impl TokenParser<'a, I, R> { + self.map_with(move |t, e| f(t, e.span(), e.state())) + } + + #[inline(always)] fn span(self) -> impl TokenParser<'a, I, SimpleSpan> + Clone { - self.map_with_span(|_, s| s) + self.to_span() } fn spur(self) -> impl TokenParser<'a, I, Spur> + Clone { @@ -102,10 +112,10 @@ where } fn spanned(self) -> impl TokenParser<'a, I, Spanned> + Clone { - self.map_with_span(Spanned) + self.map_with(|t, e| Spanned(t, e.span())) } - fn map_into>(self) ->impl TokenParser<'a, I, R> + Clone { + fn map_into>(self) -> impl TokenParser<'a, I, R> + Clone { self.map(Into::into) } } @@ -117,3 +127,10 @@ where O: Debug, { } + +pub fn just_span<'a, T, I>(seq: T) -> impl TokenParser<'a, I, SimpleSpan> +where + I: TokenInput<'a>, + T: OrderedSeq<'a, I::Token> + Clone, { + just(seq).to_span() +} diff --git a/src/parsing/parsers/statements.rs b/src/parsing/parsers/statements.rs index f59c810..6fd452d 100644 --- a/src/parsing/parsers/statements.rs +++ b/src/parsing/parsers/statements.rs @@ -122,7 +122,7 @@ fn return_parser<'a, I: TokenInput<'a>>() -> impl TokenParser<'a, I, ControlFlow keyword(Identifier::Return) .ignore_then( expression_parser() - .map_with_span(Spanned) + .spanned() .paddedln() .or_not() .labelled("return-expr") diff --git a/src/parsing/parsers/string.rs b/src/parsing/parsers/string.rs index b9b8093..5b0d04a 100644 --- a/src/parsing/parsers/string.rs +++ b/src/parsing/parsers/string.rs @@ -58,7 +58,7 @@ pub fn string_parser<'a>( any() .and_is(end.not()) .repeated() - .slice() + .to_slice() .map(|s: &'a str| { UnlassoedStringLiteral::Raw(s.to_owned().replace("\r\n", "\n")) }) diff --git a/src/parsing/tokenizer.rs b/src/parsing/tokenizer.rs index 9e7e4c3..8089ecb 100644 --- a/src/parsing/tokenizer.rs +++ b/src/parsing/tokenizer.rs @@ -48,7 +48,7 @@ fn string_parser_callback(lex: &mut Lexer) -> Option { let start = lex.span().start; let len = lex.span().end - lex.span().start; let (literal, span) = string_literal_outline_parser() - .map_with_span(|t, s| (t, s)) + .map_with(|t, e| (t, e.span())) .lazy() .parse(lex.source().slice(start..end).unwrap()) .into_output()?; diff --git a/src/project/mod.rs b/src/project/mod.rs index 184aa85..d1179bc 100644 --- a/src/project/mod.rs +++ b/src/project/mod.rs @@ -36,6 +36,18 @@ new_key_type! { pub struct ModuleId; } new_key_type! { pub struct DeclarationId; } new_key_type! { pub struct DependencyId; } +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ProjectLink { + Dependency(DependencyId), + Project, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct StructLink { + pub struct_id: StructId, + pub project_link: ProjectLink, +} + #[derive(Default)] pub struct TypeRegistry { types: SlotMap, @@ -84,16 +96,13 @@ impl TypeRegistry { } } - fn create_struct(&mut self, dependency_id: DependencyId, struct_id: StructId) -> TypeId { - self.types.insert(Type::Data(dependency_id, struct_id)) + fn create_struct(&mut self, struct_link: StructLink) -> TypeId { + self.types.insert(Type::Data(struct_link)) } - pub fn get_declaration_from_type_id( - &self, - type_id: TypeId, - ) -> Option<(DependencyId, StructId)> { + pub fn get_declaration_from_type_id(&self, type_id: TypeId) -> Option { match self.types.get(type_id)? { - Type::Data(dep_id, struct_id) => Some((*dep_id, *struct_id)), + Type::Data(link) => Some(*link), _ => None, } } @@ -127,9 +136,9 @@ impl TypeRegistry { }) } - pub fn get_as_struct(&self, type_id: TypeId) -> Option<(DependencyId, StructId)> { + pub fn get_as_struct(&self, type_id: TypeId) -> Option { self.types.get(type_id).and_then(|t| match t { - Type::Data(dep, struct_id) => Some((*dep, *struct_id)), + Type::Data(link) => Some(*link), _ => None, }) } @@ -141,21 +150,18 @@ impl TypeRegistry { .unwrap() } - pub fn display_type( - &self, - rodeo: &Rodeo, - dependencies: &Dependencies, - type_id: TypeId, - ) -> String { + pub fn display_type(&self, rodeo: &Rodeo, workspace: &Workspace, type_id: TypeId) -> String { self.get(type_id).map_or_else( || "?".to_string(), |ty| match ty { Type::PrimitiveType(ty) => Self::display_primitive_type(*ty).to_string(), - Type::Data(dep, struct_id) => { - let dependency_info = dependencies.get_dependency(*dep).unwrap(); - let project_name = rodeo.resolve(&dependency_info.name); - let struct_path = &dependency_info - .project + Type::Data(StructLink { + struct_id, + project_link, + }) => { + let project_name = rodeo.resolve(&workspace.get_dependency_name(*project_link)); + let struct_path = workspace + .get_project(*project_link) .struct_path(*struct_id) .map(|s| rodeo.resolve(&s)) .join("::"); @@ -179,7 +185,7 @@ impl TypeRegistry { }, ) } - + pub fn display_primitive_type(ty: PrimitiveType) -> &'static str { use PrimitiveType::*; match ty { @@ -219,40 +225,29 @@ pub struct Workspace { pub aplang_file: APLangWorkspaceFile, pub dependencies: Dependencies, pub type_registery: Rc>, - _project: DependencyId, + project_name: Spur, + project: Project, } impl Workspace { pub fn project(&self) -> &Project { - &self - .dependencies - .get_dependency(self._project) - .unwrap() - .project + &self.project } pub fn project_mut(&mut self) -> &mut Project { - &mut self - .dependencies - .get_dependency_mut(self._project) - .unwrap() - .project - } - - pub fn project_dep_id(&self) -> DependencyId { - self._project + &mut self.project } pub fn resolver_by_scope<'a>( &'a self, rodeo: &'a Rodeo, - dependency_id: DependencyId, + project_link: ProjectLink, scope_id: ScopeId, ) -> FileScopedNameResolver<'a> { FileScopedNameResolver::new_with_scope( - &self.dependencies, + self, self.type_registery.clone(), - dependency_id, + project_link, scope_id, rodeo, ) @@ -261,22 +256,62 @@ impl Workspace { pub fn resolver_by_file<'a>( &'a self, rodeo: &'a Rodeo, - dependency_id: DependencyId, + project_link: ProjectLink, file_id: FileId, ) -> FileScopedNameResolver<'a> { FileScopedNameResolver::new_with_file( - &self.dependencies, + self, self.type_registery.clone(), - dependency_id, + project_link, file_id, rodeo, ) } pub fn display_type(&self, rodeo: &Rodeo, ty: TypeId) -> String { - self.type_registery - .borrow() - .display_type(rodeo, &self.dependencies, ty) + self.type_registery.borrow().display_type(rodeo, self, ty) + } + + pub fn get_project(&self, project_link: ProjectLink) -> &Project { + match project_link { + ProjectLink::Dependency(dep_id) => { + self.dependencies.deps.get(dep_id).map(|d| &d.project).expect("A dependency wasn't found by DependencyId, this means it is a dead id and is a bug.") + } + ProjectLink::Project => &self.project, + } + } + + pub fn get_project_mut(&mut self, project_link: ProjectLink) -> &mut Project { + match project_link { + ProjectLink::Dependency(dep_id) => self + .dependencies + .deps + .get_mut(dep_id) + .map(|d| &mut d.project).expect("A dependency wasn't found by DependencyId, this means it is a dead id and is a bug."), + ProjectLink::Project => &mut self.project, + } + } + + pub fn get_dependency_name(&self, project_link: ProjectLink) -> Spur { + match project_link { + ProjectLink::Dependency(dep_id) => self.dependencies.deps.get(dep_id).unwrap().name, + ProjectLink::Project => self.project_name, + } + } + + pub fn get_scopes(&self, project_link: ProjectLink) -> &Scopes { + &self.get_project(project_link).scopes + } + + pub fn get_project_by_name(&self, name: &[Spur]) -> Result { + if name.len() != 1 { + todo!("Dependencies#get_dependency_by_name: multi project workspaces") + } + if *name.first().unwrap() == self.project_name { + Ok(ProjectLink::Project) + } else { + self.dependencies.get_dependency_by_name(name) + } } } @@ -545,13 +580,14 @@ impl Dependencies { id } - pub fn get_dependency_by_name(&self, name: &[Spur]) -> Result { + fn get_dependency_by_name(&self, name: &[Spur]) -> Result { if name.len() != 1 { todo!("Dependencies#get_dependency_by_name: multi project workspaces") } self.by_name - .get(name.get(0).unwrap()) + .get(name.first().unwrap()) .map(DependencyId::clone) + .map(ProjectLink::Dependency) .ok_or(0) } @@ -561,7 +597,7 @@ impl Dependencies { } pub struct ResolvedUses { - uses: HashMap, + uses: HashMap, errors: Vec, } @@ -581,8 +617,8 @@ impl ResolvedUses { } } - pub(crate) fn add(&mut self, dependency_id: DependencyId, target: UseTarget) { - match self.uses.get_mut(&dependency_id) { + pub(crate) fn add(&mut self, project_link: ProjectLink, target: UseTarget) { + match self.uses.get_mut(&project_link) { Some(ruid) => { match target { UseTarget::UseTargetStar(t) => ruid.0.push(t), @@ -590,7 +626,7 @@ impl ResolvedUses { }; } None => { - self.uses.insert(dependency_id, { + self.uses.insert(project_link, { let (vec_star, vec_single) = match target { UseTarget::UseTargetStar(t) => (vec![t], vec![]), UseTarget::UseTargetSingle(t) => (vec![], vec![t]), @@ -611,79 +647,82 @@ impl ResolvedUses { return self.errors.iter(); } - pub fn find(&self, name: Spur) -> impl Iterator + '_ { + pub fn find(&self, name: Spur) -> impl Iterator + '_ { self.find_in_single(name).chain(self.find_in_stars(name)) } - pub fn find_in_single(&self, name: Spur) -> impl Iterator + '_ { - self.uses - .iter() - .flat_map(move |(dep_id, ResolvedUsesInDependency(_, singles))| { + pub fn find_in_single(&self, name: Spur) -> impl Iterator + '_ { + self.uses.iter().flat_map( + move |(project_link, ResolvedUsesInDependency(_, singles))| { singles .iter() .filter(move |t| t.alias_name.map(|n| n.0 == name).unwrap_or(t.name == name)) - .map(|t| (*dep_id, t.scope)) - }) + .map(|t| (*project_link, t.scope)) + }, + ) } - pub fn find_in_stars(&self, name: Spur) -> impl Iterator + '_ { + pub fn find_in_stars(&self, name: Spur) -> impl Iterator + '_ { self.uses .iter() - .flat_map(move |(dep_id, ResolvedUsesInDependency(stars, _))| { + .flat_map(move |(project_link, ResolvedUsesInDependency(stars, _))| { stars .iter() .flat_map(|t| t.end_targets.iter()) .filter_map(move |(target_name, id)| (*target_name == name).then_some(id)) - .map(|&id| (*dep_id, id)) + .map(|&id| (*project_link, id)) }) } pub fn find_struct<'a>( &'a self, - dependencies: &'a Dependencies, + workspace: &'a Workspace, name: Spur, - ) -> impl Iterator + '_ { - self.find(name) - .filter_map(|(dep_id, scope_id)| self.filter_finding(dependencies, dep_id, scope_id)) + ) -> impl Iterator + '_ { + self.find(name).filter_map(|(project_link, scope_id)| { + self.filter_finding(workspace, project_link, scope_id) + }) } pub fn find_struct_in_single<'a>( &'a self, - dependencies: &'a Dependencies, + workspace: &'a Workspace, name: Spur, - ) -> impl Iterator + '_ { + ) -> impl Iterator + '_ { self.find_in_single(name) - .filter_map(|(dep_id, scope_id)| self.filter_finding(dependencies, dep_id, scope_id)) + .filter_map(|(project_link, scope_id)| { + self.filter_finding(workspace, project_link, scope_id) + }) } pub fn find_struct_in_stars<'a>( &'a self, - dependencies: &'a Dependencies, + workspace: &'a Workspace, name: Spur, - ) -> impl Iterator + '_ { + ) -> impl Iterator + '_ { self.find_in_stars(name) - .filter_map(|(dep_id, scope_id)| self.filter_finding(dependencies, dep_id, scope_id)) + .filter_map(|(project_link, scope_id)| { + self.filter_finding(workspace, project_link, scope_id) + }) } fn filter_finding( &self, - dependencies: &Dependencies, - dep_id: DependencyId, + workspace: &Workspace, + project_link: ProjectLink, scope_id: ScopeId, - ) -> Option<(DependencyId, ScopeId, DeclarationId, StructId, TypeId)> { - let dep_info = dependencies.get_dependency(dep_id)?; - let scopes = &dep_info.project.scopes; + ) -> Option<(ProjectLink, ScopeId, DeclarationId, StructId, TypeId)> { + let project = workspace.get_project(project_link); + let scopes = &project.scopes; let ScopeType::Declaration(_, dec_id) = scopes.scope(scope_id)? else { return None; }; - let DeclarationDelegate::Struct(struct_id) = - dep_info.project.pool.declarations.get(*dec_id)? - else { + let DeclarationDelegate::Struct(struct_id) = project.pool.declarations.get(*dec_id)? else { return None; }; - let type_id = dep_info.project.pool.structs.get(*struct_id)?.decl.ast.1; - Some((dep_id, scope_id, *dec_id, *struct_id, type_id)) + let type_id = project.pool.structs.get(*struct_id)?.decl.ast.1; + Some((project_link, scope_id, *dec_id, *struct_id, type_id)) } } diff --git a/src/project/readers.rs b/src/project/readers.rs index 5383cc7..7d080cd 100644 --- a/src/project/readers.rs +++ b/src/project/readers.rs @@ -1,10 +1,10 @@ -use std::{collections::HashMap, ffi::OsStr, io::Read, path::Path, cell::RefCell, rc::Rc}; +use std::{cell::RefCell, collections::HashMap, ffi::OsStr, io::Read, path::Path, rc::Rc}; use anyhow::Result; use chumsky::{prelude::Rich, primitive::end, span::SimpleSpan, Parser}; use either::Either; use lasso::Rodeo; -use slotmap::{KeyData, SlotMap}; +use slotmap::SlotMap; use thiserror::Error; use crate::{ @@ -24,9 +24,9 @@ use super::{ scopes::{ScopeType, Scopes}, std_lib::create_std_lib, AstFiles, DeclarationDelegate, DeclarationId, DeclarationInfo, DeclarationPool, - DeclarationResolutionStage, Dependencies, DependencyId, DependencyInfo, File, FileId, Files, - FunctionId, ModuleData, ModuleId, Project, StructId, TypeRegistry, VariableId, VirtualFile, - Workspace, + DeclarationResolutionStage, Dependencies, DependencyInfo, File, FileId, Files, FunctionId, + ModuleData, ModuleId, Project, ProjectLink, StructId, StructLink, TypeRegistry, VariableId, + VirtualFile, Workspace, }; #[derive(Debug, Error)] @@ -57,7 +57,6 @@ pub fn read_workspace(rodeo: &mut Rodeo, path: &Path) -> ReadWorkspaceResult { Ok(f) => f, Err(e) => return ReadWorkspaceResult::ErrFile(e), }; - let project_name = rodeo.get_or_intern(&aplang_file.project.name); let mut types = TypeRegistry::new_by_spur_supplier(|s| rodeo.get_or_intern_static(s)); let mut deps = Dependencies { deps: SlotMap::with_key(), @@ -66,7 +65,7 @@ pub fn read_workspace(rodeo: &mut Rodeo, path: &Path) -> ReadWorkspaceResult { let project = match read_project( // just creating the egg manually - DependencyId(KeyData::from_ffi(1 << 32 | 1)), + ProjectLink::Project, rodeo, path.join("src").as_path(), &mut types, @@ -74,23 +73,19 @@ pub fn read_workspace(rodeo: &mut Rodeo, path: &Path) -> ReadWorkspaceResult { ReadProjectResult::Err(err, files) => return ReadWorkspaceResult::ErrProject(err, files), ReadProjectResult::Ok(p) => p, }; - // the egg created later from SlotMap - let id = deps.deps.insert(DependencyInfo { - name: project_name, - project, - }); - deps.by_name.insert(project_name, id); let std_id = deps.add_dependency_with_key(|std_id| DependencyInfo { name: rodeo.get_or_intern_static("std"), project: create_std_lib(std_id, rodeo, &mut types), }); let mut workspace = Workspace { + project_name: rodeo.get_or_intern(&aplang_file.project.name), aplang_file, dependencies: deps, - _project: id, + project, type_registery: Rc::new(RefCell::new(types)), }; - let std_errs = &resolve_workspace_outlines(rodeo, &mut workspace, std_id); + let std_errs = + &resolve_workspace_outlines(rodeo, &mut workspace, ProjectLink::Dependency(std_id)); if !std_errs.is_empty() { let project = &workspace .dependencies @@ -118,17 +113,17 @@ pub enum ReadProjectResult { } pub fn read_project( - dependency_id: DependencyId, + project_link: ProjectLink, rodeo: &mut Rodeo, path: &Path, types: &mut TypeRegistry, ) -> ReadProjectResult { let (files, scopes) = read_files(rodeo, path); - read_project_from_files(dependency_id, rodeo, files, scopes, types) + read_project_from_files(project_link, rodeo, files, scopes, types) } pub fn read_project_from_files( - dependency_id: DependencyId, + project_link: ProjectLink, rodeo: &mut Rodeo, files: Files, mut scopes: Scopes, @@ -196,7 +191,13 @@ pub fn read_project_from_files( let name = s.name.0; let id = structs.insert_with_key(|key| DeclarationInfo { decl: DeclarationResolutionStage { - ast: (s, types.create_struct(dependency_id, key)), + ast: ( + s, + types.create_struct(StructLink { + struct_id: key, + project_link, + }), + ), outline: None, full: None, }, diff --git a/src/project/std_lib.rs b/src/project/std_lib.rs index d828d4b..e156349 100644 --- a/src/project/std_lib.rs +++ b/src/project/std_lib.rs @@ -5,8 +5,8 @@ use slotmap::SlotMap; use super::{ readers::{read_project_from_files, ReadProjectResult}, - scopes::{Scopes, ScopeType}, - Files, Project, VirtualFile, DependencyId, TypeRegistry, + scopes::{ScopeType, Scopes}, + DependencyId, Files, Project, ProjectLink, TypeRegistry, VirtualFile, }; const STD_LIB_SRC: &str = r##" @@ -17,7 +17,11 @@ fn str(input: u32) -> str {} fn str(input: u64) -> str {} "##; -pub fn create_std_lib(dependency_id: DependencyId, rodeo: &mut Rodeo, types: &mut TypeRegistry) -> Project { +pub fn create_std_lib( + dependency_id: DependencyId, + rodeo: &mut Rodeo, + types: &mut TypeRegistry, +) -> Project { let mut files = Files { files: SlotMap::with_key(), }; @@ -26,9 +30,18 @@ pub fn create_std_lib(dependency_id: DependencyId, rodeo: &mut Rodeo, types: &mu src: STD_LIB_SRC.to_owned(), path: Path::new("std/std.aplang").into(), })); - scopes.add(scopes.root_id(), ScopeType::File(rodeo.get_or_intern_static("std"), file_id)); + scopes.add( + scopes.root_id(), + ScopeType::File(rodeo.get_or_intern_static("std"), file_id), + ); - match read_project_from_files(dependency_id, rodeo, files, scopes, types) { + match read_project_from_files( + ProjectLink::Dependency(dependency_id), + rodeo, + files, + scopes, + types, + ) { ReadProjectResult::Err(_, _) => panic!("The std should compile!"), ReadProjectResult::Ok(p) => p, } diff --git a/src/resolution/fir.rs b/src/resolution/fir.rs index 6d9dc7e..fae0b87 100644 --- a/src/resolution/fir.rs +++ b/src/resolution/fir.rs @@ -6,11 +6,11 @@ use crate::{ parsing::{ self, ast::expressions::StringLiteral, - parsers::{number::NumberLiteralError, self}, + parsers::{self, number::NumberLiteralError}, tokenizer::{Operation, OperationGroup}, Infoable, Infoed, Spanned, }, - project::{DependencyId, FunctionId, StructId, VariableId}, + project::{DependencyId, FunctionId, ProjectLink, StructId, StructLink, VariableId}, typing::{FloatWidth, IntegerWidth, TypeId}, }; @@ -31,10 +31,10 @@ pub enum VariableType { #[derive(Debug, PartialEq)] pub enum CallKind { - StructField(DependencyId, StructId, usize), + StructField(StructLink, usize), Variable(VariableType), Function { - dependency_id: DependencyId, + project_link: ProjectLink, f_or_s_id: Either, parameters: Box<[Infoed]>, }, @@ -43,7 +43,7 @@ pub enum CallKind { #[derive(Debug, PartialEq)] pub enum AssignableTarget { Var(TypeId, VariableType), - StructField(TypeId, DependencyId, StructId, usize), + StructField(TypeId, StructLink, usize), Unnassignable, } diff --git a/src/resolution/mod.rs b/src/resolution/mod.rs index 353fc3e..bec202d 100644 --- a/src/resolution/mod.rs +++ b/src/resolution/mod.rs @@ -8,7 +8,8 @@ use crate::parsing::ast::ParsedType; use crate::parsing::Spanned; use crate::project::scopes::ScopeId; use crate::project::{ - Dependencies, DependencyId, FileId, FunctionId, ResolvedUses, StructId, TypeRegistry, + FileId, FunctionId, ProjectLink, ResolvedUses, StructId, + TypeRegistry, Workspace, }; use crate::typing::{PrimitiveType, Type, TypeId}; @@ -17,9 +18,9 @@ pub mod name_resolution; pub mod type_resolution; pub struct FileScopedNameResolver<'a> { - pub dependencies: &'a Dependencies, + pub workspace: &'a Workspace, pub type_registery: Rc>, - pub dependency_id: DependencyId, + pub project_link: ProjectLink, pub scope_id: ScopeId, pub file_id: FileId, pub resolved_uses: &'a ResolvedUses, @@ -27,21 +28,18 @@ pub struct FileScopedNameResolver<'a> { } impl<'a> FileScopedNameResolver<'a> { pub fn new_with_scope( - deps: &'a Dependencies, + workspace: &'a Workspace, types: Rc>, - dependency_id: DependencyId, + project_link: ProjectLink, scope_id: ScopeId, rodeo: &'a Rodeo, ) -> FileScopedNameResolver<'a> { - let file_id = deps - .get_dependency_scopes(dependency_id) - .unwrap() + let file_id = workspace + .get_scopes(project_link) .scope_as_file(scope_id) .unwrap(); - let resolved_uses = deps - .get_dependency(dependency_id) - .unwrap() - .project + let resolved_uses = workspace + .get_project(project_link) .src .get_module_by_file(file_id) .unwrap() @@ -50,9 +48,9 @@ impl<'a> FileScopedNameResolver<'a> { .as_ref() .expect_right("should have been resolved"); Self { - dependencies: deps, + workspace, type_registery: types, - dependency_id, + project_link, scope_id, file_id, resolved_uses, @@ -61,21 +59,18 @@ impl<'a> FileScopedNameResolver<'a> { } pub fn new_with_file( - deps: &'a Dependencies, + workspace: &'a Workspace, types: Rc>, - dependency_id: DependencyId, + project_link: ProjectLink, file_id: FileId, rodeo: &'a Rodeo, ) -> FileScopedNameResolver<'a> { - let scope_id = deps - .get_dependency_scopes(dependency_id) - .unwrap() + let scope_id = workspace + .get_scopes(project_link) .scope_of_file(file_id) .unwrap(); - let resolved_uses = deps - .get_dependency(dependency_id) - .unwrap() - .project + let resolved_uses = workspace + .get_project(project_link) .src .get_module_by_file(file_id) .unwrap() @@ -84,9 +79,9 @@ impl<'a> FileScopedNameResolver<'a> { .as_ref() .expect_right("should have been resolved"); Self { - dependencies: deps, + workspace, type_registery: types, - dependency_id, + project_link, scope_id, file_id, resolved_uses, @@ -95,11 +90,7 @@ impl<'a> FileScopedNameResolver<'a> { } pub fn resolve_type(&self, parsed_type: &ParsedType) -> Result { - let dependency_id = self.dependency_id; - let scopes = self - .dependencies - .get_dependency_scopes(dependency_id) - .expect("Dependency should exist"); + let scopes = self.workspace.get_scopes(self.project_link); let scope = self.scope_id; let (name_for_search, span) = match parsed_type { @@ -120,21 +111,20 @@ impl<'a> FileScopedNameResolver<'a> { scopes .scope_as_declaration(scope_id) .and_then(|(_name, dec_id)| { - self.dependencies - .get_dependency(dependency_id)? - .project + self.workspace + .get_project(self.project_link) .pool .type_id_of_declaration(dec_id) }) }) .chain( self.resolved_uses - .find_struct_in_single(self.dependencies, name_for_search) + .find_struct_in_single(self.workspace, name_for_search) .map(|(.., type_id)| type_id) .chain(self.find_in_primitives(name_for_search)) .chain( self.resolved_uses - .find_struct_in_stars(self.dependencies, name_for_search) + .find_struct_in_stars(self.workspace, name_for_search) .map(|(.., type_id)| type_id), ), ) @@ -173,7 +163,7 @@ impl<'a> FileScopedNameResolver<'a> { fn resolve_struct( &'a self, identifier: Spur, - ) -> impl Iterator + 'a { + ) -> impl Iterator + 'a { self.resolve_struct_in_file(identifier) .chain(self.resolve_struct_in_uses(identifier)) } @@ -181,7 +171,7 @@ impl<'a> FileScopedNameResolver<'a> { fn resolve_func( &'a self, identifier: Spur, - ) -> impl Iterator + 'a { + ) -> impl Iterator + 'a { self.resolve_func_in_file(identifier) .chain(self.resolve_func_in_uses(identifier)) } @@ -189,11 +179,8 @@ impl<'a> FileScopedNameResolver<'a> { fn resolve_struct_in_file( &'a self, identifier: Spur, - ) -> impl Iterator + 'a { - let scopes = self - .dependencies - .get_dependency_scopes(self.dependency_id) - .expect("Dependency should exist"); + ) -> impl Iterator + 'a { + let scopes = self.workspace.get_scopes(self.project_link); scopes .scope_children_by_name(self.scope_id, identifier) .into_iter() @@ -202,12 +189,11 @@ impl<'a> FileScopedNameResolver<'a> { scopes .scope_as_declaration(scope_id) .and_then(|(_name, dec_id)| { - self.dependencies - .get_dependency(self.dependency_id)? - .project + self.workspace + .get_project(self.project_link) .pool .declaration_id_as_struct(dec_id) - .map(|strct_id| (self.dependency_id, strct_id)) + .map(|strct_id| (self.project_link, strct_id)) }) }) } @@ -215,13 +201,13 @@ impl<'a> FileScopedNameResolver<'a> { fn resolve_struct_in_uses( &'a self, identifier: Spur, - ) -> impl Iterator + 'a { + ) -> impl Iterator + 'a { self.resolved_uses .find(identifier) - .filter_map(|(dep, sp_id)| { - let project = &self.dependencies.get_dependency(dep)?.project; + .filter_map(|(project_link, sp_id)| { + let project = &self.workspace.get_project(project_link); Some(( - dep, + project_link, project .pool .declaration_id_as_struct(project.scopes.scope_as_declaration(sp_id)?.1)?, @@ -232,11 +218,8 @@ impl<'a> FileScopedNameResolver<'a> { fn resolve_func_in_file( &'a self, identifier: Spur, - ) -> impl Iterator + 'a { - let scopes = self - .dependencies - .get_dependency_scopes(self.dependency_id) - .expect("Dependency should exist"); + ) -> impl Iterator + 'a { + let scopes = self.workspace.get_scopes(self.project_link); scopes .scope_children_by_name(self.scope_id, identifier) .into_iter() @@ -245,12 +228,11 @@ impl<'a> FileScopedNameResolver<'a> { scopes .scope_as_declaration(scope_id) .and_then(|(_name, dec_id)| { - self.dependencies - .get_dependency(self.dependency_id)? - .project + self.workspace + .get_project(self.project_link) .pool .declaration_id_as_func(dec_id) - .map(|func_id| (self.dependency_id, func_id)) + .map(|func_id| (self.project_link, func_id)) }) }) } @@ -258,13 +240,13 @@ impl<'a> FileScopedNameResolver<'a> { fn resolve_func_in_uses( &'a self, identifier: Spur, - ) -> impl Iterator + 'a { + ) -> impl Iterator + 'a { self.resolved_uses .find(identifier) - .filter_map(|(dep, sp_id)| { - let project = &self.dependencies.get_dependency(dep)?.project; + .filter_map(|(project_link, sp_id)| { + let project = self.workspace.get_project(project_link); Some(( - dep, + project_link, project .pool .declaration_id_as_func(project.scopes.scope_as_declaration(sp_id)?.1)?, @@ -275,11 +257,8 @@ impl<'a> FileScopedNameResolver<'a> { fn resolve_callable( &'a self, identifier: Spur, - ) -> impl Iterator)> + 'a { - let scopes = self - .dependencies - .get_dependency_scopes(self.dependency_id) - .expect("Dependency should exist"); + ) -> impl Iterator)> + 'a { + let scopes = self.workspace.get_scopes(self.project_link); scopes .scope_children_by_name(self.scope_id, identifier) .into_iter() @@ -288,27 +267,23 @@ impl<'a> FileScopedNameResolver<'a> { scopes .scope_as_declaration(scope_id) .and_then(|(_name, dec_id)| { - let declaration_pool = &self - .dependencies - .get_dependency(self.dependency_id)? - .project - .pool; + let declaration_pool = &self.workspace.get_project(self.project_link).pool; declaration_pool .declaration_id_as_func(dec_id) - .map(|func_id| (self.dependency_id, Left(func_id))) + .map(|func_id| (self.project_link, Left(func_id))) .or_else(|| { declaration_pool .declaration_id_as_struct(dec_id) - .map(|strct_id| (self.dependency_id, Right(strct_id))) + .map(|strct_id| (self.project_link, Right(strct_id))) }) }) }) .chain( self.resolved_uses .find(identifier) - .filter_map(|(dep, sp_id)| { - let project = &self.dependencies.get_dependency(dep)?.project; - Some((dep, { + .filter_map(|(project_link, sp_id)| { + let project = &self.workspace.get_project(project_link); + Some((project_link, { let dec_id = project.scopes.scope_as_declaration(sp_id)?.1; project .pool diff --git a/src/resolution/name_resolution.rs b/src/resolution/name_resolution.rs index 67db709..31ee426 100644 --- a/src/resolution/name_resolution.rs +++ b/src/resolution/name_resolution.rs @@ -15,7 +15,7 @@ use crate::{ Spanned, }, project::{ - DependencyId, FileId, FunctionId, ModuleId, ResolvedUses, StructId, UseTarget, + FileId, FunctionId, ModuleId, ProjectLink, ResolvedUses, StructId, UseTarget, UseTargetSingle, UseTargetStar, VariableId, Workspace, }, typing::TypeId, @@ -26,15 +26,11 @@ use super::FileScopedNameResolver; pub fn resolve_uses( rodeo: &mut Rodeo, workspace: &mut Workspace, - dependency_id: DependencyId, + project_link: ProjectLink, ) -> HashMap> { let mut errors = HashMap::>::new(); - let project = &workspace - .dependencies - .get_dependency(dependency_id) - .unwrap() - .project; + let project = workspace.get_project(project_link); let mut resolutions = HashMap::::new(); for (module_id, module) in project.src.iter() { @@ -49,7 +45,7 @@ pub fn resolve_uses( .src(); for u in uses.iter() { - let dependency_id = match workspace.dependencies.get_dependency_by_name( + let project_link = match workspace.get_project_by_name( &u.scope .iter() .map(|s| { @@ -67,10 +63,7 @@ pub fn resolve_uses( } }; - let scopes = &workspace - .dependencies - .get_dependency_scopes(dependency_id) - .unwrap(); + let scopes = workspace.get_scopes(project_link); let root = scopes.root_id(); for flat in u.flatten_tree() { @@ -89,7 +82,7 @@ pub fn resolve_uses( ) { Ok(scope_id) => { resolved.add( - dependency_id, + project_link, if star { UseTarget::UseTargetStar(UseTargetStar { scope: scope_id, @@ -125,13 +118,9 @@ pub fn resolve_uses( } resolutions.insert(module_id, resolved); } - let project = &mut workspace - .dependencies - .get_dependency_mut(dependency_id) - .unwrap() - .project; + let project_mut = workspace.get_project_mut(project_link); for (module_id, resolved_uses) in resolutions.into_iter() { - project + project_mut .src .get_module_by_module_mut(module_id) .unwrap() @@ -160,15 +149,15 @@ pub struct ResolvedStructOutline { pub fn resolve_workspace_outlines( rodeo: &mut Rodeo, workspace: &mut Workspace, - dependency_id: DependencyId, + project_link: ProjectLink, ) -> HashMap> { - let import_errs = resolve_uses(rodeo, workspace, dependency_id); + let import_errs = resolve_uses(rodeo, workspace, project_link); if !import_errs.is_empty() { return import_errs; } - let func_errs = resolve_function_outline(rodeo, workspace, dependency_id); - let var_errs = resolve_variable_outline(rodeo, workspace, dependency_id); - let struct_errs = resolve_struct_outline(rodeo, workspace, dependency_id); + let func_errs = resolve_function_outline(rodeo, workspace, project_link); + let var_errs = resolve_variable_outline(rodeo, workspace, project_link); + let struct_errs = resolve_struct_outline(rodeo, workspace, project_link); let mut errs = HashMap::new(); for (k, v) in func_errs.into_iter().chain(var_errs).chain(struct_errs) { v.into_iter() @@ -180,20 +169,16 @@ pub fn resolve_workspace_outlines( pub fn resolve_function_outline( rodeo: &Rodeo, workspace: &mut Workspace, - dependency_id: DependencyId, + project_link: ProjectLink, ) -> HashMap> { let workspace_read: &Workspace = workspace; - let project = &workspace_read - .dependencies - .get_dependency(dependency_id) - .unwrap() - .project; + let project = workspace_read.get_project(project_link); let mut errors = HashMap::>::new(); let mut to_update = HashMap::::new(); for (func_id, func) in project.pool.functions.iter() { - let name_resolver = workspace_read.resolver_by_file(rodeo, dependency_id, func.file_id); + let name_resolver = workspace_read.resolver_by_file(rodeo, project_link, func.file_id); let Function { parameters, ty, .. } = &func.decl.ast; let parameters: Box<[Result]> = resolve_multiple(parameters.iter().map(|param| ¶m.ty), &name_resolver); @@ -220,11 +205,7 @@ pub fn resolve_function_outline( to_update.insert(func_id, ResolvedFunctionOutline { parameters, ret_ty }); } - let project_mut = &mut workspace - .dependencies - .get_dependency_mut(dependency_id) - .unwrap() - .project; + let project_mut = workspace.get_project_mut(project_link); for (func_id, outline) in to_update.into_iter() { if let Some(func_info) = project_mut.pool.functions.get_mut(func_id) { func_info.decl.outline = Some(outline); @@ -236,21 +217,17 @@ pub fn resolve_function_outline( pub fn resolve_variable_outline( rodeo: &Rodeo, workspace: &mut Workspace, - dependency_id: DependencyId, + project_link: ProjectLink, ) -> HashMap> { let workspace_read: &Workspace = workspace; - let project = &workspace_read - .dependencies - .get_dependency(dependency_id) - .unwrap() - .project; + let project = workspace_read.get_project(project_link); let mut errors = HashMap::>::new(); let mut to_update = HashMap::::new(); for (var_id, var) in project.pool.variables.iter() { - let name_resolver = workspace_read.resolver_by_file(rodeo, dependency_id, var.file_id); + let name_resolver = workspace_read.resolver_by_file(rodeo, project_link, var.file_id); let Variable { ty, .. } = &var.decl.ast; let ty = ty.as_ref().map(|ty| resolve_singular(ty, &name_resolver)); if let Some(e) = ty.and_then(|r| r.err().to_owned()) { @@ -270,11 +247,7 @@ pub fn resolve_variable_outline( } to_update.insert(var_id, ResolvedVariableOutline { ty }); } - let project_mut = &mut workspace - .dependencies - .get_dependency_mut(dependency_id) - .unwrap() - .project; + let project_mut = workspace.get_project_mut(project_link); for (var_id, outline) in to_update.into_iter() { if let Some(func_info) = project_mut.pool.variables.get_mut(var_id) { func_info.decl.outline = Some(outline); @@ -286,19 +259,15 @@ pub fn resolve_variable_outline( pub fn resolve_struct_outline( rodeo: &Rodeo, workspace: &mut Workspace, - dependency_id: DependencyId, + project_link: ProjectLink, ) -> HashMap> { - let project = &workspace - .dependencies - .get_dependency(dependency_id) - .unwrap() - .project; + let project = workspace.get_project(project_link); let workspace_read: &Workspace = workspace; let mut errors = HashMap::>::new(); let mut to_update = HashMap::::new(); for (struct_id, strct) in project.pool.structs.iter() { - let name_resolver = workspace_read.resolver_by_file(rodeo, dependency_id, strct.file_id); + let name_resolver = workspace_read.resolver_by_file(rodeo, project_link, strct.file_id); let (Struct { fields, .. }, _) = &strct.decl.ast; let fields = resolve_multiple(fields.iter().map(|field| &field.ty), &name_resolver); for e in fields.iter().filter_map(|r| r.err()) { @@ -318,11 +287,7 @@ pub fn resolve_struct_outline( } to_update.insert(struct_id, ResolvedStructOutline { fields }); } - let project_mut = &mut workspace - .dependencies - .get_dependency_mut(dependency_id) - .unwrap() - .project; + let project_mut = workspace.get_project_mut(project_link); for (struct_id, outline) in to_update.into_iter() { if let Some(func_info) = project_mut.pool.structs.get_mut(struct_id) { func_info.decl.outline = Some(outline); diff --git a/src/resolution/type_resolution.rs b/src/resolution/type_resolution.rs index 8347dc4..0d379c6 100644 --- a/src/resolution/type_resolution.rs +++ b/src/resolution/type_resolution.rs @@ -22,8 +22,8 @@ use crate::{ Infoed, Spanned, }, project::{ - DeclarationInfo, DeclarationResolutionStage, DependencyId, FileId, FunctionId, StructId, - Workspace, + DeclarationInfo, DeclarationResolutionStage, DependencyId, FileId, FunctionId, ProjectLink, + StructId, StructLink, Workspace, }, resolution::fir::AssignableTarget, typing::{self, typedast::Variable, FloatWidth, IntegerWidth, PrimitiveType, Type, TypeId}, @@ -38,21 +38,18 @@ use super::{ pub fn resolve_and_typecheck_functions( rodeo: &Rodeo, workspace: &mut Workspace, - dependency_id: DependencyId, + project_link: ProjectLink, ) -> HashMap>> { let workspace_read: &Workspace = workspace; let mut errors = HashMap::new(); for (func_id, func_info) in workspace_read - .dependencies - .get_dependency(dependency_id) - .unwrap() - .project + .get_project(project_link) .pool .functions .iter() { let (func, errs) = resolve_function( - workspace_read.resolver_by_file(rodeo, dependency_id, func_info.file_id), + workspace_read.resolver_by_file(rodeo, project_link, func_info.file_id), func_id, func_info, ); @@ -84,7 +81,7 @@ fn resolve_function( pub enum TypeResError { FunctionNotFound(Spanned, Vec>), VariableNotFound(Spanned, Option), - FieldNotFound(Spanned<(DependencyId, StructId)>, Spanned), + FieldNotFound(Spanned, Spanned), TypesAreNotMatching(TypesAreNotMatchingContext, Spanned, Spanned), SignNotMatching( Spanned<(bool, IntegerWidth)>, @@ -283,7 +280,7 @@ impl<'a> ResolutionEnv<'a> { let mut this = base.info; let mut the_calls: Vec> = vec![]; for call in calls.iter() { - let Some((dep, struct_id)) = self.resolver.type_registery.borrow().get_as_struct(this) + let Some(struct_link) = self.resolver.type_registery.borrow().get_as_struct(this) else { let last_span = the_calls .last() @@ -311,11 +308,11 @@ impl<'a> ResolutionEnv<'a> { let Spanned(CallKind::Identifier(Spanned(name, _)), span) = call else { todo!("Expression::CallChain/methods") }; - let Some(fid) = self.find_field_in_struct(dep, struct_id, *name) else { + let Some(fid) = self.find_field_in_struct(struct_link, *name) else { self.add_error( TypeResError::FieldNotFound( Spanned( - (dep, struct_id), + struct_link, the_calls .last() .map(|i| i.span) @@ -340,25 +337,21 @@ impl<'a> ResolutionEnv<'a> { }, ); }; + let StructLink { + struct_id, + project_link, + } = struct_link; this = self.resolver - .dependencies - .get_dependency(dep) - .and_then(|dep| { - Some( - dep.project + .workspace.get_project(project_link) .pool .structs - .get(struct_id)? - .decl - .outline - .as_ref()? - .fields - .get(fid)? - .unwrap_or_else(|t| t), - ) - }).expect("should have been resolved and the field id of both ast and outline should match"); + .get(struct_id) + .and_then(|s| s.decl.outline.as_ref()) + .and_then(|d|d.fields.get(fid)) + .expect("should have been resolved and the field id of both ast and outline should match") + .unwrap_or_else(|t| t); the_calls.push(Infoed { - inner: fir::CallKind::StructField(dep, struct_id, fid), + inner: fir::CallKind::StructField(struct_link, fid), info: this, span: *span, }); @@ -375,17 +368,14 @@ impl<'a> ResolutionEnv<'a> { ) } - fn find_field_in_struct( - &mut self, - dep: DependencyId, - struct_id: StructId, - name: Spur, - ) -> Option { + fn find_field_in_struct(&mut self, struct_link: StructLink, name: Spur) -> Option { + let StructLink { + struct_id, + project_link, + } = struct_link; self.resolver - .dependencies - .get_dependency(dep) - .unwrap() - .project + .workspace + .get_project(project_link) .pool .structs .get(struct_id) @@ -440,7 +430,7 @@ impl<'a> ResolutionEnv<'a> { .map(|Spanned(expr, span)| self.resolve_expression(None, expr, *span)) .collect_vec() .into_boxed_slice(); - let Some((dep, f_or_s_id, ret_ty)) = self + let Some((project_link, f_or_s_id, ret_ty)) = self .find_callable( identifier.0, ¶meters.iter().map(|i| i.info).collect_vec(), @@ -479,7 +469,7 @@ impl<'a> ResolutionEnv<'a> { }), fir::Expression::Call(Spanned( fir::CallKind::Function { - dependency_id: dep, + project_link, f_or_s_id, parameters, }, @@ -734,7 +724,7 @@ impl<'a> ResolutionEnv<'a> { parameters: &'b [TypeId], ) -> impl Iterator< Item = ( - DependencyId, + ProjectLink, Either, Option>, ), @@ -742,7 +732,7 @@ impl<'a> ResolutionEnv<'a> { let iter = self.resolver .resolve_callable(identifier) - .filter_map(move |(dep, f_or_s_id)| { + .filter_map(move |(project_link, f_or_s_id)| { let (resolved_parameters, ret_ty) = match f_or_s_id { Either::Left(f_id) => { let DeclarationInfo { @@ -750,9 +740,7 @@ impl<'a> ResolutionEnv<'a> { file_id: _, } = self .resolver - .dependencies - .get_dependency(dep)? - .project + .workspace.get_project(project_link) .pool .functions .get(f_id)?; @@ -767,7 +755,7 @@ impl<'a> ResolutionEnv<'a> { } Either::Right(s_id) => { let declaration_pool = - &self.resolver.dependencies.get_dependency(dep)?.project.pool; + &self.resolver.workspace.get_project(project_link).pool; let DeclarationInfo { decl: DeclarationResolutionStage { outline, .. }, file_id: _, @@ -815,7 +803,7 @@ impl<'a> ResolutionEnv<'a> { { return None; } - Some((dep, f_or_s_id, ret_ty)) + Some((project_link, f_or_s_id, ret_ty)) }); if parameters.iter().any(|type_id| { matches!( @@ -937,6 +925,11 @@ impl<'a> ResolutionEnv<'a> { (Some(PrimitiveType::Float(w1)), Some(PrimitiveType::Float(w2))), ) => self.resolve_primitive(PrimitiveType::Float(w1.max(w2))), (Logic, _, (Some(PrimitiveType::Boolean), Some(PrimitiveType::Boolean))) => lhs.info, + ( + Bitops, + _, + (Some(PrimitiveType::Integer(s1, w1)), Some(PrimitiveType::Integer(s2, w2))), + ) => todo!("bitops"), (_, _, (Some(lhs), Some(rhs))) => todo!( "resolve_binary/other ops: {}, {}, PrimitiveType::{} and PrimitiveType::{}", group, @@ -1012,7 +1005,7 @@ impl<'a> ResolutionEnv<'a> { }); let Spanned(expr, expr_span) = &var.expression; let expr = self.resolve_expression(try_to_be.map(|t| t.0), expr, *expr_span); - // TODO: typecheck + // TODO: typecheck variable expression let ty = try_to_be .map(|t| { @@ -1069,8 +1062,8 @@ impl<'a> ResolutionEnv<'a> { ( *last_ty, match last_kind { - fir::CallKind::StructField(dep, struct_id, field_id) => { - AssignableTarget::StructField(*last_ty, *dep, *struct_id, *field_id) + fir::CallKind::StructField(struct_link, field_id) => { + AssignableTarget::StructField(*last_ty, *struct_link, *field_id) } fir::CallKind::Variable(var_type) => { AssignableTarget::Var(*last_ty, var_type.to_owned()) diff --git a/src/typing/mod.rs b/src/typing/mod.rs index 5e01457..3a2380e 100644 --- a/src/typing/mod.rs +++ b/src/typing/mod.rs @@ -8,8 +8,8 @@ use slotmap::new_key_type; use strum_macros::Display; use crate::{ - parsing::{Spanned, parsers::number::LiteralWidth}, - project::{DependencyId, FileId, StructId}, + parsing::{parsers::number::LiteralWidth, Spanned}, + project::{FileId, StructLink}, source::DeclarationPath, }; @@ -27,7 +27,7 @@ pub enum OperationResult { #[derive(Debug, PartialEq, Clone, Eq , Hash )] pub enum Type { PrimitiveType(PrimitiveType), - Data(DependencyId, StructId), + Data(StructLink), Array { ty: TypeId, size: Option,