From 089d6ab1611b98532e6abb4c36c17f577d252bbc Mon Sep 17 00:00:00 2001 From: LSTM-Kirigaya <1193466151@qq.com> Date: Fri, 4 Oct 2024 20:33:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20hover=20=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=94=99=E8=AF=AF=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rust_hdl | 2 +- src/completion/feature.rs | 11 ++++++++--- src/core/hdlparam.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/test/mod.rs | 7 +++++++ testfiles/parent.v | 3 ++- 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/rust_hdl b/rust_hdl index 0a33521..47686dd 160000 --- a/rust_hdl +++ b/rust_hdl @@ -1 +1 @@ -Subproject commit 0a335218d2f8e469ed3f510d168e4cd4ad2c1057 +Subproject commit 47686dd663b8fd063f4064fea012088a89f7aeb3 diff --git a/src/completion/feature.rs b/src/completion/feature.rs index 4946cd2..e5c83ae 100644 --- a/src/completion/feature.rs +++ b/src/completion/feature.rs @@ -156,11 +156,15 @@ fn get_position_port_param_completion( let path = PathBuf::from_str(url.path()).unwrap(); let path = to_escape_path(&path); let path_string = path.to_str().unwrap(); + info!("enter get_position_port_param_completion, pos: {pos:?}"); if let Some(hdl_file) = fast_map.get(path_string) { + info!("find hdl_file, content: {:?}", hdl_file.fast.content); // 在当前文件的 fast 中寻找 for module in &hdl_file.fast.content { for instance in &module.instances { if let Some(param_range) = &instance.instparams { + let mut param_range = param_range.clone(); + param_range.affine(-1, -1); if param_range.contains(pos) { // 补全当前 module 的所有 param let inst_module = hdl_param.find_module_by_name(&instance.inst_type); @@ -178,7 +182,7 @@ fn get_position_port_param_completion( label: param.name, detail: Some(param_desc), label_details: Some(label_details), - kind: Some(CompletionItemKind::CONSTANT), + kind: Some(CompletionItemKind::TYPE_PARAMETER), ..CompletionItem::default() }; completion_items.push(c_item); @@ -191,7 +195,8 @@ fn get_position_port_param_completion( } } - if let Some(port_range) = &instance.instports { + if instance.instports.is_some() { + let port_range = instance.gen_dot_completion_port_range(); if port_range.contains(pos) { let inst_module = hdl_param.find_module_by_name(&instance.inst_type); if inst_module.is_some() { @@ -208,7 +213,7 @@ fn get_position_port_param_completion( label: port.name, detail: Some(param_desc), label_details: Some(label_details), - kind: Some(CompletionItemKind::CONSTANT), + kind: Some(CompletionItemKind::PROPERTY), ..CompletionItem::default() }; completion_items.push(c_item); diff --git a/src/core/hdlparam.rs b/src/core/hdlparam.rs index e90f8eb..025a6c9 100644 --- a/src/core/hdlparam.rs +++ b/src/core/hdlparam.rs @@ -117,6 +117,44 @@ pub struct Instance { pub range: Range } +impl Instance { + pub fn gen_dot_completion_port_range(&self) -> Range { + // TODO: 精心调制这个方法 + if let Some(port_range) = &self.instports { + let mut new_port_range = port_range.clone(); + + info!("get port range: {new_port_range:?}, instance: {self:?}"); + + if let Some(param_range) = &self.instparams { + new_port_range.start.line = param_range.end.line - 1; + new_port_range.start.character = param_range.end.character; + } else { + new_port_range.start.line = self.range.end.line; + new_port_range.start.character = self.range.end.character + 1; + } + + new_port_range.end.line += 1; + new_port_range.affine(-1, -1); + return new_port_range; + } + + self.range.clone() + } + + pub fn gen_dot_completion_param_range(&self) -> Range { + // TODO: 精心调制这个方法 + if let Some(param_range) = &self.instparams { + let mut new_param_range = param_range.clone(); + new_param_range.start.line = self.range.end.line; + new_param_range.start.character = self.range.end.character; + new_param_range.end.line += 1; + return new_param_range; + } + + self.range.clone() + } +} + #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Module { pub name: String, diff --git a/src/test/mod.rs b/src/test/mod.rs index 914714a..acff1f2 100644 --- a/src/test/mod.rs +++ b/src/test/mod.rs @@ -52,6 +52,13 @@ mod test_fast { assert!(hdlparam.is_some()); } + #[test] + fn test_parent() { + let fast = sv_parser("/home/dide/project/digital-lsp-server/testfiles/parent.v"); + let fast = fast.unwrap(); + println!("{:#?}", fast.content); + } + #[test] fn test_testfiles() { let ws_path = env::current_dir().unwrap(); diff --git a/testfiles/parent.v b/testfiles/parent.v index 111eaa2..bd5c66a 100644 --- a/testfiles/parent.v +++ b/testfiles/parent.v @@ -36,7 +36,8 @@ dependence_1 u_dependence_1_2( .a(a), .b(b), .c(c), - .Result(Qus) + .Result(Qus), + ); dependence_3 u_dependence_3(