From 63186372abb41771c7a78c34ad3d17c458fa25e1 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 31 Mar 2016 21:29:25 +0100 Subject: Roll type parameters into Arguments --- .../java/org/zwobble/couscous/interpreter/Arguments.java | 11 +++++++++-- .../java/org/zwobble/couscous/interpreter/Evaluator.java | 11 ++++++----- .../java/org/zwobble/couscous/interpreter/Interpreter.java | 3 ++- .../couscous/interpreter/values/StaticReceiverValue.java | 12 ++++-------- 4 files changed, 21 insertions(+), 16 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/couscous/interpreter/Arguments.java b/src/main/java/org/zwobble/couscous/interpreter/Arguments.java index f562de6..07797d9 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Arguments.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Arguments.java @@ -1,13 +1,16 @@ package org.zwobble.couscous.interpreter; import org.zwobble.couscous.interpreter.values.InterpreterValue; +import org.zwobble.couscous.types.Type; import java.util.List; public class Arguments { - private List values; + private final List types; + private final List values; - public Arguments(List values) { + public Arguments(List types, List values) { + this.types = types; this.values = values; } @@ -15,6 +18,10 @@ public class Arguments { return values.get(index); } + public List getTypes() { + return types; + } + public List getValues() { return values; } diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index 5488506..bbc41d1 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -12,12 +12,12 @@ import org.zwobble.couscous.types.Type; import org.zwobble.couscous.types.Types; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; import static org.zwobble.couscous.types.Types.erasure; import static org.zwobble.couscous.util.Casts.tryCast; import static org.zwobble.couscous.util.ExtraLists.eagerMap; +import static org.zwobble.couscous.util.ExtraLists.list; public class Evaluator implements ExpressionNodeMapper { public static InterpreterValue eval(Environment environment, ExpressionNode expression) { @@ -102,16 +102,17 @@ public class Evaluator implements ExpressionNodeMapper { MethodSignature signature = methodCall.signature(); return evalReceiver(methodCall.getReceiver()) - .callMethod(environment, signature, new Arguments(arguments)); + .callMethod(environment, signature, new Arguments(list(), arguments)); } @Override public InterpreterValue visit(ConstructorCallNode call) { StaticReceiverValue clazz = environment.findClass(erasure(call.getType())); List arguments = evalArguments(call.getArguments()); - Optional> typeParameters = tryCast(ParameterizedType.class, call.getType()) - .map(type -> type.getParameters()); - return clazz.callConstructor(environment, typeParameters, new Arguments(arguments)); + List typeParameters = tryCast(ParameterizedType.class, call.getType()) + .map(type -> type.getParameters()) + .orElse(list()); + return clazz.callConstructor(environment, new Arguments(typeParameters, arguments)); } @Override diff --git a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java index b447367..a87b203 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Optional; import static org.zwobble.couscous.util.ExtraLists.eagerMap; +import static org.zwobble.couscous.util.ExtraLists.list; public class Interpreter { private Project project; @@ -30,6 +31,6 @@ public class Interpreter { methodName, eagerMap(arguments, argument -> argument.getType().getType()), returnType); - return clazz.callMethod(environment, signature, new Arguments(arguments)); + return clazz.callMethod(environment, signature, new Arguments(list(), arguments)); } } \ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java index 51a1736..945287b 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java @@ -6,10 +6,6 @@ import org.zwobble.couscous.interpreter.Environment; import org.zwobble.couscous.interpreter.Executor; import org.zwobble.couscous.interpreter.types.InterpreterType; import org.zwobble.couscous.interpreter.types.ParameterizedInterpreterType; -import org.zwobble.couscous.types.Type; - -import java.util.List; -import java.util.Optional; public class StaticReceiverValue implements ReceiverValue { private final InterpreterType type; @@ -39,10 +35,10 @@ public class StaticReceiverValue implements ReceiverValue { Executor.exec(environment, type.getStaticConstructor()); } - public InterpreterValue callConstructor(Environment environment, Optional> typeParameters, Arguments arguments) { - InterpreterType objectType = typeParameters - .map(parameters -> new ParameterizedInterpreterType(type, parameters)) - .orElse(type); + public InterpreterValue callConstructor(Environment environment, Arguments arguments) { + InterpreterType objectType = arguments.getTypes().isEmpty() + ? type + : new ParameterizedInterpreterType(type, arguments.getTypes()); ObjectInterpreterValue value = new ObjectInterpreterValue(objectType); type.callConstructor(environment, value, arguments); return value; -- cgit v1.2.3