grit_pattern_matcher/pattern/
assignment.rs

1use super::{
2    container::Container,
3    functions::{Evaluator, FuncEvaluation},
4    patterns::{Matcher, Pattern, PatternName},
5    resolved_pattern::ResolvedPattern,
6    State,
7};
8use crate::context::{ExecContext, QueryContext};
9use grit_util::{error::GritResult, AnalysisLogs};
10
11#[derive(Debug, Clone)]
12pub struct Assignment<Q: QueryContext> {
13    pub container: Container<Q>,
14    pub pattern: Pattern<Q>,
15}
16
17impl<Q: QueryContext> Assignment<Q> {
18    pub fn new(container: Container<Q>, pattern: Pattern<Q>) -> Self {
19        Self { container, pattern }
20    }
21}
22
23impl<Q: QueryContext> PatternName for Assignment<Q> {
24    fn name(&self) -> &'static str {
25        "assignment"
26    }
27}
28
29impl<Q: QueryContext> Matcher<Q> for Assignment<Q> {
30    fn execute<'a>(
31        &'a self,
32        _context_node: &Q::ResolvedPattern<'a>,
33        state: &mut State<'a, Q>,
34        context: &'a Q::ExecContext<'a>,
35        logs: &mut AnalysisLogs,
36    ) -> GritResult<bool> {
37        let resolved = ResolvedPattern::from_pattern(&self.pattern, state, context, logs)?;
38        self.container
39            .set_resolved(state, context.language(), resolved)?;
40        Ok(true)
41    }
42}
43
44impl<Q: QueryContext> Evaluator<Q> for Assignment<Q> {
45    fn execute_func<'a>(
46        &'a self,
47        state: &mut State<'a, Q>,
48        context: &'a Q::ExecContext<'a>,
49        logs: &mut AnalysisLogs,
50    ) -> GritResult<FuncEvaluation<Q>> {
51        let resolved: Q::ResolvedPattern<'_> =
52            ResolvedPattern::from_pattern(&self.pattern, state, context, logs)?;
53        self.container
54            .set_resolved(state, context.language(), resolved)?;
55        Ok(FuncEvaluation {
56            predicator: true,
57            ret_val: None,
58        })
59    }
60}