aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java54
-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/TryNode.java71
-rw-r--r--src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java7
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java5
-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.java5
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java5
13 files changed, 171 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java b/src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java
new file mode 100644
index 0000000..a7e307b
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java
@@ -0,0 +1,54 @@
+package org.zwobble.couscous.ast;
+
+import org.zwobble.couscous.types.Type;
+
+import java.util.List;
+
+public class ExceptionHandlerNode {
+ public static ExceptionHandlerNode exceptionhandler(Type type, List<StatementNode> body) {
+ return new ExceptionHandlerNode(type, body);
+ }
+
+ private final Type type;
+ private final List<StatementNode> body;
+
+ public ExceptionHandlerNode(Type type, List<StatementNode> body) {
+ this.type = type;
+ this.body = body;
+ }
+
+ public Type getExceptionType() {
+ return type;
+ }
+
+ public List<StatementNode> getBody() {
+ return body;
+ }
+
+ @Override
+ public String toString() {
+ return "ExceptionHandlerNode(" +
+ "type=" + type +
+ ", body=" + body +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ExceptionHandlerNode that = (ExceptionHandlerNode) o;
+
+ if (!type.equals(that.type)) return false;
+ return body.equals(that.body);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = type.hashCode();
+ result = 31 * result + body.hashCode();
+ return result;
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/Node.java b/src/main/java/org/zwobble/couscous/ast/Node.java
index 1c1f4ba..240afa4 100644
--- a/src/main/java/org/zwobble/couscous/ast/Node.java
+++ b/src/main/java/org/zwobble/couscous/ast/Node.java
@@ -127,6 +127,12 @@ public interface Node {
}
@Override
+ public Void visit(TryNode tryStatement) {
+ visitor.visit(tryStatement);
+ return null;
+ }
+
+ @Override
public Void visit(FormalTypeParameterNode parameter) {
visitor.visit(parameter);
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 7f8d2c2..38eb4d3 100644
--- a/src/main/java/org/zwobble/couscous/ast/StatementNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/StatementNode.java
@@ -39,6 +39,11 @@ public interface StatementNode extends Node {
public T visit(WhileNode whileLoop) {
return visitor.visit(whileLoop);
}
+
+ @Override
+ public T visit(TryNode tryStatement) {
+ return visitor.visit(tryStatement);
+ }
});
}
diff --git a/src/main/java/org/zwobble/couscous/ast/TryNode.java b/src/main/java/org/zwobble/couscous/ast/TryNode.java
new file mode 100644
index 0000000..643e65c
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/TryNode.java
@@ -0,0 +1,71 @@
+package org.zwobble.couscous.ast;
+
+import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+
+import java.util.List;
+
+import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+
+public class TryNode implements StatementNode {
+ public static TryNode tryStatement(List<StatementNode> body, List<ExceptionHandlerNode> exceptionHandlers) {
+ return new TryNode(body, exceptionHandlers);
+ }
+
+ private final List<StatementNode> body;
+ private final List<ExceptionHandlerNode> exceptionHandlers;
+
+ public TryNode(List<StatementNode> body, List<ExceptionHandlerNode> exceptionHandlers) {
+ this.body = body;
+ this.exceptionHandlers = exceptionHandlers;
+ }
+
+ public List<StatementNode> getBody() {
+ return body;
+ }
+
+ public List<ExceptionHandlerNode> getExceptionHandlers() {
+ return exceptionHandlers;
+ }
+
+ @Override
+ public <T> T accept(StatementNodeMapper<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public StatementNode transform(NodeTransformer transformer) {
+ return new TryNode(
+ transformer.transformStatements(body),
+ eagerMap(exceptionHandlers, handler -> new ExceptionHandlerNode(
+ transformer.transform(handler.getExceptionType()),
+ transformer.transformStatements(handler.getBody()))));
+ }
+
+ @Override
+ public String toString() {
+ return "TryNode(" +
+ "body=" + body +
+ ", exceptionHandlers=" + exceptionHandlers +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ TryNode tryNode = (TryNode) o;
+
+ if (!body.equals(tryNode.body)) return false;
+ return exceptionHandlers.equals(tryNode.exceptionHandlers);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = body.hashCode();
+ result = 31 * result + exceptionHandlers.hashCode();
+ return result;
+ }
+}
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 6352f4a..a98728b 100644
--- a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
+++ b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
@@ -142,6 +142,13 @@ public class NodeStructure {
}
@Override
+ public Stream<? extends Node> visit(TryNode tryStatement) {
+ return Stream.concat(
+ tryStatement.getBody().stream(),
+ tryStatement.getExceptionHandlers().stream().flatMap(handler -> handler.getBody().stream()));
+ }
+
+ @Override
public Stream<? extends Node> visit(FormalTypeParameterNode parameter) {
return Stream.empty();
}
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 1a42060..50855d8 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
@@ -25,7 +25,7 @@ public interface NodeMapper<T> {
T visit(LocalVariableDeclarationNode localVariableDeclaration);
T visit(IfStatementNode ifStatement);
T visit(WhileNode whileLoop);
-
+ T visit(TryNode tryStatement);
T visit(FormalTypeParameterNode parameter);
T visit(FormalArgumentNode formalArgumentNode);
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 9344f86..9fd2617 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
@@ -110,6 +110,11 @@ public class NodeMapperWithDefault<T> implements NodeMapper<T> {
}
@Override
+ public T visit(TryNode tryStatement) {
+ return defaultValue;
+ }
+
+ @Override
public T visit(FormalTypeParameterNode parameter) {
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 e1e9837..0edbad9 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
@@ -131,6 +131,11 @@ public class NodeTransformer {
}
@Override
+ public Node visit(TryNode tryStatement) {
+ return transformStatement(tryStatement);
+ }
+
+ @Override
public Node visit(FormalTypeParameterNode parameter) {
return transformFormalTypeParameter(parameter);
}
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 adbcb87..9ac4a16 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
@@ -25,6 +25,7 @@ public interface NodeVisitor {
void visit(LocalVariableDeclarationNode localVariableDeclaration);
void visit(IfStatementNode ifStatement);
void visit(WhileNode whileLoop);
+ void visit(TryNode tryStatement);
void visit(FormalTypeParameterNode parameter);
void visit(FormalArgumentNode formalArgumentNode);
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 516a4b9..5d88a60 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java
@@ -9,5 +9,5 @@ public interface StatementNodeMapper<T> {
T visit(LocalVariableDeclarationNode localVariableDeclaration);
T visit(IfStatementNode ifStatement);
T visit(WhileNode whileLoop);
-
+ T visit(TryNode tryStatement);
}
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 64307f4..954e03a 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -384,6 +384,11 @@ public class CsharpSerializer implements NodeVisitor {
}
@Override
+ public void visit(TryNode tryStatement) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void visit(FormalTypeParameterNode parameter) {
writer.writeIdentifier(parameter.getName());
}
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 8628988..8e99347 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -277,6 +277,11 @@ public class PythonCodeGenerator {
generateExpression(whileLoop.getCondition()),
generateStatements(whileLoop.getBody()));
}
+
+ @Override
+ public PythonStatementNode visit(TryNode tryStatement) {
+ throw new UnsupportedOperationException();
+ }
}
public static PythonExpressionNode generateExpression(ExpressionNode expression) {
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index e6dad8d..9641c5e 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -132,6 +132,11 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
return Optional.empty();
}
+ @Override
+ public Optional<InterpreterValue> visit(TryNode tryStatement) {
+ throw new UnsupportedOperationException();
+ }
+
private Optional<InterpreterValue> exec(List<StatementNode> statements) {
for (StatementNode statement : statements) {
Optional<InterpreterValue> result = exec(environment, statement);