Skip to content

Commit bf75cca

Browse files
committed
code prep
1 parent e0fb899 commit bf75cca

File tree

6 files changed

+151
-119
lines changed

6 files changed

+151
-119
lines changed

cpp-linter-lib/src/clang_tools/clang_format.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use serde_xml_rs::de::Deserializer;
1212

1313
// project-specific crates/modules
1414
use crate::{
15-
cli::LinesChangedOnly,
15+
cli::ClangParams,
1616
common_fs::{get_line_cols_from_offset, FileObj},
1717
};
1818

@@ -79,15 +79,14 @@ pub fn tally_format_advice(files: &[Arc<Mutex<FileObj>>]) -> u64 {
7979

8080
/// Run clang-tidy for a specific `file`, then parse and return it's XML output.
8181
pub fn run_clang_format(
82-
cmd: &mut Command,
8382
file: &mut Arc<Mutex<FileObj>>,
84-
style: &str,
85-
lines_changed_only: &LinesChangedOnly,
83+
clang_params: &ClangParams,
8684
) -> Vec<(log::Level, String)> {
85+
let mut cmd = Command::new(clang_params.clang_format_command.as_ref().unwrap());
8786
let mut logs = vec![];
8887
let mut file = file.lock().unwrap();
89-
cmd.args(["--style", style, "--output-replacements-xml"]);
90-
let ranges = file.get_ranges(lines_changed_only);
88+
cmd.args(["--style", &clang_params.style, "--output-replacements-xml"]);
89+
let ranges = file.get_ranges(&clang_params.lines_changed_only);
9190
for range in &ranges {
9291
cmd.arg(format!("--lines={}:{}", range.start(), range.end()));
9392
}

cpp-linter-lib/src/clang_tools/clang_tidy.rs

+47-40
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use serde::Deserialize;
1414

1515
// project-specific modules/crates
1616
use crate::{
17-
cli::LinesChangedOnly,
17+
cli::{ClangParams, LinesChangedOnly},
1818
common_fs::{normalize_path, FileObj},
1919
};
2020

@@ -184,29 +184,25 @@ pub fn tally_tidy_advice(files: &[Arc<Mutex<FileObj>>]) -> u64 {
184184

185185
/// Run clang-tidy, then parse and return it's output.
186186
pub fn run_clang_tidy(
187-
cmd: &mut Command,
188187
file: &mut Arc<Mutex<FileObj>>,
189-
checks: &str,
190-
lines_changed_only: &LinesChangedOnly,
191-
database: &Option<PathBuf>,
192-
extra_args: &Option<Vec<String>>,
193-
database_json: &Option<Vec<CompilationUnit>>,
188+
clang_params: &ClangParams,
194189
) -> Vec<(log::Level, std::string::String)> {
190+
let mut cmd = Command::new(clang_params.clang_tidy_command.as_ref().unwrap());
195191
let mut logs = vec![];
196192
let mut file = file.lock().unwrap();
197-
if !checks.is_empty() {
198-
cmd.args(["-checks", checks]);
193+
if !clang_params.tidy_checks.is_empty() {
194+
cmd.args(["-checks", &clang_params.tidy_checks]);
199195
}
200-
if let Some(db) = database {
196+
if let Some(db) = &clang_params.database {
201197
cmd.args(["-p", &db.to_string_lossy()]);
202198
}
203-
if let Some(extras) = extra_args {
199+
if let Some(extras) = &clang_params.extra_args {
204200
for arg in extras {
205201
cmd.args(["--extra-arg", format!("\"{}\"", arg).as_str()]);
206202
}
207203
}
208-
if *lines_changed_only != LinesChangedOnly::Off {
209-
let ranges = file.get_ranges(lines_changed_only);
204+
if clang_params.lines_changed_only != LinesChangedOnly::Off {
205+
let ranges = file.get_ranges(&clang_params.lines_changed_only);
210206
let filter = format!(
211207
"[{{\"name\":{:?},\"lines\":{:?}}}]",
212208
&file
@@ -249,7 +245,7 @@ pub fn run_clang_tidy(
249245
),
250246
));
251247
}
252-
file.tidy_advice = parse_tidy_output(&output.stdout, database_json);
248+
file.tidy_advice = parse_tidy_output(&output.stdout, &clang_params.database_json);
253249
logs
254250
}
255251

@@ -258,13 +254,16 @@ mod test {
258254
use std::{
259255
env,
260256
path::PathBuf,
261-
process::Command,
262257
sync::{Arc, Mutex},
263258
};
264259

265260
use regex::Regex;
266261

267-
use crate::{clang_tools::get_clang_tool_exe, cli::LinesChangedOnly, common_fs::FileObj};
262+
use crate::{
263+
clang_tools::get_clang_tool_exe,
264+
cli::{ClangParams, LinesChangedOnly},
265+
common_fs::FileObj,
266+
};
268267

269268
use super::run_clang_tidy;
270269

@@ -297,33 +296,41 @@ mod test {
297296
env::var("CLANG_VERSION").unwrap_or("".to_string()).as_str(),
298297
)
299298
.unwrap();
300-
let mut cmd = Command::new(exe_path);
301299
let file = FileObj::new(PathBuf::from("tests/demo/demo.cpp"));
302300
let mut arc_ref = Arc::new(Mutex::new(file));
303301
let extra_args = vec!["-std=c++17".to_string(), "-Wall".to_string()];
304-
run_clang_tidy(
305-
&mut cmd,
306-
&mut arc_ref,
307-
"", // use .clang-tidy config file
308-
&LinesChangedOnly::Off, // check all lines
309-
&None, // no database path
310-
&Some(extra_args), // <---- the reason for this test
311-
&None, // no deserialized database
312-
);
313-
// since `cmd` was passed as a mutable reference, we can inspect the args that were added
314-
let locked_file = arc_ref.lock().unwrap();
315-
let mut args = cmd
316-
.get_args()
317-
.map(|arg| arg.to_str().unwrap())
302+
let clang_params = ClangParams {
303+
style: "".to_string(),
304+
tidy_checks: "".to_string(), // use .clang-tidy config file
305+
lines_changed_only: LinesChangedOnly::Off,
306+
database: None,
307+
extra_args: Some(extra_args.clone()), // <---- the reason for this test
308+
database_json: None,
309+
format_filter: None,
310+
tidy_filter: None,
311+
tidy_review: false,
312+
format_review: false,
313+
clang_tidy_command: Some(exe_path),
314+
clang_format_command: None,
315+
};
316+
let logs = run_clang_tidy(&mut arc_ref, &clang_params)
317+
.into_iter()
318+
.filter_map(|(_lvl, msg)| {
319+
if msg.contains("Running ") {
320+
return Some(msg);
321+
} else {
322+
return None;
323+
}
324+
})
325+
.collect::<Vec<String>>();
326+
let args = &logs
327+
.first()
328+
.expect("expected a log message about invoked clang-tidy command")
329+
.split(' ')
318330
.collect::<Vec<&str>>();
319-
assert_eq!(locked_file.name.to_string_lossy(), args.pop().unwrap());
320-
assert_eq!(
321-
vec!["--extra-arg", "\"-std=c++17\"", "--extra-arg", "\"-Wall\""],
322-
args
323-
);
324-
assert!(!locked_file
325-
.tidy_advice
326-
.as_ref()
327-
.is_some_and(|advice| advice.notes.is_empty()));
331+
for arg in &extra_args {
332+
let extra_arg = format!("\"{arg}\"");
333+
assert!(args.contains(&extra_arg.as_str()));
334+
}
328335
}
329336
}

cpp-linter-lib/src/clang_tools/mod.rs

+10-19
Original file line numberDiff line numberDiff line change
@@ -92,20 +92,14 @@ fn analyze_single_file(
9292
let file_name = file_lock.name.clone();
9393
drop(file_lock);
9494
let mut logs = vec![];
95-
if let Some(tidy_cmd) = &clang_params.clang_tidy_command {
95+
if clang_params.clang_tidy_command.is_some() {
9696
if clang_params
9797
.tidy_filter
98-
.is_source_or_ignored(file_name.as_path())
98+
.as_ref()
99+
.is_some_and(|f| f.is_source_or_ignored(file_name.as_path()))
100+
|| clang_params.tidy_filter.is_none()
99101
{
100-
let tidy_result = run_clang_tidy(
101-
&mut Command::new(tidy_cmd),
102-
file,
103-
clang_params.tidy_checks.as_str(),
104-
&clang_params.lines_changed_only,
105-
&clang_params.database,
106-
&clang_params.extra_args,
107-
&clang_params.database_json,
108-
);
102+
let tidy_result = run_clang_tidy(file, &clang_params);
109103
logs.extend(tidy_result);
110104
} else {
111105
logs.push((
@@ -117,17 +111,14 @@ fn analyze_single_file(
117111
))
118112
}
119113
}
120-
if let Some(format_cmd) = &clang_params.clang_format_command {
114+
if clang_params.clang_format_command.is_some() {
121115
if clang_params
122116
.format_filter
123-
.is_source_or_ignored(file_name.as_path())
117+
.as_ref()
118+
.is_some_and(|f| f.is_source_or_ignored(file_name.as_path()))
119+
|| clang_params.format_filter.is_none()
124120
{
125-
let format_result = run_clang_format(
126-
&mut Command::new(format_cmd),
127-
file,
128-
clang_params.style.as_str(),
129-
&clang_params.lines_changed_only,
130-
);
121+
let format_result = run_clang_format(file, &clang_params);
131122
logs.extend(format_result);
132123
} else {
133124
logs.push((

0 commit comments

Comments
 (0)