1 //! Analyze all modules in a project for diagnostics. Exits with a non-zero status
2 //! code if any errors are found.
6 use ra_db::SourceDatabaseExt;
8 use std::{collections::HashSet, path::Path};
10 use crate::cli::{load_cargo::load_cargo, Result};
14 load_output_dirs: bool,
15 with_proc_macro: bool,
18 let (host, _vfs) = load_cargo(path, load_output_dirs, with_proc_macro)?;
19 let db = host.raw_database();
20 let analysis = host.analysis();
22 let mut found_error = false;
23 let mut visited_files = HashSet::new();
25 let mut work = Vec::new();
26 let krates = Crate::all(db);
28 let module = krate.root_module(db).expect("crate without root module");
29 let file_id = module.definition_source(db).file_id;
30 let file_id = file_id.original_file(db);
31 let source_root = db.file_source_root(file_id);
32 let source_root = db.source_root(source_root);
33 if !source_root.is_library {
39 let file_id = module.definition_source(db).file_id.original_file(db);
40 if !visited_files.contains(&file_id) {
41 let crate_name = if let Some(name) = module.krate().display_name(db) {
44 String::from("unknown")
46 println!("processing crate: {}, module: {}", crate_name, _vfs.file_path(file_id));
47 for diagnostic in analysis.diagnostics(file_id).unwrap() {
48 if matches!(diagnostic.severity, Severity::Error) {
52 println!("{:?}", diagnostic);
55 visited_files.insert(file_id);
60 println!("diagnostic scan complete");
64 Err(anyhow!("diagnostic error detected"))