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() {