diff --git a/src/core/primitive_parser.rs b/src/core/primitive_parser.rs index ec954ca..9d62f7e 100644 --- a/src/core/primitive_parser.rs +++ b/src/core/primitive_parser.rs @@ -32,7 +32,7 @@ impl PrimitiveText { pub fn get_comment(&self, name: &str, text: &str) -> String { if let Some(comment) = PrimitiveText::extract_pattern_comments(text).get(name) { - (*comment).clone() + "// ".to_string() + comment } else { "".to_string() } diff --git a/src/hover/feature.rs b/src/hover/feature.rs index 1e64a72..3637c2e 100644 --- a/src/hover/feature.rs +++ b/src/hover/feature.rs @@ -227,11 +227,25 @@ fn goto_instantiation<'a>( // info!("param_range: {param_range:#?}"); // info!("position param find belong module: {:?}", module); - for param in &module.params { - if token_name == param.name { - let file_type = server.srcs.hdl_param.find_file_type_by_module_name(&instance.inst_type); - let hover = make_param_desc_hover(&file_type, param, range, language_id); - return Some(hover); + let file_type = server.srcs.hdl_param.find_file_type_by_module_name(&instance.inst_type); + if file_type == "primitives" { + let primitives_text = server.srcs.primitive_text.clone(); + let params_assignments = &module.instances.first().unwrap().intstparam_assignments; + for assignment in params_assignments { + if assignment.parameter.clone().unwrap() == token_name { + let hover = make_primitives_param_desc_hover( + primitives_text, &instance.inst_type, + assignment, range, language_id + ); + return Some(hover); + } + } + } else { + for param in &module.params { + if token_name == param.name { + let hover = make_param_desc_hover(&file_type, param, range, language_id); + return Some(hover); + } } } return None; @@ -252,8 +266,8 @@ fn goto_instantiation<'a>( let file_type = server.srcs.hdl_param.find_file_type_by_module_name(&instance.inst_type); if file_type == "primitives" { let primitives_text = server.srcs.primitive_text.clone(); - let instance_assignments = &module.instances.first().unwrap().intstport_assignments; - for assignment in instance_assignments { + let port_assignments = &module.instances.first().unwrap().intstport_assignments; + for assignment in port_assignments { if assignment.port.clone().unwrap() == token_name { let hover = make_primitives_port_desc_hover( primitives_text, &instance.inst_type, @@ -310,6 +324,30 @@ pub fn hover_position_port_param( None } +fn make_primitives_param_desc_hover( + primitives_text: Arc, + primitives_name: &str, + inst_param: &crate::core::hdlparam::InstParameter, + range: &Range, language_id: &str) -> Hover { + + let name = inst_param.parameter.clone().unwrap(); + let text_map = primitives_text.name_to_text.read().unwrap(); + let comment = if let Some(text) = text_map.get(primitives_name) { + primitives_text.get_comment(&name, text) + } else { + "".to_string() + }; + + let language_string = LanguageString { + language: language_id.to_string(), + value: "parameter ".to_string() + &name + " " + &comment, + }; + Hover { + contents: HoverContents::Scalar(MarkedString::LanguageString(language_string)), + range: Some(range.clone()) + } +} + fn make_primitives_port_desc_hover( primitives_text: Arc, primitives_name: &str, @@ -326,7 +364,7 @@ fn make_primitives_port_desc_hover( let language_string = LanguageString { language: language_id.to_string(), - value: name + " // " + &comment, + value: "port ".to_string() + &name + " " + &comment, }; Hover { contents: HoverContents::Scalar(MarkedString::LanguageString(language_string)),