修复 hover 显示错误 bug
This commit is contained in:
parent
fcfa4b141a
commit
089d6ab161
2
rust_hdl
2
rust_hdl
@ -1 +1 @@
|
|||||||
Subproject commit 0a335218d2f8e469ed3f510d168e4cd4ad2c1057
|
Subproject commit 47686dd663b8fd063f4064fea012088a89f7aeb3
|
@ -156,11 +156,15 @@ fn get_position_port_param_completion(
|
|||||||
let path = PathBuf::from_str(url.path()).unwrap();
|
let path = PathBuf::from_str(url.path()).unwrap();
|
||||||
let path = to_escape_path(&path);
|
let path = to_escape_path(&path);
|
||||||
let path_string = path.to_str().unwrap();
|
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) {
|
if let Some(hdl_file) = fast_map.get(path_string) {
|
||||||
|
info!("find hdl_file, content: {:?}", hdl_file.fast.content);
|
||||||
// 在当前文件的 fast 中寻找
|
// 在当前文件的 fast 中寻找
|
||||||
for module in &hdl_file.fast.content {
|
for module in &hdl_file.fast.content {
|
||||||
for instance in &module.instances {
|
for instance in &module.instances {
|
||||||
if let Some(param_range) = &instance.instparams {
|
if let Some(param_range) = &instance.instparams {
|
||||||
|
let mut param_range = param_range.clone();
|
||||||
|
param_range.affine(-1, -1);
|
||||||
if param_range.contains(pos) {
|
if param_range.contains(pos) {
|
||||||
// 补全当前 module 的所有 param
|
// 补全当前 module 的所有 param
|
||||||
let inst_module = hdl_param.find_module_by_name(&instance.inst_type);
|
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,
|
label: param.name,
|
||||||
detail: Some(param_desc),
|
detail: Some(param_desc),
|
||||||
label_details: Some(label_details),
|
label_details: Some(label_details),
|
||||||
kind: Some(CompletionItemKind::CONSTANT),
|
kind: Some(CompletionItemKind::TYPE_PARAMETER),
|
||||||
..CompletionItem::default()
|
..CompletionItem::default()
|
||||||
};
|
};
|
||||||
completion_items.push(c_item);
|
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) {
|
if port_range.contains(pos) {
|
||||||
let inst_module = hdl_param.find_module_by_name(&instance.inst_type);
|
let inst_module = hdl_param.find_module_by_name(&instance.inst_type);
|
||||||
if inst_module.is_some() {
|
if inst_module.is_some() {
|
||||||
@ -208,7 +213,7 @@ fn get_position_port_param_completion(
|
|||||||
label: port.name,
|
label: port.name,
|
||||||
detail: Some(param_desc),
|
detail: Some(param_desc),
|
||||||
label_details: Some(label_details),
|
label_details: Some(label_details),
|
||||||
kind: Some(CompletionItemKind::CONSTANT),
|
kind: Some(CompletionItemKind::PROPERTY),
|
||||||
..CompletionItem::default()
|
..CompletionItem::default()
|
||||||
};
|
};
|
||||||
completion_items.push(c_item);
|
completion_items.push(c_item);
|
||||||
|
@ -117,6 +117,44 @@ pub struct Instance {
|
|||||||
pub range: Range
|
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)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct Module {
|
pub struct Module {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
@ -52,6 +52,13 @@ mod test_fast {
|
|||||||
assert!(hdlparam.is_some());
|
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]
|
#[test]
|
||||||
fn test_testfiles() {
|
fn test_testfiles() {
|
||||||
let ws_path = env::current_dir().unwrap();
|
let ws_path = env::current_dir().unwrap();
|
||||||
|
@ -36,7 +36,8 @@ dependence_1 u_dependence_1_2(
|
|||||||
.a(a),
|
.a(a),
|
||||||
.b(b),
|
.b(b),
|
||||||
.c(c),
|
.c(c),
|
||||||
.Result(Qus)
|
.Result(Qus),
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
dependence_3 u_dependence_3(
|
dependence_3 u_dependence_3(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user