]> git.lizzy.rs Git - rust.git/blob - crates/rust-analyzer/src/cli/diagnostics.rs
Merge branch 'Veetaha-feat/sync-branch'
[rust.git] / crates / rust-analyzer / src / cli / diagnostics.rs
1 //! Analyze all modules in a project for diagnostics. Exits with a non-zero status
2 //! code if any errors are found.
3
4 use anyhow::anyhow;
5 use hir::Crate;
6 use ra_db::SourceDatabaseExt;
7 use ra_ide::Severity;
8 use std::{collections::HashSet, path::Path};
9
10 use crate::cli::{load_cargo::load_cargo, Result};
11
12 pub fn diagnostics(
13     path: &Path,
14     load_output_dirs: bool,
15     with_proc_macro: bool,
16     _all: bool,
17 ) -> Result<()> {
18     let (host, _vfs) = load_cargo(path, load_output_dirs, with_proc_macro)?;
19     let db = host.raw_database();
20     let analysis = host.analysis();
21
22     let mut found_error = false;
23     let mut visited_files = HashSet::new();
24
25     let mut work = Vec::new();
26     let krates = Crate::all(db);
27     for krate in krates {
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 {
34             work.push(module);
35         }
36     }
37
38     for module in work {
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) {
42                 format!("{}", name)
43             } else {
44                 String::from("unknown")
45             };
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) {
49                     found_error = true;
50                 }
51
52                 println!("{:?}", diagnostic);
53             }
54
55             visited_files.insert(file_id);
56         }
57     }
58
59     println!();
60     println!("diagnostic scan complete");
61
62     if found_error {
63         println!();
64         Err(anyhow!("diagnostic error detected"))
65     } else {
66         Ok(())
67     }
68 }