From 1e33fa3a16ef19c427c092d7f6c07318bceae5c4 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 28 Feb 2016 10:14:00 +0200 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=81=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8=D1=8F=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/ownlang/lib/MapValue.java | 7 +++++++ src/com/annimon/ownlang/lib/Types.java | 2 +- src/com/annimon/ownlang/parser/ast/BinaryExpression.java | 6 +++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/com/annimon/ownlang/lib/MapValue.java b/src/com/annimon/ownlang/lib/MapValue.java index 3b48ddb..dbf4a63 100644 --- a/src/com/annimon/ownlang/lib/MapValue.java +++ b/src/com/annimon/ownlang/lib/MapValue.java @@ -14,6 +14,13 @@ public class MapValue implements Value, Iterable> { public static final MapValue EMPTY = new MapValue(1); + public static MapValue merge(MapValue map1, MapValue map2) { + final MapValue result = new MapValue(map1.size() + map2.size()); + result.map.putAll(map1.map); + result.map.putAll(map2.map); + return result; + } + private final Map map; public MapValue(int size) { diff --git a/src/com/annimon/ownlang/lib/Types.java b/src/com/annimon/ownlang/lib/Types.java index b588e52..4f1696f 100644 --- a/src/com/annimon/ownlang/lib/Types.java +++ b/src/com/annimon/ownlang/lib/Types.java @@ -10,7 +10,7 @@ public final class Types { MAP = 4, FUNCTION = 5; - private static int FIRST = OBJECT, LAST = FUNCTION; + private static final int FIRST = OBJECT, LAST = FUNCTION; private static final String[] NAMES = {"object", "number", "string", "array", "map", "function"}; public static String typeToString(int type) { diff --git a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java index df549c4..81e908d 100644 --- a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java +++ b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java @@ -4,6 +4,7 @@ import com.annimon.ownlang.exceptions.OperationIsNotSupportedException; import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.lib.ArrayValue; import com.annimon.ownlang.lib.Functions; +import com.annimon.ownlang.lib.MapValue; import com.annimon.ownlang.lib.NumberValue; import com.annimon.ownlang.lib.StringValue; import com.annimon.ownlang.lib.Types; @@ -89,7 +90,10 @@ public final class BinaryExpression implements Expression { case Types.NUMBER: return add((NumberValue) value1, value2); case Types.STRING: return new StringValue(value1.asString() + value2.asString()); case Types.ARRAY: return ArrayValue.add((ArrayValue) value1, value2); - case Types.MAP: /* TODO: merge maps */ + case Types.MAP: + if (value2.type() != Types.MAP) + throw new TypeException("Cannot merge non map value to map"); + return MapValue.merge((MapValue) value1, (MapValue) value2); case Types.FUNCTION: /* TODO: combining functions */ default: // Concatenation strings