diff --git a/copy_server_to_ide.sh b/copy_server_to_ide.sh index a1ac54e..5b70211 100755 --- a/copy_server_to_ide.sh +++ b/copy_server_to_ide.sh @@ -3,5 +3,5 @@ cargo test --release --package digital-lsp --lib -- core::primitive_parser::tests::gen_primitive_bin --exact --show-output --nocapture mkdir -p /home/dide/project/Digital-IDE/resources/dide-lsp/static/xilinx cp target/primitive.bin /home/dide/project/Digital-IDE/resources/dide-lsp/static/xilinx -cargo build --release -cp target/release/digital-lsp /home/dide/project/Digital-IDE/resources/dide-lsp/server/0.4.0/ \ No newline at end of file +#cargo build --release +#cp target/release/digital-lsp /home/dide/project/Digital-IDE/resources/dide-lsp/server/0.4.0/ diff --git a/src/diagnostics/mod.rs b/src/diagnostics/mod.rs index c9b82a5..8f54290 100644 --- a/src/diagnostics/mod.rs +++ b/src/diagnostics/mod.rs @@ -6,6 +6,10 @@ use std::process::{Command, Stdio}; use tower_lsp::lsp_types::*; use walkdir::DirEntry; +mod modelsim; +mod verible; +mod verilator; +mod vivado; pub fn get_diagnostics( uri: Url, diff --git a/src/diagnostics/modelsim.rs b/src/diagnostics/modelsim.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/diagnostics/verible.rs b/src/diagnostics/verible.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/diagnostics/verilator.rs b/src/diagnostics/verilator.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/diagnostics/vivado.rs b/src/diagnostics/vivado.rs new file mode 100644 index 0000000..49e8b37 --- /dev/null +++ b/src/diagnostics/vivado.rs @@ -0,0 +1,5 @@ + + +pub fn provide_diagnostics() { + +} \ No newline at end of file diff --git a/src/hover/feature.rs b/src/hover/feature.rs index 009ba50..b5bc1ae 100644 --- a/src/hover/feature.rs +++ b/src/hover/feature.rs @@ -10,6 +10,9 @@ use crate::{core::{self, hdlparam::{Define, FastHdlparam}, primitive_parser::Pri use super::{get_language_id_by_path_str, get_word_range_at_position, resolve_path, to_escape_path}; /// 将 4'b0011 分解为 ("b", "0011") +/// 需要支持的格式: +/// - `4'b0011` +/// - `8'b0000_1111` fn parse_digit_string(digit_string: &str) -> Option<(&str, &str)> { if digit_string.len() == 0 { return None; @@ -29,7 +32,14 @@ fn parse_digit_string(digit_string: &str) -> Option<(&str, &str)> { return None; } - return Some((tag.unwrap(), digit.unwrap())); + // 此时,4'b0011 被自动分割成了 + // tag: b + // digit: 0011 + // 前面的 4 被丢弃了,因为 4 可以通过 0011 的长度判断出来 + let tag = tag.unwrap(); + let digit = digit.unwrap(); + + return Some((tag, digit)); }, None => return None }; @@ -46,13 +56,20 @@ fn convert_tag_to_radix(tag: &str) -> Option { } /// 计算出有符号和无符号下的表示 +/// - `tag`: b, o, h 这些代表进制的字符, +/// - `digit_string`: 进制数 +/// +/// 需要支持的格式: +/// - `4'b0011` +/// - `8'b0000_1111` fn convert_to_sign_unsign<'a>(tag: &'a str, digit_string: &str) -> Option<(String, String)> { let radix = convert_tag_to_radix(tag); if radix.is_none() { return None; } let radix = radix.unwrap(); - let unsigned_decimal = u128::from_str_radix(digit_string, radix); + let raw_digit_string = digit_string.replace("_", ""); + let unsigned_decimal = u128::from_str_radix(&raw_digit_string, radix); if unsigned_decimal.is_err() { return None; @@ -87,7 +104,7 @@ pub fn hover_format_digit(line: &RopeSlice, pos: Position, language_id: &str) -> if let Some((signed_string, unsigned_string)) = convert_to_sign_unsign(tag, digit) { let digit_title = LanguageString { language: language_id.to_string(), - value: format!("{}'{}{}", digit.len(), tag, digit) + value: format!("{}'{}{}", digit.replace("_", "").len(), tag, digit) }; let markdown = HoverContents::Array(vec![ MarkedString::LanguageString(digit_title), diff --git a/src/server.rs b/src/server.rs index a4c14c9..6e67f94 100644 --- a/src/server.rs +++ b/src/server.rs @@ -284,8 +284,7 @@ impl LanguageServer for Backend { // .await; // } else { let diagnostics = self.server.did_open(params); - self.client - .publish_diagnostics( + self.client.publish_diagnostics( diagnostics.uri, diagnostics.diagnostics, diagnostics.version, diff --git a/src/sources.rs b/src/sources.rs index 52cfcfd..d0c3de7 100644 --- a/src/sources.rs +++ b/src/sources.rs @@ -52,12 +52,19 @@ impl LSPServer { } else { self.srcs.add(self, document); } - // diagnostics + + // 生成诊断信息 let urls = self.srcs.names.read().unwrap().keys().cloned().collect(); let file_id = self.srcs.get_id(&uri); if let Some(file) = self.srcs.get_file(file_id) { let file = file.read().unwrap(); - get_diagnostics(uri, &file.text, urls, &self.conf.read().unwrap()) + let diagnostics = get_diagnostics( + uri, + &file.text, + urls, + &self.conf.read().unwrap() + ); + diagnostics } else { PublishDiagnosticsParams { uri,