Skip to main content

lisette_diagnostics/
result.rs

1use std::path::PathBuf;
2
3use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet};
4
5use syntax::ParseError;
6use syntax::program::{Definition, EmitInput, File, ModuleInfo, MutationInfo, UnusedInfo};
7use syntax::types::Symbol;
8
9use crate::LisetteDiagnostic;
10
11pub struct SemanticResult {
12    pub files: HashMap<u32, File>,
13    pub definitions: HashMap<Symbol, Definition>,
14    pub modules: HashMap<String, ModuleInfo>,
15    pub errors: Vec<LisetteDiagnostic>,
16    pub lints: Vec<LisetteDiagnostic>,
17    pub entry_module_id: String,
18    pub unused: UnusedInfo,
19    pub mutations: MutationInfo,
20    pub cached_modules: HashSet<String>,
21    pub ufcs_methods: HashSet<(String, String)>,
22    /// File ID -> on-disk path of the `.d.lis` typedef. Populated for third-party
23    /// go: typedefs read from `target/.lisette/typedefs/...`; absent for embedded
24    /// stdlib typedefs.
25    pub typedef_paths: HashMap<u32, PathBuf>,
26    pub go_package_names: HashMap<String, String>,
27    pub go_module_ids: HashSet<String>,
28}
29
30impl SemanticResult {
31    pub fn with_parse_errors(errors: Vec<ParseError>, entry_module_id: &str) -> Self {
32        Self {
33            files: HashMap::default(),
34            definitions: HashMap::default(),
35            modules: HashMap::default(),
36            errors: errors.into_iter().map(Into::into).collect(),
37            lints: vec![],
38            entry_module_id: entry_module_id.to_string(),
39            unused: UnusedInfo::default(),
40            mutations: MutationInfo::default(),
41            cached_modules: HashSet::default(),
42            ufcs_methods: HashSet::default(),
43            typedef_paths: HashMap::default(),
44            go_package_names: HashMap::default(),
45            go_module_ids: HashSet::default(),
46        }
47    }
48
49    pub fn failed(&self) -> bool {
50        self.errors.iter().any(|e| e.is_error())
51    }
52
53    pub fn into_emit_input(self) -> EmitInput {
54        EmitInput {
55            files: self.files,
56            definitions: self.definitions,
57            modules: self.modules,
58            entry_module_id: self.entry_module_id,
59            unused: self.unused,
60            mutations: self.mutations,
61            cached_modules: self.cached_modules,
62            ufcs_methods: self.ufcs_methods,
63            go_package_names: self.go_package_names,
64            go_module_ids: self.go_module_ids,
65        }
66    }
67}