修复 hover 显示错误 bug

This commit is contained in:
锦恢 2024-10-04 20:33:27 +08:00
parent fcfa4b141a
commit 089d6ab161
5 changed files with 56 additions and 5 deletions

@ -1 +1 @@
Subproject commit 0a335218d2f8e469ed3f510d168e4cd4ad2c1057
Subproject commit 47686dd663b8fd063f4064fea012088a89f7aeb3

View File

@ -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);

View File

@ -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,

View File

@ -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();

View File

@ -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(