diff --git a/Cargo.lock b/Cargo.lock index a30b1ffa..30794b1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,12 +187,34 @@ dependencies = [ "libloading 0.7.4", ] +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -600,6 +622,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "dasp_sample" version = "0.11.0" @@ -612,6 +647,17 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "dlib" version = "0.5.2" @@ -700,6 +746,92 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "gethostname" version = "1.1.0" @@ -864,6 +996,114 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "indexmap" version = "2.13.0" @@ -1003,6 +1243,12 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + [[package]] name = "lock_api" version = "0.4.14" @@ -1018,6 +1264,19 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "lsp-types" +version = "0.94.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66bfd44a06ae10647fe3f8214762e9369fd4248df1350924b4ef9e770a85ea1" +dependencies = [ + "bitflags 1.3.2", + "serde", + "serde_json", + "serde_repr", + "url", +] + [[package]] name = "mach2" version = "0.4.3" @@ -1072,6 +1331,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + [[package]] name = "naga" version = "0.19.2" @@ -1808,6 +2078,12 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pixels" version = "0.15.0" @@ -1863,6 +2139,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "presser" version = "0.3.1" @@ -1903,6 +2188,14 @@ dependencies = [ "prometeu-runtime-desktop", ] +[[package]] +name = "prometeu-analysis" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "prometeu-bytecode" version = "0.1.0" @@ -1938,6 +2231,16 @@ dependencies = [ "serde_json", ] +[[package]] +name = "prometeu-lsp" +version = "0.1.0" +dependencies = [ + "prometeu-analysis", + "tokio", + "tokio-util", + "tower-lsp", +] + [[package]] name = "prometeu-runtime-desktop" version = "0.1.0" @@ -2202,12 +2505,33 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + [[package]] name = "siphasher" version = "1.0.1" @@ -2275,6 +2599,16 @@ dependencies = [ "serde", ] +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" @@ -2284,6 +2618,12 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "static_assertions" version = "1.1.0" @@ -2324,6 +2664,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "tempfile" version = "3.24.0" @@ -2422,6 +2773,57 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" @@ -2452,6 +2854,66 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-lsp" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ba052b54a6627628d9b3c34c176e7eda8359b7da9acd497b9f20998d118508" +dependencies = [ + "async-trait", + "auto_impl", + "bytes", + "dashmap", + "futures", + "httparse", + "lsp-types", + "memchr", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tower", + "tower-lsp-macros", + "tracing", +] + +[[package]] +name = "tower-lsp-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.44" @@ -2459,14 +2921,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "tracing-core" version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] [[package]] name = "ttf-parser" @@ -2525,6 +3002,25 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -2547,6 +3043,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" @@ -2977,6 +3479,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -3010,13 +3521,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -3029,6 +3557,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -3041,6 +3575,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -3053,12 +3593,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -3071,6 +3623,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -3083,6 +3641,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -3095,6 +3659,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -3107,6 +3677,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winit" version = "0.30.12" @@ -3174,6 +3750,12 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + [[package]] name = "x11-dl" version = "2.21.0" @@ -3237,6 +3819,29 @@ version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.8.33" @@ -3257,6 +3862,60 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "zmij" version = "1.0.14" diff --git a/Cargo.toml b/Cargo.toml index d282406c..b7ad9103 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,8 @@ members = [ "crates/prometeu", "crates/prometeu-bytecode", "crates/prometeu-compiler", + "crates/prometeu-analysis", + "crates/prometeu-lsp", ] resolver = "2" diff --git a/crates/prometeu-analysis/Cargo.toml b/crates/prometeu-analysis/Cargo.toml new file mode 100644 index 00000000..95c1de81 --- /dev/null +++ b/crates/prometeu-analysis/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "prometeu-analysis" +version = "0.1.0" +edition = "2021" +license = "MIT" + +[lib] +name = "prometeu_analysis" +path = "src/lib.rs" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/crates/prometeu-analysis/src/lib.rs b/crates/prometeu-analysis/src/lib.rs new file mode 100644 index 00000000..76bcdaad --- /dev/null +++ b/crates/prometeu-analysis/src/lib.rs @@ -0,0 +1,29 @@ +//! Tipos e utilitários de análise usados pelo servidor LSP e pelo pipeline. +//! +//! Este crate expõe o `FileDB`, repositório de textos do projeto. +//! Ele será expandido nos próximos PRs para suportar snapshots e índices. +//! +//! Exemplo básico: +//! ``` +//! use prometeu_analysis::FileDB; +//! let db = FileDB::default(); +//! assert_eq!(db.len_files(), 0); +//! ``` +use serde::{Deserialize, Serialize}; + +/// Banco de arquivos do projeto. +/// +/// Responsável por armazenar textos, URIs/paths e permitir criação de snapshots. +/// Implementação mínima no PR-00; funcionalidades serão adicionadas nos PRs seguintes. +#[derive(Default, Debug, Clone, Serialize, Deserialize)] +pub struct FileDB { + // TODO(PR-03+): armazenar textos, URIs/paths, índices de linha e snapshots + #[serde(skip)] + _placeholder: (), +} + +impl FileDB { + /// Retorna a quantidade de arquivos conhecidos. + /// Implementação temporária para manter a API estável. + pub fn len_files(&self) -> usize { 0 } +} diff --git a/crates/prometeu-lsp/Cargo.toml b/crates/prometeu-lsp/Cargo.toml new file mode 100644 index 00000000..b23d112b --- /dev/null +++ b/crates/prometeu-lsp/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "prometeu-lsp" +version = "0.1.0" +edition = "2021" +license = "MIT" + +[dependencies] +tower-lsp = "0.20" +tokio = { version = "1", features = ["full"] } +tokio-util = { version = "0.7" } +prometeu-analysis = { path = "../prometeu-analysis" } diff --git a/crates/prometeu-lsp/src/analysis_db.rs b/crates/prometeu-lsp/src/analysis_db.rs new file mode 100644 index 00000000..2590c10c --- /dev/null +++ b/crates/prometeu-lsp/src/analysis_db.rs @@ -0,0 +1,24 @@ +use std::sync::Arc; +use tokio::sync::RwLock; +use tokio_util::sync::CancellationToken; + +use prometeu_analysis::FileDB; + +#[derive(Default)] +pub struct AnalysisDb { + pub file_db: FileDB, + + // Os campos abaixo serão conectados conforme PR-03/04/05 (podem começar como None) + // pub ast: Option, + // pub symbols: Option, + // pub types: Option, + // pub diagnostics: Vec, + + /// Incrementa a cada rebuild concluído com sucesso + pub revision: u64, + + /// Cancel token do último rebuild em progresso (se houver) + pub active_rebuild: Option, +} + +pub type SharedDb = Arc>; diff --git a/crates/prometeu-lsp/src/main.rs b/crates/prometeu-lsp/src/main.rs new file mode 100644 index 00000000..49dab266 --- /dev/null +++ b/crates/prometeu-lsp/src/main.rs @@ -0,0 +1,77 @@ +use std::sync::Arc; +use tokio::sync::RwLock; +use tower_lsp::{LspService, Server}; + +mod analysis_db; +mod rebuild; + +use analysis_db::SharedDb; + +struct Backend { + db: SharedDb, +} + +#[tower_lsp::async_trait] +impl tower_lsp::LanguageServer for Backend { + async fn initialize( + &self, + _: tower_lsp::lsp_types::InitializeParams, + ) -> tower_lsp::jsonrpc::Result { + Ok(tower_lsp::lsp_types::InitializeResult { + capabilities: tower_lsp::lsp_types::ServerCapabilities { + text_document_sync: Some( + tower_lsp::lsp_types::TextDocumentSyncCapability::Kind( + tower_lsp::lsp_types::TextDocumentSyncKind::FULL, + ), + ), + // Declaramos capacidades desde já para evitar churn posterior. + definition_provider: Some(tower_lsp::lsp_types::OneOf::Left(true)), + document_symbol_provider: Some(tower_lsp::lsp_types::OneOf::Left(true)), + workspace_symbol_provider: Some(tower_lsp::lsp_types::OneOf::Left(true)), + hover_provider: Some(true.into()), + references_provider: Some(tower_lsp::lsp_types::OneOf::Left(true)), + rename_provider: Some(tower_lsp::lsp_types::OneOf::Left(true)), + completion_provider: Some(tower_lsp::lsp_types::CompletionOptions { + resolve_provider: Some(false), + trigger_characters: Some(vec![".".into(), ":".into()]), + ..Default::default() + }), + semantic_tokens_provider: Some( + tower_lsp::lsp_types::SemanticTokensServerCapabilities::SemanticTokensOptions( + tower_lsp::lsp_types::SemanticTokensOptions { + legend: tower_lsp::lsp_types::SemanticTokensLegend { + // preenchido no PR-12 + token_types: vec![], + token_modifiers: vec![], + }, + full: Some( + tower_lsp::lsp_types::SemanticTokensFullOptions::Bool(true), + ), + range: None, + ..Default::default() + }, + ), + ), + ..Default::default() + }, + ..Default::default() + }) + } + + async fn initialized(&self, _: tower_lsp::lsp_types::InitializedParams) {} + + async fn shutdown(&self) -> tower_lsp::jsonrpc::Result<()> { + Ok(()) + } +} + +#[tokio::main] +async fn main() { + let stdin = tokio::io::stdin(); + let stdout = tokio::io::stdout(); + + let db: SharedDb = Arc::new(RwLock::new(analysis_db::AnalysisDb::default())); + + let (service, socket) = LspService::new(|_client| Backend { db: db.clone() }); + Server::new(stdin, stdout, socket).serve(service).await; +} diff --git a/crates/prometeu-lsp/src/rebuild.rs b/crates/prometeu-lsp/src/rebuild.rs new file mode 100644 index 00000000..6077d2d3 --- /dev/null +++ b/crates/prometeu-lsp/src/rebuild.rs @@ -0,0 +1,48 @@ +use tokio_util::sync::CancellationToken; + +use crate::analysis_db::SharedDb; + +/// Solicita rebuild do projeto (coarse). Cancela rebuild anterior se em progresso. +/// Implementação inicial: apenas cria task e retorna. +pub async fn request_rebuild(db: SharedDb) { + // 1) lock curto: cancelar token anterior e instalar token novo + let new_token = CancellationToken::new(); + { + let mut guard = db.write().await; + if let Some(prev) = guard.active_rebuild.take() { + prev.cancel(); + } + guard.active_rebuild = Some(new_token.clone()); + } + + // 2) spawn task: roda análise fora do lock + tokio::spawn(async move { + // Ponto seguro: checar antes de começar + if new_token.is_cancelled() { return; } + + // TODO(PR-03/04/05): + // - Clonar snapshot de FileDB + // - Parsing + // - Binding/Resolver + // - Typecheck + // - Coleta de diagnostics + + // Ponto seguro: após parsing + if new_token.is_cancelled() { return; } + // Ponto seguro: após resolver + if new_token.is_cancelled() { return; } + // Ponto seguro: após typecheck + if new_token.is_cancelled() { return; } + + // 3) lock curto: se token não cancelado, swap estado + revision++ + if !new_token.is_cancelled() { + let mut guard = db.write().await; + // TODO: checar se o token ainda é o ativo quando tivermos um identificador estável + if !new_token.is_cancelled() { + // TODO: aplicar resultados reais de análise quando disponíveis + guard.revision = guard.revision.saturating_add(1); + // Nota: não limpamos `active_rebuild` aqui para evitar interferir num rebuild mais novo + } + } + }); +} diff --git a/docs/specs/pbs/files/PRs para Junie.md b/docs/specs/pbs/files/PRs para Junie.md index df068187..03d71545 100644 --- a/docs/specs/pbs/files/PRs para Junie.md +++ b/docs/specs/pbs/files/PRs para Junie.md @@ -1,5 +1,25 @@ # Prometeu — PR Plan (Arena-Driven) para um LSP Completo +--- + +# **PR-00.X — Reorganização estrutural do workspace (pré–Arena / pré–LSP)** + +> **Objetivo macro:** separar *modelo/ABI*, *execução*, *kernel* e *tooling* antes de qualquer refator arena-driven. +> +> **Regra de ouro:** nenhuma mudança de comportamento. Apenas **movimentação de código + ajuste de dependências**. +> +> **Modelo final alvo:** +> +> * `prometeu-bytecode` ✅ (fica) +> * `prometeu-abi` ✅ (novo — ex-`prometeu-core` sem execução) +> * `prometeu-vm` ✅ (novo) +> * `prometeu-kernel` ✅ (novo) +> * `prometeu-runtime-desktop` ✅ (fica) +> * `prometeu-compiler` ✅ (fica) +> * `prometeu` (CLI) ✅ (fica agregando) + +--- + > **Meta do Nilton / Junie workflow**: PRs extremamente prescritivos. A Junie só implementa; você revisa o design **antes** do código. > > **Regra de ouro:** cada PR abaixo vem com: @@ -25,6 +45,35 @@ Workspace (Archive.zip) tem crates: --- +## Visão de arquitetura alvo + +### Camadas + +1. **FileDB**: texto, URI/path, line-index, snapshots. +2. **Lexer/Parser**: produz **AstArena** (NodeId + spans por nó). +3. **Binder/Resolver**: produz **SymbolArena** + índices (def/ref). +4. **Typecheck**: produz **TypeArena** + facts (node→type, symbol→type). +5. **Analysis Export**: `analysis.json` (full) + `symbols.json` (leve e estável). +6. **LSP Server**: consome `AnalysisDb` e responde requests. + +### IDs padronizados (newtypes) + +* `FileId(u32)` +* `NodeId(u32)` +* `NameId(u32)` (interner) +* `SymbolId(u32)` +* `TypeId(u32)` +* `ProjectId(u32)` +* `ModuleId(u32)` + +### Invariantes + +* AST é **imutável** após construção (normativo na spec PBS). +* Nenhuma fase expõe referências diretas entre nós; apenas **IDs**. +* IDs externos são aceitos, mas sempre passam por **validate/resolve** (API checked). + +--- + # Templates prescritivos para PR (usar em TODAS) ## Template de descrição (copiar/colar) @@ -37,6 +86,17 @@ Workspace (Archive.zip) tem crates: * **Riscos & rollback:** * **Checklist de aceite (binário):** +## Regras para Junie (para reduzir vai-e-volta) + +1. Não “inventar design”. Se algo não estiver especificado, **criar TODO** e parar. +2. Não mudar formatação/estilo fora do escopo. +3. Todo novo tipo público precisa de doc-comment curta e exemplo. +4. Toda mudança de JSON precisa: + + * `schema_version` bump (se não for backward) + * teste de snapshot +5. Cada PR deve deixar `cargo test` verde. + --- # PRs (detalhados) @@ -320,6 +380,167 @@ pub struct AnalysisDb { --- + +# Série PR-00.X — Reestruturação de crates (Arena-Driven + LSP-ready) + +> **Objetivo da série PR-00.X:** reorganizar o workspace em crates com fronteiras claras, **sem alterar comportamento**, preparando o terreno para o Prometeu Arena-Driven (compiler/analysis) e um LSP completo depois. +> +> **Novo layout alvo (travado):** +> +> * `prometeu-bytecode` (fica) +> * `prometeu-abi` (novo nome para o atual `prometeu-core` depurado) = **types + model + protocols** (sem execução) +> * `prometeu-vm` (novo) = execução da VM +> * `prometeu-kernel` (novo) = OS + FS + syscalls (implementa interface para a VM) +> * `prometeu-runtime-desktop` (fica) = host desktop +> * `prometeu-compiler` (fica) +> * `prometeu` (CLI) (fica) +> +> **Regra de ouro:** 1 PR = 1 fronteira. Nada de mover tudo de uma vez. +> +> **Regras para Junie (serie 00.X):** +> +> 1. **Não mudar lógica**; apenas mover, ajustar imports, e deixar testes verdes. +> 2. Se algo exigir mudança de API pública, criar `TODO(PR-00.Y)` e parar. +> 3. Sempre manter o workspace compilável a cada PR. + +--- + +## PR-00.1 — Introduzir `prometeu-abi` (renomear/diluir `prometeu-core`) + +**Branch:** `pr-00-1-prometeu-abi` + +### Objetivo + +Criar crate `prometeu-abi` contendo **somente tipos e contratos** (types+model+protocols), e manter `prometeu-core` temporariamente como facade/reexport para não quebrar consumidores. + +### Passos prescritivos + +1. Criar novo crate `crates/prometeu-abi/` com `src/lib.rs`. +2. Copiar para `prometeu-abi` (sem execução): + + * `model/*` + * `debugger_protocol.rs` + * `telemetry.rs` + * `log.rs` (somente tipos/config; se tiver runtime logger, deixar no core por enquanto) + * **traits/contratos** usados por outros crates (ex.: IDs, enums de eventos) +3. Atualizar dependências dos crates consumidores para apontar para `prometeu-abi` onde aplicável. +4. Manter `prometeu-core` compilando com: + + * `pub use prometeu_abi as abi;` + * reexports temporários de tipos que mudaram de path. + +### Critérios de aceite + +* Workspace compila. +* Nenhum comportamento muda. +* `prometeu-core` ainda existe (temporário). + +--- + +## PR-00.2 — Extrair `prometeu-vm` do `prometeu-core` + +**Branch:** `pr-00-2-prometeu-vm` + +### Objetivo + +Mover `virtual_machine/*` para `crates/prometeu-vm/`. + +### Passos prescritivos + +1. Criar crate `crates/prometeu-vm/`. +2. Mover `crates/prometeu-core/src/virtual_machine/**` → `crates/prometeu-vm/src/**`. +3. Ajustar `use` paths em todos os crates. +4. Adicionar shim temporário no `prometeu-core` (se ainda existir): + + * `pub mod virtual_machine { pub use prometeu_vm::*; }` + +### Critérios de aceite + +* `cargo test` verde. +* runtime desktop ainda roda. + +--- + +## PR-00.3 — Extrair `prometeu-kernel` (OS + FS + syscalls) + +**Branch:** `pr-00-3-prometeu-kernel` + +### Objetivo + +Mover `prometeu_os/*` + `fs/*` (e qualquer dispatcher de syscalls) para `crates/prometeu-kernel/`. + +### Passos prescritivos + +1. Criar crate `crates/prometeu-kernel/`. +2. Mover: + + * `crates/prometeu-core/src/prometeu_os/**` → `crates/prometeu-kernel/src/**` + * `crates/prometeu-core/src/fs/**` → `crates/prometeu-kernel/src/fs/**` +3. Garantir que o kernel **depende** de: + + * `prometeu-abi` + * `prometeu-vm` +4. Garantir que a VM chama syscalls via interface implementada pelo kernel. +5. Manter shim temporário no `prometeu-core` (se existir): `pub mod prometeu_os { pub use prometeu_kernel::*; }` + +### Critérios de aceite + +* `cargo test` verde. +* Sem mudança comportamental (mesmo conjunto de syscalls e traps). + +--- + +## PR-00.4 — Depurar `prometeu-core`: remover execução e virar apenas compat layer + +**Branch:** `pr-00-4-deprecate-prometeu-core` + +### Objetivo + +Eliminar o conteúdo executável restante do `prometeu-core`, deixando-o como reexport/compat por um curto período. + +### Passos + +* `hardware` e `firmware/hub` ficam onde estiverem por enquanto (podem virar PR-00.5/00.6 se necessário) +* `prometeu-core` passa a reexportar: + + * `prometeu-abi` + * `prometeu-vm` + * `prometeu-kernel` + +### Critérios + +* Zero imports internos `crate::virtual_machine` etc. fora da facade. + +--- + +## PR-00.5 — (Opcional) Extrair `prometeu-firmware` (hub/boot) + +**Branch:** `pr-00-5-prometeu-firmware` + +### Objetivo + +Mover `firmware/*` + `prometeu_hub/*` para `crates/prometeu-firmware/`. + +### Critérios + +* runtime desktop depende de `prometeu-firmware`. + +--- + +## PR-00.6 — Remover `prometeu-core` e migrar consumidores + +**Branch:** `pr-00-6-remove-prometeu-core` + +### Objetivo + +Apagar `prometeu-core` após migração total. + +### Critérios + +* Nenhum crate depende de `prometeu-core`. + +--- + ## PR-01 — FileDB + LineIndex (base do LSP e spans) **Branch:** `pr-01-filedb` @@ -775,15 +996,16 @@ Baseado em RefIndex e NodeToSymbol. --- -# Ordem recomendada (para minimizar refator churn) -1. PR-00, PR-01 -2. PR-02 -3. PR-03 -4. PR-04 -5. PR-06 -6. PR-05 -7. PR-07 -8. PR-08 → PR-12 -9. PR-14 -10. PR-15 +--- + +# Sequência recomendada (travada) + +1. PR-00.1 (`prometeu-abi` + compat) +2. PR-00.2 (`prometeu-vm`) +3. PR-00.3 (`prometeu-kernel`) +4. PR-00.4 (depurar `prometeu-core`) +5. PR-00.5 (opcional firmware) +6. PR-00.6 (remover core) + +> Após PR-00.X, iniciar a trilha Arena-Driven (PR-01..PR-07) no compiler/analysis.