aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Node.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/StatementNode.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ThrowNode.java53
-rw-r--r--src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java1
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java7
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java1
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java2
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java5
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java7
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java7
12 files changed, 101 insertions, 3 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/Node.java b/src/main/java/org/zwobble/couscous/ast/Node.java
index 629b93f..1c1f4ba 100644
--- a/src/main/java/org/zwobble/couscous/ast/Node.java
+++ b/src/main/java/org/zwobble/couscous/ast/Node.java
@@ -97,6 +97,12 @@ public interface Node {
}
@Override
+ public Void visit(ThrowNode throwNode) {
+ visitor.visit(throwNode);
+ return null;
+ }
+
+ @Override
public Void visit(ExpressionStatementNode expressionStatement) {
visitor.visit(expressionStatement);
return null;
diff --git a/src/main/java/org/zwobble/couscous/ast/StatementNode.java b/src/main/java/org/zwobble/couscous/ast/StatementNode.java
index d756534..7f8d2c2 100644
--- a/src/main/java/org/zwobble/couscous/ast/StatementNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/StatementNode.java
@@ -16,6 +16,11 @@ public interface StatementNode extends Node {
}
@Override
+ public T visit(ThrowNode throwNode) {
+ return visitor.visit(throwNode);
+ }
+
+ @Override
public T visit(ExpressionStatementNode expressionStatement) {
return visitor.visit(expressionStatement);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/ThrowNode.java b/src/main/java/org/zwobble/couscous/ast/ThrowNode.java
new file mode 100644
index 0000000..ee6d7a5
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/ThrowNode.java
@@ -0,0 +1,53 @@
+package org.zwobble.couscous.ast;
+
+import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+
+public class ThrowNode implements StatementNode {
+ public static ThrowNode throwNode(ExpressionNode value) {
+ return new ThrowNode(value);
+ }
+
+ private final ExpressionNode value;
+
+ public ThrowNode(ExpressionNode value) {
+ this.value = value;
+ }
+
+ public ExpressionNode getValue() {
+ return value;
+ }
+
+ @Override
+ public <T> T accept(StatementNodeMapper<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public StatementNode transform(NodeTransformer transformer) {
+ return new ThrowNode(transformer.transformExpression(value));
+ }
+
+ @Override
+ public String toString() {
+ return "ThrowNode(" +
+ "value=" + value +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ThrowNode throwNode = (ThrowNode) o;
+
+ return value.equals(throwNode.value);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return value.hashCode();
+ }
+}
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 550082c..6352f4a 100644
--- a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
+++ b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
@@ -112,6 +112,11 @@ public class NodeStructure {
}
@Override
+ public Stream<? extends Node> visit(ThrowNode throwNode) {
+ return Stream.of(throwNode.getValue());
+ }
+
+ @Override
public Stream<Node> visit(ExpressionStatementNode expressionStatement) {
return Stream.of(expressionStatement.getExpression());
}
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
index 3edece1..1a42060 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
@@ -20,6 +20,7 @@ public interface NodeMapper<T> {
T visit(StaticReceiver receiver);
T visit(ReturnNode returnNode);
+ T visit(ThrowNode throwNode);
T visit(ExpressionStatementNode expressionStatement);
T visit(LocalVariableDeclarationNode localVariableDeclaration);
T visit(IfStatementNode ifStatement);
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
index c67116d..9344f86 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
@@ -83,7 +83,12 @@ public class NodeMapperWithDefault<T> implements NodeMapper<T> {
public T visit(ReturnNode returnNode) {
return defaultValue;
}
-
+
+ @Override
+ public T visit(ThrowNode throwNode) {
+ return defaultValue;
+ }
+
@Override
public T visit(ExpressionStatementNode expressionStatement) {
return defaultValue;
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
index f52bedc..e1e9837 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
@@ -106,6 +106,11 @@ public class NodeTransformer {
}
@Override
+ public Node visit(ThrowNode throwNode) {
+ return transformStatement(throwNode);
+ }
+
+ @Override
public Node visit(ExpressionStatementNode expressionStatement) {
return transformStatement(expressionStatement);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
index 167e89b..adbcb87 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
@@ -20,6 +20,7 @@ public interface NodeVisitor {
void visit(StaticReceiver receiver);
void visit(ReturnNode returnNode);
+ void visit(ThrowNode throwNode);
void visit(ExpressionStatementNode expressionStatement);
void visit(LocalVariableDeclarationNode localVariableDeclaration);
void visit(IfStatementNode ifStatement);
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java b/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java
index 33fbbd3..516a4b9 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java
@@ -4,8 +4,10 @@ import org.zwobble.couscous.ast.*;
public interface StatementNodeMapper<T> {
T visit(ReturnNode returnNode);
+ T visit(ThrowNode throwNode);
T visit(ExpressionStatementNode expressionStatement);
T visit(LocalVariableDeclarationNode localVariableDeclaration);
T visit(IfStatementNode ifStatement);
T visit(WhileNode whileLoop);
+
}
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 a2c77b5..d238a5c 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -310,6 +310,11 @@ public class CsharpSerializer implements NodeVisitor {
}
@Override
+ public void visit(ThrowNode throwNode) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void visit(ExpressionStatementNode expressionStatement) {
writer.writeStatement(() -> {
write(expressionStatement.getExpression());
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 3fd1ffb..8628988 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -244,6 +244,11 @@ public class PythonCodeGenerator {
}
@Override
+ public PythonStatementNode visit(ThrowNode throwNode) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public PythonStatementNode visit(ExpressionStatementNode expressionStatement) {
if (expressionStatement.getExpression() instanceof AssignmentNode) {
AssignmentNode assignment = (AssignmentNode)expressionStatement.getExpression();
@@ -416,4 +421,4 @@ public class PythonCodeGenerator {
private static PythonVariableReferenceNode typeReference(Type className) {
return pythonVariableReference(erasure(className).getSimpleName());
}
-} \ No newline at end of file
+}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index f6c1c3a..e6dad8d 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -96,6 +96,11 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
}
@Override
+ public Optional<InterpreterValue> visit(ThrowNode throwNode) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public Optional<InterpreterValue> visit(ExpressionStatementNode expressionStatement) {
eval(environment, expressionStatement.getExpression());
return Optional.empty();
@@ -136,4 +141,4 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
}
return Optional.empty();
}
-} \ No newline at end of file
+}