diff --git a/Cargo.lock b/Cargo.lock index 516e1b9..e278dcc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,6 +256,25 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + [[package]] name = "dashmap" version = "5.5.3" @@ -269,6 +288,36 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "deranged" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "divan" version = "0.1.4" @@ -410,6 +459,17 @@ dependencies = [ "slab", ] +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gimli" version = "0.28.1" @@ -431,8 +491,8 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata", + "regex-syntax", ] [[package]] @@ -559,6 +619,17 @@ dependencies = [ "libc", ] +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -600,15 +671,6 @@ dependencies = [ "url", ] -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "memchr" version = "2.6.4" @@ -698,6 +760,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ouroboros" version = "0.18.0" @@ -795,6 +863,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "prettyplease" version = "0.2.15" @@ -857,24 +931,14 @@ dependencies = [ ] [[package]] -name = "regex" -version = "1.10.2" +name = "redox_users" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "getrandom", + "libredox", + "thiserror", ] [[package]] @@ -885,7 +949,7 @@ checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax", ] [[package]] @@ -894,12 +958,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.2" @@ -1114,12 +1172,14 @@ dependencies = [ name = "stef-lsp" version = "0.1.0" dependencies = [ + "directories", "ouroboros", "stef-compiler", "stef-parser", "tokio", "tower-lsp", "tracing", + "tracing-appender", "tracing-subscriber", ] @@ -1270,6 +1330,35 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +dependencies = [ + "deranged", + "itoa", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +dependencies = [ + "time-core", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -1292,6 +1381,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", + "bytes", "num_cpus", "pin-project-lite", "tokio-macros", @@ -1393,6 +1483,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.27" @@ -1431,14 +1533,10 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ - "matchers", "nu-ansi-term", - "once_cell", - "regex", "sharded-slab", "smallvec", "thread_local", - "tracing", "tracing-core", "tracing-log", ] @@ -1516,6 +1614,12 @@ 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" diff --git a/crates/stef-lsp/Cargo.toml b/crates/stef-lsp/Cargo.toml index ae2e38c..ea0109b 100644 --- a/crates/stef-lsp/Cargo.toml +++ b/crates/stef-lsp/Cargo.toml @@ -10,13 +10,15 @@ repository.workspace = true license.workspace = true [dependencies] +directories = "5.0.1" ouroboros = "0.18.0" stef-compiler = { path = "../stef-compiler" } stef-parser = { path = "../stef-parser" } -tokio = { version = "1.34.0", features = ["io-std", "macros", "rt-multi-thread"] } +tokio = { version = "1.34.0", features = ["fs", "io-std", "io-util", "macros", "rt-multi-thread"] } tower-lsp = { version = "0.20.0", features = ["proposed"] } tracing = "0.1.40" -tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +tracing-appender = "0.2.3" +tracing-subscriber = "0.3.18" [lints] workspace = true diff --git a/crates/stef-lsp/src/main.rs b/crates/stef-lsp/src/main.rs index 45e123e..da38c2d 100644 --- a/crates/stef-lsp/src/main.rs +++ b/crates/stef-lsp/src/main.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; +use directories::ProjectDirs; use ouroboros::self_referencing; use stef_parser::Schema; use tokio::sync::Mutex; @@ -15,8 +16,8 @@ use tower_lsp::{ }, Client, LanguageServer, LspService, Server, }; -use tracing::debug; -use tracing_subscriber::EnvFilter; +use tracing::{debug, Level}; +use tracing_subscriber::{filter::Targets, fmt::MakeWriter, prelude::*}; mod compile; mod utf16; @@ -55,9 +56,7 @@ impl LanguageServer for Backend { } async fn initialized(&self, _params: InitializedParams) { - self.client - .log_message(MessageType::INFO, "server initialized!") - .await; + debug!("initialized"); } async fn shutdown(&self) -> Result<()> { @@ -121,23 +120,34 @@ impl LanguageServer for Backend { #[tokio::main] async fn main() { - let (stdin, stdout) = (tokio::io::stdin(), tokio::io::stdout()); + let dirs = ProjectDirs::from("rocks", "dnaka91", env!("CARGO_PKG_NAME")).unwrap(); + + let file_appender = tracing_appender::rolling::daily(dirs.cache_dir(), "log"); + let (file_appender, _guard) = tracing_appender::non_blocking(file_appender); + let (service, socket) = LspService::new(|client| { - tracing_subscriber::fmt() - .with_env_filter(EnvFilter::from_default_env()) - .with_writer({ - let client = client.clone(); - move || ClientLogWriter { - client: client.clone(), - } - }) + tracing_subscriber::registry() + .with( + tracing_subscriber::fmt::layer() + .with_ansi(false) + .with_writer(ClientLogWriter::new(client.clone())), + ) + .with(tracing_subscriber::fmt::layer().with_writer(file_appender)) + .with(Targets::new().with_default(Level::WARN).with_targets([ + (env!("CARGO_CRATE_NAME"), Level::TRACE), + ("stef_compiler", Level::TRACE), + ("stef_parser", Level::TRACE), + ("tower_lsp", Level::DEBUG), + ])) .init(); + Backend { client, files: Mutex::default(), } }); + let (stdin, stdout) = (tokio::io::stdin(), tokio::io::stdout()); Server::new(stdin, stdout, socket).serve(service).await; } @@ -145,12 +155,18 @@ struct ClientLogWriter { client: Client, } +impl ClientLogWriter { + fn new(client: Client) -> Self { + Self { client } + } +} + impl std::io::Write for ClientLogWriter { fn write(&mut self, buf: &[u8]) -> std::io::Result { let client = self.client.clone(); - let message = String::from_utf8_lossy(buf).into_owned(); + let message = String::from_utf8_lossy(buf).trim().to_owned(); - tokio::spawn(async move { client.log_message(MessageType::INFO, message).await }); + tokio::spawn(async move { client.log_message(MessageType::LOG, message).await }); Ok(buf.len()) } @@ -159,3 +175,13 @@ impl std::io::Write for ClientLogWriter { Ok(()) } } + +impl MakeWriter<'_> for ClientLogWriter { + type Writer = Self; + + fn make_writer(&self) -> Self::Writer { + Self { + client: self.client.clone(), + } + } +}