Tweak pretty-printed Java source output for proper indentation on JSNI methods.

Review by: spoon

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5204 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/SourceGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/jjs/impl/SourceGenerationVisitor.java
index 46282f5..1f52bfd 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/SourceGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/SourceGenerationVisitor.java
@@ -20,6 +20,7 @@
 import com.google.gwt.dev.jjs.ast.JField;
 import com.google.gwt.dev.jjs.ast.JInterfaceType;
 import com.google.gwt.dev.jjs.ast.JMethod;
+import com.google.gwt.dev.jjs.ast.JMethodBody;
 import com.google.gwt.dev.jjs.ast.JProgram;
 import com.google.gwt.dev.jjs.ast.JReferenceType;
 import com.google.gwt.dev.util.TextOutput;
@@ -48,10 +49,6 @@
 
   @Override
   public boolean visit(JClassType x, Context ctx) {
-    // All classes are deemed "static" so the monolithic compile results can be
-    // copy/pasted into a single enclosing class.
-    print(CHARS_STATIC);
-
     super.visit(x, ctx);
 
     openBlock();
@@ -64,6 +61,13 @@
     }
     for (int i = 0; i < x.methods.size(); ++i) {
       JMethod it = x.methods.get(i);
+      // Suppress empty clinit.
+      if (i == 0) {
+        JMethodBody body = (JMethodBody) it.getBody();
+        if (body.getBlock().getStatements().isEmpty()) {
+          continue;
+        }
+      }
       accept(it);
       newline();
       newline();
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ToStringGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ToStringGenerationVisitor.java
index 2848db1..9ad064c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ToStringGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ToStringGenerationVisitor.java
@@ -88,6 +88,7 @@
 import com.google.gwt.dev.jjs.ast.js.JsonArray;
 import com.google.gwt.dev.jjs.ast.js.JsonObject;
 import com.google.gwt.dev.jjs.ast.js.JsonObject.JsonPropInit;
+import com.google.gwt.dev.js.JsSourceGenerationVisitor;
 import com.google.gwt.dev.util.TextOutput;
 
 import java.util.Iterator;
@@ -739,10 +740,13 @@
   }
 
   @Override
-  public boolean visit(JsniMethodBody x, Context ctx) {
+  public boolean visit(final JsniMethodBody x, Context ctx) {
     print(" /*-");
-    String source = x.getFunc().getBody().toSource();
-    print(source.trim());
+    new JsSourceGenerationVisitor(this) {
+      {
+        printJsBlock(x.getFunc().getBody(), false, false);
+      }
+    };
     print("-*/");
     semi();
     return false;
diff --git a/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java
index 4a15d4a..1a0ff06 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java
@@ -45,7 +45,7 @@
 
   @Override
   public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
-    printJsBlockOptionalTruncate(x, false);
+    printJsBlock(x, false, true);
     return false;
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
index f2ce3e9..0660d3e 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
@@ -179,7 +179,7 @@
 
   @Override
   public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
-    printJsBlockOptionalTruncate(x, true);
+    printJsBlock(x, true, true);
     return false;
   }
 
@@ -798,7 +798,7 @@
     p.newlineOpt();
   }
 
-  protected void printJsBlockOptionalTruncate(JsBlock x, boolean truncate) {
+  protected void printJsBlock(JsBlock x, boolean truncate, boolean finalNewline) {
     boolean needBraces = !x.isGlobalBlock();
 
     if (needBraces) {
@@ -849,9 +849,12 @@
     }
 
     if (needBraces) {
-      // Close braces.
-      //
-      _blockClose();
+      // _blockClose() modified
+      p.indentOut();
+      p.print('}');
+      if (finalNewline) {
+        _newlineOpt();
+      }
     }
     needSemi = false;
   }