-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlib.rs
More file actions
57 lines (52 loc) · 1.59 KB
/
lib.rs
File metadata and controls
57 lines (52 loc) · 1.59 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
use lexer::*;
use linter::*;
use parser::*;
use scopetable::*;
use std::{fs::File, io::Read, path::PathBuf, rc::Rc};
use symtable::*;
use types::*;
use typetable::*;
struct InternalContext {
source: PathBuf,
parsed: Option<ResultExpr>,
ttbls: Option<Vec<TypeTable>>,
scopes: Option<Vec<ScopeTable>>,
tree: Option<Vec<Rc<Box<TypeTree>>>>,
}
pub struct CacheContext {
files: Vec<InternalContext>,
}
impl CacheContext {
pub fn new() -> Self {
CacheContext { files: vec![] }
}
pub fn add_file(&mut self, source: PathBuf) -> () {
self.files.push(InternalContext {
source,
parsed: None,
ttbls: None,
scopes: None,
tree: None,
});
}
pub fn analysis(&mut self) -> () {
self.files.iter_mut().enumerate().for_each(|(_i, ic)| {
let mut file = File::open(&ic.source).unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
let lexer = TLexer::new(&contents);
let mut parser = Parser::new(lexer);
match parser.all() {
Ok(mut val) => {
let mut ttbls = vec![];
let mut scopes = vec![];
let mut linter = LintSource::new(&contents, &mut scopes, &mut ttbls);
let analysis = linter.lint_check(&mut val);
ic.tree = Some(analysis);
ic.ttbls = Some(ttbls);
}
Err(perr) => ic.parsed = Some(Err(perr)),
}
})
}
}