aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/StatementNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/WhileNode.java55
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java18
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java21
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java24
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java6
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java2
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java25
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java95
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java19
-rw-r--r--src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java27
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java10
12 files changed, 138 insertions, 170 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/StatementNode.java b/src/main/java/org/zwobble/couscous/ast/StatementNode.java
index 1186619..6ba198f 100644
--- a/src/main/java/org/zwobble/couscous/ast/StatementNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/StatementNode.java
@@ -33,6 +33,12 @@ public interface StatementNode extends Node {
visitor.visit(ifStatement);
return null;
}
+
+ @Override
+ public Void visit(WhileNode whileLoop) {
+ visitor.visit(whileLoop);
+ return null;
+ }
});
}
}
diff --git a/src/main/java/org/zwobble/couscous/ast/WhileNode.java b/src/main/java/org/zwobble/couscous/ast/WhileNode.java
new file mode 100644
index 0000000..0a67aef
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/WhileNode.java
@@ -0,0 +1,55 @@
+package org.zwobble.couscous.ast;
+
+import com.google.common.base.Objects;
+import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+
+import java.util.List;
+
+public class WhileNode implements StatementNode {
+ public static WhileNode whileLoop(ExpressionNode condition, List<StatementNode> body) {
+ return new WhileNode(condition, body);
+ }
+
+ private final ExpressionNode condition;
+ private final List<StatementNode> body;
+
+ public WhileNode(ExpressionNode condition, List<StatementNode> body) {
+ this.condition = condition;
+ this.body = body;
+ }
+
+ public ExpressionNode getCondition() {
+ return condition;
+ }
+
+ public List<StatementNode> getBody() {
+ return body;
+ }
+
+ @Override
+ public <T> T accept(StatementNodeMapper<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ WhileNode whileNode = (WhileNode) o;
+ return Objects.equal(condition, whileNode.condition) &&
+ Objects.equal(body, whileNode.body);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(condition, body);
+ }
+
+ @Override
+ public String toString() {
+ return "WhileNode(" +
+ "condition=" + condition +
+ ", body=" + body +
+ ')';
+ }
+}
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 ce6bb52..8d42f5c 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
@@ -1,21 +1,6 @@
package org.zwobble.couscous.ast.visitors;
-import org.zwobble.couscous.ast.AssignmentNode;
-import org.zwobble.couscous.ast.ClassNode;
-import org.zwobble.couscous.ast.ConstructorCallNode;
-import org.zwobble.couscous.ast.ConstructorNode;
-import org.zwobble.couscous.ast.ExpressionStatementNode;
-import org.zwobble.couscous.ast.FieldAccessNode;
-import org.zwobble.couscous.ast.IfStatementNode;
-import org.zwobble.couscous.ast.LiteralNode;
-import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
-import org.zwobble.couscous.ast.MethodCallNode;
-import org.zwobble.couscous.ast.MethodNode;
-import org.zwobble.couscous.ast.ReturnNode;
-import org.zwobble.couscous.ast.StaticMethodCallNode;
-import org.zwobble.couscous.ast.TernaryConditionalNode;
-import org.zwobble.couscous.ast.ThisReferenceNode;
-import org.zwobble.couscous.ast.VariableReferenceNode;
+import org.zwobble.couscous.ast.*;
public interface NodeVisitor {
void visit(LiteralNode literal);
@@ -32,6 +17,7 @@ public interface NodeVisitor {
void visit(ExpressionStatementNode expressionStatement);
void visit(LocalVariableDeclarationNode localVariableDeclaration);
void visit(IfStatementNode ifStatement);
+ void visit(WhileNode whileLoop);
void visit(ClassNode classNode);
void visit(MethodNode methodNode);
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java
index fe57a28..c8dd2cf 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java
@@ -1,21 +1,6 @@
package org.zwobble.couscous.ast.visitors;
-import org.zwobble.couscous.ast.AssignmentNode;
-import org.zwobble.couscous.ast.ClassNode;
-import org.zwobble.couscous.ast.ConstructorCallNode;
-import org.zwobble.couscous.ast.ConstructorNode;
-import org.zwobble.couscous.ast.ExpressionStatementNode;
-import org.zwobble.couscous.ast.FieldAccessNode;
-import org.zwobble.couscous.ast.IfStatementNode;
-import org.zwobble.couscous.ast.LiteralNode;
-import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
-import org.zwobble.couscous.ast.MethodCallNode;
-import org.zwobble.couscous.ast.MethodNode;
-import org.zwobble.couscous.ast.ReturnNode;
-import org.zwobble.couscous.ast.StaticMethodCallNode;
-import org.zwobble.couscous.ast.TernaryConditionalNode;
-import org.zwobble.couscous.ast.ThisReferenceNode;
-import org.zwobble.couscous.ast.VariableReferenceNode;
+import org.zwobble.couscous.ast.*;
public interface NodeVisitorWithEmptyDefaults extends NodeVisitor {
@Override
@@ -69,6 +54,10 @@ public interface NodeVisitorWithEmptyDefaults extends NodeVisitor {
@Override
default void visit(IfStatementNode ifStatement) {
}
+
+ @Override
+ default void visit(WhileNode whileLoop) {
+ }
@Override
default void visit(ClassNode classNode) {
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java
index 1bcc226..78a8254 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java
@@ -2,23 +2,7 @@ package org.zwobble.couscous.ast.visitors;
import java.util.List;
-import org.zwobble.couscous.ast.AssignmentNode;
-import org.zwobble.couscous.ast.ClassNode;
-import org.zwobble.couscous.ast.ConstructorCallNode;
-import org.zwobble.couscous.ast.ConstructorNode;
-import org.zwobble.couscous.ast.ExpressionStatementNode;
-import org.zwobble.couscous.ast.FieldAccessNode;
-import org.zwobble.couscous.ast.IfStatementNode;
-import org.zwobble.couscous.ast.LiteralNode;
-import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
-import org.zwobble.couscous.ast.MethodCallNode;
-import org.zwobble.couscous.ast.MethodNode;
-import org.zwobble.couscous.ast.Node;
-import org.zwobble.couscous.ast.ReturnNode;
-import org.zwobble.couscous.ast.StaticMethodCallNode;
-import org.zwobble.couscous.ast.TernaryConditionalNode;
-import org.zwobble.couscous.ast.ThisReferenceNode;
-import org.zwobble.couscous.ast.VariableReferenceNode;
+import org.zwobble.couscous.ast.*;
public class NodeVisitors {
public static void visitAll(Node node, NodeVisitor visitor) {
@@ -103,6 +87,12 @@ public class NodeVisitors {
}
@Override
+ public void visit(WhileNode whileLoop) {
+ whileLoop.getCondition().accept(visitor);
+ visitAll(whileLoop.getBody());
+ }
+
+ @Override
public void visit(ClassNode classNode) {
visitor.visit(classNode);
classNode.getConstructor().accept(this);
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 fe639bd..33fbbd3 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java
@@ -1,13 +1,11 @@
package org.zwobble.couscous.ast.visitors;
-import org.zwobble.couscous.ast.ExpressionStatementNode;
-import org.zwobble.couscous.ast.IfStatementNode;
-import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
-import org.zwobble.couscous.ast.ReturnNode;
+import org.zwobble.couscous.ast.*;
public interface StatementNodeMapper<T> {
T visit(ReturnNode returnNode);
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/python/PythonBackend.java b/src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java
index ca5fe34..39bd058 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java
@@ -35,7 +35,7 @@ public class PythonBackend implements Backend {
for (ClassNode classNode : classes) {
compileClass(classNode);
}
- for (String runtimeFile : RUNTIME_FILES) {
+ for (String runtimeFile : RUNTIME_FILES) {
String path = relativePathForModule(runtimeFile);
writeModule(
runtimeFile,
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 9131fb2..ca1c706 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -7,25 +7,7 @@ import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.zwobble.couscous.ast.AssignmentNode;
-import org.zwobble.couscous.ast.ClassNode;
-import org.zwobble.couscous.ast.ConstructorCallNode;
-import org.zwobble.couscous.ast.ConstructorNode;
-import org.zwobble.couscous.ast.ExpressionNode;
-import org.zwobble.couscous.ast.ExpressionStatementNode;
-import org.zwobble.couscous.ast.FieldAccessNode;
-import org.zwobble.couscous.ast.IfStatementNode;
-import org.zwobble.couscous.ast.LiteralNode;
-import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
-import org.zwobble.couscous.ast.MethodCallNode;
-import org.zwobble.couscous.ast.MethodNode;
-import org.zwobble.couscous.ast.ReturnNode;
-import org.zwobble.couscous.ast.StatementNode;
-import org.zwobble.couscous.ast.StaticMethodCallNode;
-import org.zwobble.couscous.ast.TernaryConditionalNode;
-import org.zwobble.couscous.ast.ThisReferenceNode;
-import org.zwobble.couscous.ast.TypeName;
-import org.zwobble.couscous.ast.VariableReferenceNode;
+import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeVisitorWithEmptyDefaults;
import org.zwobble.couscous.ast.visitors.NodeVisitors;
@@ -214,6 +196,11 @@ public class PythonCodeGenerator {
generateStatements(ifStatement.getTrueBranch()),
generateStatements(ifStatement.getFalseBranch()));
}
+
+ @Override
+ public PythonStatementNode visit(WhileNode whileLoop) {
+ throw new UnsupportedOperationException();
+ }
}
private static PythonExpressionNode generateExpression(ExpressionNode expression) {
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
index c75205d..97474c4 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -6,56 +6,10 @@ import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.Assignment;
-import org.eclipse.jdt.core.dom.Block;
-import org.eclipse.jdt.core.dom.BooleanLiteral;
-import org.eclipse.jdt.core.dom.ClassInstanceCreation;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ConditionalExpression;
-import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.ExpressionStatement;
-import org.eclipse.jdt.core.dom.FieldAccess;
-import org.eclipse.jdt.core.dom.FieldDeclaration;
-import org.eclipse.jdt.core.dom.IAnnotationBinding;
-import org.eclipse.jdt.core.dom.IBinding;
-import org.eclipse.jdt.core.dom.IMethodBinding;
-import org.eclipse.jdt.core.dom.ITypeBinding;
-import org.eclipse.jdt.core.dom.IVariableBinding;
-import org.eclipse.jdt.core.dom.IfStatement;
-import org.eclipse.jdt.core.dom.InfixExpression;
+import org.eclipse.jdt.core.dom.*;
import org.eclipse.jdt.core.dom.InfixExpression.Operator;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.MethodInvocation;
-import org.eclipse.jdt.core.dom.Modifier;
-import org.eclipse.jdt.core.dom.NumberLiteral;
-import org.eclipse.jdt.core.dom.ReturnStatement;
-import org.eclipse.jdt.core.dom.SimpleName;
-import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
-import org.eclipse.jdt.core.dom.Statement;
-import org.eclipse.jdt.core.dom.StringLiteral;
-import org.eclipse.jdt.core.dom.ThisExpression;
-import org.eclipse.jdt.core.dom.Type;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
-import org.zwobble.couscous.ast.AssignableExpressionNode;
-import org.zwobble.couscous.ast.AssignmentNode;
-import org.zwobble.couscous.ast.ClassNode;
-import org.zwobble.couscous.ast.ClassNodeBuilder;
+import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.ClassNodeBuilder.MethodBuilder;
-import org.zwobble.couscous.ast.ConstructorCallNode;
-import org.zwobble.couscous.ast.ExpressionNode;
-import org.zwobble.couscous.ast.FieldAccessNode;
-import org.zwobble.couscous.ast.IfStatementNode;
-import org.zwobble.couscous.ast.LiteralNode;
-import org.zwobble.couscous.ast.MethodCallNode;
-import org.zwobble.couscous.ast.ReturnNode;
-import org.zwobble.couscous.ast.StatementNode;
-import org.zwobble.couscous.ast.StaticMethodCallNode;
-import org.zwobble.couscous.ast.TernaryConditionalNode;
-import org.zwobble.couscous.ast.ThisReferenceNode;
-import org.zwobble.couscous.ast.TypeName;
import org.zwobble.couscous.values.BooleanValue;
import org.zwobble.couscous.values.IntegerValue;
import org.zwobble.couscous.values.ObjectValues;
@@ -66,6 +20,7 @@ import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariabl
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
+import static org.zwobble.couscous.ast.WhileNode.whileLoop;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
public class JavaReader {
@@ -131,24 +86,26 @@ public class JavaReader {
private static List<StatementNode> readStatement(Statement statement) {
switch (statement.getNodeType()) {
- case ASTNode.BLOCK:
- return readBlock((Block)statement);
-
- case ASTNode.RETURN_STATEMENT:
- return asList(readReturnStatement((ReturnStatement)statement));
-
- case ASTNode.EXPRESSION_STATEMENT:
- return asList(readExpressionStatement((ExpressionStatement)statement));
-
- case ASTNode.IF_STATEMENT:
- return asList(readIfStatement((IfStatement)statement));
-
- case ASTNode.VARIABLE_DECLARATION_STATEMENT:
- return readVariableDeclarationStatement((VariableDeclarationStatement)statement);
-
- default:
- throw new RuntimeException("Unsupported statement: " + statement.getClass());
-
+ case ASTNode.BLOCK:
+ return readBlock((Block)statement);
+
+ case ASTNode.RETURN_STATEMENT:
+ return asList(readReturnStatement((ReturnStatement)statement));
+
+ case ASTNode.EXPRESSION_STATEMENT:
+ return asList(readExpressionStatement((ExpressionStatement)statement));
+
+ case ASTNode.IF_STATEMENT:
+ return asList(readIfStatement((IfStatement)statement));
+
+ case ASTNode.WHILE_STATEMENT:
+ return asList(readWhileStatement((WhileStatement)statement));
+
+ case ASTNode.VARIABLE_DECLARATION_STATEMENT:
+ return readVariableDeclarationStatement((VariableDeclarationStatement)statement);
+
+ default:
+ throw new RuntimeException("Unsupported statement: " + statement.getClass());
}
}
@@ -176,6 +133,12 @@ public class JavaReader {
readStatement(statement.getElseStatement()));
}
+ private static WhileNode readWhileStatement(WhileStatement statement) {
+ return whileLoop(
+ readExpression(BooleanValue.REF, statement.getExpression()),
+ readStatement(statement.getBody()));
+ }
+
private static List<StatementNode> readVariableDeclarationStatement(VariableDeclarationStatement statement) {
@SuppressWarnings("unchecked")
List<VariableDeclarationFragment> fragments = statement.fragments();
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index 6f33b4d..9e34c42 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -4,13 +4,7 @@ import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
-import org.zwobble.couscous.ast.CallableNode;
-import org.zwobble.couscous.ast.ExpressionStatementNode;
-import org.zwobble.couscous.ast.IfStatementNode;
-import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
-import org.zwobble.couscous.ast.ReturnNode;
-import org.zwobble.couscous.ast.StatementNode;
-import org.zwobble.couscous.ast.VariableNode;
+import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
import org.zwobble.couscous.interpreter.values.BooleanInterpreterValue;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
@@ -61,6 +55,12 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
// TODO: Handle declarations in branches
return Stream.empty();
}
+
+ @Override
+ public Stream<VariableNode> visit(WhileNode whileLoop) {
+ // TODO: Handle declarations in branches
+ return Stream.empty();
+ }
}));
}
@@ -100,6 +100,11 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
return Optional.empty();
}
+ @Override
+ public Optional<InterpreterValue> visit(WhileNode whileLoop) {
+ throw new UnsupportedOperationException();
+ }
+
private Optional<InterpreterValue> exec(List<StatementNode> statements) {
for (StatementNode statement : statements) {
Optional<InterpreterValue> result = exec(environment, statement);
diff --git a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java
index 124f34b..ccfdfdd 100644
--- a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java
@@ -12,29 +12,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
-import org.zwobble.couscous.ast.AnnotationNode;
-import org.zwobble.couscous.ast.AssignableExpressionNode;
-import org.zwobble.couscous.ast.AssignmentNode;
-import org.zwobble.couscous.ast.ClassNode;
-import org.zwobble.couscous.ast.ConstructorCallNode;
-import org.zwobble.couscous.ast.ConstructorNode;
-import org.zwobble.couscous.ast.ExpressionNode;
-import org.zwobble.couscous.ast.ExpressionStatementNode;
-import org.zwobble.couscous.ast.FieldAccessNode;
-import org.zwobble.couscous.ast.FieldDeclarationNode;
-import org.zwobble.couscous.ast.FormalArgumentNode;
-import org.zwobble.couscous.ast.IfStatementNode;
-import org.zwobble.couscous.ast.LiteralNode;
-import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
-import org.zwobble.couscous.ast.MethodCallNode;
-import org.zwobble.couscous.ast.MethodNode;
-import org.zwobble.couscous.ast.ReturnNode;
-import org.zwobble.couscous.ast.StaticMethodCallNode;
-import org.zwobble.couscous.ast.TernaryConditionalNode;
-import org.zwobble.couscous.ast.ThisReferenceNode;
-import org.zwobble.couscous.ast.TypeName;
-import org.zwobble.couscous.ast.VariableDeclaration;
-import org.zwobble.couscous.ast.VariableReferenceNode;
+import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.util.ExtraArrays;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.StringValue;
@@ -77,7 +55,8 @@ public class ValueObjectTests {
{ThisReferenceNode.class},
{TypeName.class},
{VariableDeclaration.class},
- {VariableReferenceNode.class}
+ {VariableReferenceNode.class},
+ {WhileNode.class}
});
}
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
index 629a815..7782fdc 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
@@ -45,6 +45,7 @@ import static org.zwobble.couscous.ast.StaticMethodCallNode.unboxInt;
import static org.zwobble.couscous.ast.TernaryConditionalNode.ternaryConditional;
import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
+import static org.zwobble.couscous.ast.WhileNode.whileLoop;
import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively;
public class JavaReaderTests {
@@ -366,6 +367,15 @@ public class JavaReaderTests {
asList(returns(literal(2)))),
readStatement("if (true) { return 1; } else { return 2; }"));
}
+
+ @Test
+ public void canReadWhileLoops() {
+ assertEquals(
+ whileLoop(
+ literal(true),
+ asList(returns(literal(1)))),
+ readStatement("while (true) { return 1; }"));
+ }
@Test
public void canDeclareConstructor() {