diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-10 14:14:47 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-10 14:14:47 +0100 |
| commit | 854993655d4318d565226413645268f0885df0cb (patch) | |
| tree | 741fd891c89b662ed48b03f55697804035812829 /src/main | |
| parent | 1f41544a60c12b34eeff50f4629462534b4bb725 (diff) | |
Distinguish boxed and unboxed primitives
Diffstat (limited to 'src/main')
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; |
