Remove spurious "null" generated when converting expression to string.
Allow a field declaration to not have an initializer.
diff --git a/src/main/java/net/hydromatic/linq4j/expressions/ExpressionWriter.java b/src/main/java/net/hydromatic/linq4j/expressions/ExpressionWriter.java
index 3a12e33..96b4456 100644
--- a/src/main/java/net/hydromatic/linq4j/expressions/ExpressionWriter.java
+++ b/src/main/java/net/hydromatic/linq4j/expressions/ExpressionWriter.java
@@ -28,7 +28,7 @@
private final StringBuilder buf = new StringBuilder();
private int level;
- private String indent;
+ private String indent = "";
private boolean indentPending;
private final boolean generics;
diff --git a/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java b/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java
index 7a12eac..ffc099f 100644
--- a/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java
+++ b/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java
@@ -1647,7 +1647,7 @@
}
/**
- * Declares a field.
+ * Declares a field with an initializer.
*/
public static FieldDeclaration fieldDecl(int modifier,
ParameterExpression parameter, Expression initializer) {
@@ -1655,6 +1655,14 @@
}
/**
+ * Declares a field.
+ */
+ public static FieldDeclaration fieldDecl(int modifier,
+ ParameterExpression parameter) {
+ return new FieldDeclaration(modifier, parameter, null);
+ }
+
+ /**
* Declares a class.
*/
public static ClassDeclaration classDecl(int modifier, String name,
diff --git a/src/main/java/net/hydromatic/linq4j/expressions/FieldDeclaration.java b/src/main/java/net/hydromatic/linq4j/expressions/FieldDeclaration.java
index cd9d0c3..97dfed1 100644
--- a/src/main/java/net/hydromatic/linq4j/expressions/FieldDeclaration.java
+++ b/src/main/java/net/hydromatic/linq4j/expressions/FieldDeclaration.java
@@ -37,7 +37,8 @@
@Override
public MemberDeclaration accept(Visitor visitor) {
// do not visit parameter - visit may not return a ParameterExpression
- final Expression initializer = this.initializer.accept(visitor);
+ final Expression initializer =
+ this.initializer == null ? null : this.initializer.accept(visitor);
return visitor.visit(this, parameter, initializer);
}
diff --git a/src/main/java/net/hydromatic/linq4j/expressions/Visitor.java b/src/main/java/net/hydromatic/linq4j/expressions/Visitor.java
index e08ef7e..7fd7edf 100644
--- a/src/main/java/net/hydromatic/linq4j/expressions/Visitor.java
+++ b/src/main/java/net/hydromatic/linq4j/expressions/Visitor.java
@@ -205,8 +205,8 @@
public MemberDeclaration visit(FieldDeclaration fieldDeclaration,
ParameterExpression parameter, Expression initializer) {
- return parameter.equals(fieldDeclaration.parameter) && initializer.equals(
- fieldDeclaration.initializer)
+ return parameter.equals(fieldDeclaration.parameter)
+ && eq(initializer, fieldDeclaration.initializer)
? fieldDeclaration
: Expressions.fieldDecl(fieldDeclaration.modifier, parameter,
initializer);
diff --git a/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java b/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java
index 4f1015a..d348457 100644
--- a/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java
+++ b/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java
@@ -877,7 +877,9 @@
Expressions.add(three, six),
nine));
statements.add(Expressions.return_(null, eighteen));
- assertEquals(expected, Expressions.toString(statements.toBlock()));
+ BlockStatement expression = statements.toBlock();
+ assertEquals(expected, Expressions.toString(expression));
+ expression.accept(new Visitor());
}
@Test public void testBlockBuilder2() {
@@ -901,13 +903,15 @@
treeSet,
"add",
element)));
+ BlockStatement expression = statements.toBlock();
assertEquals(
"{\n"
+ " final java.util.Comparator comparator = null;\n"
+ " return new java.util.TreeSet(\n"
+ " comparator).add(null);\n"
+ "}\n",
- Expressions.toString(statements.toBlock()));
+ Expressions.toString(expression));
+ expression.accept(new Visitor());
}
@Test public void testBlockBuilder3() {
@@ -946,6 +950,7 @@
// Correct result is
// bar(1, _b, _c, _d, foo(_c));
// because _c has the same expression (a + 3) as inner b.
+ BlockStatement expression = builder0.toBlock();
assertEquals(
"{\n"
+ " final int _b = 1 + 2;\n"
@@ -953,10 +958,22 @@
+ " final int _d = 1 + 4;\n"
+ " net.hydromatic.linq4j.test.ExpressionTest.bar(1, _b, _c, _d, net.hydromatic.linq4j.test.ExpressionTest.foo(_c));\n"
+ "}\n",
- Expressions.toString(builder0.toBlock()));
+ Expressions.toString(expression));
+ expression.accept(new Visitor());
}
@Test public void testConstantExpression() {
+ final Expression constant = Expressions.constant(
+ new Object[] {
+ 1,
+ new Object[] {
+ (byte) 1, (short) 2, (int) 3, (long) 4,
+ (float) 5, (double) 6, (char) 7, true, "string", null
+ },
+ new AllType(true, (byte) 100, (char) 101, (short) 102, 103,
+ (long) 104, (float) 105, (double) 106, new BigDecimal(107),
+ new BigInteger("108"), "109", null)
+ });
assertEquals(
"new Object[] {\n"
+ " 1,\n"
@@ -984,15 +1001,8 @@
+ " new java.math.BigInteger(\"108\"),\n"
+ " \"109\",\n"
+ " null)}",
- Expressions.constant(
- new Object[] {
- 1,
- new Object[] {(byte) 1, (short) 2, (int) 3, (long) 4,
- (float) 5, (double) 6, (char) 7, true, "string", null},
- new AllType(true, (byte) 100, (char) 101, (short) 102, 103,
- (long) 104, (float) 105, (double) 106, new BigDecimal(107),
- new BigInteger("108"), "109", null)
- }).toString());
+ constant.toString());
+ constant.accept(new Visitor());
}
@Test public void testClassDecl() {
@@ -1001,7 +1011,7 @@
Object.class,
Collections.<Expression>emptyList(),
Arrays.<MemberDeclaration>asList(
- new FieldDeclaration(
+ Expressions.fieldDecl(
Modifier.PUBLIC | Modifier.FINAL,
Expressions.parameter(String.class, "foo"),
Expressions.constant("bar")),
@@ -1015,10 +1025,9 @@
0,
Expressions.parameter(int.class, "x"),
Expressions.constant(0)))),
- new FieldDeclaration(
+ Expressions.fieldDecl(
0,
- Expressions.parameter(int.class, "i"),
- null)));
+ Expressions.parameter(int.class, "i"))));
assertEquals(
"new Object(){\n"
+ " public final String foo = \"bar\";\n"
@@ -1028,6 +1037,7 @@
+ " int i;\n"
+ "}",
Expressions.toString(newExpression));
+ newExpression.accept(new Visitor());
}
@Test public void testReturn() {