-
Notifications
You must be signed in to change notification settings - Fork 210
Expand file tree
/
Copy pathanalysis_pass.rs
More file actions
73 lines (65 loc) · 1.93 KB
/
analysis_pass.rs
File metadata and controls
73 lines (65 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use crate::{diagnostics::DiagnosticVoucher, HirAnalysisDb};
use hir::{
hir_def::{ModuleTree, TopLevelMod},
lower::parse_file_impl,
ParserError,
};
/// All analysis passes that run analysis on the HIR top level module
/// granularity should implement this trait.
pub trait ModuleAnalysisPass {
fn run_on_module<'db>(
&mut self,
db: &'db dyn HirAnalysisDb,
top_mod: TopLevelMod<'db>,
) -> Vec<Box<dyn DiagnosticVoucher + 'db>>;
}
#[derive(Default)]
pub struct AnalysisPassManager {
module_passes: Vec<Box<dyn ModuleAnalysisPass>>,
}
impl AnalysisPassManager {
pub fn new() -> Self {
Self::default()
}
pub fn add_module_pass(&mut self, pass: Box<dyn ModuleAnalysisPass>) {
self.module_passes.push(pass);
}
pub fn run_on_module<'db>(
&mut self,
db: &'db dyn HirAnalysisDb,
top_mod: TopLevelMod<'db>,
) -> Vec<Box<dyn DiagnosticVoucher + 'db>> {
let mut diags = vec![];
for pass in self.module_passes.iter_mut() {
diags.extend(pass.run_on_module(db, top_mod));
}
diags
}
pub fn run_on_module_tree<'db>(
&mut self,
db: &'db dyn HirAnalysisDb,
tree: &'db ModuleTree<'db>,
) -> Vec<Box<dyn DiagnosticVoucher + 'db>> {
let mut diags = vec![];
for module in tree.all_modules() {
for pass in self.module_passes.iter_mut() {
diags.extend(pass.run_on_module(db, module));
}
}
diags
}
}
#[derive(Clone, Copy)]
pub struct ParsingPass {}
impl ModuleAnalysisPass for ParsingPass {
fn run_on_module<'db>(
&mut self,
db: &'db dyn HirAnalysisDb,
top_mod: TopLevelMod<'db>,
) -> Vec<Box<dyn DiagnosticVoucher>> {
parse_file_impl::accumulated::<ParserError>(db, top_mod)
.into_iter()
.map(|d| Box::new(d.clone()) as _)
.collect::<Vec<_>>()
}
}