aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNode.java80
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java6
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java17
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java45
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java16
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java18
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java38
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java6
-rw-r--r--src/main/java/org/zwobble/couscous/values/BooleanValue.java1
-rw-r--r--src/test/java/org/zwobble/couscous/tests/CompilerTests.java40
-rw-r--r--src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java2
-rw-r--r--src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java8
13 files changed, 201 insertions, 82 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNode.java b/src/main/java/org/zwobble/couscous/ast/ClassNode.java
index 55453f4..3545084 100644
--- a/src/main/java/org/zwobble/couscous/ast/ClassNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ClassNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import java.util.List;
+import java.util.Set;
public class ClassNode implements Node {
public static ClassNodeBuilder builder(String name) {
@@ -10,23 +11,27 @@ public class ClassNode implements Node {
}
public static ClassNode declareClass(
TypeName name,
+ Set<TypeName> superTypes,
List<FieldDeclarationNode> fields,
ConstructorNode constructor,
List<MethodNode> methods) {
- return new ClassNode(name, fields, constructor, methods);
+ return new ClassNode(name, superTypes, fields, constructor, methods);
}
private final TypeName name;
+ private final Set<TypeName> superTypes;
private final List<FieldDeclarationNode> fields;
private final ConstructorNode constructor;
private final List<MethodNode> methods;
private ClassNode(
TypeName name,
+ Set<TypeName> superTypes,
List<FieldDeclarationNode> fields,
ConstructorNode constructor,
List<MethodNode> methodNodes) {
this.name = name;
+ this.superTypes = superTypes;
this.fields = fields;
this.constructor = constructor;
methods = methodNodes;
@@ -35,7 +40,11 @@ public class ClassNode implements Node {
public TypeName getName() {
return name;
}
-
+
+ public Set<TypeName> getSuperTypes() {
+ return superTypes;
+ }
+
public List<FieldDeclarationNode> getFields() {
return fields;
}
@@ -59,51 +68,38 @@ public class ClassNode implements Node {
@Override
public String toString() {
- return "ClassNode(name=" + name + ", fields=" + fields
- + ", constructor=" + constructor + ", methods=" + methods + ")";
+ return "ClassNode(" +
+ "name=" + name +
+ ", superTypes=" + superTypes +
+ ", fields=" + fields +
+ ", constructor=" + constructor +
+ ", methods=" + methods +
+ ')';
}
@Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result
- + ((constructor == null) ? 0 : constructor.hashCode());
- result = prime * result + ((fields == null) ? 0 : fields.hashCode());
- result = prime * result + ((methods == null) ? 0 : methods.hashCode());
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- return result;
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ClassNode classNode = (ClassNode) o;
+
+ if (name != null ? !name.equals(classNode.name) : classNode.name != null) return false;
+ if (superTypes != null ? !superTypes.equals(classNode.superTypes) : classNode.superTypes != null) return false;
+ if (fields != null ? !fields.equals(classNode.fields) : classNode.fields != null) return false;
+ if (constructor != null ? !constructor.equals(classNode.constructor) : classNode.constructor != null)
+ return false;
+ return methods != null ? methods.equals(classNode.methods) : classNode.methods == null;
+
}
@Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- ClassNode other = (ClassNode) obj;
- if (constructor == null) {
- if (other.constructor != null)
- return false;
- } else if (!constructor.equals(other.constructor))
- return false;
- if (fields == null) {
- if (other.fields != null)
- return false;
- } else if (!fields.equals(other.fields))
- return false;
- if (methods == null) {
- if (other.methods != null)
- return false;
- } else if (!methods.equals(other.methods))
- return false;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- return true;
+ public int hashCode() {
+ int result = name != null ? name.hashCode() : 0;
+ result = 31 * result + (superTypes != null ? superTypes.hashCode() : 0);
+ result = 31 * result + (fields != null ? fields.hashCode() : 0);
+ result = 31 * result + (constructor != null ? constructor.hashCode() : 0);
+ result = 31 * result + (methods != null ? methods.hashCode() : 0);
+ return result;
}
}
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
index 5981e34..9be591c 100644
--- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
+++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
@@ -1,10 +1,11 @@
package org.zwobble.couscous.ast;
+import com.google.common.collect.ImmutableList;
+
import java.util.Optional;
import java.util.function.Function;
-import com.google.common.collect.ImmutableList;
-
+import static java.util.Collections.emptySet;
import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
@@ -81,6 +82,7 @@ public class ClassNodeBuilder {
public ClassNode build() {
return ClassNode.declareClass(
name,
+ emptySet(),
fields.build(),
constructor.orElse(ConstructorNode.DEFAULT),
methods.build());
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 76dcf22..2963fd6 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -12,6 +12,7 @@ import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.Set;
import java.util.function.Function;
import static com.google.common.collect.Iterables.concat;
@@ -29,6 +30,7 @@ import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
import static org.zwobble.couscous.frontends.java.FreeVariables.findFreeVariables;
+import static org.zwobble.couscous.frontends.java.JavaTypes.superTypes;
import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf;
import static org.zwobble.couscous.util.Casts.tryCast;
import static org.zwobble.couscous.util.ExtraLists.*;
@@ -58,6 +60,7 @@ public class JavaReader {
TypeDeclarationBody body = readTypeDeclarationBody(type.bodyDeclarations());
return ClassNode.declareClass(
name,
+ superTypes(type),
body.getFields(),
body.getConstructor(),
body.getMethods());
@@ -75,7 +78,11 @@ public class JavaReader {
lambda.getFormalArguments(),
lambda.getBody());
- GeneratedClosure closure = classWithCapture(className, emptyList(), ImmutableList.of(method));
+ GeneratedClosure closure = classWithCapture(
+ className,
+ superTypes(expression),
+ emptyList(),
+ ImmutableList.of(method));
classes.add(closure.getClassNode());
return closure;
@@ -132,13 +139,18 @@ public class JavaReader {
GeneratedClosure readAnonymousClass(AnonymousClassDeclaration declaration) {
TypeName className = generateClassName(declaration);
TypeDeclarationBody bodyDeclarations = readTypeDeclarationBody(declaration.bodyDeclarations());
- GeneratedClosure closure = classWithCapture(className, bodyDeclarations.getFields(), bodyDeclarations.getMethods());
+ GeneratedClosure closure = classWithCapture(
+ className,
+ superTypes(declaration),
+ bodyDeclarations.getFields(),
+ bodyDeclarations.getMethods());
classes.add(closure.getClassNode());
return closure;
}
private GeneratedClosure classWithCapture(
TypeName className,
+ Set<TypeName> superTypes,
List<FieldDeclarationNode> declaredFields,
List<MethodNode> methods
) {
@@ -151,6 +163,7 @@ public class JavaReader {
ClassNode classNode = ClassNode.declareClass(
className,
+ superTypes,
fields,
buildConstructor(className, freeVariables),
eagerMap(methods, method ->
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 d6b2160..4b62a17 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java
@@ -1,10 +1,14 @@
package org.zwobble.couscous.frontends.java;
-import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.ITypeBinding;
-import org.eclipse.jdt.core.dom.IVariableBinding;
-import org.eclipse.jdt.core.dom.Type;
+import com.google.common.collect.ImmutableSet;
+import org.eclipse.jdt.core.dom.*;
import org.zwobble.couscous.ast.TypeName;
+import org.zwobble.couscous.values.ObjectValues;
+
+import java.util.Set;
+
+import static com.google.common.collect.Iterables.transform;
+import static java.util.Arrays.asList;
class JavaTypes {
static TypeName typeOf(Expression expression) {
@@ -22,4 +26,37 @@ class JavaTypes {
static TypeName typeOf(ITypeBinding typeBinding) {
return TypeName.of(typeBinding.getQualifiedName());
}
+
+ static Set<TypeName> superTypes(TypeDeclaration declaration) {
+ return superTypes(declaration.resolveBinding());
+ }
+
+ static Set<TypeName> superTypes(AnonymousClassDeclaration declaration) {
+ return superTypes(declaration.resolveBinding());
+ }
+
+ static Set<TypeName> superTypes(LambdaExpression expression) {
+ ImmutableSet.Builder<TypeName> superTypes = ImmutableSet.builder();
+ ITypeBinding typeBinding = expression.resolveTypeBinding();
+ superTypes.addAll(superTypes(typeBinding));
+ superTypes.add(typeOf(typeBinding));
+ return superTypes.build();
+ }
+
+ private static Set<TypeName> superTypes(ITypeBinding typeBinding) {
+ ImmutableSet.Builder<TypeName> superTypes = ImmutableSet.builder();
+ superTypes.addAll(transform(
+ asList(typeBinding.getInterfaces()),
+ JavaTypes::typeOf));
+ superTypes.add(superClass(typeBinding));
+ return superTypes.build();
+ }
+
+ private static TypeName superClass(ITypeBinding typeBinding) {
+ if (typeBinding.getSuperclass() == null) {
+ return ObjectValues.OBJECT;
+ } else {
+ return typeOf(typeBinding.getSuperclass());
+ }
+ }
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
index bb76280..1e644c8 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
@@ -1,17 +1,25 @@
package org.zwobble.couscous.interpreter;
import org.zwobble.couscous.ast.TypeName;
+import org.zwobble.couscous.interpreter.values.ConcreteType;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
import org.zwobble.couscous.values.ObjectValues;
public class InterpreterTypes {
public static void checkIsInstance(TypeName type, InterpreterValue value) {
- checkIsSubType(type, value.getType().getName());
+ checkIsSubType(type, value.getType());
}
- private static void checkIsSubType(TypeName superType, TypeName subType) {
- if (!superType.equals(subType) && !superType.equals(ObjectValues.OBJECT)) {
- throw new UnexpectedValueType(superType, subType);
+ private static void checkIsSubType(TypeName superTypeName, ConcreteType subType) {
+ if (!isSubType(superTypeName, subType)) {
+ throw new UnexpectedValueType(superTypeName, subType.getName());
}
}
+
+ private static boolean isSubType(TypeName superTypeName, ConcreteType subType) {
+ return
+ superTypeName.equals(subType.getName()) ||
+ superTypeName.equals(ObjectValues.OBJECT) ||
+ subType.getSuperTypes().contains(superTypeName);
+ }
}
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 458eca7..3ffa244 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
@@ -1,16 +1,32 @@
package org.zwobble.couscous.interpreter.values;
+import org.zwobble.couscous.ast.Operator;
+import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.values.ObjectValues;
import org.zwobble.couscous.values.StringValue;
import static java.util.Arrays.asList;
public class BoxedIntegerInterpreterValue {
public static final ConcreteType TYPE = ConcreteType.classBuilder("java.lang.Integer")
+ .field("value", IntegerValue.REF)
+
.staticMethod("parseInt", asList(StringValue.REF),
(environment, arguments) -> {
StringInterpreterValue value = (StringInterpreterValue)arguments.get(0);
return new IntegerInterpreterValue(Integer.parseInt(value.getValue()));
})
-
+
+ .method(Operator.EQUALS.getMethodName(), asList(ObjectValues.OBJECT),
+ (environment, arguments) -> {
+ InterpreterValue right = arguments.getPositionalArguments().get(0);
+ if (right.getType().getName().equals(ObjectValues.BOXED_INT)) {
+ IntegerInterpreterValue leftValue = (IntegerInterpreterValue)arguments.getReceiver().getField("value");
+ IntegerInterpreterValue rightValue = (IntegerInterpreterValue)right.getField("value");
+ return new BooleanInterpreterValue(leftValue.getValue() == rightValue.getValue());
+ } else {
+ return new BooleanInterpreterValue(false);
+ }
+ })
.build();
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
index 8d2c2d5..c053739 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
@@ -1,8 +1,6 @@
package org.zwobble.couscous.interpreter.values;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import org.zwobble.couscous.ast.ClassNode;
@@ -34,6 +32,7 @@ public class ConcreteType {
}
public static class Builder<T> {
+ private final ImmutableMap.Builder<String, FieldValue> fields = ImmutableMap.builder();
private final ImmutableMap.Builder<String, MethodValue> methods = ImmutableMap.builder();
private final ImmutableMap.Builder<String, StaticMethodValue> staticMethods = ImmutableMap.builder();
private final Class<T> interpreterValueType;
@@ -43,7 +42,12 @@ public class ConcreteType {
this.interpreterValueType = interpreterValueType;
this.name = name;
}
-
+
+ public Builder<T> field(String name, TypeName type) {
+ fields.put(name, new FieldValue(name, type));
+ return this;
+ }
+
public Builder<T> method(String name, List<TypeName> argumentsTypes, BiFunction<Environment, MethodCallArguments<T>, InterpreterValue> method) {
methods.put(name, new MethodValue(argumentsTypes, (environment, arguments) -> {
return Casts.tryCast(interpreterValueType, arguments.getReceiver()).map(typedReceiver -> method.apply(environment, MethodCallArguments.of(typedReceiver, arguments.getPositionalArguments()))).orElseThrow(() -> new RuntimeException("receiver is of wrong type"));
@@ -57,7 +61,13 @@ public class ConcreteType {
}
public ConcreteType build() {
- return new ConcreteType(name, ImmutableMap.of(), new MethodValue(ImmutableList.of(), (environment, arguments) -> InterpreterValues.UNIT), methods.build(), staticMethods.build());
+ return new ConcreteType(
+ name,
+ Collections.emptySet(),
+ fields.build(),
+ new MethodValue(ImmutableList.of(), (environment, arguments) -> InterpreterValues.UNIT),
+ methods.build(),
+ staticMethods.build());
}
}
@@ -76,20 +86,28 @@ public class ConcreteType {
return Executor.callMethod(environment, method, Optional.empty(), arguments);
});
}));
- return new ConcreteType(classNode.getName(), fields, constructor, methods, staticMethods);
+ return new ConcreteType(classNode.getName(), classNode.getSuperTypes(), fields, constructor, methods, staticMethods);
}
private static List<TypeName> getArgumentTypes(List<FormalArgumentNode> arguments) {
return arguments.stream().map(arg -> arg.getType()).collect(Collectors.toList());
}
private final TypeName name;
+ private final Set<TypeName> superTypes;
private final Map<String, FieldValue> fields;
private final MethodValue constructor;
private final Map<String, MethodValue> methods;
private final Map<String, StaticMethodValue> staticMethods;
- private ConcreteType(TypeName name, Map<String, FieldValue> fields, MethodValue constructor, Map<String, MethodValue> methods, Map<String, StaticMethodValue> staticMethods) {
+ private ConcreteType(
+ TypeName name,
+ Set<TypeName> superTypes,
+ Map<String, FieldValue> fields,
+ MethodValue constructor,
+ Map<String, MethodValue> methods,
+ Map<String, StaticMethodValue> staticMethods) {
this.name = name;
+ this.superTypes = superTypes;
this.fields = fields;
this.constructor = constructor;
this.methods = methods;
@@ -99,7 +117,11 @@ public class ConcreteType {
public TypeName getName() {
return name;
}
-
+
+ public Set<TypeName> getSuperTypes() {
+ return superTypes;
+ }
+
public Optional<FieldValue> getField(String fieldName) {
return Optional.ofNullable(fields.get(fieldName));
}
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 da28bc5..3bcb41a 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
@@ -97,6 +97,12 @@ public final class IntegerInterpreterValue implements InterpreterValue {
public int getValue() {
return this.value;
}
+
+ public InterpreterValue box() {
+ ObjectInterpreterValue box = new ObjectInterpreterValue(BoxedIntegerInterpreterValue.TYPE);
+ box.setField("value", this);
+ return box;
+ }
@java.lang.Override
public boolean equals(final java.lang.Object o) {
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 ef4c37b..4d3f33a 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java
@@ -19,10 +19,10 @@ public class InternalCouscousInterpreterValue {
((environment, arguments) -> arguments.get(0)))
.staticMethod("boxInt", asList(IntegerValue.REF),
- ((environment, arguments) -> arguments.get(0)))
+ ((environment, arguments) -> ((IntegerInterpreterValue)arguments.get(0)).box()))
- .staticMethod("unboxInt", asList(IntegerValue.REF),
- ((environment, arguments) -> arguments.get(0)))
+ .staticMethod("unboxInt", asList(ObjectValues.BOXED_INT),
+ ((environment, arguments) -> arguments.get(0).getField("value")))
.build();
}
diff --git a/src/main/java/org/zwobble/couscous/values/BooleanValue.java b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
index 5e6191f..1d2c0a4 100644
--- a/src/main/java/org/zwobble/couscous/values/BooleanValue.java
+++ b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
@@ -1,6 +1,7 @@
package org.zwobble.couscous.values;
import org.zwobble.couscous.ast.TypeName;
+import org.zwobble.couscous.interpreter.values.InterpreterValue;
public final class BooleanValue implements PrimitiveValue {
public static final TypeName REF = TypeName.of("boolean");
diff --git a/src/test/java/org/zwobble/couscous/tests/CompilerTests.java b/src/test/java/org/zwobble/couscous/tests/CompilerTests.java
index 6f64ed6..b5e0d82 100644
--- a/src/test/java/org/zwobble/couscous/tests/CompilerTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/CompilerTests.java
@@ -20,28 +20,28 @@ import static org.zwobble.couscous.values.PrimitiveValues.value;
public abstract class CompilerTests {
@Test
public void canEvaluateLiterals() {
- assertEquals(value("hello"), evalExpression("\"hello\""));
- assertEquals(value(42), evalExpression("42"));
+ assertEquals(value("hello"), evalObjectExpression("\"hello\""));
+ assertEquals(value(42), evalIntExpression("42"));
}
@Test
public void canUseOperatorsOnPrimitives() {
- assertEquals(value(3), evalExpression("1 + 2"));
- assertEquals(value(false), evalExpression("1 > 2"));
- assertEquals(value(true), evalExpression("1 == 1"));
- assertEquals(value(false), evalExpression("1 != 1"));
- assertEquals(value(true), evalExpression("!false"));
+ assertEquals(value(3), evalIntExpression("1 + 2"));
+ assertEquals(value(false), evalBooleanExpression("1 > 2"));
+ assertEquals(value(true), evalBooleanExpression("1 == 1"));
+ assertEquals(value(false), evalBooleanExpression("1 != 1"));
+ assertEquals(value(true), evalBooleanExpression("!false"));
}
@Test
public void equalityOnReferenceTypesChecksForIdentity() {
- assertEquals(value(false), evalExpression("new Object() == new Object()"));
- assertEquals(value(true), exec("Object x = new Object(); return x == x;"));
+ assertEquals(value(false), evalBooleanExpression("new Object() == new Object()"));
+ assertEquals(value(true), exec("boolean", "Object x = new Object(); return x == x;"));
}
@Test
public void integersCanBeAssignedToObjectVariable() {
- assertEquals(value(false), exec("Object x = 1; return x.equals(new Object());"));
+ assertEquals(value(false), exec("boolean", "Object x = 1; return x.equals(new Object());"));
}
@Test
@@ -150,12 +150,12 @@ public abstract class CompilerTests {
return path;
}
- private PrimitiveValue exec(String source) {
+ private PrimitiveValue exec(String returnType, String source) {
try {
String javaClass =
"package com.example;" +
"public class Example {" +
- " public static Object main() {" + source + "}" +
+ " public static " + returnType + " main() {" + source + "}" +
"}";
Path directoryPath = Files.createTempDirectory(null);
try {
@@ -174,8 +174,20 @@ public abstract class CompilerTests {
}
}
- private PrimitiveValue evalExpression(String expressionSource) {
- return exec("return " + expressionSource + ";");
+ private PrimitiveValue evalBooleanExpression(String expressionSource) {
+ return evalExpression("boolean", expressionSource);
+ }
+
+ private PrimitiveValue evalIntExpression(String expressionSource) {
+ return evalExpression("int", expressionSource);
+ }
+
+ private PrimitiveValue evalObjectExpression(String expressionSource) {
+ return evalExpression("Object", expressionSource);
+ }
+
+ private PrimitiveValue evalExpression(String type, String expressionSource) {
+ return exec(type, "return " + expressionSource + ";");
}
private static Path pathForResource(String name) {
diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java
index 203a088..49b1fbf 100644
--- a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java
@@ -1,7 +1,6 @@
package org.zwobble.couscous.tests;
import com.google.common.collect.ImmutableList;
-import org.junit.Ignore;
import org.zwobble.couscous.ast.ClassNode;
import org.zwobble.couscous.ast.TypeName;
import org.zwobble.couscous.frontends.java.JavaFrontend;
@@ -18,7 +17,6 @@ import java.util.List;
import static com.google.common.collect.Iterables.transform;
-@Ignore
public class JavaToInterpreterTests extends CompilerTests {
@Override
protected PrimitiveValue execProgram(
diff --git a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java
index 0768ee7..022e7ed 100644
--- a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java
@@ -3,7 +3,9 @@ package org.zwobble.couscous.tests;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.util.Collections;
import java.util.List;
+import java.util.Set;
import java.util.function.Function;
import java.util.stream.IntStream;
import java.util.stream.Stream;
@@ -127,6 +129,8 @@ public class ValueObjectTests {
return true;
} else if (type.equals(List.class)) {
return asList("[list 1]");
+ } else if (type.equals(Set.class)) {
+ return Collections.singleton("[set 1]");
} else if (type.equals(PrimitiveValue.class)) {
return generateFirstInstance(StringValue.class);
} else if (type.equals(ExpressionNode.class)) {
@@ -145,6 +149,8 @@ public class ValueObjectTests {
return false;
} else if (type.equals(List.class)) {
return asList("[list 2]");
+ } else if (type.equals(Set.class)) {
+ return Collections.singleton("[set 2]");
} else if (type.equals(PrimitiveValue.class)) {
return generateSecondInstance(StringValue.class);
} else if (type.equals(ExpressionNode.class)) {
@@ -163,6 +169,8 @@ public class ValueObjectTests {
return true;
} else if (type.equals(List.class)) {
return asList("[list]");
+ } else if (type.equals(Set.class)) {
+ return Collections.singleton("[set]");
} else if (type.equals(PrimitiveValue.class)) {
return generateInstance(StringValue.class);
} else if (type.equals(ExpressionNode.class)) {