smt_lang/problem/expression/
param_size.rs

1use crate::problem::*;
2
3impl Expr {
4    pub fn check_parameter_size(&self, problem: &Problem) -> Result<(), Error> {
5        match self {
6            Expr::BoolValue(_, _) => Ok(()),
7            Expr::IntValue(_, _) => Ok(()),
8            Expr::RealValue(_, _) => Ok(()),
9            Expr::Unary(_, e, _) => e.check_type(problem),
10            Expr::Binary(l, _, r, _) => {
11                l.check_parameter_size(problem)?;
12                r.check_parameter_size(problem)
13            }
14            Expr::Nary(_, v, _) => {
15                for e in v.iter() {
16                    e.check_parameter_size(problem)?;
17                }
18                Ok(())
19            }
20            Expr::FunctionCall(id, v, _) => {
21                for x in v.iter() {
22                    x.check_parameter_size(problem)?;
23                }
24                let fun = problem.get(*id).unwrap();
25                if fun.parameters().len() == v.len() {
26                    Ok(())
27                } else {
28                    Err(Error::Parameter {
29                        expr: self.clone(),
30                        size: v.len(),
31                        expected: fun.parameters().len(),
32                    })
33                }
34            }
35            Expr::Instance(_, _) => Ok(()),
36            Expr::Variable(_, _) => Ok(()),
37            Expr::Parameter(_) => Ok(()),
38            Expr::StrucSelf(_, _) => Ok(()),
39            Expr::StrucAttribute(e, _, _) => e.check_parameter_size(problem),
40            Expr::StrucMetCall(e, id, v, _) => {
41                e.check_parameter_size(problem)?;
42                for x in v.iter() {
43                    x.check_parameter_size(problem)?;
44                }
45                let meth = problem.get(*id).unwrap();
46                if meth.parameters().len() == v.len() {
47                    Ok(())
48                } else {
49                    Err(Error::Parameter {
50                        expr: self.clone(),
51                        size: v.len(),
52                        expected: meth.parameters().len(),
53                    })
54                }
55            }
56            Expr::ClassSelf(_, _) => Ok(()),
57            Expr::ClassAttribute(e, _, _) => e.check_parameter_size(problem),
58            Expr::ClassMetCall(e, id, v, _) => {
59                e.check_parameter_size(problem)?;
60                for x in v.iter() {
61                    x.check_parameter_size(problem)?;
62                }
63                let meth = problem.get(*id).unwrap();
64                if meth.parameters().len() == v.len() {
65                    Ok(())
66                } else {
67                    Err(Error::Parameter {
68                        expr: self.clone(),
69                        size: v.len(),
70                        expected: meth.parameters().len(),
71                    })
72                }
73            }
74            Expr::AsClass(e, _) => e.check_parameter_size(problem),
75            Expr::AsInterval(e, _, _, _) => e.check_parameter_size(problem),
76            Expr::AsInt(e, _) => e.check_parameter_size(problem),
77            Expr::AsReal(e, _) => e.check_parameter_size(problem),
78            Expr::IfThenElse(c, t, l, e, _) => {
79                c.check_parameter_size(problem)?;
80                t.check_parameter_size(problem)?;
81                for (x, y) in l.iter() {
82                    x.check_parameter_size(problem)?;
83                    y.check_parameter_size(problem)?;
84                }
85                e.check_parameter_size(problem)
86            }
87            Expr::Quantifier(_, _, e, _) => e.check_parameter_size(problem),
88            Expr::Unresolved(_, _) => panic!(),
89            Expr::UnresolvedFunCall(_, _, _) => panic!(),
90            Expr::UnresolvedAttribute(_, _, _) => panic!(),
91            Expr::UnresolvedMethCall(_, _, _, _) => panic!(),
92        }
93    }
94}