aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-02 19:22:31 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-02 19:22:31 +0100
commit003b55c6758f4202bff786b8324d1ded6d141a88 (patch)
tree564169cbaaa99cfcdd33c85c943fea8995797a22 /src/main/java/org
parent90dae189f638148a7b72add782023088cf22e847 (diff)
Use type references instead of deferred types
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java13
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java6
-rw-r--r--src/main/java/org/zwobble/couscous/values/Callable.java2
-rw-r--r--src/main/java/org/zwobble/couscous/values/ConcreteType.java22
-rw-r--r--src/main/java/org/zwobble/couscous/values/IntegerValue.java7
-rw-r--r--src/main/java/org/zwobble/couscous/values/MethodValue.java9
-rw-r--r--src/main/java/org/zwobble/couscous/values/StaticMethodValue.java9
-rw-r--r--src/main/java/org/zwobble/couscous/values/StringValue.java9
-rw-r--r--src/main/java/org/zwobble/couscous/values/TypeReference.java8
9 files changed, 42 insertions, 43 deletions
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<ConcreteType<?>> 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<ConcreteType<?>> getArgumentTypes();
+ List<TypeReference> 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<T> {
public Builder<T> method(
String name,
- Supplier<List<ConcreteType<?>>> argumentsTypes,
+ List<TypeReference> argumentsTypes,
BiFunction<T, Arguments, InterpreterValue> method) {
methods.put(name, new MethodValue<T>(argumentsTypes, method));
return this;
@@ -42,7 +42,7 @@ public class ConcreteType<T> {
public Builder<T> staticMethod(
String name,
- Supplier<List<ConcreteType<?>>> argumentsTypes,
+ List<TypeReference> argumentsTypes,
BiFunction<Environment, Arguments, InterpreterValue> method) {
staticMethods.put(name, new StaticMethodValue(argumentsTypes, method));
return this;
@@ -60,9 +60,9 @@ public class ConcreteType<T> {
.collect(toMap(
method -> method.getName(),
method -> {
- Supplier<List<ConcreteType<?>>> argumentTypes = () -> method.getArguments()
+ List<TypeReference> argumentTypes = method.getArguments()
.stream()
- .<ConcreteType<?>>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<T> {
return name;
}
+ public static <T> ConcreteType.Builder<T> builder(TypeReference reference) {
+ return new Builder<>(reference.getName());
+ }
+
public static <T> ConcreteType.Builder<T> builder(String name) {
return new Builder<>(name);
}
@@ -118,13 +122,17 @@ public class ConcreteType<T> {
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.<IntegerValue>builder("java.lang.Integer")
- .staticMethod("parseInt", () -> asList(StringValue.TYPE),
+ public static final TypeReference REF = typeRef("java.lang.Integer");
+
+ public static final ConcreteType<?> TYPE = ConcreteType.<IntegerValue>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<T> implements Callable {
- @Getter(value=AccessLevel.NONE)
- Supplier<List<ConcreteType<?>>> argumentTypes;
+ List<TypeReference> argumentTypes;
@Getter(value=AccessLevel.NONE)
BiFunction<T, Arguments, InterpreterValue> apply;
- @Override
- public List<ConcreteType<?>> 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<List<ConcreteType<?>>> argumentTypes;
+ List<TypeReference> argumentTypes;
@Getter(value=AccessLevel.NONE)
BiFunction<Environment, Arguments, InterpreterValue> apply;
- @Override
- public List<ConcreteType<?>> 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.<StringValue>builder("String")
- .method("length", () -> asList(),
+ public static final TypeReference REF = typeRef("java.lang.String");
+
+ public static final ConcreteType<?> TYPE = ConcreteType.<StringValue>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;
+}