smt_lang/problem/expression/
param_size.rs1use 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}