diff --git a/Cargo.lock b/Cargo.lock index 8ac993a..aefd5e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -205,6 +205,7 @@ version = "0.0.1" dependencies = [ "anyhow", "flexi_logger", + "futures", "log", "once_cell", "path-clean", @@ -284,6 +285,7 @@ checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", + "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -306,6 +308,17 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.28" diff --git a/Cargo.toml b/Cargo.toml index f02bb9e..6459eb5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" [dependencies] sv-parser = { version = "0.13.3", path = "sv-parser/sv-parser"} once_cell = "1.8" +futures = "0.3" log = "0.4.19" tower-lsp = "0.20.0" flexi_logger = "0.29.0" diff --git a/src/core/sv_parser.rs b/src/core/sv_parser.rs index 35dc85e..0a18797 100644 --- a/src/core/sv_parser.rs +++ b/src/core/sv_parser.rs @@ -3,6 +3,7 @@ use std::io::BufRead; use std::{collections::HashMap, io::BufReader}; use std::path::PathBuf; use anyhow::Error; +use log::info; use sv_parser::{parse_sv, unwrap_node, ConstantMintypmaxExpression, GateInstantiation, ListOfParameterAssignments, ListOfPortConnections, Locate, PackedDimensionRange, RefNode, SyntaxTree}; use super::fast_hdlparam::{FastHdlparam, Macro}; diff --git a/src/custom_request.rs b/src/custom_request.rs index 502f447..c7071f9 100644 --- a/src/custom_request.rs +++ b/src/custom_request.rs @@ -131,9 +131,22 @@ pub fn do_fast(path: String) -> Result { // 下面是服务端发送给客户端的 + +#[derive(Serialize, Deserialize)] +pub struct StringNotification { + pub content: String +} + +impl Notification for StringNotification { + const METHOD: &'static str = "update/string"; + type Params = Self; +} + + #[derive(Serialize, Deserialize)] pub struct UpdateFastNotification { - pub fast: FastHdlparam + pub fast: FastHdlparam, + pub path: String } impl Notification for UpdateFastNotification { @@ -141,8 +154,16 @@ impl Notification for UpdateFastNotification { type Params = Self; } -pub fn update_fast_to_client(fast: FastHdlparam) { + +pub async fn update_fast_to_client(fast: FastHdlparam, path: &PathBuf) { + // info!("send fast to foreend {:?}", fast); + + info!("send fast to foreend"); let backend = GLOBAL_BACKEND.get().unwrap(); - let params = UpdateFastNotification { fast }; - backend.client.send_notification::(params); + let path = path.to_str().unwrap_or("").to_string(); + + let params = UpdateFastNotification { fast, path }; + info!("backend client: {:?}", backend.client); + + backend.client.send_notification::(params).await; } \ No newline at end of file diff --git a/src/server.rs b/src/server.rs index 41e81ff..affd29d 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,3 +1,4 @@ +use crate::custom_request::StringNotification; use crate::sources::*; use crate::completion::keyword::*; use flexi_logger::LoggerHandle; @@ -299,6 +300,7 @@ impl LanguageServer for Backend { .log_message(MessageType::INFO, "digital lsp initialized!") .await; + // self.client.send_notification::(StringNotification { content: "hello from lsp server".to_string() }).await; } async fn shutdown(&self) -> Result<()> { diff --git a/src/sources.rs b/src/sources.rs index b88d8e6..dc0fbcb 100644 --- a/src/sources.rs +++ b/src/sources.rs @@ -1,11 +1,12 @@ use crate::core::sv_parser::make_fast_from_syntaxtree; use crate::custom_request::update_fast_to_client; -use crate::custom_request::UpdateFastNotification; use crate::definition::def_types::*; use crate::definition::get_scopes; use crate::diagnostics::{get_diagnostics, is_hidden}; use crate::server::Backend; use crate::server::LSPServer; +use futures::executor::block_on; +use log::info; use log::{debug, error}; use pathdiff::diff_paths; use ropey::{Rope, RopeSlice}; @@ -13,6 +14,7 @@ use std::cmp::min; use std::collections::HashMap; use std::env::current_dir; use std::fs; +use std::ops::Deref; use std::ops::Range as StdRange; use std::path::PathBuf; use std::sync::{Arc, Condvar, Mutex, RwLock}; @@ -253,7 +255,9 @@ impl Sources { } }; // update_fast_to_client(backend.clone(), fast); - update_fast_to_client(fast); + block_on(async { + update_fast_to_client(fast, &path).await; + }); } let mut file = source_handle.write().unwrap(); diff --git a/sv-parser b/sv-parser index af11f5f..4960ea3 160000 --- a/sv-parser +++ b/sv-parser @@ -1 +1 @@ -Subproject commit af11f5ff1ef091562d2b17cdf4de3614aedf2286 +Subproject commit 4960ea3fb7c848462ce6e78dbae454ffc775803f