From 003b55c6758f4202bff786b8324d1ded6d141a88 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 2 Oct 2015 19:22:31 +0100 Subject: Use type references instead of deferred types --- .../zwobble/couscous/ast/FormalArgumentNode.java | 13 ++----------- .../couscous/interpreter/UnexpectedValueType.java | 6 +++--- .../java/org/zwobble/couscous/values/Callable.java | 2 +- .../org/zwobble/couscous/values/ConcreteType.java | 22 +++++++++++++++------- .../org/zwobble/couscous/values/IntegerValue.java | 7 +++++-- .../org/zwobble/couscous/values/MethodValue.java | 9 +-------- .../zwobble/couscous/values/StaticMethodValue.java | 9 +-------- .../org/zwobble/couscous/values/StringValue.java | 9 ++++++--- .../org/zwobble/couscous/values/TypeReference.java | 8 ++++++++ 9 files changed, 42 insertions(+), 43 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/values/TypeReference.java (limited to 'src/main/java/org') diff --git a/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java b/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java index 72a5f51..947a015 100644 --- a/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java +++ b/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java @@ -1,21 +1,12 @@ package org.zwobble.couscous.ast; -import java.util.function.Supplier; +import org.zwobble.couscous.values.TypeReference; -import org.zwobble.couscous.values.ConcreteType; - -import lombok.AccessLevel; -import lombok.Getter; import lombok.Value; @Value public class FormalArgumentNode implements VariableNode { int id; - @Getter(value=AccessLevel.NONE) - Supplier> type; + TypeReference type; String name; - - public ConcreteType getType() { - return type.get(); - } } diff --git a/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java b/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java index 59ea2d0..8ae32c3 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java +++ b/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java @@ -1,6 +1,6 @@ package org.zwobble.couscous.interpreter; -import org.zwobble.couscous.values.ConcreteType; +import org.zwobble.couscous.values.TypeReference; import lombok.EqualsAndHashCode; import lombok.Value; @@ -10,6 +10,6 @@ import lombok.Value; public class UnexpectedValueType extends InterpreterException { private static final long serialVersionUID = 1L; - ConcreteType expected; - ConcreteType actual; + TypeReference expected; + TypeReference actual; } diff --git a/src/main/java/org/zwobble/couscous/values/Callable.java b/src/main/java/org/zwobble/couscous/values/Callable.java index 9f3e486..5065598 100644 --- a/src/main/java/org/zwobble/couscous/values/Callable.java +++ b/src/main/java/org/zwobble/couscous/values/Callable.java @@ -3,5 +3,5 @@ package org.zwobble.couscous.values; import java.util.List; public interface Callable { - List> getArgumentTypes(); + List getArgumentTypes(); } diff --git a/src/main/java/org/zwobble/couscous/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/values/ConcreteType.java index 9b08d9e..520b504 100644 --- a/src/main/java/org/zwobble/couscous/values/ConcreteType.java +++ b/src/main/java/org/zwobble/couscous/values/ConcreteType.java @@ -3,7 +3,6 @@ package org.zwobble.couscous.values; import java.util.List; import java.util.Map; import java.util.function.BiFunction; -import java.util.function.Supplier; import java.util.stream.Collectors; import org.zwobble.couscous.ast.ClassNode; @@ -17,6 +16,7 @@ import org.zwobble.couscous.interpreter.WrongNumberOfArguments; import com.google.common.collect.ImmutableMap; import static java.util.stream.Collectors.toMap; +import static org.zwobble.couscous.values.TypeReference.typeRef; import lombok.val; @@ -34,7 +34,7 @@ public class ConcreteType { public Builder method( String name, - Supplier>> argumentsTypes, + List argumentsTypes, BiFunction method) { methods.put(name, new MethodValue(argumentsTypes, method)); return this; @@ -42,7 +42,7 @@ public class ConcreteType { public Builder staticMethod( String name, - Supplier>> argumentsTypes, + List argumentsTypes, BiFunction method) { staticMethods.put(name, new StaticMethodValue(argumentsTypes, method)); return this; @@ -60,9 +60,9 @@ public class ConcreteType { .collect(toMap( method -> method.getName(), method -> { - Supplier>> argumentTypes = () -> method.getArguments() + List argumentTypes = method.getArguments() .stream() - .>map(arg -> arg.getType()) + .map(arg -> arg.getType()) .collect(Collectors.toList()); return new StaticMethodValue(argumentTypes, (environment, arguments) -> { return Executor.callMethod(environment, method, arguments); @@ -91,6 +91,10 @@ public class ConcreteType { return name; } + public static ConcreteType.Builder builder(TypeReference reference) { + return new Builder<>(reference.getName()); + } + public static ConcreteType.Builder builder(String name) { return new Builder<>(name); } @@ -118,13 +122,17 @@ public class ConcreteType { for (int index = 0; index < arguments.size(); index++) { val formalArgumentType = method.getArgumentTypes().get(index); val actualArgumentType = arguments.get(index).getType(); - if (formalArgumentType != actualArgumentType) { - throw new UnexpectedValueType(formalArgumentType, actualArgumentType); + if (!formalArgumentType.equals(actualArgumentType.getReference())) { + throw new UnexpectedValueType(formalArgumentType, actualArgumentType.getReference()); } } return method; } + private TypeReference getReference() { + return typeRef(name); + } + @Override public String toString() { return "ConcreteType<" + name + ">"; diff --git a/src/main/java/org/zwobble/couscous/values/IntegerValue.java b/src/main/java/org/zwobble/couscous/values/IntegerValue.java index 1f8a699..c87bd27 100644 --- a/src/main/java/org/zwobble/couscous/values/IntegerValue.java +++ b/src/main/java/org/zwobble/couscous/values/IntegerValue.java @@ -1,14 +1,17 @@ package org.zwobble.couscous.values; import static java.util.Arrays.asList; +import static org.zwobble.couscous.values.TypeReference.typeRef; import lombok.Value; import lombok.val; @Value public class IntegerValue implements InterpreterValue { - public static final ConcreteType TYPE = ConcreteType.builder("java.lang.Integer") - .staticMethod("parseInt", () -> asList(StringValue.TYPE), + public static final TypeReference REF = typeRef("java.lang.Integer"); + + public static final ConcreteType TYPE = ConcreteType.builder(REF) + .staticMethod("parseInt", asList(StringValue.REF), (environment, arguments) -> { val value = (StringValue)arguments.get(0); return new IntegerValue(Integer.parseInt(value.getValue())); diff --git a/src/main/java/org/zwobble/couscous/values/MethodValue.java b/src/main/java/org/zwobble/couscous/values/MethodValue.java index df53722..495f608 100644 --- a/src/main/java/org/zwobble/couscous/values/MethodValue.java +++ b/src/main/java/org/zwobble/couscous/values/MethodValue.java @@ -2,7 +2,6 @@ package org.zwobble.couscous.values; import java.util.List; import java.util.function.BiFunction; -import java.util.function.Supplier; import org.zwobble.couscous.interpreter.Arguments; @@ -12,16 +11,10 @@ import lombok.Value; @Value public class MethodValue implements Callable { - @Getter(value=AccessLevel.NONE) - Supplier>> argumentTypes; + List argumentTypes; @Getter(value=AccessLevel.NONE) BiFunction apply; - @Override - public List> getArgumentTypes() { - return argumentTypes.get(); - } - public InterpreterValue apply(T receiver, Arguments arguments) { return apply.apply(receiver, arguments); } diff --git a/src/main/java/org/zwobble/couscous/values/StaticMethodValue.java b/src/main/java/org/zwobble/couscous/values/StaticMethodValue.java index 80ace03..e291914 100644 --- a/src/main/java/org/zwobble/couscous/values/StaticMethodValue.java +++ b/src/main/java/org/zwobble/couscous/values/StaticMethodValue.java @@ -2,7 +2,6 @@ package org.zwobble.couscous.values; import java.util.List; import java.util.function.BiFunction; -import java.util.function.Supplier; import org.zwobble.couscous.interpreter.Arguments; import org.zwobble.couscous.interpreter.Environment; @@ -13,16 +12,10 @@ import lombok.Value; @Value public class StaticMethodValue implements Callable { - @Getter(value=AccessLevel.NONE) - Supplier>> argumentTypes; + List argumentTypes; @Getter(value=AccessLevel.NONE) BiFunction apply; - @Override - public List> getArgumentTypes() { - return argumentTypes.get(); - } - public InterpreterValue apply(Environment environment, Arguments arguments) { return apply.apply(environment, arguments); } diff --git a/src/main/java/org/zwobble/couscous/values/StringValue.java b/src/main/java/org/zwobble/couscous/values/StringValue.java index e8a7c0e..0e24ac6 100644 --- a/src/main/java/org/zwobble/couscous/values/StringValue.java +++ b/src/main/java/org/zwobble/couscous/values/StringValue.java @@ -1,17 +1,20 @@ package org.zwobble.couscous.values; import static java.util.Arrays.asList; +import static org.zwobble.couscous.values.TypeReference.typeRef; import lombok.Value; import lombok.val; @Value public class StringValue implements InterpreterValue { - public static final ConcreteType TYPE = ConcreteType.builder("String") - .method("length", () -> asList(), + public static final TypeReference REF = typeRef("java.lang.String"); + + public static final ConcreteType TYPE = ConcreteType.builder(REF) + .method("length", asList(), (receiver, arguments) -> new IntegerValue(receiver.value.length())) - .method("substring", () -> asList(IntegerValue.TYPE, IntegerValue.TYPE), + .method("substring", asList(IntegerValue.REF, IntegerValue.REF), (receiver, arguments) -> { val startIndex = (IntegerValue)arguments.get(0); val endIndex = (IntegerValue)arguments.get(1); diff --git a/src/main/java/org/zwobble/couscous/values/TypeReference.java b/src/main/java/org/zwobble/couscous/values/TypeReference.java new file mode 100644 index 0000000..9eb4783 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/values/TypeReference.java @@ -0,0 +1,8 @@ +package org.zwobble.couscous.values; + +import lombok.Value; + +@Value(staticConstructor="typeRef") +public class TypeReference { + String name; +} -- cgit v1.2.3