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