View Javadoc

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  		// Definitions already checked.
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  }