From 989b66b737620aebd299183e43030af2820f52c4 Mon Sep 17 00:00:00 2001 From: light-ly Date: Sat, 16 Nov 2024 10:23:49 +0800 Subject: [PATCH] skip architecture when there is no entity --- src/core/vhdl_parser.rs | 90 ++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/src/core/vhdl_parser.rs b/src/core/vhdl_parser.rs index 76bc8be..0a87bb9 100644 --- a/src/core/vhdl_parser.rs +++ b/src/core/vhdl_parser.rs @@ -144,47 +144,55 @@ fn parse_tokens(tokens: Vec) -> Vec { "architecture" => { if (i >= 1 as usize) && (kind_str(tokens[i-1].kind) != "end") || (i < 1) { // !!! We not think of Architecture as VHDL Module Now - // let name = get_value(&tokens[i+3]); - // if let None = modules.iter().find(|module| module.name == name) { - // let start_pos = tokens[i].pos.range.start; - // i += 1; - // let arch_name = get_value(&tokens[i]); - // // println!("arch name {:?}", arch_name); - // let mut end = i; - // while (end+1 < tokens.len()) && - // !(kind_str(tokens[end].kind) == "end" && - // (kind_str(tokens[end+1].kind) == "architecture" || get_value(&tokens[end+1]) == arch_name)) { - // end += 1; - // } - // let end_pos = if end+1 < tokens.len() && get_value(&tokens[end+1]) == arch_name { - // // i = end + 2; - // tokens[end+2].pos.range.end - // } else if end + 3 < tokens.len() { - // // i = end + 3; - // tokens[end+3].pos.range.end - // } else { - // // i = end; - // tokens[end].pos.range.end - // }; - // let module = Module { - // name: name.to_string(), - // params: Vec::new(), - // ports: Vec::new(), - // instances: Vec::new(), - // range: Range { - // start: Position { - // line: start_pos.line + 1, - // character: start_pos.character + 1 - // }, - // end: Position { - // line: end_pos.line + 1, - // character: end_pos.character + 1 - // } - // } - // }; - // last_module_name = name.to_string(); - // modules.push(module); - // } + // !!! So skip all Architecture Parse when there is no it's Entity + let name = get_value(&tokens[i+3]); + if let None = modules.iter().find(|module| module.name == name) { + // let start_pos = tokens[i].pos.range.start; + i += 1; + let arch_name = get_value(&tokens[i]); + // println!("arch name {:?}", arch_name); + let mut end = i; + while (end+1 < tokens.len()) && + !(kind_str(tokens[end].kind) == "end" && + (kind_str(tokens[end+1].kind) == "architecture" || get_value(&tokens[end+1]) == arch_name)) { + end += 1; + } + if end+1 < tokens.len() && get_value(&tokens[end+1]) == arch_name { + i = end + 2; + } else if end + 3 < tokens.len() { + i = end + 3; + } else { + i = end; + }; + // let end_pos = if end+1 < tokens.len() && get_value(&tokens[end+1]) == arch_name { + // i = end + 2; + // tokens[end+2].pos.range.end + // } else if end + 3 < tokens.len() { + // i = end + 3; + // tokens[end+3].pos.range.end + // } else { + // i = end; + // tokens[end].pos.range.end + // }; + // let module = Module { + // name: name.to_string(), + // params: Vec::new(), + // ports: Vec::new(), + // instances: Vec::new(), + // range: Range { + // start: Position { + // line: start_pos.line + 1, + // character: start_pos.character + 1 + // }, + // end: Position { + // line: end_pos.line + 1, + // character: end_pos.character + 1 + // } + // } + // }; + // last_module_name = name.to_string(); + // modules.push(module); + } } } "configuration" => {