darklua_core/process/processors/
find_usage.rs

1use std::ops;
2
3use crate::{
4    nodes::{Identifier, TypeField},
5    process::{IdentifierTracker, NodeProcessor},
6};
7
8/// A processor to find usage of a given variable.
9pub(crate) struct FindUsage<'a> {
10    variable: &'a str,
11    usage_found: bool,
12    identifier_tracker: IdentifierTracker,
13}
14
15impl<'a> ops::Deref for FindUsage<'a> {
16    type Target = IdentifierTracker;
17
18    fn deref(&self) -> &Self::Target {
19        &self.identifier_tracker
20    }
21}
22
23impl<'a> ops::DerefMut for FindUsage<'a> {
24    fn deref_mut(&mut self) -> &mut Self::Target {
25        &mut self.identifier_tracker
26    }
27}
28
29impl<'a> FindUsage<'a> {
30    pub fn new(variable: &'a str) -> Self {
31        Self {
32            variable,
33            usage_found: false,
34            identifier_tracker: Default::default(),
35        }
36    }
37
38    #[inline]
39    pub fn has_found_usage(&self) -> bool {
40        self.usage_found
41    }
42
43    fn verify_identifier(&mut self, variable: &Identifier) {
44        if !self.usage_found && variable.get_name() == self.variable {
45            self.usage_found = !self.is_identifier_used(self.variable);
46        }
47    }
48}
49
50impl<'a> NodeProcessor for FindUsage<'a> {
51    fn process_variable_expression(&mut self, variable: &mut Identifier) {
52        self.verify_identifier(variable);
53    }
54
55    fn process_type_field(&mut self, type_field: &mut TypeField) {
56        self.verify_identifier(type_field.get_namespace());
57    }
58}