diff options
Diffstat (limited to 'src/main')
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); |
