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