Fix https://github.com/julianhyde/linq4j/issues/15, "Expressions.ifThenElse does not work".
diff --git a/src/main/java/net/hydromatic/linq4j/expressions/ConditionalStatement.java b/src/main/java/net/hydromatic/linq4j/expressions/ConditionalStatement.java
index 9edb3c1..5ed1f57 100644
--- a/src/main/java/net/hydromatic/linq4j/expressions/ConditionalStatement.java
+++ b/src/main/java/net/hydromatic/linq4j/expressions/ConditionalStatement.java
@@ -51,18 +51,27 @@
@Override
void accept0(ExpressionWriter writer) {
- for (int i = 0; i < expressionList.size(); i += 2) {
- writer.append(i > 0 ? " else if (" : "if (")
+ for (int i = 0; i < expressionList.size() - 1; i += 2) {
+ if (i > 0) {
+ writer.backUp();
+ writer.append(" else ");
+ }
+ writer.append("if (")
.append(expressionList.get(i))
.append(") ")
.append(Blocks.toBlock(expressionList.get(i + 1)));
}
if (expressionList.size() % 2 == 1) {
- writer.append(" else ").append(Blocks.toBlock(expressionList.get(
- expressionList.size() - 1)));
+ writer.backUp();
+ writer.append(" else ")
+ .append(Blocks.toBlock(last(expressionList)));
}
}
+ private static <E> E last(List<E> collection) {
+ return collection.get(collection.size() - 1);
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
diff --git a/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java b/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java
index 8e8ecd5..3a34fdf 100644
--- a/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java
+++ b/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java
@@ -958,6 +958,17 @@
}
/**
+ * Creates a ConditionalExpression that represents a conditional
+ * block with if and else statements:
+ * <code>if (test) stmt1 [ else if (test2) stmt2 ]... [ else stmtN ]</code>.
+ */
+ public static ConditionalStatement ifThenElse(Expression test,
+ Node... nodes) {
+ return new ConditionalStatement(
+ new FluentArrayList<Node>().append(test).appendAll(nodes));
+ }
+
+ /**
* Creates a UnaryExpression that represents the incrementing of
* the expression value by 1.
*/
diff --git a/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java b/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java
index 3d9fda7..025526d 100644
--- a/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java
+++ b/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java
@@ -1045,11 +1045,32 @@
assertEquals(
"if (true) {\n"
+ " return;\n"
+ + "} else {\n"
+ + " return 1;\n"
+ "}\n",
Expressions.toString(
- Expressions.ifThen(
+ Expressions.ifThenElse(
Expressions.constant(true),
- Expressions.return_(null))));
+ Expressions.return_(null),
+ Expressions.return_(null, Expressions.constant(1)))));
+ }
+
+ @Test public void testIfElseIfElse() {
+ assertEquals(
+ "if (true) {\n"
+ + " return;\n"
+ + "} else if (false) {\n"
+ + " return;\n"
+ + "} else {\n"
+ + " return 1;\n"
+ + "}\n",
+ Expressions.toString(
+ Expressions.ifThenElse(
+ Expressions.constant(true),
+ Expressions.return_(null),
+ Expressions.constant(false),
+ Expressions.return_(null),
+ Expressions.return_(null, Expressions.constant(1)))));
}
@Test public void assignInCondition() {