diff --git a/src/com/annimon/ownlang/lib/ArrayValue.java b/src/com/annimon/ownlang/lib/ArrayValue.java index 594c205..3d67b80 100644 --- a/src/com/annimon/ownlang/lib/ArrayValue.java +++ b/src/com/annimon/ownlang/lib/ArrayValue.java @@ -72,6 +72,11 @@ public final class ArrayValue implements Value, Iterable { elements[index] = value; } + @Override + public Object raw() { + return elements; + } + @Override public int asInt() { throw new TypeException("Cannot cast array to integer"); diff --git a/src/com/annimon/ownlang/lib/FunctionValue.java b/src/com/annimon/ownlang/lib/FunctionValue.java index 2cc89e7..97ad62a 100644 --- a/src/com/annimon/ownlang/lib/FunctionValue.java +++ b/src/com/annimon/ownlang/lib/FunctionValue.java @@ -22,6 +22,11 @@ public final class FunctionValue implements Value { return Types.FUNCTION; } + @Override + public Object raw() { + return value; + } + @Override public int asInt() { throw new TypeException("Cannot cast function to integer"); diff --git a/src/com/annimon/ownlang/lib/MapValue.java b/src/com/annimon/ownlang/lib/MapValue.java index d94cc11..3b48ddb 100644 --- a/src/com/annimon/ownlang/lib/MapValue.java +++ b/src/com/annimon/ownlang/lib/MapValue.java @@ -45,6 +45,11 @@ public class MapValue implements Value, Iterable> { map.put(key, value); } + @Override + public Object raw() { + return map; + } + @Override public int asInt() { throw new TypeException("Cannot cast map to integer"); diff --git a/src/com/annimon/ownlang/lib/NumberValue.java b/src/com/annimon/ownlang/lib/NumberValue.java index 85c07f2..b1a919e 100644 --- a/src/com/annimon/ownlang/lib/NumberValue.java +++ b/src/com/annimon/ownlang/lib/NumberValue.java @@ -25,6 +25,7 @@ public final class NumberValue implements Value { return Types.NUMBER; } + @Override public Number raw() { return value; } diff --git a/src/com/annimon/ownlang/lib/StringValue.java b/src/com/annimon/ownlang/lib/StringValue.java index fc6fa89..8a1ac22 100644 --- a/src/com/annimon/ownlang/lib/StringValue.java +++ b/src/com/annimon/ownlang/lib/StringValue.java @@ -24,6 +24,11 @@ public final class StringValue implements Value { public int type() { return Types.STRING; } + + @Override + public Object raw() { + return value; + } @Override public int asInt() { diff --git a/src/com/annimon/ownlang/lib/Value.java b/src/com/annimon/ownlang/lib/Value.java index e585313..0bac3e4 100644 --- a/src/com/annimon/ownlang/lib/Value.java +++ b/src/com/annimon/ownlang/lib/Value.java @@ -6,6 +6,8 @@ package com.annimon.ownlang.lib; */ public interface Value extends Comparable { + Object raw(); + int asInt(); double asNumber(); diff --git a/src/com/annimon/ownlang/lib/modules/functions/json_encode.java b/src/com/annimon/ownlang/lib/modules/functions/json_encode.java index bf880ca..660e4dc 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/json_encode.java +++ b/src/com/annimon/ownlang/lib/modules/functions/json_encode.java @@ -26,7 +26,7 @@ public final class json_encode implements Function { case Types.MAP: return process((MapValue) val); case Types.NUMBER: - return ((NumberValue) val).raw(); + return val.raw(); case Types.STRING: return val.asString(); default: diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_sprintf.java b/src/com/annimon/ownlang/lib/modules/functions/std_sprintf.java index cb282e7..e6c7256 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/std_sprintf.java +++ b/src/com/annimon/ownlang/lib/modules/functions/std_sprintf.java @@ -13,7 +13,7 @@ public final class std_sprintf implements Function { final Object[] values = new Object[args.length - 1]; for (int i = 1; i < args.length; i++) { values[i - 1] = (args[i].type() == Types.NUMBER) - ? ((NumberValue) args[i]).raw() + ? args[i].raw() : args[i].asString(); } return new StringValue(String.format(format, values)); diff --git a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java index 30876a1..df549c4 100644 --- a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java +++ b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java @@ -101,7 +101,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 + number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Double || number2 instanceof Double) { return new NumberValue(number1.doubleValue() + number2.doubleValue()); } @@ -138,7 +138,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 - number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Double || number2 instanceof Double) { return new NumberValue(number1.doubleValue() - number2.doubleValue()); } @@ -184,7 +184,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 * number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Double || number2 instanceof Double) { return new NumberValue(number1.doubleValue() * number2.doubleValue()); } @@ -221,7 +221,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 / number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Double || number2 instanceof Double) { return new NumberValue(number1.doubleValue() / number2.doubleValue()); } @@ -258,7 +258,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 % number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Double || number2 instanceof Double) { return new NumberValue(number1.doubleValue() % number2.doubleValue()); } @@ -303,7 +303,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 & number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Long || number2 instanceof Long) { return new NumberValue(number1.longValue() & number2.longValue()); } @@ -328,7 +328,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 | number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Long || number2 instanceof Long) { return new NumberValue(number1.longValue() | number2.longValue()); } @@ -353,7 +353,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 ^ number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Long || number2 instanceof Long) { return new NumberValue(number1.longValue() ^ number2.longValue()); } @@ -383,7 +383,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 << number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Long || number2 instanceof Long) { return new NumberValue(number1.longValue() << number2.longValue()); } @@ -408,7 +408,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 >> number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Long || number2 instanceof Long) { return new NumberValue(number1.longValue() >> number2.longValue()); } @@ -433,7 +433,7 @@ public final class BinaryExpression implements Expression { final Number number1 = value1.raw(); if (value2.type() == Types.NUMBER) { // number1 >>> number2 - final Number number2 = ((NumberValue) value2).raw(); + final Number number2 = (Number) value2.raw(); if (number1 instanceof Long || number2 instanceof Long) { return new NumberValue(number1.longValue() >>> number2.longValue()); } diff --git a/src/com/annimon/ownlang/parser/ast/UnaryExpression.java b/src/com/annimon/ownlang/parser/ast/UnaryExpression.java index 75b1f79..8182524 100644 --- a/src/com/annimon/ownlang/parser/ast/UnaryExpression.java +++ b/src/com/annimon/ownlang/parser/ast/UnaryExpression.java @@ -88,7 +88,7 @@ public final class UnaryExpression implements Expression, Statement { private Value increment(Value value) { if (value.type() == Types.NUMBER) { - final Number number = ((NumberValue) value).raw(); + final Number number = (Number) value.raw(); if (number instanceof Double) { return new NumberValue(number.doubleValue() + 1); } @@ -104,7 +104,7 @@ public final class UnaryExpression implements Expression, Statement { private Value decrement(Value value) { if (value.type() == Types.NUMBER) { - final Number number = ((NumberValue) value).raw(); + final Number number = (Number) value.raw(); if (number instanceof Double) { return new NumberValue(number.doubleValue() - 1); } @@ -124,7 +124,7 @@ public final class UnaryExpression implements Expression, Statement { return new StringValue(sb.reverse().toString()); } if (value.type() == Types.NUMBER) { - final Number number = ((NumberValue) value).raw(); + final Number number = (Number) value.raw(); if (number instanceof Double) { return new NumberValue(-number.doubleValue()); } @@ -140,7 +140,7 @@ public final class UnaryExpression implements Expression, Statement { private Value complement(Value value) { if (value.type() == Types.NUMBER) { - final Number number = ((NumberValue) value).raw(); + final Number number = (Number) value.raw(); if (number instanceof Long) { return new NumberValue(~number.longValue()); }