add primitives port/param auto completion

This commit is contained in:
light-ly 2024-11-13 22:45:18 +08:00
parent 82b4f6f092
commit ec5e1f19c4
2 changed files with 113 additions and 56 deletions

View File

@ -167,35 +167,58 @@ fn get_position_port_param_completion(
// 补全当前 module 的所有 param // 补全当前 module 的所有 param
if let Some((inst_module, file_type, _)) = hdl_param.find_module_context_by_name(&instance.inst_type) { if let Some((inst_module, file_type, _)) = hdl_param.find_module_context_by_name(&instance.inst_type) {
let mut completion_items = Vec::<CompletionItem>::new(); let mut completion_items = Vec::<CompletionItem>::new();
for param in inst_module.params { match file_type.as_str() {
let label_details = CompletionItemLabelDetails { "primitives" => {
detail: None, if let Some(primitives_inst) = inst_module.instances.first() {
..CompletionItemLabelDetails::default() for param_assignment in &primitives_inst.intstparam_assignments {
}; let label_details = CompletionItemLabelDetails {
detail: None,
..CompletionItemLabelDetails::default()
};
let param_desc = match file_type.as_str() { let name = param_assignment.parameter.clone().unwrap();
"common" => { let param_desc = format!("parameter {}", name);
param.to_vlog_description()
}
"ip" => {
param.to_vhdl_description()
}
"primitives" => {
param.to_vlog_description()
}
_ => {
param.to_vlog_description()
}
};
let c_item = CompletionItem { let c_item = CompletionItem {
label: param.name, label: name,
detail: Some(param_desc), detail: Some(param_desc),
label_details: Some(label_details), label_details: Some(label_details),
kind: Some(CompletionItemKind::TYPE_PARAMETER), kind: Some(CompletionItemKind::TYPE_PARAMETER),
..CompletionItem::default() ..CompletionItem::default()
}; };
completion_items.push(c_item); completion_items.push(c_item);
}
}
}
_ => {
for param in inst_module.params {
let label_details = CompletionItemLabelDetails {
detail: None,
..CompletionItemLabelDetails::default()
};
let param_desc = match file_type.as_str() {
"common" => {
param.to_vlog_description()
}
"ip" => {
param.to_vhdl_description()
}
_ => {
param.to_vlog_description()
}
};
let c_item = CompletionItem {
label: param.name,
detail: Some(param_desc),
label_details: Some(label_details),
kind: Some(CompletionItemKind::TYPE_PARAMETER),
..CompletionItem::default()
};
completion_items.push(c_item);
}
}
} }
return Some(CompletionList { return Some(CompletionList {
is_incomplete: false, is_incomplete: false,
@ -210,35 +233,58 @@ fn get_position_port_param_completion(
if port_range.contains(pos) { if port_range.contains(pos) {
if let Some((inst_module, file_type, _)) = hdl_param.find_module_context_by_name(&instance.inst_type) { if let Some((inst_module, file_type, _)) = hdl_param.find_module_context_by_name(&instance.inst_type) {
let mut completion_items = Vec::<CompletionItem>::new(); let mut completion_items = Vec::<CompletionItem>::new();
for port in inst_module.ports { match file_type.as_str() {
let label_details = CompletionItemLabelDetails { "primitives" => {
detail: None, if let Some(primitives_inst) = inst_module.instances.first() {
..CompletionItemLabelDetails::default() for port_assignment in &primitives_inst.intstport_assignments {
}; let label_details = CompletionItemLabelDetails {
detail: None,
..CompletionItemLabelDetails::default()
};
let port_desc = match file_type.as_str() { let name = port_assignment.port.clone().unwrap();
"common" => { let port_desc = format!("parameter {}", name);
port.to_vlog_description()
}
"ip" => {
port.to_vhdl_description()
}
"primitives" => {
port.to_vlog_description()
}
_ => {
port.to_vlog_description()
}
};
let c_item = CompletionItem { let c_item = CompletionItem {
label: port.name, label: name,
detail: Some(port_desc), detail: Some(port_desc),
label_details: Some(label_details), label_details: Some(label_details),
kind: Some(CompletionItemKind::PROPERTY), kind: Some(CompletionItemKind::PROPERTY),
..CompletionItem::default() ..CompletionItem::default()
}; };
completion_items.push(c_item); completion_items.push(c_item);
}
}
}
_ => {
for port in inst_module.ports {
let label_details = CompletionItemLabelDetails {
detail: None,
..CompletionItemLabelDetails::default()
};
let port_desc = match file_type.as_str() {
"common" => {
port.to_vlog_description()
}
"ip" => {
port.to_vhdl_description()
}
_ => {
port.to_vlog_description()
}
};
let c_item = CompletionItem {
label: port.name,
detail: Some(port_desc),
label_details: Some(label_details),
kind: Some(CompletionItemKind::PROPERTY),
..CompletionItem::default()
};
completion_items.push(c_item);
}
}
} }
return Some(CompletionList { return Some(CompletionList {
is_incomplete: false, is_incomplete: false,

View File

@ -217,6 +217,17 @@ fn make_primitives_instantiation_code(text: &str) -> String {
}).collect::<Vec<String>>().join("\n") }).collect::<Vec<String>>().join("\n")
} }
fn make_primitives_module_profile_code(text: &str) -> String {
let mut lines: Vec<&str> = text.split_inclusive('\n').collect();
if lines.len() > 1 {
lines.remove(0);
lines.pop();
}
lines.join("")
}
fn make_instantiation_code(module: &crate::core::hdlparam::Module) -> String { fn make_instantiation_code(module: &crate::core::hdlparam::Module) -> String {
// makeVlogParamAssignments 参数信息列表 // makeVlogParamAssignments 参数信息列表
@ -298,8 +309,8 @@ fn make_module_completions(
let primitive_map = server.srcs.primitive_text.name_to_text.read().unwrap(); let primitive_map = server.srcs.primitive_text.name_to_text.read().unwrap();
if let Some(text) = primitive_map.get(&module.name) { if let Some(text) = primitive_map.get(&module.name) {
( (
make_primitives_instantiation_code(&text), make_primitives_instantiation_code(text),
(*text).clone(), make_primitives_module_profile_code(text),
format!("[Definition] Primitive module: {}", module.name) format!("[Definition] Primitive module: {}", module.name)
) )
} else { } else {