fix instance parameter/port range
This commit is contained in:
parent
2b3752edba
commit
a749580bdb
@ -7,7 +7,7 @@ use log::info;
|
|||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use ropey::Rope;
|
use ropey::Rope;
|
||||||
use tower_lsp::lsp_types::Url;
|
use tower_lsp::lsp_types::Url;
|
||||||
use sv_parser::{unwrap_locate, unwrap_node, EventIter, ListOfParamAssignments, ListOfTypeAssignments, Locate, NodeEvent, ParamAssignment, ParameterDeclaration, RefNode, SyntaxTree, TypeAssignment};
|
use sv_parser::{unwrap_locate, unwrap_node, EventIter, ListOfParamAssignments, Locate, NodeEvent, ParamAssignment, ParameterDeclaration, RefNode, SyntaxTree};
|
||||||
|
|
||||||
use crate::sources::recovery_sv_parse_with_retry;
|
use crate::sources::recovery_sv_parse_with_retry;
|
||||||
use crate::utils::to_escape_path;
|
use crate::utils::to_escape_path;
|
||||||
@ -303,28 +303,22 @@ pub fn make_fast_from_syntaxtree(syntax_tree: &SyntaxTree, path: &PathBuf) -> Re
|
|||||||
let inst_type = syntax_tree.get_str(&id).unwrap();
|
let inst_type = syntax_tree.get_str(&id).unwrap();
|
||||||
|
|
||||||
if let Some(id) = unwrap_node!(x, HierarchicalInstance) {
|
if let Some(id) = unwrap_node!(x, HierarchicalInstance) {
|
||||||
|
let hier_node = id.clone();
|
||||||
let id = get_identifier(id).unwrap();
|
let id = get_identifier(id).unwrap();
|
||||||
let name = syntax_tree.get_str(&id).unwrap();
|
let name = syntax_tree.get_str(&id).unwrap();
|
||||||
let (line, character) = (id.line, get_column_by_offset(&content, id.offset) as u32);
|
let (line, character) = (id.line, get_column_by_offset(&content, id.offset) as u32);
|
||||||
let end_character = character + id.len as u32;
|
let end_character = character + id.len as u32;
|
||||||
|
|
||||||
let (param_start_line, param_start_character,
|
let (param_start_line, param_start_character,
|
||||||
param_end_line, param_end_character) = match unwrap_node!(x, ListOfParameterAssignments) {
|
param_end_line, param_end_character) = match unwrap_node!(x, ParameterValueAssignment) {
|
||||||
Some(RefNode::ListOfParameterAssignments(x)) => {
|
Some(inst_node) => {
|
||||||
let param_assignments = sv_parser::NeedGetLocate::ParamAssignments(x.clone());
|
get_port_parameter_range(&content, inst_node)
|
||||||
get_port_parameter_range(&content, ¶m_assignments)
|
|
||||||
}
|
}
|
||||||
_ => (0, 0, 0, 0)
|
_ => (0, 0, 0, 0)
|
||||||
};
|
};
|
||||||
|
|
||||||
let (port_start_line, port_start_character,
|
let (port_start_line, port_start_character,
|
||||||
port_end_line, port_end_character) = match unwrap_node!(x, ListOfPortConnections) {
|
port_end_line, port_end_character) = get_port_parameter_range(&content, hier_node);
|
||||||
Some(RefNode::ListOfPortConnections(x)) => {
|
|
||||||
let param_assignments = sv_parser::NeedGetLocate::PortConnections(x.clone());
|
|
||||||
get_port_parameter_range(&content, ¶m_assignments)
|
|
||||||
}
|
|
||||||
_ => (0, 0, 0, 0)
|
|
||||||
};
|
|
||||||
|
|
||||||
hdlparam.add_instance(name, inst_type, line, character, end_character,
|
hdlparam.add_instance(name, inst_type, line, character, end_character,
|
||||||
param_start_line, param_start_character, param_end_line, param_end_character,
|
param_start_line, param_start_character, param_end_line, param_end_character,
|
||||||
@ -340,15 +334,15 @@ pub fn make_fast_from_syntaxtree(syntax_tree: &SyntaxTree, path: &PathBuf) -> Re
|
|||||||
|
|
||||||
match unwrap_node!(x, NInputGateInstance, NOutputGateInstance) {
|
match unwrap_node!(x, NInputGateInstance, NOutputGateInstance) {
|
||||||
Some(id) => {
|
Some(id) => {
|
||||||
|
let gate_node = id.clone();
|
||||||
let id = get_identifier(id).unwrap();
|
let id = get_identifier(id).unwrap();
|
||||||
let name = syntax_tree.get_str(&id).unwrap();
|
let name = syntax_tree.get_str(&id).unwrap();
|
||||||
let (line, character) = (id.line, get_column_by_offset(&content, id.offset) as u32);
|
let (line, character) = (id.line, get_column_by_offset(&content, id.offset) as u32);
|
||||||
let end_character = character + id.len as u32;
|
let end_character = character + id.len as u32;
|
||||||
|
|
||||||
let gate_instance = sv_parser::NeedGetLocate::GateInstantiation(x.clone());
|
|
||||||
let (param_start_line, param_start_character, param_end_line, param_end_character) = (0, 0, 0, 0);
|
let (param_start_line, param_start_character, param_end_line, param_end_character) = (0, 0, 0, 0);
|
||||||
let (port_start_line, port_start_character,
|
let (port_start_line, port_start_character,
|
||||||
port_end_line, port_end_character) = get_port_parameter_range(&content, &gate_instance);
|
port_end_line, port_end_character) = get_port_parameter_range(&content, gate_node);
|
||||||
|
|
||||||
hdlparam.add_instance(name, inst_type, line, character, end_character,
|
hdlparam.add_instance(name, inst_type, line, character, end_character,
|
||||||
param_start_line, param_start_character, param_end_line, param_end_character,
|
param_start_line, param_start_character, param_end_line, param_end_character,
|
||||||
@ -367,8 +361,8 @@ pub fn make_fast_from_syntaxtree(syntax_tree: &SyntaxTree, path: &PathBuf) -> Re
|
|||||||
Ok(hdlparam)
|
Ok(hdlparam)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_port_parameter_range(content: &[String], x: &sv_parser::NeedGetLocate) -> (u32, u32, u32, u32) {
|
fn get_port_parameter_range(content: &[String], node: RefNode) -> (u32, u32, u32, u32) {
|
||||||
let locate = get_first_last_locate(&x);
|
let locate = get_first_last_locate(node);
|
||||||
if locate.is_none() {
|
if locate.is_none() {
|
||||||
(0,0,0,0)
|
(0,0,0,0)
|
||||||
} else {
|
} else {
|
||||||
@ -379,60 +373,18 @@ fn get_port_parameter_range(content: &[String], x: &sv_parser::NeedGetLocate) ->
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_first_last_locate(x: &sv_parser::NeedGetLocate) -> Option<(Locate, Locate)> {
|
fn get_first_last_locate(node: RefNode) -> Option<(Locate, Locate)> {
|
||||||
let mut first_locate = Locate { offset: 0, line: 0, len: 0 };
|
let mut first_locate = Locate { offset: 0, line: 0, len: 0 };
|
||||||
let mut last_locate = Locate { offset: 0, line: 0, len: 0 };
|
let mut last_locate = Locate { offset: 0, line: 0, len: 0 };
|
||||||
|
|
||||||
match x {
|
for n in node {
|
||||||
sv_parser::NeedGetLocate::GateInstantiation(gate) => {
|
match n {
|
||||||
for node in gate {
|
RefNode::Symbol(x) => {
|
||||||
match unwrap_node!(node, InputTerminal, OutputTerminal) {
|
let locate = x.nodes.0;
|
||||||
Some(RefNode::InputTerminal(x)) => {
|
if locate != last_locate { last_locate = locate; }
|
||||||
if let Some(id) = unwrap_node!(x, Identifier) {
|
if first_locate.offset == 0 { first_locate = locate; };
|
||||||
let locate = get_identifier(id).unwrap();
|
|
||||||
if locate != last_locate { last_locate = locate; }
|
|
||||||
if first_locate.offset == 0 { first_locate = locate; };
|
|
||||||
} else if let Some(RefNode::Expression(x)) = unwrap_node!(x, Expression) {
|
|
||||||
let exp = sv_parser::NeedParseExpression::Expression(x.clone());
|
|
||||||
if let Some(locate) = parse_expression_only_locate(&exp) {
|
|
||||||
if locate != last_locate { last_locate = locate; }
|
|
||||||
if first_locate.offset == 0 { first_locate = locate; };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some(RefNode::OutputTerminal(x)) => {
|
|
||||||
if let Some(id) = unwrap_node!(x, Identifier) {
|
|
||||||
let locate = get_identifier(id).unwrap();
|
|
||||||
if locate != last_locate { last_locate = locate; }
|
|
||||||
if first_locate.offset == 0 { first_locate = locate; };
|
|
||||||
} else if let Some(RefNode::Expression(x)) = unwrap_node!(x, Expression) {
|
|
||||||
let exp = sv_parser::NeedParseExpression::Expression(x.clone());
|
|
||||||
if let Some(locate) = parse_expression_only_locate(&exp) {
|
|
||||||
if locate != last_locate { last_locate = locate; }
|
|
||||||
if first_locate.offset == 0 { first_locate = locate; };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => ()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
for node in x {
|
|
||||||
match unwrap_node!(node, SimpleIdentifier, Symbol) {
|
|
||||||
Some(RefNode::SimpleIdentifier(x)) => {
|
|
||||||
let locate = x.nodes.0;
|
|
||||||
if locate != last_locate { last_locate = locate; }
|
|
||||||
if first_locate.offset == 0 { first_locate = locate; };
|
|
||||||
}
|
|
||||||
Some(RefNode::Symbol(x)) => {
|
|
||||||
let locate = x.nodes.0;
|
|
||||||
if locate != last_locate { last_locate = locate; }
|
|
||||||
if first_locate.offset == 0 { first_locate = locate; };
|
|
||||||
}
|
|
||||||
_ => ()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
_ => ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,59 +395,6 @@ fn get_first_last_locate(x: &sv_parser::NeedGetLocate) -> Option<(Locate, Locate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_expression_only_locate(x: &sv_parser::NeedParseExpression) -> Option<Locate> {
|
|
||||||
let mut last_locate = Locate { offset: 0, line: 0, len: 0 };
|
|
||||||
|
|
||||||
for node in x {
|
|
||||||
// println!("parse expression::node {:#?}", node);
|
|
||||||
match unwrap_node!(node, SimpleIdentifier, Symbol, UnsignedNumber, HexNumber, OctalNumber, BinaryNumber) {
|
|
||||||
Some(RefNode::SimpleIdentifier(x)) => {
|
|
||||||
let locate = x.nodes.0;
|
|
||||||
if locate != last_locate {
|
|
||||||
last_locate = locate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some(RefNode::Symbol(x)) => {
|
|
||||||
let locate = x.nodes.0;
|
|
||||||
if locate != last_locate {
|
|
||||||
last_locate = locate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some(RefNode::UnsignedNumber(x)) => {
|
|
||||||
let locate = x.nodes.0;
|
|
||||||
if locate != last_locate {
|
|
||||||
last_locate = locate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some(RefNode::HexNumber(x)) => {
|
|
||||||
let locate = x.nodes.1.nodes.0;
|
|
||||||
if locate != last_locate {
|
|
||||||
last_locate = locate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some(RefNode::OctalNumber(x)) => {
|
|
||||||
let locate = x.nodes.1.nodes.0;
|
|
||||||
if locate != last_locate {
|
|
||||||
last_locate = locate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some(RefNode::BinaryNumber(x)) => {
|
|
||||||
let locate = x.nodes.1.nodes.0;
|
|
||||||
if locate != last_locate {
|
|
||||||
last_locate = locate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => ()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if last_locate.offset == 0 {
|
|
||||||
Some(last_locate)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_expression(syntax_tree: &SyntaxTree, x: &sv_parser::NeedParseExpression) -> (String, Option<Locate>) {
|
fn parse_expression(syntax_tree: &SyntaxTree, x: &sv_parser::NeedParseExpression) -> (String, Option<Locate>) {
|
||||||
let mut last_locate = Locate { offset: 0, line: 0, len: 0 };
|
let mut last_locate = Locate { offset: 0, line: 0, len: 0 };
|
||||||
let mut expression = String::new();
|
let mut expression = String::new();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user