remove repeat replace logic in parser

This commit is contained in:
light-ly 2024-12-28 15:05:30 +08:00
parent 621dea1819
commit 76af408f3f

View File

@ -554,7 +554,7 @@ fn replace_substring(rope: Rope, substring: &str) -> Rope {
pub fn recovery_sv_parse( pub fn recovery_sv_parse(
doc: &Rope, doc: &Rope,
uri: &Url, uri: &Url,
last_change_range: &Option<Range>, _last_change_range: &Option<Range>,
inc_paths: &[PathBuf], inc_paths: &[PathBuf],
allow_incomplete: bool, allow_incomplete: bool,
) -> Option<(SyntaxTree, sv_parser::common::ParseResult)> { ) -> Option<(SyntaxTree, sv_parser::common::ParseResult)> {
@ -562,26 +562,17 @@ pub fn recovery_sv_parse(
let mut i = 0; let mut i = 0;
let mut includes: Vec<PathBuf> = inc_paths.to_vec(); let mut includes: Vec<PathBuf> = inc_paths.to_vec();
let mut defines = HashMap::new(); let mut defines = HashMap::new();
let mut reverted_change = false;
let mut text = doc.clone(); let mut text = doc.clone();
// TODO: find how to fix it // TODO: find how to fix it
// remove `reset all to avoid parse error // remove `reset all to avoid parse error
text = replace_substring(text, "`resetall"); text = replace_substring(text, "`resetall");
let recover_text_by_byte_idx = |byte_idx: usize, reverted_change: &mut bool, text: &mut Rope| { let recover_text_by_byte_idx = |byte_idx: usize, text: &mut Rope| {
let mut line_start = text.byte_to_line(byte_idx); let line_start = text.byte_to_line(byte_idx);
let mut line_end = text.byte_to_line(byte_idx) + 1; let line_end = text.byte_to_line(byte_idx) + 1;
// println!("byte: {byte_idx}, line_start: {line_start}, line_end: {line_end}"); // info!("byte: {byte_idx}, line_start: {line_start}, line_end: {line_end}");
if !(*reverted_change) {
if let Some(range) = last_change_range {
line_start = range.start.line as usize;
line_end = range.end.line as usize + 1;
*reverted_change = true;
}
}
// 把 last_change 处的地方替换成空格 // 把 last_change 处的地方替换成空格
for line_idx in line_start .. line_end { for line_idx in line_start .. line_end {
@ -614,7 +605,7 @@ pub fn recovery_sv_parse(
sv_parser::Error::Parse(trace) => match trace { sv_parser::Error::Parse(trace) => match trace {
Some((_, byte_idx)) => { Some((_, byte_idx)) => {
// 把出错的地方替换成空格 // 把出错的地方替换成空格
recover_text_by_byte_idx(byte_idx, &mut reverted_change, &mut text); recover_text_by_byte_idx(byte_idx, &mut text);
parse_iterations += 1; parse_iterations += 1;
} }
None => return None, None => return None,
@ -658,14 +649,14 @@ pub fn recovery_sv_parse(
// 把出错的地方替换成空格 // 把出错的地方替换成空格
// println!("text {text:?}"); // println!("text {text:?}");
recover_text_by_byte_idx(byte_idx, &mut reverted_change, &mut text); recover_text_by_byte_idx(byte_idx, &mut text);
parse_iterations += 1; parse_iterations += 1;
} }
None => return None None => return None
} }
sv_parser::Error::DefineArgNotFound(trace) => match trace { sv_parser::Error::DefineArgNotFound(trace) => match trace {
Some((_, start_byte_idx, _)) => { Some((_, start_byte_idx, _)) => {
recover_text_by_byte_idx(start_byte_idx, &mut reverted_change, &mut text); recover_text_by_byte_idx(start_byte_idx, &mut text);
// recover_text_by_byte_idx(end_byte_idx, &mut reverted_change, &mut text); // recover_text_by_byte_idx(end_byte_idx, &mut reverted_change, &mut text);
parse_iterations += 1; parse_iterations += 1;
} }
@ -673,7 +664,7 @@ pub fn recovery_sv_parse(
} }
sv_parser::Error::DefineNoArgs(trace) => match trace { sv_parser::Error::DefineNoArgs(trace) => match trace {
Some((_, start_byte_idx, _)) => { Some((_, start_byte_idx, _)) => {
recover_text_by_byte_idx(start_byte_idx, &mut reverted_change, &mut text); recover_text_by_byte_idx(start_byte_idx, &mut text);
parse_iterations += 1; parse_iterations += 1;
} }
_ => return None _ => return None