1 /********************************************************************************
2 *
3 * Copyright (C) 2008 Fujitsu Services Ltd.
4 *
5 * Author: Nick Battle
6 *
7 * This file is part of VDMJ.
8 *
9 * VDMJ is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * VDMJ is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with VDMJ. If not, see <http://www.gnu.org/licenses/>.
21 *
22 ******************************************************************************/
23
24 package org.overturetool.vdmj.statements;
25
26 import org.overturetool.vdmj.definitions.ClassInvariantDefinition;
27 import org.overturetool.vdmj.definitions.Definition;
28 import org.overturetool.vdmj.definitions.DefinitionList;
29 import org.overturetool.vdmj.lex.LexNameToken;
30 import org.overturetool.vdmj.runtime.Context;
31 import org.overturetool.vdmj.runtime.ValueException;
32 import org.overturetool.vdmj.typechecker.Environment;
33 import org.overturetool.vdmj.typechecker.NameScope;
34 import org.overturetool.vdmj.types.BooleanType;
35 import org.overturetool.vdmj.types.Type;
36 import org.overturetool.vdmj.values.BooleanValue;
37 import org.overturetool.vdmj.values.Value;
38
39 public class ClassInvariantStatement extends Statement
40 {
41 private static final long serialVersionUID = 1L;
42 public final LexNameToken name;
43 public final DefinitionList invdefs;
44
45 public ClassInvariantStatement(LexNameToken name, DefinitionList invdefs)
46 {
47 super(name.location);
48 this.name = name;
49 this.invdefs = invdefs;
50 }
51
52 @Override
53 public Type typeCheck(Environment env, NameScope scope)
54 {
55
56 return new BooleanType(location);
57 }
58
59 @Override
60 public Value eval(Context ctxt)
61 {
62 for (Definition d: invdefs)
63 {
64 ClassInvariantDefinition invdef = (ClassInvariantDefinition)d;
65
66 try
67 {
68 if (!invdef.expression.eval(ctxt).boolValue(ctxt))
69 {
70 return new BooleanValue(false);
71 }
72 }
73 catch (ValueException e)
74 {
75 abort(e);
76 }
77 }
78
79 return new BooleanValue(true);
80 }
81
82 @Override
83 public String kind()
84 {
85 return "instance invariant";
86 }
87
88 @Override
89 public String toString()
90 {
91 return "instance invariant " + name;
92 }
93 }