From f2ccd76a6546c9ae3ee8c176e64b8e4e7302c32c Mon Sep 17 00:00:00 2001 From: LSTM-Kirigaya <1193466151@qq.com> Date: Wed, 8 Jan 2025 19:32:33 +0800 Subject: [PATCH] update --- src/diagnostics/verilator.rs | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/diagnostics/verilator.rs b/src/diagnostics/verilator.rs index 085459c..02c368a 100644 --- a/src/diagnostics/verilator.rs +++ b/src/diagnostics/verilator.rs @@ -158,10 +158,13 @@ impl AbstractLinterConfiguration for VerilatorConfiguration { _ => "".to_string(), }; + // TODO: 支持更多的报错 + let end_pos = refine_end_pos(rope, &message, pos); + let message = format!("{}\n\n{}", message, error_tuple.1); let diagnostic = Diagnostic { - range: Range::new(pos, pos), + range: Range::new(pos, end_pos), code: None, severity, source: Some("Digital IDE: verilator".to_string()), @@ -201,7 +204,6 @@ fn match_not_module_found(error_line: &str) -> Option { strings.push(char); } - info!("strings: {:?}", strings); if strings.starts_with("'") && strings.ends_with("'") { strings = strings[1 .. strings.len() - 1].to_string(); } @@ -222,7 +224,8 @@ fn make_include_args( let path = Path::new(path_string); if let Some(parent) = path.parent() { let folder_string = parent.to_str().unwrap(); - include_paths.insert(format!("-I{}", folder_string)); + // 加入目标文件的 __dirname + include_paths.insert(folder_string.to_string()); } let workspace_path = from_uri_to_escape_path_string(&workspace); @@ -230,8 +233,11 @@ fn make_include_args( let workspace = PathBuf::from_str(&workspace_path).unwrap(); let src_path = workspace.join("user").join("src"); let sim_path = workspace.join("user").join("sim"); + // 加入 user/src include_paths.insert(src_path.to_str().unwrap().to_string()); + // 加入 user/sim include_paths.insert(sim_path.to_str().unwrap().to_string()); + // 加入 workspace include_paths.insert(workspace_path); } @@ -240,4 +246,27 @@ fn make_include_args( include_args.push(format!("-I{}", path)); } include_args +} + +fn refine_end_pos( + rope: &Rope, + message: &str, + pos: Position +) -> Position { + if message.starts_with("Cannot find include file") { + let mut pls = message.split(":"); + if let Some(include_name) = pls.nth(1) { + let include_name = include_name.trim(); + let line_text = rope.line(pos.line as usize).to_string(); + if let Some(index) = line_text.find(include_name) { + let end_character = index + include_name.len() + 1; + let pos = Position { + line: pos.line, + character: end_character as u32 + }; + return pos; + } + } + } + pos } \ No newline at end of file