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.expressions; 25 26 import org.overturetool.vdmj.lex.LexLocation; 27 import org.overturetool.vdmj.runtime.Context; 28 import org.overturetool.vdmj.runtime.ValueException; 29 import org.overturetool.vdmj.typechecker.Environment; 30 import org.overturetool.vdmj.typechecker.NameScope; 31 import org.overturetool.vdmj.types.MapType; 32 import org.overturetool.vdmj.types.SetType; 33 import org.overturetool.vdmj.types.Type; 34 import org.overturetool.vdmj.types.TypeList; 35 import org.overturetool.vdmj.types.UnknownType; 36 import org.overturetool.vdmj.values.SetValue; 37 import org.overturetool.vdmj.values.Value; 38 import org.overturetool.vdmj.values.ValueMap; 39 import org.overturetool.vdmj.values.ValueSet; 40 41 public class MapDomainExpression extends UnaryExpression 42 { 43 private static final long serialVersionUID = 1L; 44 45 public MapDomainExpression(LexLocation location, Expression exp) 46 { 47 super(location, exp); 48 } 49 50 @Override 51 public String toString() 52 { 53 return "(dom " + exp + ")"; 54 } 55 56 @Override 57 public Type typeCheck(Environment env, TypeList qualifiers, NameScope scope) 58 { 59 Type etype = exp.typeCheck(env, null, scope); 60 61 if (!etype.isMap()) 62 { 63 report(3120, "Argument to 'dom' is not a map"); 64 return new UnknownType(location); 65 } 66 67 MapType mt = etype.getMap(); 68 return new SetType(location, mt.from); 69 } 70 71 @Override 72 public Value eval(Context ctxt) 73 { 74 breakpoint.check(location, ctxt); 75 76 try 77 { 78 ValueMap map = exp.eval(ctxt).mapValue(ctxt); 79 ValueSet result = new ValueSet(); 80 result.addAll(map.keySet()); 81 return new SetValue(result); 82 } 83 catch (ValueException e) 84 { 85 return abort(e); 86 } 87 } 88 89 @Override 90 public String kind() 91 { 92 return "dom"; 93 } 94 }