From 561432667229f94fa22adbd5ff083d0bddea482e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 13 Jan 2016 21:02:11 +0000 Subject: Tidy up processing of statements in switch --- .../frontends/java/JavaStatementReader.java | 23 ++++++++++--------- src/main/java/org/zwobble/couscous/util/Tails.java | 26 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/util/Tails.java (limited to 'src/main/java') 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 d03c7c0..99e8d7e 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java @@ -11,7 +11,8 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; -import static com.google.common.collect.Iterables.*; +import static com.google.common.collect.Iterables.filter; +import static com.google.common.collect.Iterables.tryFind; import static com.google.common.collect.Maps.immutableEntry; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; import static org.zwobble.couscous.ast.IfStatementNode.ifStatement; @@ -21,7 +22,8 @@ import static org.zwobble.couscous.ast.WhileNode.whileLoop; import static org.zwobble.couscous.frontends.java.JavaExpressionReader.coerceExpression; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; import static org.zwobble.couscous.util.ExtraLists.*; -import static org.zwobble.couscous.util.ExtraLists.concat; +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 { @@ -100,10 +102,10 @@ class JavaStatementReader { List statements = switchStatement.statements(); List, List>> cases = new ArrayList<>(); - for (int statementIndex = 0; statementIndex < statements.size(); statementIndex++) { - Statement statement = statements.get(statementIndex); - if (statement.getNodeType() == ASTNode.SWITCH_CASE) { - cases.add(readSwitchCase(statements, statementIndex)); + for (List tail : tails(statements)) { + Statement first = tail.get(0); + if (first.getNodeType() == ASTNode.SWITCH_CASE) { + cases.add(readSwitchCase((SwitchCase) first, tail(tail))); } } @@ -129,12 +131,13 @@ class JavaStatementReader { handle); } - private Map.Entry,List> readSwitchCase(List statements, int statementIndex) { - SwitchCase caseStatement = (SwitchCase)statements.get(statementIndex); - + private Map.Entry,List> readSwitchCase( + SwitchCase caseStatement, + List statements) + { Iterable statementsForCase = upToAndIncluding( filter( - skip(statements, statementIndex), + statements, statement -> statement.getNodeType() != ASTNode.SWITCH_CASE), JavaStatementReader::isEndOfCase); return immutableEntry( diff --git a/src/main/java/org/zwobble/couscous/util/Tails.java b/src/main/java/org/zwobble/couscous/util/Tails.java new file mode 100644 index 0000000..f9ec724 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/util/Tails.java @@ -0,0 +1,26 @@ +package org.zwobble.couscous.util; + +import java.util.Iterator; +import java.util.List; + +public class Tails { + public static Iterable> tails(List list) { + return () -> new Iterator>() { + private int startIndex = 0; + + @Override + public boolean hasNext() { + return startIndex < list.size(); + } + + @Override + public List next() { + return list.subList(startIndex++, list.size()); + } + }; + } + + public static List tail(List list) { + return list.subList(1, list.size()); + } +} -- cgit v1.2.3