aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-10 14:14:47 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-10 14:14:47 +0100
commit854993655d4318d565226413645268f0885df0cb (patch)
tree741fd891c89b662ed48b03f55697804035812829 /src/main/java/org/zwobble
parent1f41544a60c12b34eeff50f4629462534b4bb725 (diff)
Distinguish boxed and unboxed primitives
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/couscous/JavaProject.java4
-rw-r--r--src/main/java/org/zwobble/couscous/MapBackedProject.java7
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Environment.java1
-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.java20
-rw-r--r--src/main/java/org/zwobble/couscous/values/BooleanValue.java2
-rw-r--r--src/main/java/org/zwobble/couscous/values/IntegerValue.java2
7 files changed, 40 insertions, 14 deletions
diff --git a/src/main/java/org/zwobble/couscous/JavaProject.java b/src/main/java/org/zwobble/couscous/JavaProject.java
index 833f06f..dc91584 100644
--- a/src/main/java/org/zwobble/couscous/JavaProject.java
+++ b/src/main/java/org/zwobble/couscous/JavaProject.java
@@ -3,8 +3,8 @@ package org.zwobble.couscous;
import java.util.List;
import org.zwobble.couscous.ast.ClassNode;
+import org.zwobble.couscous.interpreter.values.BoxedIntegerInterpreterValue;
import org.zwobble.couscous.interpreter.values.ConcreteType;
-import org.zwobble.couscous.interpreter.values.IntegerInterpreterValue;
import com.google.common.collect.Iterables;
@@ -13,7 +13,7 @@ import lombok.val;
public class JavaProject {
public static MapBackedProject.Builder builder() {
return MapBackedProject.builder()
- .addClass(IntegerInterpreterValue.TYPE);
+ .addClass(BoxedIntegerInterpreterValue.TYPE);
}
public static Project of(List<ClassNode> classNodes) {
diff --git a/src/main/java/org/zwobble/couscous/MapBackedProject.java b/src/main/java/org/zwobble/couscous/MapBackedProject.java
index 7a243f4..8547677 100644
--- a/src/main/java/org/zwobble/couscous/MapBackedProject.java
+++ b/src/main/java/org/zwobble/couscous/MapBackedProject.java
@@ -46,6 +46,11 @@ public class MapBackedProject implements Project {
@Override
public ConcreteType findClass(TypeName name) {
- return classes.get(name);
+ if (classes.containsKey(name)) {
+ return classes.get(name);
+ } else {
+ throw new IllegalArgumentException("Cannot find class: " + name);
+ }
+
}
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Environment.java b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
index d91664d..111e18d 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Environment.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
@@ -56,7 +56,6 @@ public class Environment {
}
public ConcreteType findClass(TypeName className) {
- // TODO: handle missing classes
return project.findClass(className);
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
new file mode 100644
index 0000000..a6ba5e1
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
@@ -0,0 +1,18 @@
+package org.zwobble.couscous.interpreter.values;
+
+import org.zwobble.couscous.values.StringValue;
+
+import static java.util.Arrays.asList;
+
+import lombok.val;
+
+public class BoxedIntegerInterpreterValue {
+ public static final ConcreteType TYPE = ConcreteType.classBuilder("java.lang.Integer")
+ .staticMethod("parseInt", asList(StringValue.REF),
+ (environment, arguments) -> {
+ val value = (StringInterpreterValue)arguments.get(0);
+ return new IntegerInterpreterValue(Integer.parseInt(value.getValue()));
+ })
+
+ .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 6332b89..2c64031 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
@@ -25,6 +25,18 @@ import static java.util.stream.Collectors.toMap;
import lombok.val;
public class ConcreteType {
+ public static <T> ConcreteType.Builder<T> builder(Class<T> interpreterValueType, TypeName reference) {
+ return new Builder<>(interpreterValueType, reference);
+ }
+
+ public static <T> ConcreteType.Builder<T> builder(Class<T> interpreterValueType, String name) {
+ return builder(interpreterValueType, TypeName.of(name));
+ }
+
+ public static ConcreteType.Builder<ObjectInterpreterValue> classBuilder(String name) {
+ return builder(ObjectInterpreterValue.class, name);
+ }
+
public static class Builder<T> {
private final ImmutableMap.Builder<String, MethodValue> methods =
ImmutableMap.builder();
@@ -159,14 +171,6 @@ public class ConcreteType {
return Optional.ofNullable(fields.get(fieldName));
}
- public static <T> ConcreteType.Builder<T> builder(Class<T> interpreterValueType, TypeName reference) {
- return new Builder<>(interpreterValueType, reference);
- }
-
- public static <T> ConcreteType.Builder<T> builder(Class<T> interpreterValueType, String name) {
- return builder(interpreterValueType, TypeName.of(name));
- }
-
public InterpreterValue callMethod(Environment environment, InterpreterValue receiver, String methodName, List<InterpreterValue> arguments) {
val method = findMethod(methods, methodName, arguments);
return method.apply(
diff --git a/src/main/java/org/zwobble/couscous/values/BooleanValue.java b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
index e733e44..6f18e36 100644
--- a/src/main/java/org/zwobble/couscous/values/BooleanValue.java
+++ b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
@@ -8,7 +8,7 @@ import lombok.Value;
@Value
public class BooleanValue implements PrimitiveValue {
- public static final TypeName REF = TypeName.of("java.lang.Boolean");
+ public static final TypeName REF = TypeName.of("boolean");
@Getter(value = AccessLevel.NONE)
boolean value;
diff --git a/src/main/java/org/zwobble/couscous/values/IntegerValue.java b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
index e65408a..794ad8c 100644
--- a/src/main/java/org/zwobble/couscous/values/IntegerValue.java
+++ b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
@@ -6,7 +6,7 @@ import lombok.Value;
@Value
public class IntegerValue implements PrimitiveValue {
- public static final TypeName REF = TypeName.of("java.lang.Integer");
+ public static final TypeName REF = TypeName.of("int");
int value;