From b9c8a2f451aae184e6174a22a0aace422e7c2cb6 Mon Sep 17 00:00:00 2001 From: LSTM-Kirigaya <1193466151@qq.com> Date: Tue, 17 Dec 2024 20:36:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=B8=89=E7=A7=8D=E8=AF=8A?= =?UTF-8?q?=E6=96=AD=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/code_lens/sv.rs | 2 +- src/completion/feature.rs | 6 ++--- src/completion/sv.rs | 12 +++++----- src/completion/vhdl.rs | 12 +++++----- src/definition/feature.rs | 16 ++++++------- src/definition/sv.rs | 6 ++--- src/definition/vhdl.rs | 8 +++---- src/diagnostics/iverilog.rs | 4 ++-- src/diagnostics/verilator.rs | 4 ++-- src/diagnostics/vivado.rs | 2 +- src/document_highlight/mod.rs | 4 ++-- src/document_highlight/sv.rs | 4 ++-- src/document_highlight/vhdl.rs | 2 +- src/document_symbol/sv.rs | 6 ++--- src/document_symbol/vhdl.rs | 8 +++---- src/execute_command/diagnostics.rs | 7 ++++-- src/format/mod.rs | 12 +++++----- src/hover/feature.rs | 20 ++++++++--------- src/hover/sv.rs | 10 ++++----- src/hover/vhdl.rs | 10 ++++----- src/inlay_hint/sv.rs | 8 +++---- src/request/config.rs | 2 +- src/request/fast.rs | 8 +++---- src/request/primitives.rs | 2 +- src/server.rs | 14 +++++++----- src/sources.rs | 36 +++++++++++++++++------------- src/utils/fast.rs | 2 +- 27 files changed, 118 insertions(+), 109 deletions(-) diff --git a/src/code_lens/sv.rs b/src/code_lens/sv.rs index 39f9365..901a23d 100644 --- a/src/code_lens/sv.rs +++ b/src/code_lens/sv.rs @@ -13,7 +13,7 @@ pub fn code_lens( #[allow(unused)] params: &CodeLensParams ) -> Option> { - let hdl_param = server.srcs.hdl_param.clone(); + let hdl_param = server.db.hdl_param.clone(); let uri = ¶ms.text_document.uri; let path_to_hdl_file = hdl_param.path_to_hdl_file.read().unwrap(); diff --git a/src/completion/feature.rs b/src/completion/feature.rs index 97c9a5c..a2b89a7 100644 --- a/src/completion/feature.rs +++ b/src/completion/feature.rs @@ -112,7 +112,7 @@ pub fn vlog_directives_completion( let mut completion_items = server.vlog_directives.clone(); // 再从每个文件中搜集定义的宏 - let hdl_param = server.srcs.hdl_param.clone(); + let hdl_param = server.db.hdl_param.clone(); let path_to_hdl_file = hdl_param.path_to_hdl_file.read().unwrap(); // 遍历所有的 defines @@ -156,7 +156,7 @@ pub fn vlog_directives_completion_without_prefix( let mut completion_items = server.vlog_directives.clone(); // 再从每个文件中搜集定义的宏 - let hdl_param = server.srcs.hdl_param.clone(); + let hdl_param = server.db.hdl_param.clone(); let path_to_hdl_file = hdl_param.path_to_hdl_file.read().unwrap(); // 遍历所有的 defines @@ -253,7 +253,7 @@ fn get_position_port_param_completion( language_id: &str ) -> Option { // 判断在不在一个模块内,并获取这个模块 - let hdl_param = &server.srcs.hdl_param; + let hdl_param = &server.db.hdl_param; let fast_map = hdl_param.path_to_hdl_file.read().unwrap(); let path = PathBuf::from_str(url.path()).unwrap(); let path = to_escape_path(&path); diff --git a/src/completion/sv.rs b/src/completion/sv.rs index 5a3444f..216328f 100644 --- a/src/completion/sv.rs +++ b/src/completion/sv.rs @@ -15,8 +15,8 @@ pub fn completion(server: &LspServer, params: &CompletionParams) -> Option Option { // 1. 先根据 AST 获取上下文补全项 // 去除如下几种情况:module textmacro - let mut completion_items = server.srcs.get_completions( + let mut completion_items = server.db.get_completions( &token, source.text.pos_to_byte(&doc.position), &doc.text_document.uri, @@ -216,13 +216,13 @@ fn make_module_completions( language_id: &str ) -> Vec { let mut module_completioms = Vec::::new(); - let hdl_param = server.srcs.hdl_param.clone(); + let hdl_param = server.db.hdl_param.clone(); let prefix = token.to_string().to_lowercase(); let module_name_to_path = hdl_param.module_name_to_path.read().unwrap(); // 获取和自动补全相关的配置 - let auto_add_output_declaration = server.srcs.get_lsp_configuration_bool_value("digital-ide.function.lsp.completion.vlog.auto-add-output-declaration").unwrap_or(true); + let auto_add_output_declaration = server.db.get_lsp_configuration_bool_value("digital-ide.function.lsp.completion.vlog.auto-add-output-declaration").unwrap_or(true); // 遍历 hdlparam 中所有的 modules for module_name in module_name_to_path.keys() { @@ -238,7 +238,7 @@ fn make_module_completions( } let (insert_text, module_profile, define_info) = if file_type == "primitives" { - let primitive_map = server.srcs.primitive_text.name_to_text.read().unwrap(); + let primitive_map = server.db.primitive_text.name_to_text.read().unwrap(); if let Some(text) = primitive_map.get(&module.name) { insert_text.push(make_primitives_instantiation_code(text)); ( diff --git a/src/completion/vhdl.rs b/src/completion/vhdl.rs index bde1faa..fc7c833 100644 --- a/src/completion/vhdl.rs +++ b/src/completion/vhdl.rs @@ -19,8 +19,8 @@ pub fn completion(server: &LspServer, params: &CompletionParams) -> Option Option Option { info!("trigger vhdl dot completion"); - let mut completion_items = server.srcs.get_completions( + let mut completion_items = server.db.get_completions( &token, source.text.pos_to_byte(&doc.position), &doc.text_document.uri, @@ -84,7 +84,7 @@ pub fn completion(server: &LspServer, params: &CompletionParams) -> Option { // 1. 先根据 AST 获取上下文补全项 - let mut completion_items = server.srcs.get_completions( + let mut completion_items = server.db.get_completions( &token, source.text.pos_to_byte(&doc.position), &doc.text_document.uri, @@ -190,7 +190,7 @@ fn make_module_completions( language_id: &str ) -> Vec { let mut module_completioms = Vec::::new(); - let hdl_param = server.srcs.hdl_param.clone(); + let hdl_param = server.db.hdl_param.clone(); let prefix = token.to_string().to_lowercase(); let module_name_to_path = hdl_param.module_name_to_path.read().unwrap(); diff --git a/src/definition/feature.rs b/src/definition/feature.rs index 545fba6..96cfea0 100644 --- a/src/definition/feature.rs +++ b/src/definition/feature.rs @@ -114,17 +114,17 @@ fn goto_instantiation<'a>( // let in_scope = compare_pos(&range.start, pos) != 1 && compare_pos(pos, &range.end) != 1; // info!("pos: {pos:?}, param_range: {range:?}, in_scope: {in_scope:?}"); if param_range.contains(pos) { - let module = match server.srcs.hdl_param.find_module_by_name(&instance.inst_type) { + let module = match server.db.hdl_param.find_module_by_name(&instance.inst_type) { Some(module) => module, None => return None }; for param in &module.params { if token_name == param.name { - let def_path = server.srcs.hdl_param.find_module_definition_path(&module.name).unwrap(); + let def_path = server.db.hdl_param.find_module_definition_path(&module.name).unwrap(); let target_uri = Url::from_file_path(def_path).unwrap(); let target_range = param.range.clone(); - let file_type = server.srcs.hdl_param.find_file_type_by_module_name(&instance.inst_type); + let file_type = server.db.hdl_param.find_file_type_by_module_name(&instance.inst_type); let target_range = match file_type.as_str() { "common" => { target_range.to_lsp_range() @@ -159,17 +159,17 @@ fn goto_instantiation<'a>( // let in_scope = compare_pos(&range.start, pos) != 1 && compare_pos(pos, &range.end) != 1; // info!("pos: {pos:?}, port_range: {range:?}, in_scope: {in_scope:?}"); if port_range.contains(pos) { - let module = match server.srcs.hdl_param.find_module_by_name(&instance.inst_type) { + let module = match server.db.hdl_param.find_module_by_name(&instance.inst_type) { Some(module) => module, None => return None }; for port in &module.ports { if token_name == port.name { - let def_path = server.srcs.hdl_param.find_module_definition_path(&module.name).unwrap(); + let def_path = server.db.hdl_param.find_module_definition_path(&module.name).unwrap(); let target_uri = Url::from_file_path(def_path).unwrap(); let target_range = port.range.clone(); - let file_type = server.srcs.hdl_param.find_file_type_by_module_name(&instance.inst_type); + let file_type = server.db.hdl_param.find_file_type_by_module_name(&instance.inst_type); let target_range = match file_type.as_str() { "common" => { target_range.to_lsp_range() @@ -216,7 +216,7 @@ pub fn goto_position_port_param_definition( if name.starts_with(".") { let name = &name[1..]; // 进入最近的 scope 寻找 - let fast_map = server.srcs.hdl_param.path_to_hdl_file.read().unwrap(); + let fast_map = server.db.hdl_param.path_to_hdl_file.read().unwrap(); let path = PathBuf::from_str(url.path()).unwrap(); let path = to_escape_path(&path); let path_string = path.to_str().unwrap(); @@ -237,7 +237,7 @@ pub fn goto_module_declaration_definition( server: &LspServer, token_name: &str ) -> Option { - let hdl_param = server.srcs.hdl_param.clone(); + let hdl_param = server.db.hdl_param.clone(); info!("get into goto_module_declaration_definition"); if let Some((module, file_type, def_path)) = hdl_param.find_module_context_by_name(token_name) { diff --git a/src/definition/sv.rs b/src/definition/sv.rs index d467e5b..f33fe67 100644 --- a/src/definition/sv.rs +++ b/src/definition/sv.rs @@ -15,8 +15,8 @@ pub fn goto_definition(server: &LspServer, params: &GotoDefinitionParams) -> Opt let path_string = from_uri_to_escape_path_string(uri).unwrap(); // 等待解析完成 - server.srcs.wait_parse_ready(&path_string, false); - let source = server.srcs.get_source(&path_string)?; + server.db.wait_parse_ready(&path_string, false); + let source = server.db.get_source(&path_string)?; let source = source.read().ok()?; let line_text = source.text.line(pos.line as usize); @@ -33,7 +33,7 @@ pub fn goto_definition(server: &LspServer, params: &GotoDefinitionParams) -> Opt } // match instance - let scope_tree = server.srcs.scope_tree.read().ok()?; + let scope_tree = server.db.scope_tree.read().ok()?; // match position port & param if let Some(definition) = goto_position_port_param_definition(server, &line_text, uri, pos) { diff --git a/src/definition/vhdl.rs b/src/definition/vhdl.rs index 6eea0eb..3e093ce 100644 --- a/src/definition/vhdl.rs +++ b/src/definition/vhdl.rs @@ -12,8 +12,8 @@ pub fn goto_vhdl_definition(server: &LspServer, params: &GotoDefinitionParams) - let path_string = from_uri_to_escape_path_string(uri).unwrap(); // 等待解析完成 - server.srcs.wait_parse_ready(&path_string, false); - let source = server.srcs.get_source(&path_string)?; + server.db.wait_parse_ready(&path_string, false); + let source = server.db.get_source(&path_string)?; let source = source.read().ok()?; let line_text = source.text.line(pos.line as usize); @@ -21,7 +21,7 @@ pub fn goto_vhdl_definition(server: &LspServer, params: &GotoDefinitionParams) - #[allow(unused)] let token: String = get_definition_token(&line_text, pos); - let project = server.srcs.vhdl_project.read().ok()?; + let project = server.db.vhdl_project.read().ok()?; let global_project = project.as_ref().unwrap(); let path = match PathBuf::from_str(uri.path()) { @@ -57,7 +57,7 @@ pub fn goto_vhdl_definition(server: &LspServer, params: &GotoDefinitionParams) - // match instance - // let scope_tree = server.srcs.scope_tree.read().ok()?; + // let scope_tree = server.db.scope_tree.read().ok()?; // // match position port & param // if let Some(definition) = goto_position_port_param_definition(server, &line_text, doc, pos) { diff --git a/src/diagnostics/iverilog.rs b/src/diagnostics/iverilog.rs index df649f2..403559b 100644 --- a/src/diagnostics/iverilog.rs +++ b/src/diagnostics/iverilog.rs @@ -107,9 +107,9 @@ impl AbstractLinterConfiguration for IverilogConfiguration { let mut groups = error_description.split(":"); if let Some(unknown_module_name) = groups.nth(1) { let unknown_module_name = unknown_module_name.trim(); - info!("包含 {} ? {}", unknown_module_name, server.srcs.contains_module(unknown_module_name)); + info!("包含 {} ? {}", unknown_module_name, server.db.contains_module(unknown_module_name)); - if server.srcs.contains_module(unknown_module_name) { + if server.db.contains_module(unknown_module_name) { continue; } } diff --git a/src/diagnostics/verilator.rs b/src/diagnostics/verilator.rs index 2dd8f40..ba28b2f 100644 --- a/src/diagnostics/verilator.rs +++ b/src/diagnostics/verilator.rs @@ -79,7 +79,7 @@ impl AbstractLinterConfiguration for VerilatorConfiguration { let output = child.wait_with_output().ok()?; let output_string = String::from_utf8(output.stderr).ok()?; - let lint_level = server.srcs.get_lsp_configuration_string_value("digital-ide.function.lsp.linter.linter-level").unwrap_or("error".to_string()); + let lint_level = server.db.get_lsp_configuration_string_value("digital-ide.function.lsp.linter.linter-level").unwrap_or("error".to_string()); info!("verilator linter: {:?}, output:\n{}", path_string, output_string); @@ -115,7 +115,7 @@ impl AbstractLinterConfiguration for VerilatorConfiguration { // 对于 NOTFOUNDMODULE 进行过滤 // 如果存在于 fast 中,则直接跳过 if let Some(module_name) = match_not_module_found(error_tuple.0.as_str()) { - if server.srcs.contains_module(&module_name) { + if server.db.contains_module(&module_name) { continue; } } diff --git a/src/diagnostics/vivado.rs b/src/diagnostics/vivado.rs index 37b5c45..d1d1920 100644 --- a/src/diagnostics/vivado.rs +++ b/src/diagnostics/vivado.rs @@ -155,7 +155,7 @@ fn get_all_dependence_files( let path_string = from_uri_to_escape_path_string(uri).unwrap(); let mut used_macro_names = HashSet::::new(); - let hdl_param = server.srcs.hdl_param.clone(); + let hdl_param = server.db.hdl_param.clone(); let path_to_hdl_file = hdl_param.path_to_hdl_file.read().unwrap(); if let Some(hdl_file) = path_to_hdl_file.get(&path_string) { for macro_symbol in &hdl_file.parse_result.symbol_table.macro_usages { diff --git a/src/document_highlight/mod.rs b/src/document_highlight/mod.rs index de80e5b..3825d52 100644 --- a/src/document_highlight/mod.rs +++ b/src/document_highlight/mod.rs @@ -15,8 +15,8 @@ impl LspServer { let path_string = from_uri_to_escape_path_string(uri).unwrap(); // 等待解析完成 - self.srcs.wait_parse_ready(&path_string, false); - let source = self.srcs.get_source(&path_string)?; + self.db.wait_parse_ready(&path_string, false); + let source = self.db.get_source(&path_string)?; let source = source.read().ok()?; let line_text = source.text.line(pos.line as usize); diff --git a/src/document_highlight/sv.rs b/src/document_highlight/sv.rs index 039ce45..ce0effc 100644 --- a/src/document_highlight/sv.rs +++ b/src/document_highlight/sv.rs @@ -14,7 +14,7 @@ pub fn document_highlight( pos: Position, uri: &Url ) -> Option> { - let scope_tree = server.srcs.scope_tree.read().ok()?; + let scope_tree = server.db.scope_tree.read().ok()?; let path_string = from_uri_to_escape_path_string(uri).unwrap(); @@ -25,7 +25,7 @@ pub fn document_highlight( }; // 获取对应的 AST - let path_to_hdl_file = server.srcs.hdl_param.path_to_hdl_file.read().unwrap(); + let path_to_hdl_file = server.db.hdl_param.path_to_hdl_file.read().unwrap(); if let Some(hdl_file) = path_to_hdl_file.get(&path_string) { if let Some(AstLike::Svlog(syntax_tree)) = &hdl_file.ast_like { let references = all_identifiers(&syntax_tree, &token); diff --git a/src/document_highlight/vhdl.rs b/src/document_highlight/vhdl.rs index 10b08c2..1e8e846 100644 --- a/src/document_highlight/vhdl.rs +++ b/src/document_highlight/vhdl.rs @@ -13,7 +13,7 @@ pub fn document_highlight( pos: Position, uri: &Url ) -> Option> { - let scope_tree = server.srcs.scope_tree.read().ok()?; + let scope_tree = server.db.scope_tree.read().ok()?; // use the byte_idx of the definition if possible, otherwise use the cursor let byte_idx = match scope_tree.as_ref()?.get_definition(token, file.text.pos_to_byte(&pos), uri) { diff --git a/src/document_symbol/sv.rs b/src/document_symbol/sv.rs index 8dbf7aa..443b1b8 100644 --- a/src/document_symbol/sv.rs +++ b/src/document_symbol/sv.rs @@ -10,11 +10,11 @@ pub fn document_symbol( let path_string = from_uri_to_escape_path_string(uri).unwrap(); // 等待解析完成 - server.srcs.wait_parse_ready(&path_string, false); - let source = server.srcs.get_source(&path_string)?; + server.db.wait_parse_ready(&path_string, false); + let source = server.db.get_source(&path_string)?; let source = source.read().ok()?; - let scope_tree = server.srcs.scope_tree.read().ok()?; + let scope_tree = server.db.scope_tree.read().ok()?; Some(DocumentSymbolResponse::Nested( scope_tree.as_ref()?.document_symbols(uri, &source.text), diff --git a/src/document_symbol/vhdl.rs b/src/document_symbol/vhdl.rs index fa88edc..2f79df9 100644 --- a/src/document_symbol/vhdl.rs +++ b/src/document_symbol/vhdl.rs @@ -11,13 +11,13 @@ pub fn document_symbol(server: &LspServer, params: &DocumentSymbolParams) -> Opt let path_string = from_uri_to_escape_path_string(uri).unwrap(); // 等待解析完成 - server.srcs.wait_parse_ready(&path_string, false); - // let source_handle = server.srcs.get_source(&path_string)?; + server.db.wait_parse_ready(&path_string, false); + // let source_handle = server.db.get_source(&path_string)?; // let source_handle = source_handle.read().ok()?; - let scope_tree = server.srcs.scope_tree.read().ok()?; + let scope_tree = server.db.scope_tree.read().ok()?; - let project = server.srcs.vhdl_project.read().ok()?; + let project = server.db.vhdl_project.read().ok()?; let global_project = project.as_ref().unwrap(); let path = match PathBuf::from_str(uri.path()) { Ok(path) => path, diff --git a/src/execute_command/diagnostics.rs b/src/execute_command/diagnostics.rs index 5cfb137..f2c9e92 100644 --- a/src/execute_command/diagnostics.rs +++ b/src/execute_command/diagnostics.rs @@ -1,5 +1,6 @@ use std::{path::PathBuf, str::FromStr}; +use log::info; use serde_json::Value; use tower_lsp::lsp_types::{Diagnostic, Url}; @@ -11,7 +12,9 @@ pub async fn publish_diagnostics( backend: &Backend, arguments: Vec ) -> tower_lsp::jsonrpc::Result> { - let path_string = arguments.get(0).unwrap().to_string(); + let path_string = arguments.get(0).unwrap().as_str().unwrap(); + info!("path_string: {:?}", path_string); + let uri = Url::from_file_path(path_string).unwrap(); let path_string = from_uri_to_escape_path_string(&uri).unwrap(); let pathbuf = PathBuf::from_str(&path_string).unwrap(); @@ -35,7 +38,7 @@ pub async fn clear_diagnostics( backend: &Backend, arguments: Vec ) -> tower_lsp::jsonrpc::Result> { - let path_string = arguments.get(0).unwrap().to_string(); + let path_string = arguments.get(0).unwrap().as_str().unwrap(); let uri = Url::from_file_path(path_string).unwrap(); let diagnostics = Vec::::new(); diff --git a/src/format/mod.rs b/src/format/mod.rs index 584248a..c552c9c 100644 --- a/src/format/mod.rs +++ b/src/format/mod.rs @@ -9,9 +9,9 @@ impl LspServer { None // let uri = params.text_document.uri; // info!("formatting {}", &uri); - // let file_id = self.srcs.get_id(&uri).to_owned(); - // self.srcs.wait_parse_ready(file_id, false); - // let file = self.srcs.get_file(file_id)?; + // let file_id = self.db.get_id(&uri).to_owned(); + // self.db.wait_parse_ready(file_id, false); + // let file = self.db.get_file(file_id)?; // let file = file.read().ok()?; // let conf = self.configuration.read().unwrap(); @@ -37,9 +37,9 @@ impl LspServer { None // let uri = params.text_document.uri; // info!("range formatting {}", &uri); - // let file_id = self.srcs.get_id(&uri).to_owned(); - // self.srcs.wait_parse_ready(file_id, false); - // let file = self.srcs.get_file(file_id)?; + // let file_id = self.db.get_id(&uri).to_owned(); + // self.db.wait_parse_ready(file_id, false); + // let file = self.db.get_file(file_id)?; // let file = file.read().ok()?; // let conf = self.configuration.read().unwrap(); diff --git a/src/hover/feature.rs b/src/hover/feature.rs index e946066..5b0240e 100644 --- a/src/hover/feature.rs +++ b/src/hover/feature.rs @@ -235,7 +235,7 @@ fn goto_instantiation<'a>( // let in_scope = compare_pos(&range.start, pos) != 1 && compare_pos(pos, &range.end) != 1; // info!("pos: {pos:?}, param_range: {range:?}, in_scope: {in_scope:?}"); if param_range.contains(pos) { - let module = match server.srcs.hdl_param.find_module_by_name(&instance.inst_type) { + let module = match server.db.hdl_param.find_module_by_name(&instance.inst_type) { Some(module) => module, None => return None }; @@ -244,9 +244,9 @@ fn goto_instantiation<'a>( // info!("param_range: {param_range:#?}"); // info!("position param find belong module: {:?}", module); - let file_type = server.srcs.hdl_param.find_file_type_by_module_name(&instance.inst_type); + let file_type = server.db.hdl_param.find_file_type_by_module_name(&instance.inst_type); if file_type == "primitives" { - let primitives_text = server.srcs.primitive_text.clone(); + let primitives_text = server.db.primitive_text.clone(); let params_assignments = &module.instances.first().unwrap().intstparam_assignments; for assignment in params_assignments { if assignment.parameter.clone().unwrap() == token_name { @@ -271,7 +271,7 @@ fn goto_instantiation<'a>( if let Some(port_range) = &instance.instports { if port_range.contains(pos) { - let module = match server.srcs.hdl_param.find_module_by_name(&instance.inst_type) { + let module = match server.db.hdl_param.find_module_by_name(&instance.inst_type) { Some(module) => module, None => return None }; @@ -280,9 +280,9 @@ fn goto_instantiation<'a>( // info!("port_range: {port_range:#?}"); // info!("position port find belong module: {:?}", module); - let file_type = server.srcs.hdl_param.find_file_type_by_module_name(&instance.inst_type); + let file_type = server.db.hdl_param.find_file_type_by_module_name(&instance.inst_type); if file_type == "primitives" { - let primitives_text = server.srcs.primitive_text.clone(); + let primitives_text = server.db.primitive_text.clone(); let port_assignments = &module.instances.first().unwrap().intstport_assignments; for assignment in port_assignments { if assignment.port.clone().unwrap() == token_name { @@ -324,7 +324,7 @@ pub fn hover_position_port_param( if name.starts_with(".") { let name = &name[1..]; // 进入最近的 scope 寻找 - let fast_map = server.srcs.hdl_param.path_to_hdl_file.read().unwrap(); + let fast_map = server.db.hdl_param.path_to_hdl_file.read().unwrap(); let path = PathBuf::from_str(url.path()).unwrap(); let path = to_escape_path(&path); let path_string = path.to_str().unwrap(); @@ -448,9 +448,9 @@ pub fn hover_module_declaration( ) -> Option { // info!("hover_module_declaration token: {:?}", token_name); - // let test = server.srcs.hdl_param.module_name_to_path.read().unwrap(); + // let test = server.db.hdl_param.module_name_to_path.read().unwrap(); // info!("module name to path: {:#?}", test); - let hdl_param = server.srcs.hdl_param.clone(); + let hdl_param = server.db.hdl_param.clone(); if let Some((module, file_type, def_path)) = hdl_param.find_module_context_by_name(token_name) { match file_type.as_str() { "common" => { @@ -621,7 +621,7 @@ fn hover_primitives_module_declaration( #[allow(unused)] def_path: &str ) -> Option { - let primitive_map = server.srcs.primitive_text.name_to_text.read().unwrap(); + let primitive_map = server.db.primitive_text.name_to_text.read().unwrap(); if let Some(text) = primitive_map.get(token_name) { let mut markdowns = Vec::::new(); diff --git a/src/hover/sv.rs b/src/hover/sv.rs index c3ff5e9..73bfe5e 100644 --- a/src/hover/sv.rs +++ b/src/hover/sv.rs @@ -18,8 +18,8 @@ pub fn hover(server: &LspServer, params: &HoverParams) -> Option { let path_string = from_uri_to_escape_path_string(uri).unwrap(); // 等待解析完成 - server.srcs.wait_parse_ready(&path_string, false); - let source = server.srcs.get_source(&path_string)?; + server.db.wait_parse_ready(&path_string, false); + let source = server.db.get_source(&path_string)?; let source = source.read().ok()?; let line_text = source.text.line(pos.line as usize); @@ -55,7 +55,7 @@ pub fn hover(server: &LspServer, params: &HoverParams) -> Option { return Some(hover); } - let scope_tree = server.srcs.scope_tree.read().ok()?; + let scope_tree = server.db.scope_tree.read().ok()?; let global_scope = scope_tree.as_ref().unwrap(); let symbol_definition: GenericDec = global_scope @@ -240,7 +240,7 @@ fn hover_common_symbol( // 根据 symbol 的类别进行额外的判断 match symbol_definition.def_type { DefinitionType::ModuleInstantiation => { - let hdlparam = server.srcs.hdl_param.clone(); + let hdlparam = server.db.hdl_param.clone(); let pathbuf = PathBuf::from_str(doc.path()).unwrap(); let pathbuf = to_escape_path(&pathbuf); let path_string = pathbuf.to_str().unwrap().replace("\\", "/"); @@ -301,7 +301,7 @@ fn hover_for_module(server: &LspServer, pos: Position, doc: &Url) -> bool { let pathbuf = PathBuf::from_str(doc.path()).unwrap(); let pathbuf = to_escape_path(&pathbuf); let path_string = pathbuf.to_str().unwrap().replace("\\", "/"); - let hdlparam = server.srcs.hdl_param.clone(); + let hdlparam = server.db.hdl_param.clone(); let find_instance_range = |_: &Module, instance: &Instance| { // info!("instance start pos: {:#?}", instance.range.start); diff --git a/src/hover/vhdl.rs b/src/hover/vhdl.rs index bd43b73..2ef6cdd 100644 --- a/src/hover/vhdl.rs +++ b/src/hover/vhdl.rs @@ -16,13 +16,13 @@ pub fn hover(server: &LspServer, params: &HoverParams) -> Option { let path_string = from_uri_to_escape_path_string(uri).unwrap(); // 等待解析完成 - server.srcs.wait_parse_ready(&path_string, false); - let source = server.srcs.get_source(&path_string)?; + server.db.wait_parse_ready(&path_string, false); + let source = server.db.get_source(&path_string)?; let source = source.read().ok()?; let line_text = source.text.line(pos.line as usize); - let project = server.srcs.vhdl_project.read().ok()?; + let project = server.db.vhdl_project.read().ok()?; let global_project = project.as_ref().unwrap(); let path = match PathBuf::from_str(uri.path()) { @@ -56,7 +56,7 @@ pub fn hover(server: &LspServer, params: &HoverParams) -> Option { // return Some(hover); // } - // let scope_tree = server.srcs.scope_tree.read().ok()?; + // let scope_tree = server.db.scope_tree.read().ok()?; // let global_scope = scope_tree.as_ref().unwrap(); // let symbol_definition: GenericDec = global_scope @@ -254,7 +254,7 @@ fn hover_common_symbol( // 根据 symbol 的类别进行额外的判断 match symbol_definition.def_type { DefinitionType::ModuleInstantiation => { - let hdlparam = server.srcs.hdl_param.clone(); + let hdlparam = server.db.hdl_param.clone(); let pathbuf = PathBuf::from_str(doc.path()).unwrap(); let pathbuf = to_escape_path(&pathbuf); let path_string = pathbuf.to_str().unwrap().replace("\\", "/"); diff --git a/src/inlay_hint/sv.rs b/src/inlay_hint/sv.rs index 34e3ba3..f87e603 100644 --- a/src/inlay_hint/sv.rs +++ b/src/inlay_hint/sv.rs @@ -16,13 +16,13 @@ pub fn inlay_hint(server: &LspServer, params: &InlayHintParams) -> Option::new(); @@ -154,7 +154,7 @@ fn make_instport_hints( instance: &core::hdlparam::Instance, rope: &Rope ) -> Vec { - let hdl_param = server.srcs.hdl_param.clone(); + let hdl_param = server.db.hdl_param.clone(); let mut hints = Vec::::new(); let module_context = hdl_param.find_module_context_by_name(&instance.inst_type); if module_context.is_none() { diff --git a/src/request/config.rs b/src/request/config.rs index 6ad30e4..6c73909 100644 --- a/src/request/config.rs +++ b/src/request/config.rs @@ -45,7 +45,7 @@ fn update_configuration( config_type: String, backend: &Arc ) { - let mut lsp_configuration = backend.server.srcs.lsp_configuration.write().unwrap(); + let mut lsp_configuration = backend.server.db.lsp_configuration.write().unwrap(); match config_type.as_str() { // 所有配置同步到 lsp_configuration 中 diff --git a/src/request/fast.rs b/src/request/fast.rs index 5debb89..c914385 100644 --- a/src/request/fast.rs +++ b/src/request/fast.rs @@ -192,7 +192,7 @@ fn do_sv_fast( &includes ); - let sources = &backend.server.srcs; + let sources = &backend.server.db; if let Some((syntax_tree, parse_result)) = parse_result { if let Ok(mut fast) = make_fast_from_syntaxtree(&syntax_tree, &path_buf) { fast.file_type = file_type.to_string(); @@ -222,7 +222,7 @@ fn do_vhdl_fast( tool_chain: &str, backend: &Arc ) -> Result { - let sources = &backend.server.srcs; + let sources = &backend.server.db; let pathbuf = PathBuf::from_str(path).unwrap(); let hdl_param = sources.hdl_param.clone(); let vhdl_project = sources.vhdl_project.clone(); @@ -377,12 +377,12 @@ pub fn sync_fast( let uri = Url::from_file_path(path.to_string()).unwrap(); let path_string = from_uri_to_escape_path_string(&uri).unwrap(); - if let Some(source_handle) = backend.server.srcs.get_source(&path_string) { + if let Some(source_handle) = backend.server.db.get_source(&path_string) { let _unused = source_handle.read().unwrap(); } } - let hdl_param = backend.server.srcs.hdl_param.clone(); + let hdl_param = backend.server.db.hdl_param.clone(); // TODO: 检查加锁的有效性,因为前端在请求该方法时,后端可能仍然在计算 let path_to_hdl_file = hdl_param.path_to_hdl_file.read().unwrap(); if let Some(hdl_file) = path_to_hdl_file.get(&path) { diff --git a/src/request/primitives.rs b/src/request/primitives.rs index 507f314..c3135af 100644 --- a/src/request/primitives.rs +++ b/src/request/primitives.rs @@ -30,7 +30,7 @@ fn do_primitives_judge( name: &str, backend: &Arc ) -> bool { - let sources = &backend.server.srcs; + let sources = &backend.server.db; let primitive_text = sources.primitive_text.clone(); let primitive_map = primitive_text.name_to_text.read().unwrap(); primitive_map.contains_key(name) diff --git a/src/server.rs b/src/server.rs index 746e1d1..c2a2042 100644 --- a/src/server.rs +++ b/src/server.rs @@ -14,7 +14,7 @@ use tower_lsp::lsp_types::*; use tower_lsp::{Client, LanguageServer}; pub struct LspServer { /// 文件和 ast 相关的 - pub srcs: Sources, + pub db: DigitalDataBase, /// 缓存 pub cache: CacheManager, /// verilog 关键词的自动补全 @@ -37,7 +37,7 @@ impl LspServer { let user_home = dirs_next::home_dir().unwrap(); let dide_home = user_home.join(".digital-ide"); LspServer { - srcs: Sources::new(), + db: DigitalDataBase::new(), cache: CacheManager::new(dide_home), vlog_keyword_completion_items: provide_keyword_completions(VLOG_KEYWORDS), vhdl_keyword_completiom_items: provide_keyword_completions(VHDL_KEYWORDS), @@ -149,17 +149,19 @@ impl LanguageServer for Backend { }); info!("当前客户端初始化结果"); - info!("workspaceFolder: {:?}", configure.workspace_folder); + if let Some(workspace_path) = &configure.workspace_folder { + info!("workspaceFolder: {:?}", workspace_path.to_file_path()); + } info!("extensionPath: {:?}", configure.extension_path); info!("toolChain: {:?}", configure.tool_chain); // 初始化原语系统 - self.server.srcs.init_primitive( + self.server.db.init_primitive( &configure.tool_chain, &configure.extension_path ); - self.server.srcs.init_vhdl_project(&configure.extension_path); + self.server.db.init_vhdl_project(&configure.extension_path); // 初始化系统缓存路径 self.server.cache.start(&version); @@ -253,7 +255,7 @@ impl LanguageServer for Backend { async fn did_close(&self, params: DidCloseTextDocumentParams) { // 获取诊断相关的配置信息,如果 mode 为 common,则需要清空关闭文件的诊断信息 - let linter_mode = self.server.srcs.get_lsp_configuration_string_value("digital-ide.function.lsp.linter.linter-mode").unwrap(); + let linter_mode = self.server.db.get_lsp_configuration_string_value("digital-ide.function.lsp.linter.linter-mode").unwrap(); if linter_mode == "common" { self.client.publish_diagnostics(params.text_document.uri, vec![], None).await; } diff --git a/src/sources.rs b/src/sources.rs index b031fdb..0b61312 100644 --- a/src/sources.rs +++ b/src/sources.rs @@ -40,7 +40,7 @@ impl LspServer { let uri = document.uri.clone(); let path_string = from_uri_to_escape_path_string(&uri).unwrap(); - if self.srcs.contain_source(&path_string) { + if self.db.contain_source(&path_string) { // 如果已经存在了,则进行增量更新 self.did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier::new(document.uri, document.version), @@ -52,12 +52,12 @@ impl LspServer { }); } else { // 如果不存在,直接加入其中 - self.srcs.add(self, document); + self.db.add(self, document); } // 生成诊断信息 - if let Some(source) = self.srcs.get_source(&path_string) { + if let Some(source) = self.db.get_source(&path_string) { let source = source.read().unwrap(); let diagnostics = provide_diagnostics( uri, @@ -77,7 +77,7 @@ impl LspServer { pub fn did_change(&self, params: DidChangeTextDocumentParams) { let path_string = from_uri_to_escape_path_string(¶ms.text_document.uri).unwrap(); - if let Some(source) = self.srcs.get_source(&path_string) { + if let Some(source) = self.db.get_source(&path_string) { let mut source = source.write().unwrap(); // 根据输入的 change 动态更新对应的代码的文本片段 @@ -93,7 +93,7 @@ impl LspServer { drop(source); // 唤醒解析线程 - let source_status = self.srcs.get_source_status(&path_string).unwrap(); + let source_status = self.db.get_source_status(&path_string).unwrap(); let (lock, cvar) = &*source_status.read().unwrap().valid_parse; let mut valid = lock.lock().unwrap(); *valid = false; @@ -107,7 +107,7 @@ impl LspServer { let uri = params.text_document.uri; let path_string = from_uri_to_escape_path_string(&uri).unwrap(); - if let Some(source) = self.srcs.get_source(&path_string) { + if let Some(source) = self.db.get_source(&path_string) { let source = source.read().unwrap(); provide_diagnostics( uri, @@ -131,24 +131,24 @@ impl LspServer { // 同步 { - let mut fast_sync_controller = self.srcs.fast_sync_controller.write().unwrap(); + let mut fast_sync_controller = self.db.fast_sync_controller.write().unwrap(); fast_sync_controller.remove(&path_string); } // hdlparam { - self.srcs.hdl_param.delete_file(&path_string); + self.db.hdl_param.delete_file(&path_string); } // 文本缓冲器 { - let mut sources = self.srcs.sources.write().unwrap(); + let mut sources = self.db.sources.write().unwrap(); sources.remove(&path_string); } // scope tree { - let mut global_scope = self.srcs.scope_tree.write().unwrap(); + let mut global_scope = self.db.scope_tree.write().unwrap(); match &mut *global_scope { Some(scope) => { scope.defs.retain(|x| x.url() != uri); @@ -160,7 +160,7 @@ impl LspServer { // vhdl { - let mut vhdl_project = self.srcs.vhdl_project.write().unwrap(); + let mut vhdl_project = self.db.vhdl_project.write().unwrap(); match &mut *vhdl_project { Some(vhdl_project) => { let config_file_strs = vhdl_project.config_file_strs.clone() @@ -206,21 +206,25 @@ pub struct Source { /// file metadata, including whether or not the syntax tree is up to date pub struct SourceStatus { /// 当前解析的文件的路径 + #[allow(unused)] pub path: String, /// 用于进行控制的锁 pub valid_parse: Arc<(Mutex, Condvar)>, - /// 解析当前文件的线程句柄 + /// 解析当前文件的线程句柄,此处必须让句柄被全局变量持有,否则 + /// 解析线程句柄在离开作用域后会被销毁 #[allow(unused)] pub parse_handle: JoinHandle<()>, } pub enum AstLike { + #[allow(unused)] Svlog(SyntaxTree), + #[allow(unused)] Vhdl(DesignFile) } -/// The Sources struct manages all source files -pub struct Sources { +/// 用于管理和源代码文本副本、AST、Fast、客户端配置信息等相关的 db 对象 +pub struct DigitalDataBase { // 用于存储后端中的前端的文本缓冲区的备份 pub sources: Arc>>>>, // 存储类似于线程句柄等数据的结构 @@ -241,13 +245,13 @@ pub struct Sources { pub lsp_configuration: Arc>> } -impl std::default::Default for Sources { +impl std::default::Default for DigitalDataBase { fn default() -> Self { Self::new() } } -impl Sources { +impl DigitalDataBase { pub fn new() -> Self { Self { sources: Arc::new(RwLock::new(HashMap::new())), diff --git a/src/utils/fast.rs b/src/utils/fast.rs index 8c705e6..20db3ac 100644 --- a/src/utils/fast.rs +++ b/src/utils/fast.rs @@ -8,7 +8,7 @@ impl LspServer { /// macro 可以以 ` 开头 pub fn find_macros(&self, macro_name: &str) -> Option<(Define, String)> { let macro_name = macro_name.replace("`", ""); - let path_to_hdl_file = self.srcs.hdl_param.path_to_hdl_file.read().unwrap(); + let path_to_hdl_file = self.db.hdl_param.path_to_hdl_file.read().unwrap(); for (path, hdl_file) in path_to_hdl_file.iter() { for define in &hdl_file.fast.fast_macro.defines { if define.name == macro_name {