grit_pattern_matcher/pattern/
assignment.rs1use 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}