From fe113241971cfe87b163a9eb4dc51e9d5e32410e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 21 Mar 2016 08:13:45 +0000 Subject: Move standard type definitions into a Types class --- .../org/zwobble/couscous/ast/ClassNodeBuilder.java | 4 +- .../java/org/zwobble/couscous/ast/MethodNode.java | 4 +- .../java/org/zwobble/couscous/ast/Operations.java | 18 ++++---- .../backends/csharp/CsharpCodeGenerator.java | 13 +++--- .../backends/csharp/CsharpPrimitiveMethods.java | 23 +++++----- .../couscous/backends/csharp/CsharpSerializer.java | 3 +- .../backends/python/PythonCodeGenerator.java | 7 +-- .../backends/python/PythonPrimitiveMethods.java | 11 ++--- .../couscous/backends/python/PythonSerializer.java | 1 + .../frontends/java/JavaExpressionReader.java | 27 ++++++------ .../couscous/frontends/java/JavaReader.java | 4 +- .../frontends/java/JavaStatementReader.java | 13 +++--- .../zwobble/couscous/frontends/java/JavaTypes.java | 6 +-- .../zwobble/couscous/interpreter/Evaluator.java | 19 ++++---- .../couscous/interpreter/InterpreterTypes.java | 4 +- .../values/BooleanInterpreterValue.java | 8 ++-- .../values/BoxedIntegerInterpreterValue.java | 17 +++----- .../values/IntegerInterpreterValue.java | 27 ++++++------ .../values/InternalCouscousInterpreterValue.java | 5 +-- .../interpreter/values/StringInterpreterValue.java | 13 +++--- .../interpreter/values/TypeInterpreterValue.java | 4 +- .../java/org/zwobble/couscous/types/Types.java | 13 ++++-- .../org/zwobble/couscous/values/BooleanValue.java | 5 +-- .../org/zwobble/couscous/values/IntegerValue.java | 4 +- .../org/zwobble/couscous/values/ObjectValues.java | 11 ----- .../org/zwobble/couscous/values/StringValue.java | 6 +-- .../org/zwobble/couscous/values/TypeValue.java | 3 +- .../org/zwobble/couscous/values/UnitValue.java | 5 +-- .../zwobble/couscous/tests/BackendEvalTests.java | 45 ++++++++++--------- .../zwobble/couscous/tests/BackendMethodTests.java | 37 ++++++++-------- .../org/zwobble/couscous/tests/CompilerTests.java | 50 +++++++++++----------- .../tests/backends/csharp/CsharpMethodRunner.java | 7 ++- .../backends/csharp/CsharpSerializerTests.java | 9 ++-- .../frontends/java/ExpressionReadingTests.java | 39 ++++++++--------- .../tests/frontends/java/FreeVariablesTests.java | 9 ++-- .../tests/frontends/java/JavaReaderTests.java | 28 ++++++------ .../couscous/tests/interpreter/EvaluatorTests.java | 48 ++++++++++----------- .../tests/interpreter/InterpreterMethodTests.java | 16 +++---- 38 files changed, 265 insertions(+), 301 deletions(-) delete mode 100644 src/main/java/org/zwobble/couscous/values/ObjectValues.java (limited to 'src') 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, T> build; private final ImmutableList.Builder annotations; private final ImmutableList.Builder arguments; - private ScalarType returnType = UnitValue.REF; + private ScalarType returnType = Types.VOID; private final ImmutableList.Builder statements; public MethodBuilder(Function, 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 arguments = ImmutableList.builder(); - private Type returnType = UnitValue.REF; + private Type returnType = Types.VOID; private final ImmutableList.Builder 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 PRIMITIVES = ImmutableMap.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 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> METHODS = ImmutableMap.>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 STATIC_INT_METHODS = @@ -87,7 +84,7 @@ public class CsharpPrimitiveMethods { private static final Map> STATIC_METHODS = ImmutableMap.>builder() - .put(ObjectValues.BOXED_INT, STATIC_INT_METHODS) + .put(Types.BOXED_INT, STATIC_INT_METHODS) .build(); public static Optional 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 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> METHODS = ImmutableMap.>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 INTERNAL_METHODS = @@ -135,7 +136,7 @@ public class PythonPrimitiveMethods { private static final Map> STATIC_METHODS = ImmutableMap.>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 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 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 { } 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 evalArguments(List 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() { @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.class")); + assertEquals(literal(Types.STRING), readExpression("Class", "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 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 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 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 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); -- cgit v1.2.3