aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/frontends
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-07-15 14:23:47 +0100
committerMichael Williamson <mike@zwobble.org>2016-07-15 14:23:47 +0100
commitbc06840e00425db342bc5a021c0900d9e63b71f0 (patch)
tree0aa45a4ea475804a36a5ee33f9a726656f45bc1f /src/main/java/org/zwobble/couscous/frontends
parent3be68289f34a37ac7f9e1e95fa0d95dfc1bb3836 (diff)
Split switch handling off to desugar step
Diffstat (limited to 'src/main/java/org/zwobble/couscous/frontends')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java44
1 files changed, 8 insertions, 36 deletions
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 512030d..5692f8a 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
@@ -4,6 +4,7 @@ import com.google.common.collect.Lists;
import org.eclipse.jdt.core.dom.*;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.sugar.SwitchCaseNode;
+import org.zwobble.couscous.ast.sugar.SwitchNode;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.types.Types;
@@ -11,24 +12,20 @@ import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.tryFind;
import static org.zwobble.couscous.ast.ExceptionHandlerNode.exceptionHandler;
import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement;
import static org.zwobble.couscous.ast.IfStatementNode.ifStatement;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.TryNode.tryStatement;
-import static org.zwobble.couscous.ast.TypeCoercionNode.coerce;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
import static org.zwobble.couscous.ast.WhileNode.whileLoop;
import static org.zwobble.couscous.ast.sugar.SwitchCaseNode.switchCase;
import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf;
import static org.zwobble.couscous.types.BoundTypeParameter.boundTypeParameter;
+import static org.zwobble.couscous.util.ExtraIterables.takeUntil;
import static org.zwobble.couscous.util.ExtraLists.*;
-import static org.zwobble.couscous.util.Fold.foldRight;
import static org.zwobble.couscous.util.Tails.tail;
import static org.zwobble.couscous.util.Tails.tails;
-import static org.zwobble.couscous.util.UpToAndIncludingIterable.upToAndIncluding;
class JavaStatementReader {
private final Scope scope;
@@ -120,8 +117,6 @@ class JavaStatementReader {
private List<StatementNode> readSwitchStatement(SwitchStatement switchStatement) {
ExpressionNode switchValue = readExpressionWithoutBoxing(switchStatement.getExpression());
- LocalVariableDeclarationNode switchValueAssignment = scope.temporaryVariable(switchValue);
-
@SuppressWarnings("unchecked")
List<Statement> statements = switchStatement.statements();
List<SwitchCaseNode> cases = eagerFlatMap(
@@ -134,42 +129,19 @@ class JavaStatementReader {
return list();
}
});
-
- List<StatementNode> handleDefault = tryFind(cases, currentCase -> currentCase.isDefault())
- .transform(currentCase -> currentCase.getStatements())
- .or(list());
-
- return cons(
- switchValueAssignment,
- foldRight(cases, handleDefault, (handle, currentCase) ->
- currentCase.getValue()
- .map(value -> list(ifStatement(
- methodCall(
- reference(switchValueAssignment),
- "equals",
- list(coerce(value, Types.OBJECT)),
- Types.BOOLEAN),
- currentCase.getStatements(), handle)))
- .orElse(handle)));
+ return list(new SwitchNode(switchValue, cases));
}
- private SwitchCaseNode readSwitchCase(SwitchCase caseStatement, List<Statement> statements)
- {
- Iterable<Statement> statementsForCase = upToAndIncluding(
- filter(
- statements,
- statement -> statement.getNodeType() != ASTNode.SWITCH_CASE),
- JavaStatementReader::isEndOfCase);
+ private SwitchCaseNode readSwitchCase(SwitchCase caseStatement, List<Statement> statements) {
+ Iterable<Statement> statementsForCase = takeUntil(
+ statements,
+ statement -> statement.getNodeType() == ASTNode.SWITCH_CASE
+ );
return switchCase(
Optional.ofNullable(caseStatement.getExpression()).map(this::readExpressionWithoutBoxing),
readStatements(statementsForCase));
}
- private static boolean isEndOfCase(Statement statement) {
- // TODO: do this on transformed nodes instead?
- return statement.getNodeType() == ASTNode.RETURN_STATEMENT;
- }
-
private List<StatementNode> readTryStatement(TryStatement statement) {
@SuppressWarnings("unchecked")
List<VariableDeclarationExpression> resources = statement.resources();