grit_pattern_matcher/pattern/
predicates.rs

1use super::{
2    accumulate::Accumulate,
3    and::PrAnd,
4    any::PrAny,
5    assignment::Assignment,
6    call::PrCall,
7    equal::Equal,
8    functions::{Evaluator, FuncEvaluation},
9    maybe::PrMaybe,
10    not::PrNot,
11    or::PrOr,
12    patterns::PatternName,
13    predicate_return::PrReturn,
14    r#if::PrIf,
15    r#match::Match,
16    rewrite::Rewrite,
17    CallBuiltIn, State,
18};
19use crate::context::QueryContext;
20use core::fmt::Debug;
21use grit_util::{error::GritResult, AnalysisLogs};
22
23#[derive(Debug, Clone)]
24pub enum Predicate<Q: QueryContext> {
25    Call(Box<PrCall<Q>>),
26    CallBuiltIn(Box<CallBuiltIn<Q>>),
27    Not(Box<PrNot<Q>>),
28    If(Box<PrIf<Q>>),
29    True,
30    False,
31    Or(Box<PrOr<Q>>),
32    And(Box<PrAnd<Q>>),
33    Maybe(Box<PrMaybe<Q>>),
34    Any(Box<PrAny<Q>>),
35    Rewrite(Box<Rewrite<Q>>),
36    Match(Box<Match<Q>>),
37    Equal(Box<Equal<Q>>),
38    Assignment(Box<Assignment<Q>>),
39    Accumulate(Box<Accumulate<Q>>),
40    Return(Box<PrReturn<Q>>),
41}
42
43impl<Q: QueryContext> PatternName for Predicate<Q> {
44    fn name(&self) -> &'static str {
45        match self {
46            Predicate::Call(call) => call.name(),
47            Predicate::CallBuiltIn(call_built_in) => call_built_in.name(),
48            Predicate::Not(not) => not.name(),
49            Predicate::If(if_) => if_.name(),
50            Predicate::True => "TRUE",
51            Predicate::False => "FALSE",
52            Predicate::Or(or) => or.name(),
53            Predicate::And(and) => and.name(),
54            Predicate::Maybe(maybe) => maybe.name(),
55            Predicate::Any(any) => any.name(),
56            Predicate::Rewrite(rewrite) => rewrite.name(),
57            Predicate::Match(match_) => match_.name(),
58            Predicate::Equal(equal) => equal.name(),
59            Predicate::Assignment(assignment) => assignment.name(),
60            Predicate::Accumulate(accumulate) => accumulate.name(),
61            Predicate::Return(return_) => return_.name(),
62        }
63    }
64}
65
66impl<Q: QueryContext> Evaluator<Q> for Predicate<Q> {
67    fn execute_func<'a>(
68        &'a self,
69        state: &mut State<'a, Q>,
70        context: &'a Q::ExecContext<'a>,
71        logs: &mut AnalysisLogs,
72    ) -> GritResult<FuncEvaluation<Q>> {
73        match self {
74            Predicate::Call(call) => call.execute_func(state, context, logs),
75            Predicate::CallBuiltIn(call_built_in) => {
76                call_built_in.execute_func(state, context, logs)
77            }
78            Predicate::Or(or) => or.execute_func(state, context, logs),
79            Predicate::And(and) => and.execute_func(state, context, logs),
80            Predicate::Maybe(maybe) => maybe.execute_func(state, context, logs),
81            Predicate::Any(any) => any.execute_func(state, context, logs),
82            Predicate::Rewrite(rewrite) => rewrite.execute_func(state, context, logs),
83            Predicate::Match(match_) => match_.execute_func(state, context, logs),
84            Predicate::Equal(equal) => equal.execute_func(state, context, logs),
85            Predicate::True => Ok(FuncEvaluation {
86                predicator: true,
87                ret_val: None,
88            }),
89            Predicate::False => Ok(FuncEvaluation {
90                predicator: false,
91                ret_val: None,
92            }),
93            Predicate::Not(not) => not.execute_func(state, context, logs),
94            Predicate::If(if_) => if_.execute_func(state, context, logs),
95            Predicate::Assignment(assignment) => assignment.execute_func(state, context, logs),
96            Predicate::Accumulate(accumulate) => accumulate.execute_func(state, context, logs),
97            Predicate::Return(return_) => return_.execute_func(state, context, logs),
98        }
99    }
100}