aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-28 13:54:49 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-28 13:54:49 +0000
commiteee46d13e629c79f4acb60cc29aa773e2ed735c1 (patch)
tree643725918643a0c930d1e87d2d639b56af52bc83 /src/main/java
parent11247b4df9b3d882f396ac7eaabb275908c8c8f8 (diff)
Change method bodies to be optional
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/CallableNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ConstructorNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java3
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java2
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java46
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java2
8 files changed, 48 insertions, 23 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/CallableNode.java b/src/main/java/org/zwobble/couscous/ast/CallableNode.java
deleted file mode 100644
index 6d6fc7b..0000000
--- a/src/main/java/org/zwobble/couscous/ast/CallableNode.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.zwobble.couscous.ast;
-
-import java.util.List;
-
-public interface CallableNode extends Node {
- List<FormalArgumentNode> getArguments();
- List<StatementNode> getBody();
-}
diff --git a/src/main/java/org/zwobble/couscous/ast/ConstructorNode.java b/src/main/java/org/zwobble/couscous/ast/ConstructorNode.java
index fab931b..a25a993 100644
--- a/src/main/java/org/zwobble/couscous/ast/ConstructorNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ConstructorNode.java
@@ -6,7 +6,7 @@ import org.zwobble.couscous.ast.visitors.NodeTransformer;
import java.util.Collections;
import java.util.List;
-public class ConstructorNode implements CallableNode {
+public class ConstructorNode implements Node {
public static final ConstructorNode DEFAULT = constructor(Collections.emptyList(), Collections.emptyList());
public static ConstructorNode constructor(
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
index 967b2b1..c201047 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
@@ -11,7 +11,7 @@ import java.util.function.Function;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
-public class MethodNode implements CallableNode {
+public class MethodNode implements Node {
public static Builder staticMethod(String name) {
return builder(name).isStatic(true);
}
@@ -140,8 +140,8 @@ public class MethodNode implements CallableNode {
return returnType;
}
- public List<StatementNode> getBody() {
- return body.get();
+ public Optional<List<StatementNode>> getBody() {
+ return body;
}
public MethodSignature signature() {
diff --git a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
index 2424bbe..f1f37a6 100644
--- a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
+++ b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast.structure;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.visitors.NodeMapper;
+import java.util.Collection;
import java.util.function.Predicate;
import java.util.stream.Stream;
@@ -158,7 +159,7 @@ public class NodeStructure {
return concatStreams(
methodNode.getAnnotations().stream(),
methodNode.getArguments().stream(),
- methodNode.getBody().stream());
+ methodNode.getBody().map(Collection::stream).orElse(Stream.empty()));
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
index 37147ed..3cfcd33 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -265,7 +265,7 @@ public class CsharpSerializer implements NodeVisitor {
writer.writeSpace();
writer.writeIdentifier(method.getName());
writeFormalArguments(method.getArguments());
- writeBlock(method.getBody());
+ writeBlock(method.getBody().get());
});
}
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
index 2aafcca..08ecba4 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -166,7 +166,7 @@ public class PythonCodeGenerator {
Iterable<String> argumentNames = Iterables.concat(
method.isStatic() ? Collections.<String>emptyList() : list("self"),
explicitArgumentNames);
- List<PythonStatementNode> pythonBody = generateStatements(method.getBody());
+ List<PythonStatementNode> pythonBody = generateStatements(method.getBody().get());
return pythonFunctionDefinition(Names.toUniqueName(method.signature()), ImmutableList.copyOf(argumentNames), new PythonBlock(pythonBody));
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index 60f7d9c..8ba263c 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -15,18 +15,50 @@ import static org.zwobble.couscous.interpreter.Evaluator.eval;
import static org.zwobble.couscous.interpreter.Evaluator.evalCondition;
public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> {
- public static InterpreterValue callMethod(Environment environment, CallableNode method, Optional<InterpreterValue> thisValue, PositionalArguments arguments) {
- Environment innerEnvironment = buildEnvironment(environment, method, thisValue, arguments);
- return exec(innerEnvironment, method.getBody())
+ public static InterpreterValue callMethod(
+ Environment environment,
+ MethodNode method,
+ Optional<InterpreterValue> thisValue,
+ PositionalArguments actualArguments)
+ {
+ List<StatementNode> body = method.getBody().orElseThrow(() -> new RuntimeException("Cannot call abstract method"));
+ return callMethod(environment, method.getArguments(), body, thisValue, actualArguments);
+ }
+
+ public static InterpreterValue callConstructor(
+ Environment environment,
+ ConstructorNode constructor,
+ Optional<InterpreterValue> thisValue,
+ PositionalArguments actualArguments)
+ {
+ return callMethod(environment, constructor.getArguments(), constructor.getBody(), thisValue, actualArguments);
+ }
+
+ private static InterpreterValue callMethod(
+ Environment environment,
+ List<FormalArgumentNode> formalArguments,
+ List<StatementNode> statements,
+ Optional<InterpreterValue> thisValue,
+ PositionalArguments actualArguments)
+ {
+ Environment innerEnvironment = buildEnvironment(environment, formalArguments, statements, thisValue, actualArguments);
+ return exec(innerEnvironment, statements)
.orElse(UnitInterpreterValue.UNIT);
}
- private static Environment buildEnvironment(final Environment environment, final CallableNode method, Optional<InterpreterValue> thisValue, PositionalArguments arguments) {
+ private static Environment buildEnvironment(
+ Environment environment,
+ List<FormalArgumentNode> formalArguments,
+ List<StatementNode> statements,
+ Optional<InterpreterValue> thisValue,
+ PositionalArguments arguments)
+ {
+ // TODO use map with multiple iterables
final org.zwobble.couscous.interpreter.StackFrameBuilder stackFrame = new StackFrameBuilder();
- for (int index = 0; index < method.getArguments().size(); index++) {
- stackFrame.declare(method.getArguments().get(index), arguments.get(index));
+ for (int index = 0; index < formalArguments.size(); index++) {
+ stackFrame.declare(formalArguments.get(index), arguments.get(index));
}
- findDeclarations(method.getBody()).forEach(declaration -> stackFrame.declare(declaration));
+ findDeclarations(statements).forEach(declaration -> stackFrame.declare(declaration));
return environment.withStackFrame(thisValue, stackFrame.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 98036f1..19a6039 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
@@ -99,7 +99,7 @@ public class ConcreteType {
field -> field));
MethodValue constructor = new MethodValue(
getArgumentTypes(classNode.getConstructor().getArguments()),
- (environment, arguments) -> Executor.callMethod(
+ (environment, arguments) -> Executor.callConstructor(
environment,
classNode.getConstructor(),
Optional.of(arguments.getReceiver()),