aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-07-31 18:22:41 +0100
committerMichael Williamson <mike@zwobble.org>2016-07-31 18:22:41 +0100
commit119de6958f47141815de9c13e884b27a08a2b4b3 (patch)
treee8e3a17ba16060d6ff1a9b27ffe6884e4fc0d617 /src/main/java
parent1b0bd2dd2eac9883d81d9e2ccb0eecdb50add59c (diff)
Read statement blocks
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/NodeTypes.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/StatementBlockNode.java51
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java7
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java33
4 files changed, 79 insertions, 14 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/NodeTypes.java b/src/main/java/org/zwobble/couscous/ast/NodeTypes.java
index f7f8bf6..82090aa 100644
--- a/src/main/java/org/zwobble/couscous/ast/NodeTypes.java
+++ b/src/main/java/org/zwobble/couscous/ast/NodeTypes.java
@@ -45,6 +45,7 @@ public class NodeTypes {
public static final int VARIABLE_REFERENCE = 10029;
public static final int WHILE = 10030;
public static final int FOR_EACH = 10034;
+ public static final int STATEMENT_BLOCK = 10035;
private NodeTypes() {
}
@@ -85,6 +86,7 @@ public class NodeTypes {
.put(VariableReferenceNode.class, VARIABLE_REFERENCE)
.put(WhileNode.class, WHILE)
.put(ForEachNode.class, FOR_EACH)
+ .put(StatementBlockNode.class, STATEMENT_BLOCK)
.put(PrimitiveInstanceMethodCall.class, CsharpNodeTypes.PRIMITIVE_INSTANCE_METHOD_CALL)
.put(PrimitiveStaticMethodCall.class, CsharpNodeTypes.PRIMITIVE_STATIC_METHOD_CALL)
.build();
diff --git a/src/main/java/org/zwobble/couscous/ast/StatementBlockNode.java b/src/main/java/org/zwobble/couscous/ast/StatementBlockNode.java
new file mode 100644
index 0000000..0c24295
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/StatementBlockNode.java
@@ -0,0 +1,51 @@
+package org.zwobble.couscous.ast;
+
+import org.zwobble.couscous.ast.visitors.NodeTransformer;
+
+import java.util.List;
+
+public class StatementBlockNode implements StatementNode {
+ private final List<StatementNode> statements;
+
+ public StatementBlockNode(List<StatementNode> statements) {
+ this.statements = statements;
+ }
+
+ @Override
+ public int type() {
+ return NodeTypes.STATEMENT_BLOCK;
+ }
+
+ @Override
+ public Iterable<? extends Node> childNodes() {
+ return statements;
+ }
+
+ @Override
+ public StatementNode transformSubtree(NodeTransformer transformer) {
+ return new StatementBlockNode(transformer.transformStatements(statements));
+ }
+
+ @Override
+ public String toString() {
+ return "StatementBlockNode(" +
+ "statements=" + statements +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ StatementBlockNode that = (StatementBlockNode) o;
+
+ return statements.equals(that.statements);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return statements.hashCode();
+ }
+}
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 30adff9..1c4ac81 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -367,7 +367,7 @@ public class JavaReader {
tryCast(Initializer.class, declaration)
.ifPresent(initializer -> body.addInitializer(
Modifier.isStatic(initializer.getModifiers()),
- readStatement(scope, initializer.getBody())));
+ readStatementBody(scope, initializer.getBody())));
tryCast(FieldDeclaration.class, declaration)
.ifPresent(field -> readField(body, scope, type, field));
@@ -494,6 +494,11 @@ public class JavaReader {
}
}
+ List<StatementNode> readStatementBody(Scope scope, Statement statement) {
+ JavaStatementReader statementReader = new JavaStatementReader(scope, expressionReader(scope), Optional.empty());
+ return statementReader.readBody(statement);
+ }
+
List<StatementNode> readStatement(Scope scope, Statement statement) {
JavaStatementReader statementReader = new JavaStatementReader(scope, expressionReader(scope), Optional.empty());
return statementReader.readStatement(statement);
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
index df75ec4..72f94d5 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
@@ -10,7 +10,6 @@ import org.zwobble.couscous.types.Types;
import java.util.List;
import java.util.Optional;
-import java.util.stream.Collectors;
import static org.zwobble.couscous.ast.ExceptionHandlerNode.exceptionHandler;
import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement;
@@ -83,10 +82,9 @@ class JavaStatementReader {
private List<StatementNode> readBlock(Block block) {
@SuppressWarnings("unchecked")
- List<Statement> statements = block.statements();
- return statements.stream()
- .flatMap(statement -> readStatement(statement).stream())
- .collect(Collectors.toList());
+ List<Statement> javaStatements = block.statements();
+ List<StatementNode> statements = eagerFlatMap(javaStatements, this::readStatement);
+ return list(new StatementBlockNode(statements));
}
private StatementNode readReturnStatement(ReturnStatement statement) {
@@ -107,10 +105,10 @@ class JavaStatementReader {
private StatementNode readIfStatement(IfStatement statement) {
List<StatementNode> falseBranch = statement.getElseStatement() == null
? list()
- : readStatement(statement.getElseStatement());
+ : readBody(statement.getElseStatement());
return ifStatement(
readExpression(Types.BOOLEAN, statement.getExpression()),
- readStatement(statement.getThenStatement()),
+ readBody(statement.getThenStatement()),
falseBranch);
}
@@ -145,7 +143,7 @@ class JavaStatementReader {
@SuppressWarnings("unchecked")
List<VariableDeclarationExpression> resources = statement.resources();
List<LocalVariableDeclarationNode> resourceDeclarations = eagerFlatMap(resources, this::readVariableDeclarationExpression);
- List<StatementNode> body = readStatement(statement.getBody());
+ List<StatementNode> body = readBody(statement.getBody());
for (LocalVariableDeclarationNode resource : Lists.reverse(resourceDeclarations)) {
body = list(
resource,
@@ -155,7 +153,7 @@ class JavaStatementReader {
@SuppressWarnings("unchecked")
List<CatchClause> javaCatchClauses = statement.catchClauses();
List<ExceptionHandlerNode> catchClauses = eagerMap(javaCatchClauses, this::readCatchClause);
- List<StatementNode> finallyBody = statement.getFinally() == null ? list() : readStatement(statement.getFinally());
+ List<StatementNode> finallyBody = statement.getFinally() == null ? list() : readBody(statement.getFinally());
if (catchClauses.isEmpty() && finallyBody.isEmpty()) {
return body;
} else {
@@ -166,7 +164,7 @@ class JavaStatementReader {
private ExceptionHandlerNode readCatchClause(CatchClause clause) {
return exceptionHandler(
JavaVariableDeclarationReader.read(scope, clause.getException()),
- readStatement(clause.getBody()));
+ readBody(clause.getBody()));
}
private List<StatementNode> readStatements(Iterable<Statement> statements) {
@@ -176,7 +174,7 @@ class JavaStatementReader {
private WhileNode readWhileStatement(WhileStatement statement) {
return whileLoop(
readExpression(Types.BOOLEAN, statement.getExpression()),
- readStatement(statement.getBody()));
+ readBody(statement.getBody()));
}
private List<StatementNode> readForStatement(ForStatement statement) {
@@ -193,7 +191,7 @@ class JavaStatementReader {
whileLoop(
readExpression(Types.BOOLEAN, statement.getExpression()),
concat(
- readStatement(statement.getBody()),
+ readBody(statement.getBody()),
eagerMap(updaters, updater -> expressionStatement(readExpressionWithoutBoxing(updater))))));
}
@@ -207,7 +205,7 @@ class JavaStatementReader {
ForEachNode node = new ForEachNode(
scope.generateVariable(parameterBinding.getKey(), parameterBinding.getName(), elementType),
iterableValue,
- readStatement(statement.getBody())
+ readBody(statement.getBody())
);
return list(node);
}
@@ -243,4 +241,13 @@ class JavaStatementReader {
private ExpressionNode readExpression(Type targetType, Expression expression) {
return expressionReader.readExpression(targetType, expression);
}
+
+ List<StatementNode> readBody(Statement statement) {
+ if (statement instanceof Block) {
+ List<Statement> javaStatements = ((Block) statement).statements();
+ return eagerFlatMap(javaStatements, this::readStatement);
+ } else {
+ return readStatement(statement);
+ }
+ }
}