From 1b0bd2dd2eac9883d81d9e2ccb0eecdb50add59c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 31 Jul 2016 18:06:33 +0100 Subject: Read for-each as sugared statements --- .../tests/frontends/java/JavaReaderTests.java | 27 +++++++++++-- .../frontends/java/JavaStatementSourceReader.java | 46 ++++++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 src/test/java/org/zwobble/couscous/tests/frontends/java/JavaStatementSourceReader.java (limited to 'src/test/java/org') 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 c6055e7..5718dca 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 @@ -3,14 +3,13 @@ package org.zwobble.couscous.tests.frontends.java; import org.junit.Test; import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.identifiers.Identifier; +import org.zwobble.couscous.frontends.java.JavaTypes; import org.zwobble.couscous.types.ScalarType; import org.zwobble.couscous.types.Types; import java.util.List; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.zwobble.couscous.ast.AnnotationNode.annotation; @@ -32,6 +31,7 @@ import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; import static org.zwobble.couscous.ast.ThrowNode.throwNode; import static org.zwobble.couscous.ast.TryNode.tryStatement; import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion; +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.tests.frontends.java.JavaReading.*; @@ -177,6 +177,27 @@ public class JavaReaderTests { statements); } + @Test + public void canReadForEachLoops() { + List statements = new JavaStatementSourceReader() + .returns("String") + .addVariable("iterable", "java.lang.Iterable") + .readStatement("for (String x : iterable) { return x; } return \"\";"); + + VariableDeclaration expectedTarget = var(Identifier.TOP.type("com.example.Example").method("main").variable("x"), "x", Types.STRING); + assertEquals( + list( + new ForEachNode( + expectedTarget, + reference(var(Identifier.TOP.type("com.example.Example").method("main").variable("iterable"), "iterable", JavaTypes.iterable(Types.STRING))), + list(returns(reference(expectedTarget))) + ), + returns(literal("")) + ), + statements + ); + } + @Test public void canReadSwitchStatements() { assertThat( diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaStatementSourceReader.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaStatementSourceReader.java new file mode 100644 index 0000000..69be77d --- /dev/null +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaStatementSourceReader.java @@ -0,0 +1,46 @@ +package org.zwobble.couscous.tests.frontends.java; + +import org.zwobble.couscous.ast.ClassNode; +import org.zwobble.couscous.ast.StatementNode; + +import java.util.List; + +import static org.zwobble.couscous.tests.frontends.java.JavaReading.readClass; +import static org.zwobble.couscous.util.ExtraIterables.only; +import static org.zwobble.couscous.util.ExtraLists.append; +import static org.zwobble.couscous.util.ExtraLists.list; + +class JavaStatementSourceReader { + private final List variables; + private final String returnType; + + JavaStatementSourceReader() { + this(list(), "void"); + } + + private JavaStatementSourceReader(List variables, String returnType) { + this.variables = variables; + this.returnType = returnType; + } + + JavaStatementSourceReader returns(String returnType) { + return new JavaStatementSourceReader(variables, returnType); + } + + JavaStatementSourceReader addVariable(String name, String type) { + return new JavaStatementSourceReader(append(variables, type + " " + name), returnType); + } + + public List readStatement(String statement) { + String javaClass = generateMethodSource(variables, returnType, statement); + ClassNode classNode = readClass(javaClass); + return only(classNode.getMethods()).getBody().get(); + + } + + private String generateMethodSource(List variables, String returnType, String statement) { + return "public static " + returnType + " main(" + String.join(", ", variables) + ") throws Exception {" + + statement + + "}"; + } +} -- cgit v1.2.3