aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Operations.java18
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java13
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpPrimitiveMethods.java23
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java3
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java7
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonPrimitiveMethods.java11
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java1
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java27
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java4
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java13
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java19
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java4
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java8
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java17
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java27
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java5
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java13
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java4
-rw-r--r--src/main/java/org/zwobble/couscous/types/Types.java13
-rw-r--r--src/main/java/org/zwobble/couscous/values/BooleanValue.java5
-rw-r--r--src/main/java/org/zwobble/couscous/values/IntegerValue.java4
-rw-r--r--src/main/java/org/zwobble/couscous/values/ObjectValues.java11
-rw-r--r--src/main/java/org/zwobble/couscous/values/StringValue.java6
-rw-r--r--src/main/java/org/zwobble/couscous/values/TypeValue.java3
-rw-r--r--src/main/java/org/zwobble/couscous/values/UnitValue.java5
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java45
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java37
-rw-r--r--src/test/java/org/zwobble/couscous/tests/CompilerTests.java50
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java7
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java9
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java39
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java9
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java28
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java48
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java16
38 files changed, 265 insertions, 301 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
index 1fe8fcb..734a6a2 100644
--- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
+++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
@@ -5,7 +5,7 @@ import com.google.common.collect.ImmutableSet;
import org.zwobble.couscous.ast.identifiers.Identifier;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.values.UnitValue;
+import org.zwobble.couscous.types.Types;
import java.util.List;
import java.util.Optional;
@@ -134,7 +134,7 @@ public class ClassNodeBuilder {
private final Function<MethodBuilder<?>, T> build;
private final ImmutableList.Builder<AnnotationNode> annotations;
private final ImmutableList.Builder<FormalArgumentNode> arguments;
- private ScalarType returnType = UnitValue.REF;
+ private ScalarType returnType = Types.VOID;
private final ImmutableList.Builder<StatementNode> statements;
public MethodBuilder(Function<MethodBuilder<?>, T> build) {
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
index b8f2601..024541f 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
@@ -4,7 +4,7 @@ import com.google.common.collect.ImmutableList;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
-import org.zwobble.couscous.values.UnitValue;
+import org.zwobble.couscous.types.Types;
import java.util.List;
import java.util.Optional;
@@ -28,7 +28,7 @@ public class MethodNode implements Node {
private final String name;
private final ImmutableList.Builder<FormalArgumentNode> arguments =
ImmutableList.builder();
- private Type returnType = UnitValue.REF;
+ private Type returnType = Types.VOID;
private final ImmutableList.Builder<StatementNode> body =
ImmutableList.builder();
diff --git a/src/main/java/org/zwobble/couscous/ast/Operations.java b/src/main/java/org/zwobble/couscous/ast/Operations.java
index 0ae4923..04de1de 100644
--- a/src/main/java/org/zwobble/couscous/ast/Operations.java
+++ b/src/main/java/org/zwobble/couscous/ast/Operations.java
@@ -1,9 +1,7 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.InternalCouscousValue;
-import org.zwobble.couscous.values.ObjectValues;
import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall;
import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion;
@@ -11,14 +9,14 @@ import static org.zwobble.couscous.util.ExtraLists.list;
public class Operations {
public static ExpressionNode same(ExpressionNode left, ExpressionNode right) {
- return staticMethodCall(InternalCouscousValue.REF, "same", list(left, right), BooleanValue.REF);
+ return staticMethodCall(InternalCouscousValue.REF, "same", list(left, right), Types.BOOLEAN);
}
public static ExpressionNode not(ExpressionNode value) {
- if (value.getType().equals(BooleanValue.REF)) {
+ if (value.getType().equals(Types.BOOLEAN)) {
return OperationNode.operation(
Operator.BOOLEAN_NOT, list(value),
- BooleanValue.REF);
+ Types.BOOLEAN);
} else {
throw new IllegalArgumentException("Can only negate booleans");
}
@@ -53,7 +51,7 @@ public class Operations {
}
public static ExpressionNode integerOperation(Operator operator, ExpressionNode left, ExpressionNode right) {
- return new OperationNode(operator, list(left, right), IntegerValue.REF);
+ return new OperationNode(operator, list(left, right), Types.INT);
}
public static ExpressionNode equal(ExpressionNode left, ExpressionNode right) {
@@ -81,15 +79,15 @@ public class Operations {
}
private static ExpressionNode booleanOperation(Operator operator, ExpressionNode left, ExpressionNode right) {
- return new OperationNode(operator, list(left, right), BooleanValue.REF);
+ return new OperationNode(operator, list(left, right), Types.BOOLEAN);
}
public static ExpressionNode boxInt(ExpressionNode value) {
- return typeCoercion(value, ObjectValues.BOXED_INT);
+ return typeCoercion(value, Types.BOXED_INT);
}
public static ExpressionNode unboxInt(ExpressionNode value) {
- return typeCoercion(value, IntegerValue.REF);
+ return typeCoercion(value, Types.INT);
}
}
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java
index dbfb00f..1b64293 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java
@@ -5,7 +5,6 @@ import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.backends.Names;
import org.zwobble.couscous.types.*;
-import org.zwobble.couscous.values.*;
import java.util.Map;
import java.util.Optional;
@@ -16,11 +15,11 @@ import static org.zwobble.couscous.util.ExtraLists.eagerMap;
public class CsharpCodeGenerator {
private final static Map<ScalarType, ScalarType> PRIMITIVES = ImmutableMap.<ScalarType, ScalarType>builder()
- .put(IntegerValue.REF, ScalarType.of("int"))
- .put(StringValue.REF, ScalarType.of("string"))
- .put(BooleanValue.REF, ScalarType.of("bool"))
- .put(ObjectValues.CLASS, ScalarType.of("System.Type"))
- .put(UnitValue.REF, ScalarType.of("void"))
+ .put(Types.INT, ScalarType.of("int"))
+ .put(Types.STRING, ScalarType.of("string"))
+ .put(Types.BOOLEAN, ScalarType.of("bool"))
+ .put(Types.CLASS, ScalarType.of("System.Type"))
+ .put(Types.VOID, ScalarType.of("void"))
.build();
private final String namespace;
@@ -61,7 +60,7 @@ public class CsharpCodeGenerator {
@Override
public Type visit(ParameterizedType type) {
- if (type.getRawType().equals(ObjectValues.CLASS)) {
+ if (type.getRawType().equals(Types.CLASS)) {
return ScalarType.of("System.Type");
} else {
return new ParameterizedType(
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpPrimitiveMethods.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpPrimitiveMethods.java
index cb5b027..96f8c00 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpPrimitiveMethods.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpPrimitiveMethods.java
@@ -3,10 +3,7 @@ package org.zwobble.couscous.backends.csharp;
import com.google.common.collect.ImmutableMap;
import org.zwobble.couscous.ast.ExpressionNode;
import org.zwobble.couscous.types.ScalarType;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.IntegerValue;
-import org.zwobble.couscous.values.ObjectValues;
-import org.zwobble.couscous.values.StringValue;
+import org.zwobble.couscous.types.Types;
import java.util.List;
import java.util.Map;
@@ -34,7 +31,7 @@ public class CsharpPrimitiveMethods {
receiver,
"ToString",
list(),
- StringValue.REF)));
+ Types.STRING)));
BOXED_INT_METHODS = methods.build();
}
@@ -42,7 +39,7 @@ public class CsharpPrimitiveMethods {
static {
ImmutableMap.Builder<String, PrimitiveMethodGenerator> methods = ImmutableMap.builder();
- methods.put("length", (receiver, arguments) -> fieldAccess(receiver, "Length", IntegerValue.REF));
+ methods.put("length", (receiver, arguments) -> fieldAccess(receiver, "Length", Types.INT));
methods.put("substring", (receiver, arguments) -> {
ExpressionNode startIndex = arguments.get(0);
ExpressionNode endIndex = arguments.get(1);
@@ -52,26 +49,26 @@ public class CsharpPrimitiveMethods {
receiver,
"Substring",
list(startIndex, length),
- StringValue.REF);
+ Types.STRING);
});
methods.put("toLowerCase", (receiver, arguments) -> methodCall(
receiver,
"ToLower",
list(),
- StringValue.REF));
+ Types.STRING));
methods.put("equals", (receiver, arguments) -> methodCall(
receiver,
"Equals",
arguments,
- StringValue.REF));
+ Types.STRING));
STRING_METHODS = methods.build();
}
private static final Map<ScalarType, Map<String, PrimitiveMethodGenerator>> METHODS =
ImmutableMap.<ScalarType, Map<String, PrimitiveMethodGenerator>>builder()
- .put(BooleanValue.REF, BOOLEAN_METHODS)
- .put(StringValue.REF, STRING_METHODS)
- .put(ObjectValues.BOXED_INT, BOXED_INT_METHODS)
+ .put(Types.BOOLEAN, BOOLEAN_METHODS)
+ .put(Types.STRING, STRING_METHODS)
+ .put(Types.BOXED_INT, BOXED_INT_METHODS)
.build();
private static final Map<String, PrimitiveStaticMethodGenerator> STATIC_INT_METHODS =
@@ -87,7 +84,7 @@ public class CsharpPrimitiveMethods {
private static final Map<ScalarType, Map<String, PrimitiveStaticMethodGenerator>> STATIC_METHODS =
ImmutableMap.<ScalarType, Map<String, PrimitiveStaticMethodGenerator>>builder()
- .put(ObjectValues.BOXED_INT, STATIC_INT_METHODS)
+ .put(Types.BOXED_INT, STATIC_INT_METHODS)
.build();
public static Optional<PrimitiveMethodGenerator> getPrimitiveMethod(ScalarType type, String methodName) {
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
index 090a19a..9b168ef 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -6,7 +6,6 @@ import org.zwobble.couscous.backends.SourceCodeWriter;
import org.zwobble.couscous.types.*;
import org.zwobble.couscous.util.Action;
import org.zwobble.couscous.values.PrimitiveValue;
-import org.zwobble.couscous.values.UnitValue;
import java.util.List;
@@ -181,7 +180,7 @@ public class CsharpSerializer implements NodeVisitor {
public void visit(ReturnNode returnNode) {
writer.writeStatement(() -> {
writer.writeKeyword("return");
- if (!returnNode.getValue().getType().equals(UnitValue.REF)) {
+ if (!returnNode.getValue().getType().equals(Types.VOID)) {
writer.writeSpace();
write(returnNode.getValue());
}
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
index 9e0a0b9..5b1691b 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -13,6 +13,7 @@ import org.zwobble.couscous.ast.visitors.NodeMapperWithDefault;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
import org.zwobble.couscous.backends.Names;
import org.zwobble.couscous.backends.python.ast.*;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.*;
import java.util.*;
@@ -113,7 +114,7 @@ public class PythonCodeGenerator {
@Override
public Stream<ScalarType> visit(TypeCoercionNode typeCoercion) {
if (isIntegerBox(typeCoercion)) {
- return Stream.of(ObjectValues.BOXED_INT);
+ return Stream.of(Types.BOXED_INT);
} else {
return Stream.empty();
}
@@ -312,7 +313,7 @@ public class PythonCodeGenerator {
if (isIntegerBox(typeCoercion)) {
// TODO: perform this replacement at the start so that we don't split the import handling and actual expression
return visit(ConstructorCallNode.constructorCall(
- ObjectValues.BOXED_INT,
+ Types.BOXED_INT,
list(typeCoercion.getExpression())));
} else if (isIntegerUnbox(typeCoercion)) {
return pythonAttributeAccess(value, "_value");
@@ -353,7 +354,7 @@ public class PythonCodeGenerator {
}
private static boolean isInteger(Type type) {
- return type.equals(IntegerValue.REF) || type.equals(ObjectValues.BOXED_INT);
+ return type.equals(Types.INT) || type.equals(Types.BOXED_INT);
}
private static PythonVariableReferenceNode typeReference(Type className) {
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonPrimitiveMethods.java b/src/main/java/org/zwobble/couscous/backends/python/PythonPrimitiveMethods.java
index a290c54..40c794e 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonPrimitiveMethods.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonPrimitiveMethods.java
@@ -7,6 +7,7 @@ import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.backends.python.ast.PythonBinaryOperation;
import org.zwobble.couscous.backends.python.ast.PythonExpressionNode;
import org.zwobble.couscous.backends.python.ast.PythonNotNode;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.*;
import java.util.List;
@@ -112,10 +113,10 @@ public class PythonPrimitiveMethods {
private static final Map<ScalarType, Map<String, PrimitiveMethodGenerator>> METHODS =
ImmutableMap.<ScalarType, Map<String, PrimitiveMethodGenerator>>builder()
- .put(StringValue.REF, STRING_METHODS)
- .put(BooleanValue.REF, BOOLEAN_METHODS)
- .put(IntegerValue.REF, INT_METHODS)
- .put(ObjectValues.BOXED_INT, INT_METHODS)
+ .put(Types.STRING, STRING_METHODS)
+ .put(Types.BOOLEAN, BOOLEAN_METHODS)
+ .put(Types.INT, INT_METHODS)
+ .put(Types.BOXED_INT, INT_METHODS)
.build();
private static final Map<String, PrimitiveStaticMethodGenerator> INTERNAL_METHODS =
@@ -135,7 +136,7 @@ public class PythonPrimitiveMethods {
private static final Map<ScalarType, Map<String, PrimitiveStaticMethodGenerator>> STATIC_METHODS =
ImmutableMap.<ScalarType, Map<String, PrimitiveStaticMethodGenerator>>builder()
.put(InternalCouscousValue.REF, INTERNAL_METHODS)
- .put(ObjectValues.BOXED_INT, BOXED_INT_STATIC_METHODS)
+ .put(Types.BOXED_INT, BOXED_INT_STATIC_METHODS)
.build();
public static Optional<PrimitiveMethodGenerator> getPrimitiveMethod(ScalarType type, String methodName) {
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
index 7732a87..89711a2 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
@@ -13,6 +13,7 @@ public class PythonSerializer implements PythonNodeVisitor {
);
PythonSerializer serializer = new PythonSerializer(writer);
serializer.write(node);
+ System.out.println(writer.asString());
return writer.asString();
}
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
index 75e0b6d..c0b69b3 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
@@ -4,9 +4,6 @@ import org.eclipse.jdt.core.dom.*;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.types.Types;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.IntegerValue;
-import org.zwobble.couscous.values.ObjectValues;
import java.util.List;
import java.util.stream.Collectors;
@@ -47,10 +44,10 @@ public class JavaExpressionReader {
}
private static Type unboxedType(Type type) {
- if (type.equals(ObjectValues.BOXED_INT)) {
- return IntegerValue.REF;
- } else if (type.equals(ObjectValues.BOXED_BOOLEAN)) {
- return BooleanValue.REF;
+ if (type.equals(Types.BOXED_INT)) {
+ return Types.INT;
+ } else if (type.equals(Types.BOXED_BOOLEAN)) {
+ return Types.BOOLEAN;
} else {
return type;
}
@@ -257,8 +254,8 @@ public class JavaExpressionReader {
expression.getLeftOperand(),
expression.getRightOperand());
} else {
- ExpressionNode left = readExpression(ObjectValues.OBJECT, expression.getLeftOperand());
- ExpressionNode right = readExpression(ObjectValues.OBJECT, expression.getRightOperand());
+ ExpressionNode left = readExpression(Types.OBJECT, expression.getLeftOperand());
+ ExpressionNode right = readExpression(Types.OBJECT, expression.getRightOperand());
if (expression.getOperator() == InfixExpression.Operator.EQUALS) {
return Operations.same(left, right);
} else if (expression.getOperator() == InfixExpression.Operator.NOT_EQUALS) {
@@ -279,12 +276,12 @@ public class JavaExpressionReader {
}
private static boolean isPrimitive(Type type) {
- return type.equals(BooleanValue.REF) || type.equals(IntegerValue.REF);
+ return type.equals(Types.BOOLEAN) || type.equals(Types.INT);
}
private ExpressionNode readPrefixExpression(PrefixExpression expression) {
if (expression.getOperator() == PrefixExpression.Operator.NOT) {
- return not(readExpression(BooleanValue.REF, expression.getOperand()));
+ return not(readExpression(Types.BOOLEAN, expression.getOperand()));
} else {
Operator operator = readOperator(expression.getOperator());
return AssignmentNode.assign(
@@ -292,16 +289,16 @@ public class JavaExpressionReader {
operation(
operator,
list(
- readExpression(IntegerValue.REF, expression.getOperand()),
+ readExpression(Types.INT, expression.getOperand()),
literal(1)),
- IntegerValue.REF));
+ Types.INT));
}
}
private ExpressionNode readConditionalExpression(ConditionalExpression expression) {
Type type = typeOf(expression);
return TernaryConditionalNode.ternaryConditional(
- readExpression(BooleanValue.REF, expression.getExpression()),
+ readExpression(Types.BOOLEAN, expression.getExpression()),
readExpression(type, expression.getThenExpression()),
readExpression(type, expression.getElseExpression()));
}
@@ -327,7 +324,7 @@ public class JavaExpressionReader {
return operation(
operator,
list(left, right),
- operator.isBoolean() ? BooleanValue.REF : left.getType());
+ operator.isBoolean() ? Types.BOOLEAN : left.getType());
}
private ExpressionNode readCastExpression(CastExpression expression) {
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
index 0df0788..a6da3c3 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -11,8 +11,8 @@ import org.zwobble.couscous.ast.sugar.TypeDeclarationBody;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.util.ExtraLists;
-import org.zwobble.couscous.values.ObjectValues;
import java.io.IOException;
import java.nio.file.Path;
@@ -413,7 +413,7 @@ public class JavaReader {
eagerMap(arguments, argument -> reference(argument)),
methodNode.signature());
- StatementNode body = override.getReturnType().equals(ObjectValues.VOID)
+ StatementNode body = override.getReturnType().equals(Types.VOID)
? expressionStatement(call)
: returns(typeCoercion(call, override.getReturnType()));
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
index b21b4d9..c668774 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
@@ -4,8 +4,7 @@ import org.eclipse.jdt.core.dom.*;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.sugar.SwitchCaseNode;
import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.ObjectValues;
+import org.zwobble.couscous.types.Types;
import java.util.List;
import java.util.Optional;
@@ -94,7 +93,7 @@ class JavaStatementReader {
? list()
: readStatement(statement.getElseStatement());
return ifStatement(
- readExpression(BooleanValue.REF, statement.getExpression()),
+ readExpression(Types.BOOLEAN, statement.getExpression()),
readStatement(statement.getThenStatement()),
falseBranch);
}
@@ -128,8 +127,8 @@ class JavaStatementReader {
methodCall(
reference(switchValueAssignment),
"equals",
- list(coerceExpression(ObjectValues.OBJECT, value)),
- BooleanValue.REF),
+ list(coerceExpression(Types.OBJECT, value)),
+ Types.BOOLEAN),
currentCase.getStatements(), handle)))
.orElse(handle)));
}
@@ -157,7 +156,7 @@ class JavaStatementReader {
private WhileNode readWhileStatement(WhileStatement statement) {
return whileLoop(
- readExpression(BooleanValue.REF, statement.getExpression()),
+ readExpression(Types.BOOLEAN, statement.getExpression()),
readStatement(statement.getBody()));
}
@@ -175,7 +174,7 @@ class JavaStatementReader {
return append(
readDeclarationFragments(fragments, typeOf(javaDeclaration.getType())),
whileLoop(
- readExpression(BooleanValue.REF, statement.getExpression()),
+ readExpression(Types.BOOLEAN, statement.getExpression()),
concat(
readStatement(statement.getBody()),
eagerMap(updaters, updater -> expressionStatement(readExpressionWithoutBoxing(updater))))));
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java
index d5f21d0..a196004 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java
@@ -2,11 +2,9 @@ package org.zwobble.couscous.frontends.java;
import com.google.common.collect.ImmutableSet;
import org.eclipse.jdt.core.dom.*;
+import org.zwobble.couscous.types.*;
import org.zwobble.couscous.types.ParameterizedType;
-import org.zwobble.couscous.types.ScalarType;
-import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.types.TypeParameter;
-import org.zwobble.couscous.values.ObjectValues;
import java.util.List;
import java.util.Optional;
@@ -79,6 +77,6 @@ class JavaTypes {
private static Optional<Type> superClass(ITypeBinding typeBinding) {
return Optional.ofNullable(typeBinding.getSuperclass())
.map(JavaTypes::typeOf)
- .filter(type -> !type.equals(ObjectValues.OBJECT));
+ .filter(type -> !type.equals(Types.OBJECT));
}
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 3a366e0..a721206 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -7,8 +7,7 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.interpreter.errors.ConditionMustBeBoolean;
import org.zwobble.couscous.interpreter.errors.InvalidCast;
import org.zwobble.couscous.interpreter.values.*;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.types.Types;
import java.util.List;
import java.util.stream.Collectors;
@@ -136,23 +135,23 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
}
private static boolean isIntegerBox(TypeCoercionNode typeCoercion) {
- return typeCoercion.getExpression().getType().equals(IntegerValue.REF) &&
- !typeCoercion.getType().equals(IntegerValue.REF);
+ return typeCoercion.getExpression().getType().equals(Types.INT) &&
+ !typeCoercion.getType().equals(Types.INT);
}
private static boolean isIntegerUnbox(TypeCoercionNode typeCoercion) {
- return !typeCoercion.getExpression().getType().equals(IntegerValue.REF) &&
- typeCoercion.getType().equals(IntegerValue.REF);
+ return !typeCoercion.getExpression().getType().equals(Types.INT) &&
+ typeCoercion.getType().equals(Types.INT);
}
private static boolean isBooleanBox(TypeCoercionNode typeCoercion) {
- return typeCoercion.getExpression().getType().equals(BooleanValue.REF) &&
- !typeCoercion.getType().equals(BooleanValue.REF);
+ return typeCoercion.getExpression().getType().equals(Types.BOOLEAN) &&
+ !typeCoercion.getType().equals(Types.BOOLEAN);
}
private static boolean isBooleanUnbox(TypeCoercionNode typeCoercion) {
- return !typeCoercion.getExpression().getType().equals(BooleanValue.REF) &&
- typeCoercion.getType().equals(BooleanValue.REF);
+ return !typeCoercion.getExpression().getType().equals(Types.BOOLEAN) &&
+ typeCoercion.getType().equals(Types.BOOLEAN);
}
private List<InterpreterValue> evalArguments(List<? extends ExpressionNode> arguments) {
diff --git a/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
index c6920c7..6c315bb 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
@@ -4,7 +4,7 @@ import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.interpreter.errors.UnexpectedValueType;
import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
-import org.zwobble.couscous.values.ObjectValues;
+import org.zwobble.couscous.types.Types;
public class InterpreterTypes {
public static void checkIsInstance(Type type, InterpreterValue value) {
@@ -20,7 +20,7 @@ public class InterpreterTypes {
public static boolean isSubType(Type superType, InterpreterType subType) {
return
superType.equals(subType.getType()) ||
- superType.equals(ObjectValues.OBJECT) ||
+ superType.equals(Types.OBJECT) ||
subType.getSuperTypes().contains(superType);
}
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
index a183206..6cebc21 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
@@ -4,7 +4,7 @@ import org.zwobble.couscous.ast.Operator;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
-import org.zwobble.couscous.values.BooleanValue;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
@@ -22,15 +22,15 @@ public final class BooleanInterpreterValue implements InterpreterValue {
private static final InterpreterType TYPE = IntrinsicInterpreterType.builder(BooleanInterpreterValue.class, "boolean")
- .method(Operator.BOOLEAN_NOT.getSymbol(), list(), BooleanValue.REF, (environment, arguments) ->
+ .method(Operator.BOOLEAN_NOT.getSymbol(), list(), Types.BOOLEAN, (environment, arguments) ->
of(!arguments.getReceiver().getValue()))
- .method(Operator.BOOLEAN_AND.getSymbol(), list(BooleanValue.REF), BooleanValue.REF, (environment, arguments) -> {
+ .method(Operator.BOOLEAN_AND.getSymbol(), list(Types.BOOLEAN), Types.BOOLEAN, (environment, arguments) -> {
BooleanInterpreterValue right = (BooleanInterpreterValue)arguments.get(0);
return of(arguments.getReceiver().getValue() && right.getValue());
})
- .method(Operator.BOOLEAN_OR.getSymbol(), list(BooleanValue.REF), BooleanValue.REF, (environment, arguments) -> {
+ .method(Operator.BOOLEAN_OR.getSymbol(), list(Types.BOOLEAN), Types.BOOLEAN, (environment, arguments) -> {
BooleanInterpreterValue right = (BooleanInterpreterValue)arguments.get(0);
return of(arguments.getReceiver().getValue() || right.getValue());
})
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
index 18d0c34..b4f8701 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
@@ -2,10 +2,7 @@ package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.IntegerValue;
-import org.zwobble.couscous.values.ObjectValues;
-import org.zwobble.couscous.values.StringValue;
+import org.zwobble.couscous.types.Types;
import static org.zwobble.couscous.util.ExtraLists.list;
@@ -21,24 +18,24 @@ public class BoxedIntegerInterpreterValue {
}
public static final InterpreterType TYPE = IntrinsicInterpreterType.classBuilder("java.lang.Integer")
- .field("value", IntegerValue.REF)
+ .field("value", Types.INT)
- .staticMethod("parseInt", list(StringValue.REF), IntegerValue.REF,
+ .staticMethod("parseInt", list(Types.STRING), Types.INT,
(environment, arguments) -> {
StringInterpreterValue value = (StringInterpreterValue)arguments.get(0);
return new IntegerInterpreterValue(Integer.parseInt(value.getValue()));
})
- .staticMethod("valueOf", list(IntegerValue.REF), ObjectValues.BOXED_INT,
+ .staticMethod("valueOf", list(Types.INT), Types.BOXED_INT,
(environment, arguments) -> {
IntegerInterpreterValue value = (IntegerInterpreterValue)arguments.get(0);
return of(value);
})
- .method("equals", list(ObjectValues.OBJECT), BooleanValue.REF,
+ .method("equals", list(Types.OBJECT), Types.BOOLEAN,
(environment, arguments) -> {
InterpreterValue right = arguments.getPositionalArguments().get(0);
- if (right.getType().getType().equals(ObjectValues.BOXED_INT)) {
+ if (right.getType().getType().equals(Types.BOXED_INT)) {
IntegerInterpreterValue leftValue = (IntegerInterpreterValue)arguments.getReceiver().getField("value");
IntegerInterpreterValue rightValue = (IntegerInterpreterValue)right.getField("value");
return BooleanInterpreterValue.of(leftValue.getValue() == rightValue.getValue());
@@ -47,7 +44,7 @@ public class BoxedIntegerInterpreterValue {
}
})
- .method("toString", list(), StringValue.REF,
+ .method("toString", list(), Types.STRING,
(environment, arguments) -> {
IntegerInterpreterValue value = (IntegerInterpreterValue)arguments.getReceiver().getField("value");
return StringInterpreterValue.of(Integer.toString(value.getValue()));
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
index f0ce783..00d4aa5 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
@@ -5,8 +5,7 @@ import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
@@ -16,31 +15,31 @@ import java.util.function.BiFunction;
import static org.zwobble.couscous.util.ExtraLists.list;
public final class IntegerInterpreterValue implements InterpreterValue {
- public static final InterpreterType TYPE = IntrinsicInterpreterType.builder(IntegerInterpreterValue.class, IntegerValue.REF)
- .method(Operator.ADD.getSymbol(), list(IntegerValue.REF), IntegerValue.REF,
+ public static final InterpreterType TYPE = IntrinsicInterpreterType.builder(IntegerInterpreterValue.class, Types.INT)
+ .method(Operator.ADD.getSymbol(), list(Types.INT), Types.INT,
infixReturningInteger((left, right) -> left + right))
- .method(Operator.SUBTRACT.getSymbol(), list(IntegerValue.REF), IntegerValue.REF,
+ .method(Operator.SUBTRACT.getSymbol(), list(Types.INT), Types.INT,
infixReturningInteger((left, right) -> left - right))
- .method(Operator.MULTIPLY.getSymbol(), list(IntegerValue.REF), IntegerValue.REF,
+ .method(Operator.MULTIPLY.getSymbol(), list(Types.INT), Types.INT,
infixReturningInteger((left, right) -> left * right))
- .method(Operator.DIVIDE.getSymbol(), list(IntegerValue.REF), IntegerValue.REF,
+ .method(Operator.DIVIDE.getSymbol(), list(Types.INT), Types.INT,
infixReturningInteger((left, right) -> left / right))
- .method(Operator.MOD.getSymbol(), list(IntegerValue.REF), IntegerValue.REF,
+ .method(Operator.MOD.getSymbol(), list(Types.INT), Types.INT,
infixReturningInteger((left, right) -> left % right))
- .method(Operator.EQUALS.getSymbol(), list(IntegerValue.REF), BooleanValue.REF,
+ .method(Operator.EQUALS.getSymbol(), list(Types.INT), Types.BOOLEAN,
(environment, arguments) -> {
IntegerInterpreterValue right = (IntegerInterpreterValue)arguments.getPositionalArguments().get(0);
return integerEquals(arguments, right);
})
- .method(Operator.NOT_EQUALS.getSymbol(), list(IntegerValue.REF), BooleanValue.REF,
+ .method(Operator.NOT_EQUALS.getSymbol(), list(Types.INT), Types.BOOLEAN,
infixReturningBoolean((left, right) -> !left.equals(right)))
- .method(Operator.GREATER_THAN.getSymbol(), list(IntegerValue.REF), BooleanValue.REF,
+ .method(Operator.GREATER_THAN.getSymbol(), list(Types.INT), Types.BOOLEAN,
infixReturningBoolean((left, right) -> left > right))
- .method(Operator.GREATER_THAN_OR_EQUAL.getSymbol(), list(IntegerValue.REF), BooleanValue.REF,
+ .method(Operator.GREATER_THAN_OR_EQUAL.getSymbol(), list(Types.INT), Types.BOOLEAN,
infixReturningBoolean((left, right) -> left >= right))
- .method(Operator.LESS_THAN.getSymbol(), list(IntegerValue.REF), BooleanValue.REF,
+ .method(Operator.LESS_THAN.getSymbol(), list(Types.INT), Types.BOOLEAN,
infixReturningBoolean((left, right) -> left < right))
- .method(Operator.LESS_THAN_OR_EQUAL.getSymbol(), list(IntegerValue.REF), BooleanValue.REF,
+ .method(Operator.LESS_THAN_OR_EQUAL.getSymbol(), list(Types.INT), Types.BOOLEAN,
infixReturningBoolean((left, right) -> left <= right))
.build();
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java
index faab2a8..80635b2 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java
@@ -2,14 +2,13 @@ package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.ObjectValues;
+import org.zwobble.couscous.types.Types;
import static org.zwobble.couscous.util.ExtraLists.list;
public class InternalCouscousInterpreterValue {
public static final InterpreterType TYPE = IntrinsicInterpreterType.classBuilder("_couscous")
- .staticMethod("same", list(ObjectValues.OBJECT, ObjectValues.OBJECT), BooleanValue.REF,
+ .staticMethod("same", list(Types.OBJECT, Types.OBJECT), Types.BOOLEAN,
(environment, arguments) ->
BooleanInterpreterValue.of(arguments.get(0) == arguments.get(1)))
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java
index 2fe72d7..bd4d6ba 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java
@@ -4,6 +4,7 @@ import org.zwobble.couscous.ast.Operator;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.*;
import java.util.Optional;
@@ -11,25 +12,25 @@ import java.util.Optional;
import static org.zwobble.couscous.util.ExtraLists.list;
public final class StringInterpreterValue implements InterpreterValue {
- public static final InterpreterType TYPE = IntrinsicInterpreterType.builder(StringInterpreterValue.class, StringValue.REF)
- .method("length", list(), IntegerValue.REF, (environment, arguments) ->
+ public static final InterpreterType TYPE = IntrinsicInterpreterType.builder(StringInterpreterValue.class, Types.STRING)
+ .method("length", list(), Types.INT, (environment, arguments) ->
new IntegerInterpreterValue(arguments.getReceiver().value.length()))
- .method("substring", list(IntegerValue.REF, IntegerValue.REF), StringValue.REF, (environment, arguments) -> {
+ .method("substring", list(Types.INT, Types.INT), Types.STRING, (environment, arguments) -> {
IntegerInterpreterValue startIndex = (IntegerInterpreterValue)arguments.get(0);
IntegerInterpreterValue endIndex = (IntegerInterpreterValue)arguments.get(1);
return of(arguments.getReceiver().value.substring(startIndex.getValue(), endIndex.getValue()));
})
- .method(Operator.ADD.getSymbol(), list(StringValue.REF), StringValue.REF, (environment, arguments) -> {
+ .method(Operator.ADD.getSymbol(), list(Types.STRING), Types.STRING, (environment, arguments) -> {
StringInterpreterValue right = (StringInterpreterValue)arguments.get(0);
return of(arguments.getReceiver().value + right.value);
})
- .method("toLowerCase", list(), StringValue.REF, (environment, arguments) ->
+ .method("toLowerCase", list(), Types.STRING, (environment, arguments) ->
of(arguments.getReceiver().value.toLowerCase()))
- .method("equals", list(ObjectValues.OBJECT), BooleanValue.REF, (environment, arguments) -> {
+ .method("equals", list(Types.OBJECT), Types.BOOLEAN, (environment, arguments) -> {
InterpreterValue right = arguments.get(0);
if (right instanceof StringInterpreterValue) {
return BooleanInterpreterValue.of(arguments.getReceiver().value.equals(((StringInterpreterValue)right).value));
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java
index b460d00..f941652 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java
@@ -4,7 +4,7 @@ import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
-import org.zwobble.couscous.values.ObjectValues;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
@@ -12,7 +12,7 @@ import java.util.Optional;
public class TypeInterpreterValue implements InterpreterValue {
public static final InterpreterType TYPE = IntrinsicInterpreterType
- .builder(TypeInterpreterValue.class, ObjectValues.CLASS)
+ .builder(TypeInterpreterValue.class, Types.CLASS)
.build();
public static InterpreterValue of(ScalarType type) {
diff --git a/src/main/java/org/zwobble/couscous/types/Types.java b/src/main/java/org/zwobble/couscous/types/Types.java
index 20a3645..6902c33 100644
--- a/src/main/java/org/zwobble/couscous/types/Types.java
+++ b/src/main/java/org/zwobble/couscous/types/Types.java
@@ -1,8 +1,15 @@
package org.zwobble.couscous.types;
-import org.zwobble.couscous.values.ObjectValues;
-
public class Types {
+ public static final ScalarType VOID = ScalarType.of("void");
+ public static final ScalarType BOOLEAN = ScalarType.of("boolean");
+ public static final ScalarType INT = ScalarType.of("int");
+ public static final ScalarType STRING = ScalarType.of("java.lang.String");
+ public static final ScalarType CLASS = ScalarType.of("java.lang.Class");
+ public static final ScalarType OBJECT = ScalarType.of("java.lang.Object");
+ public static final ScalarType BOXED_INT = ScalarType.of("java.lang.Integer");
+ public static final ScalarType BOXED_BOOLEAN = ScalarType.of("java.lang.Boolean");
+
public static ScalarType erasure(Type type) {
return type.accept(new Type.Visitor<ScalarType>() {
@Override
@@ -12,7 +19,7 @@ public class Types {
@Override
public ScalarType visit(TypeParameter parameter) {
- return ObjectValues.OBJECT;
+ return OBJECT;
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/values/BooleanValue.java b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
index 8d42e4f..8f7d95b 100644
--- a/src/main/java/org/zwobble/couscous/values/BooleanValue.java
+++ b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
@@ -1,10 +1,9 @@
package org.zwobble.couscous.values;
import org.zwobble.couscous.types.ScalarType;
+import org.zwobble.couscous.types.Types;
public final class BooleanValue implements PrimitiveValue {
- public static final ScalarType REF = ScalarType.of("boolean");
-
private final boolean value;
public BooleanValue(final boolean value) {
@@ -22,7 +21,7 @@ public final class BooleanValue implements PrimitiveValue {
@Override
public ScalarType getType() {
- return REF;
+ return Types.BOOLEAN;
}
@java.lang.Override
diff --git a/src/main/java/org/zwobble/couscous/values/IntegerValue.java b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
index 86de00f..d657097 100644
--- a/src/main/java/org/zwobble/couscous/values/IntegerValue.java
+++ b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
@@ -1,9 +1,9 @@
package org.zwobble.couscous.values;
import org.zwobble.couscous.types.ScalarType;
+import org.zwobble.couscous.types.Types;
public final class IntegerValue implements PrimitiveValue {
- public static final ScalarType REF = ScalarType.of("int");
private final int value;
@Override
@@ -13,7 +13,7 @@ public final class IntegerValue implements PrimitiveValue {
@Override
public ScalarType getType() {
- return REF;
+ return Types.INT;
}
public IntegerValue(final int value) {
diff --git a/src/main/java/org/zwobble/couscous/values/ObjectValues.java b/src/main/java/org/zwobble/couscous/values/ObjectValues.java
deleted file mode 100644
index 1df2de6..0000000
--- a/src/main/java/org/zwobble/couscous/values/ObjectValues.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.zwobble.couscous.values;
-
-import org.zwobble.couscous.types.ScalarType;
-
-public class ObjectValues {
- public static final ScalarType VOID = ScalarType.of("void");
- public static final ScalarType CLASS = ScalarType.of("java.lang.Class");
- public static final ScalarType OBJECT = ScalarType.of("java.lang.Object");
- public static final ScalarType BOXED_INT = ScalarType.of("java.lang.Integer");
- public static final ScalarType BOXED_BOOLEAN = ScalarType.of("java.lang.Boolean");
-}
diff --git a/src/main/java/org/zwobble/couscous/values/StringValue.java b/src/main/java/org/zwobble/couscous/values/StringValue.java
index 6a417f5..41bd5e9 100644
--- a/src/main/java/org/zwobble/couscous/values/StringValue.java
+++ b/src/main/java/org/zwobble/couscous/values/StringValue.java
@@ -1,13 +1,13 @@
package org.zwobble.couscous.values;
import org.zwobble.couscous.types.ScalarType;
+import org.zwobble.couscous.types.Types;
public final class StringValue implements PrimitiveValue {
-
public static StringValue of(String value) {
return new StringValue(value);
}
- public static final ScalarType REF = ScalarType.of("java.lang.String");
+
private final String value;
@Override
@@ -17,7 +17,7 @@ public final class StringValue implements PrimitiveValue {
@Override
public ScalarType getType() {
- return REF;
+ return Types.STRING;
}
private StringValue(final String value) {
diff --git a/src/main/java/org/zwobble/couscous/values/TypeValue.java b/src/main/java/org/zwobble/couscous/values/TypeValue.java
index 4a3b13d..d5234ac 100644
--- a/src/main/java/org/zwobble/couscous/values/TypeValue.java
+++ b/src/main/java/org/zwobble/couscous/values/TypeValue.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.values;
import org.zwobble.couscous.types.ParameterizedType;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.types.Types;
import static org.zwobble.couscous.util.ExtraLists.list;
@@ -24,7 +25,7 @@ public class TypeValue implements PrimitiveValue {
@Override
public Type getType() {
- return new ParameterizedType(ObjectValues.CLASS, list(value));
+ return new ParameterizedType(Types.CLASS, list(value));
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/values/UnitValue.java b/src/main/java/org/zwobble/couscous/values/UnitValue.java
index 3af8111..5b6698b 100644
--- a/src/main/java/org/zwobble/couscous/values/UnitValue.java
+++ b/src/main/java/org/zwobble/couscous/values/UnitValue.java
@@ -1,10 +1,9 @@
package org.zwobble.couscous.values;
import org.zwobble.couscous.types.ScalarType;
+import org.zwobble.couscous.types.Types;
public class UnitValue implements PrimitiveValue {
- public static final ScalarType REF = ScalarType.of("void");
-
static final UnitValue UNIT = new UnitValue();
private UnitValue() {
@@ -17,6 +16,6 @@ public class UnitValue implements PrimitiveValue {
@Override
public ScalarType getType() {
- return REF;
+ return Types.VOID;
}
}
diff --git a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java
index cccd305..c9c7414 100644
--- a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java
@@ -3,9 +3,8 @@ package org.zwobble.couscous.tests;
import org.junit.Test;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.types.ScalarType;
-import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.PrimitiveValue;
-import org.zwobble.couscous.values.StringValue;
import java.util.Collections;
import java.util.List;
@@ -35,7 +34,7 @@ public abstract class BackendEvalTests {
assertEquals(value(true), evalExpression(literal(true)));
assertEquals(value(false), evalExpression(literal(false)));
assertEquals(value(42), evalExpression(literal(42)));
- assertEquals(value(StringValue.REF), evalExpression(literal(StringValue.REF)));
+ assertEquals(value(Types.STRING), evalExpression(literal(Types.STRING)));
}
@Test
@@ -127,7 +126,7 @@ public abstract class BackendEvalTests {
literal("hello"),
"length",
list(),
- IntegerValue.REF));
+ Types.INT));
assertEquals(value(5), result);
}
@@ -137,7 +136,7 @@ public abstract class BackendEvalTests {
literal("hello"),
"substring",
list(literal(1), literal(4)),
- StringValue.REF));
+ Types.STRING));
assertEquals(value("ell"), result);
}
@@ -147,7 +146,7 @@ public abstract class BackendEvalTests {
"java.lang.Integer",
"parseInt",
list(literal("42")),
- IntegerValue.REF));
+ Types.INT));
assertEquals(value(42), result);
}
@@ -155,15 +154,15 @@ public abstract class BackendEvalTests {
public void canCallStaticMethodFromUserDefinedStaticMethod() {
ClassNode classNode = ClassNode.builder("com.example.Example")
.staticMethod("main", method -> method
- .returns(IntegerValue.REF)
+ .returns(Types.INT)
.statement(returns(staticMethodCall(
"java.lang.Integer",
"parseInt",
list(literal("42")),
- IntegerValue.REF))))
+ Types.INT))))
.build();
PrimitiveValue result = evalExpression(list(classNode),
- staticMethodCall("com.example.Example", "main", list(), IntegerValue.REF));
+ staticMethodCall("com.example.Example", "main", list(), Types.INT));
assertEquals(value(42), result);
}
@@ -171,21 +170,21 @@ public abstract class BackendEvalTests {
public void canCallInstanceMethodWithNoArgumentsOnUserDefinedClass() {
ClassNode classNode = ClassNode.builder("com.example.Example")
.method("main", method -> method
- .returns(IntegerValue.REF)
+ .returns(Types.INT)
.statement(returns(literal(42))))
.build();
PrimitiveValue result = evalExpression(list(classNode),
- methodCall(constructorCall(classNode.getName(), list()), "main", list(), IntegerValue.REF));
+ methodCall(constructorCall(classNode.getName(), list()), "main", list(), Types.INT));
assertEquals(value(42), result);
}
@Test
public void canCallInstanceMethodWithArgumentsOnUserDefinedClass() {
- FormalArgumentNode argument = formalArg(var(ANY_ID, "x", IntegerValue.REF));
+ FormalArgumentNode argument = formalArg(var(ANY_ID, "x", Types.INT));
ClassNode classNode = ClassNode.builder("com.example.Example")
.method("main", method -> method
.argument(argument)
- .returns(IntegerValue.REF)
+ .returns(Types.INT)
.statement(returns(reference(argument))))
.build();
@@ -195,25 +194,25 @@ public abstract class BackendEvalTests {
constructorCall(classNode.getName(), list()),
"main",
list(literal(42)),
- IntegerValue.REF));
+ Types.INT));
assertEquals(value(42), result);
}
@Test
public void constructorIsExecutedOnConstruction() {
- FormalArgumentNode argument = formalArg(var(ANY_ID, "x", IntegerValue.REF));
+ FormalArgumentNode argument = formalArg(var(ANY_ID, "x", Types.INT));
ClassNode classNode = ClassNode.builder("com.example.Example")
- .field("value", IntegerValue.REF)
+ .field("value", Types.INT)
.constructor(constructor -> constructor
.argument(argument)
.statement(assignStatement(
- fieldAccess(constructor.thisReference(), "value", IntegerValue.REF),
+ fieldAccess(constructor.thisReference(), "value", Types.INT),
reference(argument))))
.method("main", method -> method
- .returns(IntegerValue.REF)
+ .returns(Types.INT)
.statement(returns(
- fieldAccess(method.thisReference(), "value", IntegerValue.REF))))
+ fieldAccess(method.thisReference(), "value", Types.INT))))
.build();
PrimitiveValue result = evalExpression(
@@ -222,7 +221,7 @@ public abstract class BackendEvalTests {
constructorCall(classNode.getName(), list(literal(42))),
"main",
list(),
- IntegerValue.REF));
+ Types.INT));
assertEquals(value(42), result);
}
@@ -231,16 +230,16 @@ public abstract class BackendEvalTests {
public void staticConstructorIsExecutedOnReference() {
ScalarType type = ScalarType.of("com.example.Example");
ClassNode classNode = ClassNode.builder(type)
- .staticField("value", IntegerValue.REF)
+ .staticField("value", Types.INT)
.staticConstructor(list(
assignStatement(
- fieldAccess(type, "value", IntegerValue.REF),
+ fieldAccess(type, "value", Types.INT),
literal(42))))
.build();
PrimitiveValue result = evalExpression(
list(classNode),
- fieldAccess(type, "value", IntegerValue.REF));
+ fieldAccess(type, "value", Types.INT));
assertEquals(value(42), result);
}
diff --git a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
index c8b2b70..635dae8 100644
--- a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
@@ -2,10 +2,9 @@ package org.zwobble.couscous.tests;
import org.junit.Test;
import org.zwobble.couscous.ast.*;
-import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
-import org.zwobble.couscous.values.StringValue;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
@@ -38,7 +37,7 @@ public abstract class BackendMethodTests {
@Test
public void canReturnLiteralValue() {
MethodNode.Builder method = staticMethod("hello")
- .returns(StringValue.REF)
+ .returns(Types.STRING)
.statement(returns(literal("hello, world!")));
final java.lang.Object result = runMethod(method);
assertEquals(value("hello, world!"), result);
@@ -46,10 +45,10 @@ public abstract class BackendMethodTests {
@Test
public void canPassValueToMethod() {
- FormalArgumentNode arg = formalArg(var(ANY_ID, "x", StringValue.REF));
+ FormalArgumentNode arg = formalArg(var(ANY_ID, "x", Types.STRING));
MethodNode.Builder method = staticMethod("hello")
.argument(arg)
- .returns(StringValue.REF)
+ .returns(Types.STRING)
.statement(returns(reference(arg)));
final java.lang.Object result = runMethod(method, value("hello, world!"));
assertEquals(value("hello, world!"), result);
@@ -57,10 +56,10 @@ public abstract class BackendMethodTests {
@Test
public void canReassignValueToArgument() {
- FormalArgumentNode arg = formalArg(var(ANY_ID, "x", StringValue.REF));
+ FormalArgumentNode arg = formalArg(var(ANY_ID, "x", Types.STRING));
MethodNode.Builder method = staticMethod("hello")
.argument(arg)
- .returns(StringValue.REF)
+ .returns(Types.STRING)
.statement(expressionStatement(assign(
reference(arg),
literal("[updated value]"))))
@@ -71,9 +70,9 @@ public abstract class BackendMethodTests {
@Test
public void canDeclareVariable() {
- LocalVariableDeclarationNode localVariableDeclaration = localVariableDeclaration(ANY_ID, "x", StringValue.REF, LiteralNode.literal("[initial value]"));
+ LocalVariableDeclarationNode localVariableDeclaration = localVariableDeclaration(ANY_ID, "x", Types.STRING, LiteralNode.literal("[initial value]"));
MethodNode.Builder method = staticMethod("hello")
- .returns(StringValue.REF)
+ .returns(Types.STRING)
.statement(localVariableDeclaration)
.statement(returns(reference(localVariableDeclaration)));
final java.lang.Object result = runMethod(method);
@@ -82,9 +81,9 @@ public abstract class BackendMethodTests {
@Test
public void canDeclareVariableAndThenAssignValues() {
- LocalVariableDeclarationNode localVariableDeclaration = localVariableDeclaration(ANY_ID, "x", StringValue.REF, LiteralNode.literal("[initial value]"));
+ LocalVariableDeclarationNode localVariableDeclaration = localVariableDeclaration(ANY_ID, "x", Types.STRING, LiteralNode.literal("[initial value]"));
MethodNode.Builder method = staticMethod("hello")
- .returns(StringValue.REF)
+ .returns(Types.STRING)
.statement(localVariableDeclaration)
.statement(expressionStatement(assign(
reference(localVariableDeclaration),
@@ -97,7 +96,7 @@ public abstract class BackendMethodTests {
@Test
public void whenConditionIsTrueIfStatementExecutesTrueBranch() {
MethodNode.Builder method = staticMethod("hello")
- .returns(StringValue.REF)
+ .returns(Types.STRING)
.statement(ifStatement(
literal(true),
list(returns(literal("[true]"))),
@@ -108,7 +107,7 @@ public abstract class BackendMethodTests {
@Test
public void whenConditionIsFalseIfStatementExecutesTrueBranch() {
MethodNode.Builder method = staticMethod("hello")
- .returns(StringValue.REF)
+ .returns(Types.STRING)
.statement(ifStatement(
literal(false),
list(returns(literal("[true]"))),
@@ -118,10 +117,10 @@ public abstract class BackendMethodTests {
@Test
public void whileLoopIsExecutedWhileConditionIsTrue() {
- LocalVariableDeclarationNode x = localVariableDeclaration(TestIds.id("x"), "x", IntegerValue.REF, literal(0));
- LocalVariableDeclarationNode y = localVariableDeclaration(TestIds.id("y"), "y", IntegerValue.REF, literal(2));
+ LocalVariableDeclarationNode x = localVariableDeclaration(TestIds.id("x"), "x", Types.INT, literal(0));
+ LocalVariableDeclarationNode y = localVariableDeclaration(TestIds.id("y"), "y", Types.INT, literal(2));
MethodNode.Builder method = staticMethod("hello")
- .returns(IntegerValue.REF)
+ .returns(Types.INT)
.statement(x)
.statement(y)
.statement(whileLoop(
@@ -133,10 +132,10 @@ public abstract class BackendMethodTests {
@Test
public void returnWillExitWhileLoopEarly() {
- LocalVariableDeclarationNode x = localVariableDeclaration(TestIds.id("x"), "x", IntegerValue.REF, literal(0));
- LocalVariableDeclarationNode y = localVariableDeclaration(TestIds.id("y"), "y", IntegerValue.REF, literal(2));
+ LocalVariableDeclarationNode x = localVariableDeclaration(TestIds.id("x"), "x", Types.INT, literal(0));
+ LocalVariableDeclarationNode y = localVariableDeclaration(TestIds.id("y"), "y", Types.INT, literal(2));
MethodNode.Builder method = staticMethod("hello")
- .returns(IntegerValue.REF)
+ .returns(Types.INT)
.statement(x)
.statement(y)
.statement(whileLoop(
diff --git a/src/test/java/org/zwobble/couscous/tests/CompilerTests.java b/src/test/java/org/zwobble/couscous/tests/CompilerTests.java
index ae8376b..7df7582 100644
--- a/src/test/java/org/zwobble/couscous/tests/CompilerTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/CompilerTests.java
@@ -2,10 +2,8 @@ package org.zwobble.couscous.tests;
import org.junit.Test;
import org.zwobble.couscous.types.ScalarType;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.PrimitiveValue;
-import org.zwobble.couscous.values.StringValue;
import java.io.File;
import java.io.IOException;
@@ -23,7 +21,7 @@ import static org.zwobble.couscous.values.PrimitiveValues.value;
public abstract class CompilerTests {
@Test
public void canEvaluateLiterals() {
- assertEquals(value("hello"), evalExpression(StringValue.REF, "\"hello\""));
+ assertEquals(value("hello"), evalExpression(Types.STRING, "\"hello\""));
assertEquals(value(42), evalIntExpression("42"));
}
@@ -41,13 +39,13 @@ public abstract class CompilerTests {
@Test
public void equalityOnReferenceTypesChecksForIdentity() {
assertEquals(value(false), evalBooleanExpression("new Object() == new Object()"));
- assertEquals(value(true), exec(BooleanValue.REF, "Object x = new Object(); return x == x;"));
+ assertEquals(value(true), exec(Types.BOOLEAN, "Object x = new Object(); return x == x;"));
}
@Test
public void integersCanBeAssignedToObjectVariable() {
- assertEquals(value(false), exec(BooleanValue.REF, "Object x = 1; return x.equals(new Object());"));
- assertEquals(value(true), exec(BooleanValue.REF, "Object x = 1; return x.equals(1);"));
+ assertEquals(value(false), exec(Types.BOOLEAN, "Object x = 1; return x.equals(new Object());"));
+ assertEquals(value(true), exec(Types.BOOLEAN, "Object x = 1; return x.equals(1);"));
}
@Test
@@ -59,7 +57,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.RecursiveFactorial"),
"factorial",
list(value(6)),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -71,7 +69,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.WhileFactorial"),
"factorial",
list(value(6)),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -83,7 +81,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.ForFactorial"),
"factorial",
list(value(6)),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -95,7 +93,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.StaticNestedClass"),
"value",
list(),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -107,7 +105,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.InnerClass"),
"run",
list(),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -119,7 +117,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.InnerClass"),
"run",
list(),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -131,7 +129,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.ConstantIntSupplier"),
"value",
list(),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -143,7 +141,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.AnonymousClass"),
"value",
list(),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -155,7 +153,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.AnonymousClass"),
"value",
list(value(42)),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -167,7 +165,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.Lambda"),
"value",
list(),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -179,7 +177,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.Lambda"),
"value",
list(value(2)),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -191,7 +189,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.Lambda"),
"value",
list(value(2)),
- IntegerValue.REF));
+ Types.INT));
}
@Test
@@ -203,7 +201,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.GenericInterface"),
"value",
list(),
- StringValue.REF));
+ Types.STRING));
}
@Test
@@ -215,7 +213,7 @@ public abstract class CompilerTests {
ScalarType.of("com.example.GenericInterface"),
"value",
list(),
- StringValue.REF));
+ Types.STRING));
}
@Test
@@ -227,17 +225,17 @@ public abstract class CompilerTests {
ScalarType.of("com.example.StaticMethodOverloads"),
"value",
list(),
- IntegerValue.REF));
+ Types.INT));
}
@Test
public void stringAdd() throws Exception {
- assertEquals(value("42"), evalExpression(StringValue.REF, "\"4\" + \"2\""));
+ assertEquals(value("42"), evalExpression(Types.STRING, "\"4\" + \"2\""));
}
@Test
public void stringToLowerCase() throws Exception {
- assertEquals(value("patrick wolf"), evalExpression(StringValue.REF, "\"Patrick Wolf\".toLowerCase()"));
+ assertEquals(value("patrick wolf"), evalExpression(Types.STRING, "\"Patrick Wolf\".toLowerCase()"));
}
@Test
@@ -305,11 +303,11 @@ public abstract class CompilerTests {
}
private PrimitiveValue evalBooleanExpression(String expressionSource) {
- return evalExpression(BooleanValue.REF, expressionSource);
+ return evalExpression(Types.BOOLEAN, expressionSource);
}
private PrimitiveValue evalIntExpression(String expressionSource) {
- return evalExpression(IntegerValue.REF, expressionSource);
+ return evalExpression(Types.INT, expressionSource);
}
private PrimitiveValue evalExpression(ScalarType type, String expressionSource) {
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java
index 2ca3b2d..fbc3c54 100644
--- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java
@@ -14,11 +14,10 @@ import org.zwobble.couscous.backends.csharp.CsharpBackend;
import org.zwobble.couscous.backends.csharp.CsharpSerializer;
import org.zwobble.couscous.tests.MethodRunner;
import org.zwobble.couscous.tests.backends.Processes;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.util.ExtraLists;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
-import org.zwobble.couscous.values.StringValue;
-import org.zwobble.couscous.values.UnitValue;
import java.io.IOException;
import java.nio.file.Files;
@@ -72,7 +71,7 @@ public class CsharpMethodRunner implements MethodRunner {
eagerMap(arguments, LiteralNode::literal),
returnType));
- boolean isVoid = returnType.equals(UnitValue.REF);
+ boolean isVoid = returnType.equals(Types.VOID);
String body = isVoid
? value + ";"
: "var value = " + value + ";" +
@@ -123,7 +122,7 @@ public class CsharpMethodRunner implements MethodRunner {
return value(value.equals("True"));
case "System.MonoType":
if (value.equals("System.String")) {
- return value(StringValue.REF);
+ return value(Types.STRING);
} else {
assertThat(value, Matchers.startsWith(NAMESPACE_PREFIX));
return value(ScalarType.of(value.substring(NAMESPACE_PREFIX.length())));
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java
index 3eebf1a..5c1044d 100644
--- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java
@@ -5,8 +5,7 @@ import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.backends.csharp.CsharpSerializer;
import org.zwobble.couscous.tests.TestIds;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.types.Types;
import static org.junit.Assert.assertEquals;
import static org.zwobble.couscous.ast.AssignmentNode.assign;
@@ -71,7 +70,7 @@ public class CsharpSerializerTests {
@Test
public void assignmentSeparatesTargetAndValueWithEqualsSign() {
String output = serialize(assign(
- reference(var(TestIds.ANY_ID, "x", BooleanValue.REF)),
+ reference(var(TestIds.ANY_ID, "x", Types.BOOLEAN)),
literal(true)));
assertEquals("x = true", output);
}
@@ -131,7 +130,7 @@ public class CsharpSerializerTests {
@Test
public void prefixExpression() {
String output = serialize(not(
- reference(var(TestIds.ANY_ID, "x", BooleanValue.REF))));
+ reference(var(TestIds.ANY_ID, "x", Types.BOOLEAN))));
assertEquals("!x", output);
}
@@ -360,7 +359,7 @@ public class CsharpSerializerTests {
@Test
public void interfaceWithMethod() {
- MethodNode method = MethodNode.builder("get").isAbstract().returns(IntegerValue.REF).build();
+ MethodNode method = MethodNode.builder("get").isAbstract().returns(Types.INT).build();
Node node = new ClassNodeBuilder(ScalarType.of("com.example.Example"))
.method(method)
.buildInterface();
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java
index cc36c20..3ad255b 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java
@@ -3,10 +3,7 @@ package org.zwobble.couscous.tests.frontends.java;
import org.junit.Test;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.types.ScalarType;
-import org.zwobble.couscous.values.BooleanValue;
-import org.zwobble.couscous.values.IntegerValue;
-import org.zwobble.couscous.values.ObjectValues;
-import org.zwobble.couscous.values.StringValue;
+import org.zwobble.couscous.types.Types;
import java.util.List;
@@ -38,7 +35,7 @@ public class ExpressionReadingTests {
assertEquals(literal(false), readBooleanExpression("false"));
assertEquals(literal(42), readIntExpression("42"));
assertEquals(literal('h'), readIntExpression("'h'"));
- assertEquals(literal(StringValue.REF), readExpression("Class<String>", "String.class"));
+ assertEquals(literal(Types.STRING), readExpression("Class<String>", "String.class"));
}
@Test
@@ -51,7 +48,7 @@ public class ExpressionReadingTests {
@Test
public void canReadCasts() {
assertEquals(
- cast(literal(42), ObjectValues.OBJECT),
+ cast(literal(42), Types.OBJECT),
readExpression("Object", "(Object)42"));
}
@Test
@@ -96,7 +93,7 @@ public class ExpressionReadingTests {
fieldAccess(
thisReference(ScalarType.of("com.example.Example")),
"name",
- StringValue.REF),
+ Types.STRING),
returnNode.getValue());
}
@@ -122,21 +119,21 @@ public class ExpressionReadingTests {
fieldAccess(
ScalarType.of("com.example.Example"),
"name",
- StringValue.REF),
+ Types.STRING),
returnNode.getValue());
}
@Test
public void canReadInstanceMethodCalls() {
assertEquals(
- methodCall(literal("hello"), "startsWith", list(literal("h")), BooleanValue.REF),
+ methodCall(literal("hello"), "startsWith", list(literal("h")), Types.BOOLEAN),
readBooleanExpression("\"hello\".startsWith(\"h\")"));
List<StatementNode> statements = readStatements("int", "Object x = 1; return x.hashCode();");
LocalVariableDeclarationNode declaration = (LocalVariableDeclarationNode) statements.get(0);
ReturnNode returnNode = (ReturnNode) statements.get(1);
assertEquals(
- methodCall(reference(declaration), "hashCode", list(), IntegerValue.REF),
+ methodCall(reference(declaration), "hashCode", list(), Types.INT),
returnNode.getValue());
}
@@ -153,7 +150,7 @@ public class ExpressionReadingTests {
ThisReferenceNode.thisReference(ScalarType.of("com.example.Example")),
"loop",
list(),
- StringValue.REF),
+ Types.STRING),
returnNode.getValue());
}
@@ -164,7 +161,7 @@ public class ExpressionReadingTests {
ScalarType.of("java.lang.Integer"),
"parseInt",
list(literal("42")),
- IntegerValue.REF),
+ Types.INT),
readIntExpression("Integer.parseInt(\"42\")"));
}
@@ -181,7 +178,7 @@ public class ExpressionReadingTests {
ScalarType.of("com.example.Example"),
"loop",
list(),
- StringValue.REF),
+ Types.STRING),
returnNode.getValue());
}
@@ -198,7 +195,7 @@ public class ExpressionReadingTests {
"String",
"java.util.Objects.toString(42)");
assertEquals(
- typeCoercion(literal(42), ObjectValues.OBJECT),
+ typeCoercion(literal(42), Types.OBJECT),
expression.getArguments().get(0));
}
@@ -285,14 +282,14 @@ public class ExpressionReadingTests {
public void equalityOperatorDoesNotUnboxIfBothOperandsAreBoxed() {
assertEquals(
same(
- typeCoercion(constructorCall(ObjectValues.BOXED_INT, list(literal(1))), ObjectValues.OBJECT),
- typeCoercion(constructorCall(ObjectValues.BOXED_INT, list(literal(2))), ObjectValues.OBJECT)),
+ typeCoercion(constructorCall(Types.BOXED_INT, list(literal(1))), Types.OBJECT),
+ typeCoercion(constructorCall(Types.BOXED_INT, list(literal(2))), Types.OBJECT)),
readBooleanExpression("new Integer(1) == new Integer(2)"));
assertEquals(
not(same(
- typeCoercion(constructorCall(ObjectValues.BOXED_INT, list(literal(1))), ObjectValues.OBJECT),
- typeCoercion(constructorCall(ObjectValues.BOXED_INT, list(literal(2))), ObjectValues.OBJECT))),
+ typeCoercion(constructorCall(Types.BOXED_INT, list(literal(1))), Types.OBJECT),
+ typeCoercion(constructorCall(Types.BOXED_INT, list(literal(2))), Types.OBJECT))),
readBooleanExpression("new Integer(1) != new Integer(2)"));
}
@@ -326,7 +323,7 @@ public class ExpressionReadingTests {
fieldAccess(
thisReference(ScalarType.of("com.example.Example")),
"name",
- StringValue.REF),
+ Types.STRING),
literal("blah")),
returnNode.getValue());
}
@@ -345,8 +342,8 @@ public class ExpressionReadingTests {
fieldAccess(
thisReference(ScalarType.of("com.example.Example")),
"value",
- ObjectValues.OBJECT),
- typeCoercion(literal(4), ObjectValues.OBJECT)),
+ Types.OBJECT),
+ typeCoercion(literal(4), Types.OBJECT)),
returnNode.getValue());
}
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java
index 84e9508..8bcf38d 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java
@@ -4,11 +4,10 @@ import org.junit.Test;
import org.zwobble.couscous.ast.ReferenceNode;
import org.zwobble.couscous.ast.VariableDeclaration;
import org.zwobble.couscous.tests.TestIds;
-import org.zwobble.couscous.values.StringValue;
+import org.zwobble.couscous.types.Types;
import java.util.List;
-import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.junit.Assert.assertEquals;
import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg;
@@ -22,14 +21,14 @@ import static org.zwobble.couscous.util.ExtraLists.list;
public class FreeVariablesTests {
@Test
public void referenceIsFreeIfThereIsNoAssociatedDeclaration() {
- VariableDeclaration declaration = var(TestIds.ANY_ID, "[name]", StringValue.REF);
+ VariableDeclaration declaration = var(TestIds.ANY_ID, "[name]", Types.STRING);
List<ReferenceNode> freeVariables = findFreeVariables(list(reference(declaration)));
assertEquals(list(reference(declaration)), freeVariables);
}
@Test
public void referenceIsNotFreeIfIsDeclaredAsArgument() {
- VariableDeclaration declaration = var(TestIds.ANY_ID, "[name]", StringValue.REF);
+ VariableDeclaration declaration = var(TestIds.ANY_ID, "[name]", Types.STRING);
List<ReferenceNode> freeVariables = findFreeVariables(
list(formalArg(declaration), reference(declaration)));
assertEquals(emptyList(), freeVariables);
@@ -37,7 +36,7 @@ public class FreeVariablesTests {
@Test
public void referenceIsNotFreeIfIsReferenceToLocalDefinedInBody() {
- VariableDeclaration declaration = var(TestIds.ANY_ID, "[name]", StringValue.REF);
+ VariableDeclaration declaration = var(TestIds.ANY_ID, "[name]", Types.STRING);
List<ReferenceNode> freeVariables = findFreeVariables(
list(
localVariableDeclaration(declaration, literal("[value]")),
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
index c3b83a0..97b8b66 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
@@ -3,9 +3,7 @@ package org.zwobble.couscous.tests.frontends.java;
import org.junit.Test;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.types.ScalarType;
-import org.zwobble.couscous.values.IntegerValue;
-import org.zwobble.couscous.values.ObjectValues;
-import org.zwobble.couscous.values.StringValue;
+import org.zwobble.couscous.types.Types;
import java.util.List;
@@ -41,7 +39,7 @@ public class JavaReaderTests {
LocalVariableDeclarationNode declaration = (LocalVariableDeclarationNode) statements.get(0);
assertEquals("x", declaration.getName());
- assertEquals(IntegerValue.REF, declaration.getType());
+ assertEquals(Types.INT, declaration.getType());
assertEquals(literal(4), declaration.getInitialValue());
ReturnNode returnNode = (ReturnNode) statements.get(1);
assertEquals(
@@ -54,7 +52,7 @@ public class JavaReaderTests {
StatementNode statement = readStatement("void", "Object x = 4;");
LocalVariableDeclarationNode declaration = (LocalVariableDeclarationNode) statement;
- assertEquals(typeCoercion(literal(4), ObjectValues.OBJECT), declaration.getInitialValue());
+ assertEquals(typeCoercion(literal(4), Types.OBJECT), declaration.getInitialValue());
}
@Test
@@ -65,7 +63,7 @@ public class JavaReaderTests {
"}");
MethodNode method = classNode.getMethods().get(0);
- assertEquals(IntegerValue.REF, method.getReturnType());
+ assertEquals(Types.INT, method.getReturnType());
}
@Test
@@ -93,7 +91,7 @@ public class JavaReaderTests {
ScalarType.of("java.lang.Integer"),
"parseInt",
list(literal("42")),
- IntegerValue.REF)),
+ Types.INT)),
readStatement("void", "Integer.parseInt(\"42\");"));
}
@@ -182,7 +180,7 @@ public class JavaReaderTests {
fieldAccess(
thisReference(ScalarType.of("com.example.Example")),
"name",
- StringValue.REF),
+ Types.STRING),
literal("Flaws"))),
constructor.getBody());
}
@@ -205,13 +203,13 @@ public class JavaReaderTests {
fieldAccess(
thisReference(ScalarType.of("com.example.Example")),
"year",
- IntegerValue.REF),
+ Types.INT),
literal(2013)),
assignStatement(
fieldAccess(
thisReference(ScalarType.of("com.example.Example")),
"name",
- StringValue.REF),
+ Types.STRING),
literal("Flaws"))),
constructor.getBody());
}
@@ -233,13 +231,13 @@ public class JavaReaderTests {
fieldAccess(
thisReference(ScalarType.of("com.example.Example")),
"year",
- IntegerValue.REF),
+ Types.INT),
literal(2013)),
assignStatement(
fieldAccess(
thisReference(ScalarType.of("com.example.Example")),
"name",
- StringValue.REF),
+ Types.STRING),
literal("Flaws"))),
constructor.getBody());
}
@@ -259,7 +257,7 @@ public class JavaReaderTests {
fieldAccess(
ScalarType.of("com.example.Example"),
"name",
- StringValue.REF),
+ Types.STRING),
literal("Flaws"))),
staticConstructor);
}
@@ -276,7 +274,7 @@ public class JavaReaderTests {
fieldAccess(
ScalarType.of("com.example.Example"),
"name",
- StringValue.REF),
+ Types.STRING),
literal("Flaws"))),
staticConstructor);
}
@@ -362,7 +360,7 @@ public class JavaReaderTests {
MethodNode expectedMethod = MethodNode.builder("get")
.isAbstract()
- .returns(IntegerValue.REF)
+ .returns(Types.INT)
.build();
assertEquals(list(expectedMethod), classNode.getMethods());
}
diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
index 760cc56..6112c8e 100644
--- a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
@@ -13,10 +13,8 @@ import org.zwobble.couscous.interpreter.values.IntegerInterpreterValue;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
import org.zwobble.couscous.interpreter.values.StringInterpreterValue;
import org.zwobble.couscous.tests.BackendEvalTests;
-import org.zwobble.couscous.values.IntegerValue;
-import org.zwobble.couscous.values.ObjectValues;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.PrimitiveValue;
-import org.zwobble.couscous.values.StringValue;
import java.util.List;
import java.util.Optional;
@@ -41,7 +39,7 @@ import static org.zwobble.couscous.util.ExtraLists.list;
public class EvaluatorTests extends BackendEvalTests {
@Test
public void valueOfAssignmentExpressionIsNewValue() {
- FormalArgumentNode arg = formalArg(var(ANY_ID, "x", StringValue.REF));
+ FormalArgumentNode arg = formalArg(var(ANY_ID, "x", Types.STRING));
Environment environment = new Environment(
new MapBackedProject(ImmutableMap.of()),
Optional.empty(),
@@ -66,8 +64,8 @@ public class EvaluatorTests extends BackendEvalTests {
literal("hello"),
"size",
list(),
- IntegerValue.REF)));
- assertEquals(new MethodSignature("size", list(), IntegerValue.REF), exception.getSignature());
+ Types.INT)));
+ assertEquals(new MethodSignature("size", list(), Types.INT), exception.getSignature());
}
@Test
@@ -78,8 +76,8 @@ public class EvaluatorTests extends BackendEvalTests {
literal("hello"),
"substring",
list(literal(1)),
- StringValue.REF)));
- assertEquals(new MethodSignature("substring", list(IntegerValue.REF), StringValue.REF), exception.getSignature());
+ Types.STRING)));
+ assertEquals(new MethodSignature("substring", list(Types.INT), Types.STRING), exception.getSignature());
}
@Test
@@ -90,15 +88,15 @@ public class EvaluatorTests extends BackendEvalTests {
literal("hello"),
"substring",
list(literal(0), literal("")),
- StringValue.REF)));
+ Types.STRING)));
assertEquals(
- new MethodSignature("substring", list(IntegerValue.REF, StringValue.REF), StringValue.REF),
+ new MethodSignature("substring", list(Types.INT, Types.STRING), Types.STRING),
exception.getSignature());
}
@Test
public void errorIfConstructorArgumentIsWrongType() {
- FormalArgumentNode argument = formalArg(var(ANY_ID, "x", IntegerValue.REF));
+ FormalArgumentNode argument = formalArg(var(ANY_ID, "x", Types.INT));
ClassNode classNode = ClassNode.builder("com.example.Example")
.constructor(constructor -> constructor
.argument(argument))
@@ -111,7 +109,7 @@ public class EvaluatorTests extends BackendEvalTests {
classNode.getName(),
list(literal("")))));
- assertEquals(new UnexpectedValueType(IntegerValue.REF, StringValue.REF), exception);
+ assertEquals(new UnexpectedValueType(Types.INT, Types.STRING), exception);
}
@Test
@@ -127,7 +125,7 @@ public class EvaluatorTests extends BackendEvalTests {
classNode.getName(),
list()),
"value",
- IntegerValue.REF)));
+ Types.INT)));
assertEquals(new NoSuchField("value"), exception);
}
@@ -135,7 +133,7 @@ public class EvaluatorTests extends BackendEvalTests {
@Test
public void cannotGetValueOfUnboundField() {
ClassNode classNode = ClassNode.builder("com.example.Example")
- .field("value", IntegerValue.REF)
+ .field("value", Types.INT)
.build();
UnboundField exception = assertThrows(UnboundField.class,
@@ -146,7 +144,7 @@ public class EvaluatorTests extends BackendEvalTests {
classNode.getName(),
list()),
"value",
- IntegerValue.REF)));
+ Types.INT)));
assertEquals(new UnboundField("value"), exception);
}
@@ -156,7 +154,7 @@ public class EvaluatorTests extends BackendEvalTests {
ClassNode classNode = ClassNode.builder("com.example.Example")
.constructor(constructor -> constructor
.statement(assignStatement(
- fieldAccess(constructor.thisReference(), "value", IntegerValue.REF),
+ fieldAccess(constructor.thisReference(), "value", Types.INT),
literal(42))))
.build();
@@ -174,10 +172,10 @@ public class EvaluatorTests extends BackendEvalTests {
public void cannotSetValueOfInstanceFieldAsThoughItIsAStaticField() {
ScalarType type = ScalarType.of("com.example.Example");
ClassNode classNode = ClassNode.builder(type)
- .field("value", IntegerValue.REF)
+ .field("value", Types.INT)
.constructor(constructor -> constructor
.statement(assignStatement(
- fieldAccess(type, "value", IntegerValue.REF),
+ fieldAccess(type, "value", Types.INT),
literal(42))))
.build();
@@ -194,10 +192,10 @@ public class EvaluatorTests extends BackendEvalTests {
@Test
public void cannotSetValueOfFieldWithWrongType() {
ClassNode classNode = ClassNode.builder("com.example.Example")
- .field("value", IntegerValue.REF)
+ .field("value", Types.INT)
.constructor(constructor -> constructor
.statement(assignStatement(
- fieldAccess(constructor.thisReference(), "value", IntegerValue.REF),
+ fieldAccess(constructor.thisReference(), "value", Types.INT),
literal(""))))
.build();
@@ -208,14 +206,14 @@ public class EvaluatorTests extends BackendEvalTests {
classNode.getName(),
list())));
- assertEquals(new UnexpectedValueType(IntegerValue.REF, StringValue.REF), exception);
+ assertEquals(new UnexpectedValueType(Types.INT, Types.STRING), exception);
}
@Test
public void validCastPassesValueThrough() {
InterpreterValue value = eval(
emptyEnvironment(),
- cast(literal("42"), ObjectValues.OBJECT));
+ cast(literal("42"), Types.OBJECT));
assertEquals(value("42"), value);
}
@@ -223,9 +221,9 @@ public class EvaluatorTests extends BackendEvalTests {
public void errorIfCastIsNotValid() {
InvalidCast exception = assertThrows(InvalidCast.class,
() -> eval(emptyEnvironment(),
- cast(literal(42), StringValue.REF)));
- assertEquals(StringValue.REF, exception.getExpected());
- assertEquals(IntegerValue.REF, exception.getActual());
+ cast(literal(42), Types.STRING)));
+ assertEquals(Types.STRING, exception.getExpected());
+ assertEquals(Types.INT, exception.getActual());
}
private static Environment emptyEnvironment() {
diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java
index 9787ee2..0e644e1 100644
--- a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java
@@ -15,10 +15,8 @@ import org.zwobble.couscous.interpreter.values.InterpreterValue;
import org.zwobble.couscous.interpreter.values.InterpreterValues;
import org.zwobble.couscous.tests.BackendMethodTests;
import org.zwobble.couscous.tests.MethodRunner;
-import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.PrimitiveValue;
-import org.zwobble.couscous.values.StringValue;
-import org.zwobble.couscous.values.UnitValue;
import java.util.List;
import java.util.stream.Collectors;
@@ -46,12 +44,12 @@ public class InterpreterMethodTests extends BackendMethodTests {
NoSuchMethod exception = assertThrows(NoSuchMethod.class,
() -> runMethod(method, value("hello, world!")));
- assertEquals(new MethodSignature("hello", list(StringValue.REF), UnitValue.REF), exception.getSignature());
+ assertEquals(new MethodSignature("hello", list(Types.STRING), Types.VOID), exception.getSignature());
}
@Test
public void errorIfTryingToAssignValueOfWrongTypeToVariable() {
- FormalArgumentNode arg = formalArg(var(ANY_ID, "x", StringValue.REF));
+ FormalArgumentNode arg = formalArg(var(ANY_ID, "x", Types.STRING));
MethodNode.Builder method = staticMethod("hello")
.argument(arg)
.statement(expressionStatement(assign(reference(arg), literal(0))));
@@ -59,13 +57,13 @@ public class InterpreterMethodTests extends BackendMethodTests {
UnexpectedValueType exception = assertThrows(UnexpectedValueType.class,
() -> runMethod(method, value("")));
- assertEquals(new UnexpectedValueType(StringValue.REF, IntegerValue.REF), exception);
+ assertEquals(new UnexpectedValueType(Types.STRING, Types.INT), exception);
}
@Test
public void errorIfTryingToAssignToVariableNotInScope() {
LocalVariableDeclarationNode localVariableDeclaration = localVariableDeclaration(
- ANY_ID, "x", StringValue.REF, literal(""));
+ ANY_ID, "x", Types.STRING, literal(""));
MethodNode.Builder method = staticMethod("hello")
.statement(expressionStatement(assign(reference(localVariableDeclaration), LiteralNode.literal("[updated value]"))));
@@ -78,7 +76,7 @@ public class InterpreterMethodTests extends BackendMethodTests {
@Test
public void errorIfTryingToGetValueOfVariableNotInScope() {
LocalVariableDeclarationNode localVariableDeclaration = localVariableDeclaration(
- ANY_ID, "x", StringValue.REF, literal(""));
+ ANY_ID, "x", Types.STRING, literal(""));
MethodNode.Builder method = staticMethod("hello")
.statement(returns(reference(localVariableDeclaration)));
@@ -91,7 +89,7 @@ public class InterpreterMethodTests extends BackendMethodTests {
@Test
public void errorIfTryingToGetValueOfUnboundVariable() {
LocalVariableDeclarationNode localVariableDeclaration = localVariableDeclaration(
- ANY_ID, "x", StringValue.REF, literal(""));
+ ANY_ID, "x", Types.STRING, literal(""));
MethodNode.Builder method = staticMethod("hello")
.statement(returns(reference(localVariableDeclaration)))
.statement(localVariableDeclaration);