From 854993655d4318d565226413645268f0885df0cb Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Oct 2015 14:14:47 +0100 Subject: Distinguish boxed and unboxed primitives --- src/main/java/org/zwobble/couscous/JavaProject.java | 4 ++-- .../java/org/zwobble/couscous/MapBackedProject.java | 7 ++++++- .../zwobble/couscous/interpreter/Environment.java | 1 - .../values/BoxedIntegerInterpreterValue.java | 18 ++++++++++++++++++ .../couscous/interpreter/values/ConcreteType.java | 20 ++++++++++++-------- .../org/zwobble/couscous/values/BooleanValue.java | 2 +- .../org/zwobble/couscous/values/IntegerValue.java | 2 +- 7 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java (limited to 'src/main') 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 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 ConcreteType.Builder builder(Class interpreterValueType, TypeName reference) { + return new Builder<>(interpreterValueType, reference); + } + + public static ConcreteType.Builder builder(Class interpreterValueType, String name) { + return builder(interpreterValueType, TypeName.of(name)); + } + + public static ConcreteType.Builder classBuilder(String name) { + return builder(ObjectInterpreterValue.class, name); + } + public static class Builder { private final ImmutableMap.Builder methods = ImmutableMap.builder(); @@ -159,14 +171,6 @@ public class ConcreteType { return Optional.ofNullable(fields.get(fieldName)); } - public static ConcreteType.Builder builder(Class interpreterValueType, TypeName reference) { - return new Builder<>(interpreterValueType, reference); - } - - public static ConcreteType.Builder builder(Class interpreterValueType, String name) { - return builder(interpreterValueType, TypeName.of(name)); - } - public InterpreterValue callMethod(Environment environment, InterpreterValue receiver, String methodName, List 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; -- cgit v1.2.3